From d795c8e1255ce080f2751848ef783283292ff4b9 Mon Sep 17 00:00:00 2001 From: XiaoHuNao Date: Fri, 5 Jan 2024 19:27:36 +0800 Subject: [PATCH] dev --- .../minecraft/tags/items/music_discs.json | 5 - .../aftermath/common.json | 782 ------------------ .../tags/entity_types/nether_mob.json | 15 - .../worldgen/biome/has_burnt_structure.json | 6 - .../tags/worldgen/biome/has_city.json | 5 - .../worldgen/biome/has_expansion_build.json | 6 - .../worldgen/biome/has_house_of_sakura.json | 5 - .../tags/worldgen/biome/has_nether_raid.json | 5 - .../tags/worldgen/structure/nether_raid.json | 8 - .../worldgen/biome/barren.json | 99 --- .../worldgen/structure/brick_well.json | 6 - .../worldgen/structure/burnt_structure1.json | 6 - .../worldgen/structure/burnt_structure2.json | 6 - .../worldgen/structure/burnt_structure3.json | 6 - .../worldgen/structure/burnt_structure4.json | 6 - .../worldgen/structure/burnt_structure5.json | 6 - .../worldgen/structure/burnt_structure6.json | 6 - .../worldgen/structure/camp.json | 6 - .../worldgen/structure/city.json | 7 - .../worldgen/structure/cobblestone_pile.json | 6 - .../worldgen/structure/construction1.json | 6 - .../worldgen/structure/construction2.json | 6 - .../worldgen/structure/house_of_sakura.json | 7 - .../worldgen/structure/logs.json | 6 - .../worldgen/structure/nether_raid.json | 7 - .../worldgen/structure/tent.json | 6 - .../worldgen/structure/wagon_cargo1.json | 6 - .../worldgen/structure/wagon_cargo2.json | 6 - .../worldgen/structure/wagon_cargo3.json | 6 - .../worldgen/structure/wagon_cargo4.json | 6 - .../worldgen/structure/wagon_cargo5.json | 6 - .../worldgen/structure/wagon_cargo6.json | 6 - .../worldgen/structure_set/brick_well.json | 14 - .../structure_set/burnt_structure1.json | 14 - .../structure_set/burnt_structure2.json | 14 - .../structure_set/burnt_structure3.json | 14 - .../structure_set/burnt_structure4.json | 14 - .../structure_set/burnt_structure5.json | 14 - .../structure_set/burnt_structure6.json | 14 - .../worldgen/structure_set/camp.json | 14 - .../worldgen/structure_set/city.json | 14 - .../structure_set/cobblestone_pile.json | 14 - .../worldgen/structure_set/construction1.json | 14 - .../worldgen/structure_set/construction2.json | 14 - .../structure_set/house_of_sakura.json | 14 - .../worldgen/structure_set/logs.json | 14 - .../worldgen/structure_set/nether_raid.json | 14 - .../worldgen/structure_set/tent.json | 14 - .../worldgen/structure_set/wagon_cargo1.json | 14 - .../worldgen/structure_set/wagon_cargo2.json | 14 - .../worldgen/structure_set/wagon_cargo3.json | 14 - .../worldgen/structure_set/wagon_cargo4.json | 14 - .../worldgen/structure_set/wagon_cargo5.json | 14 - .../worldgen/structure_set/wagon_cargo6.json | 14 - .../SurvivingTheAftermath.java | 74 +- .../api/AftermathState.java | 20 - .../surviving_the_aftermath/api/Constant.java | 36 - .../api/IAftermath.java | 47 -- .../api/IAftermathFactory.java | 9 - .../api/IIdentifier.java | 2 +- .../api/IJSONSerializable.java | 8 - .../surviving_the_aftermath/api/IModule.java | 4 + .../api/IStageData.java | 20 - .../surviving_the_aftermath/api/ITracker.java | 18 - .../api/PortalShapeAccessor.java | 18 - .../api/aftermath/AftermathAPI.java | 138 ---- .../api/aftermath/AftermathManager.java | 64 -- .../api/base/BaseAftermath.java | 208 ----- .../api/base/BaseAftermathModule.java | 91 -- .../api/base/BaseTracker.java | 28 - .../api/module/IAftermathModule.java | 17 - .../api/module/IAmountModule.java | 21 +- .../api/module/IConditionModule.java | 14 - .../api/module/IEntityInfoModule.java | 12 +- .../api/module/IWeightedListModule.java | 23 - .../api/module/IWeightedModule.java | 15 + .../module/impl/amount/FixedAmountModule.java | 62 -- .../impl/amount/RandomAmountModule.java | 72 -- .../impl/condition/StageConditionModule.java | 89 -- .../impl/entity_info/EntityInfoModule.java | 100 --- .../EntityInfoWithEquipmentModule.java | 90 -- .../impl/weighted/BaseWeightedListModule.java | 52 -- .../EntityTypeWeightedListModule.java | 89 -- .../impl/weighted/ItemWeightedListModule.java | 100 --- .../api/stage/LevelStageData.java | 19 - .../api/stage/PlayerStageData.java | 13 - .../api/stage/StageData.java | 82 -- .../common/capability/AftermathCap.java | 77 -- .../common/capability/StageDataCap.java | 61 -- .../common/config/AftermathConfig.java | 28 - .../datagen/AftermathModuleProviders.java | 66 -- .../common/data/datagen/EventSubscriber.java | 37 - .../data/datagen/ModBlockStateProvider.java | 19 - .../data/datagen/ModItemModelProvider.java | 66 -- .../data/datagen/ModLanguageCNProvider.java | 46 -- .../data/datagen/ModLanguageProvider.java | 48 -- .../data/datagen/ModLootTableProvider.java | 23 - .../common/data/datagen/ModSoundProvider.java | 25 - .../common/data/datagen/ModTagProviders.java | 105 --- .../data/datagen/RegistryDataGenerator.java | 27 - .../data/datagen/loot/ModBlockLoot.java | 42 - .../data/datagen/loot/ModChestLoot.java | 18 - .../data/datagen/loot/ModEntityLoot.java | 41 - .../raid/NetherRaidModuleProvider.java | 523 ------------ .../data/pack/AftermathModuleLoader.java | 54 -- .../common/effect/CowardiceEffect.java | 10 - .../common/enchantment/BaseEnchantment.java | 84 -- .../enchantment/BloodthirstyEnchantment.java | 18 - .../enchantment/CleanWaterEnchantment.java | 37 - .../enchantment/CounterattackEnchantment.java | 58 -- .../enchantment/DevouredEnchantment.java | 28 - .../enchantment/ExecuteEnchantment.java | 41 - .../enchantment/FranticEnchantment.java | 24 - .../enchantment/LifeTreeEnchantment.java | 34 - .../common/enchantment/RangerEnchantment.java | 22 - .../enchantment/SunAndMoonEnchantment.java | 38 - .../common/event/AftermathEvent.java | 88 -- .../event/subscriber/ClientForgeEvent.java | 45 - .../subscriber/EnchantmentSubscriber.java | 111 --- .../subscriber/ForgeEventSubscriber.java | 49 -- .../event/subscriber/RaidEventSubscriber.java | 92 --- .../event/subscriber/VillagerSubscriber.java | 70 -- .../common/init/ModAftermathModule.java | 32 + .../common/init/ModBiomes.java | 29 - .../common/init/ModBlocks.java | 31 - .../common/init/ModCapability.java | 49 -- .../common/init/ModEnchantments.java | 24 - .../common/init/ModItems.java | 44 - .../common/init/ModMobEffects.java | 17 - .../common/init/ModSoundEvents.java | 16 - .../common/init/ModStructurePieceTypes.java | 44 - .../common/init/ModStructureSets.java | 66 -- .../common/init/ModStructureTypes.java | 47 -- .../common/init/ModStructures.java | 64 -- .../common/init/ModTabs.java | 22 - .../common/init/ModTags.java | 26 - .../common/init/ModVillagers.java | 21 - .../common/level/biomes/ModBiomesMaker.java | 34 - .../common/mixin/MoveControlMixin.java | 56 -- .../common/mixin/PortalShapeMixin.java | 53 -- .../common/mixin/VillagerMixin.java | 31 - .../module/amount/IntegerAmountModule.java | 50 ++ .../module/amount/RandomAmountModule.java | 57 ++ .../module/entity_info/EntityInfoModule.java | 38 + .../module/weighted/BaseWeightedModule.java | 37 + .../weighted/EntityTypeWeightedModule.java | 28 + .../module/weighted/ItemWeightedModule.java | 25 + .../common/raid/NetherRaid.java | 358 -------- .../common/raid/api/BaseRaid.java | 102 --- .../common/raid/api/IRaid.java | 8 - .../common/raid/api/IRaidModule.java | 9 - .../common/raid/module/BaseRaidModule.java | 122 --- .../common/raid/module/NetherRaidModule.java | 69 -- .../common/structure/AbstractStructure.java | 99 --- .../common/structure/BurntStructure.java | 56 -- .../common/structure/CityStructure.java | 73 -- .../common/structure/HouseOfSakura.java | 42 - .../common/structure/NetherRaidStructure.java | 44 - .../expansion/BrickWellStructure.java | 43 - .../structure/expansion/CampStructure.java | 43 - .../expansion/CobblestonePileStructure.java | 42 - .../expansion/ConstructionStructure.java | 45 - .../structure/expansion/LogsStructure.java | 42 - .../structure/expansion/TentStructure.java | 42 - .../expansion/WagonCargoStructure.java | 57 -- .../structure/expansion/package-info.java | 9 - .../common/structure/package-info.java | 9 - .../common/tracker/MobBattleTracker.java | 36 - .../common/tracker/RaidMobBattleTracker.java | 47 -- .../tracker/RaidPlayerBattleTracker.java | 253 ------ .../common/util/AftermathEventUtil.java | 94 --- .../common/util/RandomUtils.java | 35 - .../common/util/RegistryUtil.java | 61 -- .../common/util/SpawnEntityUtil.java | 53 -- .../common/util/StructureUtil.java | 185 ----- .../compat/kubejs/ModExtra.java | 32 - .../compat/kubejs/ModKubeJSPlugin.java | 29 - .../compat/kubejs/event/AftermathEventJS.java | 85 -- .../compat/kubejs/event/AftermathEvents.java | 39 - .../kubejs/event/AftermathModifyEventJS.java | 32 - .../kubejs/util/AftermathEventJSUtil.java | 44 - .../event/PlayerEvent.java | 94 +++ .../structures/brick_well.nbt | Bin 565 -> 0 bytes .../structures/burnt_structure1.nbt | Bin 3551 -> 0 bytes .../structures/burnt_structure2.nbt | Bin 3028 -> 0 bytes .../structures/burnt_structure3.nbt | Bin 2071 -> 0 bytes .../structures/burnt_structure4.nbt | Bin 2033 -> 0 bytes .../structures/burnt_structure5.nbt | Bin 517 -> 0 bytes .../structures/burnt_structure6.nbt | Bin 511 -> 0 bytes .../structures/camp.nbt | Bin 2350 -> 0 bytes .../structures/city.nbt | Bin 348800 -> 0 bytes .../structures/cobblestone_pile.nbt | Bin 705 -> 0 bytes .../structures/construction1.nbt | Bin 4362 -> 0 bytes .../structures/construction2.nbt | Bin 3486 -> 0 bytes .../structures/house_of_sakura.nbt | Bin 5561 -> 0 bytes .../structures/logs.nbt | Bin 543 -> 0 bytes .../structures/nether_invasion_portal.nbt | Bin 40716 -> 0 bytes .../nether_invasion_portal_transformed.nbt | Bin 20895 -> 0 bytes .../structures/tent.nbt | Bin 2338 -> 0 bytes .../structures/wagon_cargo1.nbt | Bin 733 -> 0 bytes .../structures/wagon_cargo2.nbt | Bin 707 -> 0 bytes .../structures/wagon_cargo3.nbt | Bin 703 -> 0 bytes .../structures/wagon_cargo4.nbt | Bin 703 -> 0 bytes .../structures/wagon_cargo5.nbt | Bin 712 -> 0 bytes .../structures/wagon_cargo6.nbt | Bin 706 -> 0 bytes .../surviving_the_aftermath.mixins.json | 4 +- 206 files changed, 403 insertions(+), 8164 deletions(-) delete mode 100644 src/generated/resources/data/minecraft/tags/items/music_discs.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/aftermath/common.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/tags/entity_types/nether_mob.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/tags/worldgen/biome/has_burnt_structure.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/tags/worldgen/biome/has_city.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/tags/worldgen/biome/has_expansion_build.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/tags/worldgen/biome/has_house_of_sakura.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/tags/worldgen/biome/has_nether_raid.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/tags/worldgen/structure/nether_raid.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/biome/barren.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure/brick_well.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure1.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure2.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure3.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure4.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure5.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure6.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure/camp.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure/city.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure/cobblestone_pile.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure/construction1.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure/construction2.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure/house_of_sakura.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure/logs.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure/nether_raid.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure/tent.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo1.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo2.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo3.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo4.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo5.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo6.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/brick_well.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure1.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure2.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure3.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure4.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure5.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure6.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/camp.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/city.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/cobblestone_pile.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/construction1.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/construction2.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/house_of_sakura.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/logs.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/nether_raid.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/tent.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo1.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo2.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo3.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo4.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo5.json delete mode 100644 src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo6.json delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/AftermathState.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/Constant.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/IAftermath.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/IAftermathFactory.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/IJSONSerializable.java create mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/IModule.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/IStageData.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/ITracker.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/PortalShapeAccessor.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/aftermath/AftermathAPI.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/aftermath/AftermathManager.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/base/BaseAftermath.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/base/BaseAftermathModule.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/base/BaseTracker.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/module/IAftermathModule.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/module/IConditionModule.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/module/IWeightedListModule.java create mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/module/IWeightedModule.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/amount/FixedAmountModule.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/amount/RandomAmountModule.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/condition/StageConditionModule.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/entity_info/EntityInfoModule.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/entity_info/EntityInfoWithEquipmentModule.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/weighted/BaseWeightedListModule.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/weighted/EntityTypeWeightedListModule.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/weighted/ItemWeightedListModule.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/stage/LevelStageData.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/stage/PlayerStageData.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/api/stage/StageData.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/capability/AftermathCap.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/capability/StageDataCap.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/config/AftermathConfig.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/AftermathModuleProviders.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/EventSubscriber.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModBlockStateProvider.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModItemModelProvider.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModLanguageCNProvider.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModLanguageProvider.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModLootTableProvider.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModSoundProvider.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModTagProviders.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/RegistryDataGenerator.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/loot/ModBlockLoot.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/loot/ModChestLoot.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/loot/ModEntityLoot.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/raid/NetherRaidModuleProvider.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/data/pack/AftermathModuleLoader.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/effect/CowardiceEffect.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/BaseEnchantment.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/BloodthirstyEnchantment.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/CleanWaterEnchantment.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/CounterattackEnchantment.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/DevouredEnchantment.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/ExecuteEnchantment.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/FranticEnchantment.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/LifeTreeEnchantment.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/RangerEnchantment.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/SunAndMoonEnchantment.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/event/AftermathEvent.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/event/subscriber/ClientForgeEvent.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/event/subscriber/EnchantmentSubscriber.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/event/subscriber/ForgeEventSubscriber.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/event/subscriber/RaidEventSubscriber.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/event/subscriber/VillagerSubscriber.java create mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/init/ModAftermathModule.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/init/ModBiomes.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/init/ModBlocks.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/init/ModCapability.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/init/ModEnchantments.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/init/ModItems.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/init/ModMobEffects.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/init/ModSoundEvents.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/init/ModStructurePieceTypes.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/init/ModStructureSets.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/init/ModStructureTypes.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/init/ModStructures.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/init/ModTabs.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/init/ModTags.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/init/ModVillagers.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/level/biomes/ModBiomesMaker.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/mixin/MoveControlMixin.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/mixin/PortalShapeMixin.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/mixin/VillagerMixin.java create mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/module/amount/IntegerAmountModule.java create mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/module/amount/RandomAmountModule.java create mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/module/entity_info/EntityInfoModule.java create mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/module/weighted/BaseWeightedModule.java create mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/module/weighted/EntityTypeWeightedModule.java create mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/module/weighted/ItemWeightedModule.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/raid/NetherRaid.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/raid/api/BaseRaid.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/raid/api/IRaid.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/raid/api/IRaidModule.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/raid/module/BaseRaidModule.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/raid/module/NetherRaidModule.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/structure/AbstractStructure.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/structure/BurntStructure.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/structure/CityStructure.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/structure/HouseOfSakura.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/structure/NetherRaidStructure.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/BrickWellStructure.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/CampStructure.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/CobblestonePileStructure.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/ConstructionStructure.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/LogsStructure.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/TentStructure.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/WagonCargoStructure.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/package-info.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/structure/package-info.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/tracker/MobBattleTracker.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/tracker/RaidMobBattleTracker.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/tracker/RaidPlayerBattleTracker.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/util/AftermathEventUtil.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/util/RandomUtils.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/util/RegistryUtil.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/util/SpawnEntityUtil.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/common/util/StructureUtil.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/ModExtra.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/ModKubeJSPlugin.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/event/AftermathEventJS.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/event/AftermathEvents.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/event/AftermathModifyEventJS.java delete mode 100644 src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/util/AftermathEventJSUtil.java create mode 100644 src/main/java/com/pancake/surviving_the_aftermath/event/PlayerEvent.java delete mode 100644 src/main/resources/data/surviving_the_aftermath/structures/brick_well.nbt delete mode 100644 src/main/resources/data/surviving_the_aftermath/structures/burnt_structure1.nbt delete mode 100644 src/main/resources/data/surviving_the_aftermath/structures/burnt_structure2.nbt delete mode 100644 src/main/resources/data/surviving_the_aftermath/structures/burnt_structure3.nbt delete mode 100644 src/main/resources/data/surviving_the_aftermath/structures/burnt_structure4.nbt delete mode 100644 src/main/resources/data/surviving_the_aftermath/structures/burnt_structure5.nbt delete mode 100644 src/main/resources/data/surviving_the_aftermath/structures/burnt_structure6.nbt delete mode 100644 src/main/resources/data/surviving_the_aftermath/structures/camp.nbt delete mode 100644 src/main/resources/data/surviving_the_aftermath/structures/city.nbt delete mode 100644 src/main/resources/data/surviving_the_aftermath/structures/cobblestone_pile.nbt delete mode 100644 src/main/resources/data/surviving_the_aftermath/structures/construction1.nbt delete mode 100644 src/main/resources/data/surviving_the_aftermath/structures/construction2.nbt delete mode 100644 src/main/resources/data/surviving_the_aftermath/structures/house_of_sakura.nbt delete mode 100644 src/main/resources/data/surviving_the_aftermath/structures/logs.nbt delete mode 100644 src/main/resources/data/surviving_the_aftermath/structures/nether_invasion_portal.nbt delete mode 100644 src/main/resources/data/surviving_the_aftermath/structures/nether_invasion_portal_transformed.nbt delete mode 100644 src/main/resources/data/surviving_the_aftermath/structures/tent.nbt delete mode 100644 src/main/resources/data/surviving_the_aftermath/structures/wagon_cargo1.nbt delete mode 100644 src/main/resources/data/surviving_the_aftermath/structures/wagon_cargo2.nbt delete mode 100644 src/main/resources/data/surviving_the_aftermath/structures/wagon_cargo3.nbt delete mode 100644 src/main/resources/data/surviving_the_aftermath/structures/wagon_cargo4.nbt delete mode 100644 src/main/resources/data/surviving_the_aftermath/structures/wagon_cargo5.nbt delete mode 100644 src/main/resources/data/surviving_the_aftermath/structures/wagon_cargo6.nbt diff --git a/src/generated/resources/data/minecraft/tags/items/music_discs.json b/src/generated/resources/data/minecraft/tags/items/music_discs.json deleted file mode 100644 index 29e5ba5..0000000 --- a/src/generated/resources/data/minecraft/tags/items/music_discs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "surviving_the_aftermath:music_disk_orchelias_vox" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/aftermath/common.json b/src/generated/resources/data/surviving_the_aftermath/aftermath/common.json deleted file mode 100644 index e7fdcab..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/aftermath/common.json +++ /dev/null @@ -1,782 +0,0 @@ -{ - "identifier": "nether_raid", - "readyTime": 100, - "rewards": [ - { - "item": "minecraft:gold_ingot", - "weight": 100 - }, - { - "item": "minecraft:diamond", - "weight": 10 - }, - { - "item": "minecraft:emerald", - "weight": 20 - }, - { - "item": "minecraft:enchanted_golden_apple", - "weight": 2 - }, - { - "item": "minecraft:air", - "weight": 2 - }, - { - "item": "surviving_the_aftermath:nether_core", - "weight": 1 - } - ], - "waves": [ - [ - { - "amount": { - "identifier": "random_amount", - "max": 5, - "min": 4 - }, - "entityType": "minecraft:piglin", - "identifier": "entity_info" - } - ], - [ - { - "amount": { - "identifier": "random_amount", - "max": 5, - "min": 4 - }, - "entityType": "minecraft:zombified_piglin", - "identifier": "entity_info" - }, - { - "amount": { - "amount": 1, - "identifier": "fixed_amount" - }, - "entityType": "minecraft:hoglin", - "identifier": "entity_info" - } - ], - [ - { - "amount": { - "identifier": "random_amount", - "max": 5, - "min": 4 - }, - "entityType": "minecraft:piglin", - "identifier": "entity_info" - }, - { - "amount": { - "amount": 1, - "identifier": "fixed_amount" - }, - "entityType": "minecraft:hoglin", - "identifier": "entity_info" - }, - { - "amount": { - "amount": 1, - "identifier": "fixed_amount" - }, - "entityType": "minecraft:magma_cube", - "identifier": "entity_info" - } - ], - [ - { - "amount": { - "identifier": "random_amount", - "max": 5, - "min": 4 - }, - "entityType": "minecraft:piglin", - "identifier": "entity_info" - }, - { - "amount": { - "identifier": "random_amount", - "max": 2, - "min": 1 - }, - "entityType": "minecraft:hoglin", - "identifier": "entity_info" - }, - { - "amount": { - "amount": 1, - "identifier": "fixed_amount" - }, - "entityType": "minecraft:magma_cube", - "identifier": "entity_info" - }, - { - "amount": { - "amount": 1, - "identifier": "fixed_amount" - }, - "entityType": "minecraft:blaze", - "identifier": "entity_info" - } - ], - [ - { - "amount": { - "identifier": "random_amount", - "max": 4, - "min": 3 - }, - "entityType": "minecraft:piglin", - "identifier": "entity_info" - }, - { - "amount": { - "identifier": "random_amount", - "max": 2, - "min": 1 - }, - "entityType": "minecraft:hoglin", - "identifier": "entity_info" - }, - { - "amount": { - "identifier": "random_amount", - "max": 2, - "min": 1 - }, - "entityType": "minecraft:magma_cube", - "identifier": "entity_info" - }, - { - "amount": { - "amount": 1, - "identifier": "fixed_amount" - }, - "entityType": "minecraft:blaze", - "identifier": "entity_info" - }, - { - "amount": { - "amount": 1, - "identifier": "fixed_amount" - }, - "entityType": "minecraft:piglin_brute", - "equipment": [ - { - "item": "minecraft:golden_helmet", - "weight": 1 - }, - { - "item": "minecraft:golden_chestplate", - "weight": 1 - }, - { - "item": "minecraft:golden_leggings", - "weight": 1 - }, - { - "item": "minecraft:golden_boots", - "weight": 1 - }, - { - "item": "minecraft:golden_sword", - "weight": 1 - } - ], - "identifier": "entity_info" - } - ], - [ - { - "amount": { - "identifier": "random_amount", - "max": 4, - "min": 3 - }, - "entityType": "minecraft:piglin", - "equipment": [ - { - "item": "minecraft:golden_helmet", - "weight": 1 - }, - { - "item": "minecraft:golden_chestplate", - "weight": 1 - }, - { - "item": "minecraft:golden_leggings", - "weight": 1 - }, - { - "item": "minecraft:golden_boots", - "weight": 1 - }, - { - "item": "minecraft:golden_sword", - "weight": 1 - } - ], - "identifier": "entity_info" - }, - { - "amount": { - "identifier": "random_amount", - "max": 3, - "min": 2 - }, - "entityType": "minecraft:hoglin", - "identifier": "entity_info" - }, - { - "amount": { - "identifier": "random_amount", - "max": 2, - "min": 1 - }, - "entityType": "minecraft:magma_cube", - "identifier": "entity_info" - }, - { - "amount": { - "identifier": "random_amount", - "max": 3, - "min": 1 - }, - "entityType": "minecraft:ghast", - "identifier": "entity_info" - }, - { - "amount": { - "amount": 1, - "identifier": "fixed_amount" - }, - "entityType": "minecraft:blaze", - "identifier": "entity_info" - }, - { - "amount": { - "amount": 1, - "identifier": "fixed_amount" - }, - "entityType": "minecraft:piglin_brute", - "equipment": [ - { - "item": "minecraft:golden_helmet", - "weight": 1 - }, - { - "item": "minecraft:golden_chestplate", - "weight": 1 - }, - { - "item": "minecraft:golden_leggings", - "weight": 1 - }, - { - "item": "minecraft:golden_boots", - "weight": 1 - }, - { - "item": "minecraft:golden_sword", - "weight": 1 - } - ], - "identifier": "entity_info" - } - ], - [ - { - "amount": { - "identifier": "random_amount", - "max": 4, - "min": 3 - }, - "entityType": "minecraft:piglin", - "equipment": [ - { - "item": "minecraft:golden_helmet", - "weight": 1 - }, - { - "item": "minecraft:golden_chestplate", - "weight": 1 - }, - { - "item": "minecraft:golden_leggings", - "weight": 1 - }, - { - "item": "minecraft:golden_boots", - "weight": 1 - }, - { - "item": "minecraft:golden_sword", - "weight": 1 - } - ], - "identifier": "entity_info" - }, - { - "amount": { - "identifier": "random_amount", - "max": 4, - "min": 3 - }, - "entityType": "minecraft:hoglin", - "identifier": "entity_info" - }, - { - "amount": { - "identifier": "random_amount", - "max": 4, - "min": 2 - }, - "entityType": "minecraft:magma_cube", - "identifier": "entity_info" - }, - { - "amount": { - "identifier": "random_amount", - "max": 4, - "min": 2 - }, - "entityType": "minecraft:ghast", - "identifier": "entity_info" - }, - { - "amount": { - "amount": 2, - "identifier": "fixed_amount" - }, - "entityType": "minecraft:blaze", - "identifier": "entity_info" - }, - { - "amount": { - "amount": 1, - "identifier": "fixed_amount" - }, - "entityType": "minecraft:piglin_brute", - "equipment": [ - { - "item": "minecraft:golden_helmet", - "weight": 1 - }, - { - "item": "minecraft:golden_chestplate", - "weight": 1 - }, - { - "item": "minecraft:golden_leggings", - "weight": 1 - }, - { - "item": "minecraft:golden_boots", - "weight": 1 - }, - { - "item": "minecraft:golden_sword", - "weight": 1 - } - ], - "identifier": "entity_info" - } - ], - [ - { - "amount": { - "identifier": "random_amount", - "max": 4, - "min": 3 - }, - "entityType": "minecraft:piglin", - "equipment": [ - { - "item": "minecraft:golden_helmet", - "weight": 1 - }, - { - "item": "minecraft:golden_chestplate", - "weight": 1 - }, - { - "item": "minecraft:golden_leggings", - "weight": 1 - }, - { - "item": "minecraft:golden_boots", - "weight": 1 - }, - { - "item": "minecraft:golden_sword", - "weight": 1 - } - ], - "identifier": "entity_info" - }, - { - "amount": { - "identifier": "random_amount", - "max": 4, - "min": 2 - }, - "entityType": "minecraft:hoglin", - "identifier": "entity_info" - }, - { - "amount": { - "identifier": "random_amount", - "max": 4, - "min": 3 - }, - "entityType": "minecraft:magma_cube", - "identifier": "entity_info" - }, - { - "amount": { - "identifier": "random_amount", - "max": 4, - "min": 2 - }, - "entityType": "minecraft:ghast", - "identifier": "entity_info" - }, - { - "amount": { - "amount": 3, - "identifier": "fixed_amount" - }, - "entityType": "minecraft:blaze", - "identifier": "entity_info" - }, - { - "amount": { - "amount": 2, - "identifier": "fixed_amount" - }, - "entityType": "minecraft:piglin_brute", - "equipment": [ - { - "item": "minecraft:golden_helmet", - "weight": 1 - }, - { - "item": "minecraft:golden_chestplate", - "weight": 1 - }, - { - "item": "minecraft:golden_leggings", - "weight": 1 - }, - { - "item": "minecraft:golden_boots", - "weight": 1 - }, - { - "item": "minecraft:golden_sword", - "weight": 1 - } - ], - "identifier": "entity_info" - } - ], - [ - { - "amount": { - "identifier": "random_amount", - "max": 6, - "min": 4 - }, - "entityType": "minecraft:piglin", - "equipment": [ - { - "item": "minecraft:golden_helmet", - "weight": 1 - }, - { - "item": "minecraft:golden_chestplate", - "weight": 1 - }, - { - "item": "minecraft:golden_leggings", - "weight": 1 - }, - { - "item": "minecraft:golden_boots", - "weight": 1 - }, - { - "item": "minecraft:golden_sword", - "weight": 1 - } - ], - "identifier": "entity_info" - }, - { - "amount": { - "identifier": "random_amount", - "max": 6, - "min": 3 - }, - "entityType": "minecraft:hoglin", - "identifier": "entity_info" - }, - { - "amount": { - "identifier": "random_amount", - "max": 5, - "min": 3 - }, - "entityType": "minecraft:magma_cube", - "identifier": "entity_info" - }, - { - "amount": { - "identifier": "random_amount", - "max": 5, - "min": 3 - }, - "entityType": "minecraft:ghast", - "identifier": "entity_info" - }, - { - "amount": { - "amount": 4, - "identifier": "fixed_amount" - }, - "entityType": "minecraft:blaze", - "identifier": "entity_info" - }, - { - "amount": { - "amount": 3, - "identifier": "fixed_amount" - }, - "entityType": "minecraft:piglin_brute", - "equipment": [ - { - "item": "minecraft:golden_helmet", - "weight": 1 - }, - { - "item": "minecraft:golden_chestplate", - "weight": 1 - }, - { - "item": "minecraft:golden_leggings", - "weight": 1 - }, - { - "item": "minecraft:golden_boots", - "weight": 1 - }, - { - "item": "minecraft:golden_sword", - "weight": 1 - } - ], - "identifier": "entity_info" - } - ], - [ - { - "amount": { - "identifier": "random_amount", - "max": 6, - "min": 2 - }, - "entityType": "minecraft:piglin", - "equipment": [ - { - "item": "minecraft:golden_helmet", - "weight": 1 - }, - { - "item": "minecraft:golden_chestplate", - "weight": 1 - }, - { - "item": "minecraft:golden_leggings", - "weight": 1 - }, - { - "item": "minecraft:golden_boots", - "weight": 1 - }, - { - "item": "minecraft:golden_sword", - "weight": 1 - } - ], - "identifier": "entity_info" - }, - { - "amount": { - "identifier": "random_amount", - "max": 6, - "min": 2 - }, - "entityType": "minecraft:hoglin", - "identifier": "entity_info" - }, - { - "amount": { - "identifier": "random_amount", - "max": 6, - "min": 2 - }, - "entityType": "minecraft:magma_cube", - "identifier": "entity_info" - }, - { - "amount": { - "identifier": "random_amount", - "max": 6, - "min": 2 - }, - "entityType": "minecraft:ghast", - "identifier": "entity_info" - }, - { - "amount": { - "amount": 6, - "identifier": "fixed_amount" - }, - "entityType": "minecraft:blaze", - "identifier": "entity_info" - }, - { - "amount": { - "identifier": "random_amount", - "max": 5, - "min": 3 - }, - "entityType": "minecraft:piglin_brute", - "equipment": [ - { - "item": "minecraft:golden_helmet", - "weight": 1 - }, - { - "item": "minecraft:golden_chestplate", - "weight": 1 - }, - { - "item": "minecraft:golden_leggings", - "weight": 1 - }, - { - "item": "minecraft:golden_boots", - "weight": 1 - }, - { - "item": "minecraft:golden_sword", - "weight": 1 - } - ], - "identifier": "entity_info" - } - ], - [ - { - "amount": { - "identifier": "random_amount", - "max": 8, - "min": 1 - }, - "entityType": "minecraft:piglin", - "equipment": [ - { - "item": "minecraft:golden_helmet", - "weight": 1 - }, - { - "item": "minecraft:golden_chestplate", - "weight": 1 - }, - { - "item": "minecraft:golden_leggings", - "weight": 1 - }, - { - "item": "minecraft:golden_boots", - "weight": 1 - }, - { - "item": "minecraft:golden_sword", - "weight": 1 - } - ], - "identifier": "entity_info" - }, - { - "amount": { - "identifier": "random_amount", - "max": 8, - "min": 1 - }, - "entityType": "minecraft:hoglin", - "identifier": "entity_info" - }, - { - "amount": { - "identifier": "random_amount", - "max": 8, - "min": 1 - }, - "entityType": "minecraft:magma_cube", - "identifier": "entity_info" - }, - { - "amount": { - "identifier": "random_amount", - "max": 8, - "min": 1 - }, - "entityType": "minecraft:ghast", - "identifier": "entity_info" - }, - { - "amount": { - "identifier": "random_amount", - "max": 8, - "min": 1 - }, - "entityType": "minecraft:blaze", - "identifier": "entity_info" - }, - { - "amount": { - "amount": 8, - "identifier": "fixed_amount" - }, - "entityType": "minecraft:piglin_brute", - "equipment": [ - { - "item": "minecraft:netherite_helmet", - "weight": 1 - }, - { - "item": "minecraft:netherite_chestplate", - "weight": 1 - }, - { - "item": "minecraft:netherite_leggings", - "weight": 1 - }, - { - "item": "minecraft:netherite_boots", - "weight": 1 - }, - { - "item": "minecraft:netherite_sword", - "weight": 1 - } - ], - "identifier": "entity_info" - } - ] - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/tags/entity_types/nether_mob.json b/src/generated/resources/data/surviving_the_aftermath/tags/entity_types/nether_mob.json deleted file mode 100644 index 607db3f..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/tags/entity_types/nether_mob.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "values": [ - "minecraft:zombified_piglin", - "minecraft:ghast", - "minecraft:magma_cube", - "minecraft:blaze", - "minecraft:skeleton", - "minecraft:wither_skeleton", - "minecraft:enderman", - "minecraft:hoglin", - "minecraft:piglin", - "minecraft:piglin_brute", - "minecraft:strider" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/tags/worldgen/biome/has_burnt_structure.json b/src/generated/resources/data/surviving_the_aftermath/tags/worldgen/biome/has_burnt_structure.json deleted file mode 100644 index ef5b750..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/tags/worldgen/biome/has_burnt_structure.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "#minecraft:is_badlands", - "#minecraft:has_structure/desert_pyramid" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/tags/worldgen/biome/has_city.json b/src/generated/resources/data/surviving_the_aftermath/tags/worldgen/biome/has_city.json deleted file mode 100644 index 8b5e6c2..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/tags/worldgen/biome/has_city.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "minecraft:plains" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/tags/worldgen/biome/has_expansion_build.json b/src/generated/resources/data/surviving_the_aftermath/tags/worldgen/biome/has_expansion_build.json deleted file mode 100644 index 3b9fc26..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/tags/worldgen/biome/has_expansion_build.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "#minecraft:is_forest", - "minecraft:plains" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/tags/worldgen/biome/has_house_of_sakura.json b/src/generated/resources/data/surviving_the_aftermath/tags/worldgen/biome/has_house_of_sakura.json deleted file mode 100644 index 4c83435..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/tags/worldgen/biome/has_house_of_sakura.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "minecraft:cherry_grove" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/tags/worldgen/biome/has_nether_raid.json b/src/generated/resources/data/surviving_the_aftermath/tags/worldgen/biome/has_nether_raid.json deleted file mode 100644 index 8b5e6c2..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/tags/worldgen/biome/has_nether_raid.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "minecraft:plains" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/tags/worldgen/structure/nether_raid.json b/src/generated/resources/data/surviving_the_aftermath/tags/worldgen/structure/nether_raid.json deleted file mode 100644 index c0b42fa..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/tags/worldgen/structure/nether_raid.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "values": [ - { - "id": "surviving_the_aftermath:nether_raid", - "required": false - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/biome/barren.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/biome/barren.json deleted file mode 100644 index 9a4a748..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/biome/barren.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "carvers": {}, - "downfall": 0.9, - "effects": { - "fog_color": 12638463, - "particle": { - "options": { - "type": "minecraft:white_ash" - }, - "probability": 0.118093334 - }, - "sky_color": 7254527, - "water_color": 4159204, - "water_fog_color": 329011 - }, - "features": [], - "has_precipitation": true, - "spawn_costs": {}, - "spawners": { - "ambient": [ - { - "type": "minecraft:bat", - "maxCount": 8, - "minCount": 8, - "weight": 10 - } - ], - "axolotls": [], - "creature": [], - "misc": [], - "monster": [ - { - "type": "minecraft:zombified_piglin", - "maxCount": 4, - "minCount": 4, - "weight": 100 - }, - { - "type": "minecraft:spider", - "maxCount": 4, - "minCount": 4, - "weight": 100 - }, - { - "type": "minecraft:zombie", - "maxCount": 4, - "minCount": 4, - "weight": 95 - }, - { - "type": "minecraft:zombie_villager", - "maxCount": 1, - "minCount": 1, - "weight": 5 - }, - { - "type": "minecraft:skeleton", - "maxCount": 4, - "minCount": 4, - "weight": 100 - }, - { - "type": "minecraft:creeper", - "maxCount": 4, - "minCount": 4, - "weight": 100 - }, - { - "type": "minecraft:slime", - "maxCount": 4, - "minCount": 4, - "weight": 100 - }, - { - "type": "minecraft:enderman", - "maxCount": 4, - "minCount": 1, - "weight": 10 - }, - { - "type": "minecraft:witch", - "maxCount": 1, - "minCount": 1, - "weight": 5 - } - ], - "underground_water_creature": [ - { - "type": "minecraft:glow_squid", - "maxCount": 6, - "minCount": 4, - "weight": 10 - } - ], - "water_ambient": [], - "water_creature": [] - }, - "temperature": 0.8 -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/brick_well.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/brick_well.json deleted file mode 100644 index 89a9a53..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/brick_well.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "surviving_the_aftermath:brick_well", - "biomes": "#surviving_the_aftermath:has_expansion_build", - "spawn_overrides": {}, - "step": "surface_structures" -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure1.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure1.json deleted file mode 100644 index 0630684..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure1.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "surviving_the_aftermath:burnt_structure1", - "biomes": "#surviving_the_aftermath:has_burnt_structure", - "spawn_overrides": {}, - "step": "surface_structures" -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure2.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure2.json deleted file mode 100644 index 2252609..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure2.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "surviving_the_aftermath:burnt_structure2", - "biomes": "#surviving_the_aftermath:has_burnt_structure", - "spawn_overrides": {}, - "step": "surface_structures" -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure3.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure3.json deleted file mode 100644 index 9e4630e..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure3.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "surviving_the_aftermath:burnt_structure3", - "biomes": "#surviving_the_aftermath:has_burnt_structure", - "spawn_overrides": {}, - "step": "surface_structures" -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure4.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure4.json deleted file mode 100644 index 56800ff..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure4.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "surviving_the_aftermath:burnt_structure4", - "biomes": "#surviving_the_aftermath:has_burnt_structure", - "spawn_overrides": {}, - "step": "surface_structures" -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure5.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure5.json deleted file mode 100644 index e3a8072..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure5.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "surviving_the_aftermath:burnt_structure5", - "biomes": "#surviving_the_aftermath:has_burnt_structure", - "spawn_overrides": {}, - "step": "surface_structures" -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure6.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure6.json deleted file mode 100644 index 6c38abf..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/burnt_structure6.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "surviving_the_aftermath:burnt_structure6", - "biomes": "#surviving_the_aftermath:has_burnt_structure", - "spawn_overrides": {}, - "step": "surface_structures" -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/camp.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/camp.json deleted file mode 100644 index d82a136..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/camp.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "surviving_the_aftermath:camo", - "biomes": "#surviving_the_aftermath:has_expansion_build", - "spawn_overrides": {}, - "step": "surface_structures" -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/city.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/city.json deleted file mode 100644 index 1e86215..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/city.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "surviving_the_aftermath:city", - "biomes": "#surviving_the_aftermath:has_city", - "spawn_overrides": {}, - "step": "surface_structures", - "terrain_adaptation": "beard_box" -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/cobblestone_pile.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/cobblestone_pile.json deleted file mode 100644 index e70ac97..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/cobblestone_pile.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "surviving_the_aftermath:cobblestone_pile", - "biomes": "#surviving_the_aftermath:has_expansion_build", - "spawn_overrides": {}, - "step": "surface_structures" -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/construction1.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/construction1.json deleted file mode 100644 index fb5eae0..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/construction1.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "surviving_the_aftermath:construction1", - "biomes": "#surviving_the_aftermath:has_expansion_build", - "spawn_overrides": {}, - "step": "surface_structures" -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/construction2.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/construction2.json deleted file mode 100644 index 51315c1..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/construction2.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "surviving_the_aftermath:construction2", - "biomes": "#surviving_the_aftermath:has_expansion_build", - "spawn_overrides": {}, - "step": "surface_structures" -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/house_of_sakura.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/house_of_sakura.json deleted file mode 100644 index f4108e7..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/house_of_sakura.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "surviving_the_aftermath:house_of_sakura", - "biomes": "#surviving_the_aftermath:has_house_of_sakura", - "spawn_overrides": {}, - "step": "surface_structures", - "terrain_adaptation": "beard_thin" -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/logs.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/logs.json deleted file mode 100644 index 5a7a6f9..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/logs.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "surviving_the_aftermath:logs", - "biomes": "#surviving_the_aftermath:has_expansion_build", - "spawn_overrides": {}, - "step": "surface_structures" -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/nether_raid.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/nether_raid.json deleted file mode 100644 index 886d73a..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/nether_raid.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "surviving_the_aftermath:nether_raid", - "biomes": "#surviving_the_aftermath:has_nether_raid", - "spawn_overrides": {}, - "step": "surface_structures", - "terrain_adaptation": "beard_thin" -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/tent.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/tent.json deleted file mode 100644 index a5c9ac5..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/tent.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "surviving_the_aftermath:tent", - "biomes": "#surviving_the_aftermath:has_expansion_build", - "spawn_overrides": {}, - "step": "surface_structures" -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo1.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo1.json deleted file mode 100644 index f38ea66..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo1.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "surviving_the_aftermath:wagon_cargo1", - "biomes": "#surviving_the_aftermath:has_expansion_build", - "spawn_overrides": {}, - "step": "surface_structures" -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo2.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo2.json deleted file mode 100644 index 20898ff..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo2.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "surviving_the_aftermath:wagon_cargo2", - "biomes": "#surviving_the_aftermath:has_expansion_build", - "spawn_overrides": {}, - "step": "surface_structures" -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo3.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo3.json deleted file mode 100644 index 71430d5..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo3.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "surviving_the_aftermath:wagon_cargo3", - "biomes": "#surviving_the_aftermath:has_expansion_build", - "spawn_overrides": {}, - "step": "surface_structures" -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo4.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo4.json deleted file mode 100644 index 0ed1164..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo4.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "surviving_the_aftermath:wagon_cargo4", - "biomes": "#surviving_the_aftermath:has_expansion_build", - "spawn_overrides": {}, - "step": "surface_structures" -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo5.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo5.json deleted file mode 100644 index aec37c1..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo5.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "surviving_the_aftermath:wagon_cargo5", - "biomes": "#surviving_the_aftermath:has_expansion_build", - "spawn_overrides": {}, - "step": "surface_structures" -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo6.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo6.json deleted file mode 100644 index 930fff6..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure/wagon_cargo6.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "type": "surviving_the_aftermath:wagon_cargo6", - "biomes": "#surviving_the_aftermath:has_expansion_build", - "spawn_overrides": {}, - "step": "surface_structures" -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/brick_well.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/brick_well.json deleted file mode 100644 index 6ca4cf7..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/brick_well.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "placement": { - "type": "minecraft:random_spread", - "salt": 1561323135, - "separation": 40, - "spacing": 95 - }, - "structures": [ - { - "structure": "surviving_the_aftermath:brick_well", - "weight": 1 - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure1.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure1.json deleted file mode 100644 index 9e17eb0..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure1.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "placement": { - "type": "minecraft:random_spread", - "salt": 104706480, - "separation": 40, - "spacing": 80 - }, - "structures": [ - { - "structure": "surviving_the_aftermath:burnt_structure1", - "weight": 1 - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure2.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure2.json deleted file mode 100644 index 81b4c91..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure2.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "placement": { - "type": "minecraft:random_spread", - "salt": 705540248, - "separation": 40, - "spacing": 80 - }, - "structures": [ - { - "structure": "surviving_the_aftermath:burnt_structure2", - "weight": 1 - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure3.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure3.json deleted file mode 100644 index 048bca7..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure3.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "placement": { - "type": "minecraft:random_spread", - "salt": 1838764692, - "separation": 40, - "spacing": 80 - }, - "structures": [ - { - "structure": "surviving_the_aftermath:burnt_structure3", - "weight": 1 - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure4.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure4.json deleted file mode 100644 index 6951be1..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure4.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "placement": { - "type": "minecraft:random_spread", - "salt": 1669956657, - "separation": 40, - "spacing": 80 - }, - "structures": [ - { - "structure": "surviving_the_aftermath:burnt_structure4", - "weight": 1 - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure5.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure5.json deleted file mode 100644 index 22a5f15..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure5.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "placement": { - "type": "minecraft:random_spread", - "salt": 1334899266, - "separation": 40, - "spacing": 80 - }, - "structures": [ - { - "structure": "surviving_the_aftermath:burnt_structure5", - "weight": 1 - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure6.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure6.json deleted file mode 100644 index 6d87eb2..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/burnt_structure6.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "placement": { - "type": "minecraft:random_spread", - "salt": 2119656745, - "separation": 40, - "spacing": 80 - }, - "structures": [ - { - "structure": "surviving_the_aftermath:burnt_structure6", - "weight": 1 - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/camp.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/camp.json deleted file mode 100644 index 05fb9b0..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/camp.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "placement": { - "type": "minecraft:random_spread", - "salt": 1310135130, - "separation": 40, - "spacing": 100 - }, - "structures": [ - { - "structure": "surviving_the_aftermath:camp", - "weight": 1 - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/city.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/city.json deleted file mode 100644 index 8adf2a3..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/city.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "placement": { - "type": "minecraft:random_spread", - "salt": 2057068235, - "separation": 40, - "spacing": 80 - }, - "structures": [ - { - "structure": "surviving_the_aftermath:city", - "weight": 1 - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/cobblestone_pile.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/cobblestone_pile.json deleted file mode 100644 index 07854b4..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/cobblestone_pile.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "placement": { - "type": "minecraft:random_spread", - "salt": 795416633, - "separation": 40, - "spacing": 75 - }, - "structures": [ - { - "structure": "surviving_the_aftermath:cobblestone_pile", - "weight": 1 - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/construction1.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/construction1.json deleted file mode 100644 index b6f33bf..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/construction1.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "placement": { - "type": "minecraft:random_spread", - "salt": 761313131, - "separation": 40, - "spacing": 100 - }, - "structures": [ - { - "structure": "surviving_the_aftermath:construction1", - "weight": 1 - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/construction2.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/construction2.json deleted file mode 100644 index d00696b..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/construction2.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "placement": { - "type": "minecraft:random_spread", - "salt": 498231431, - "separation": 40, - "spacing": 85 - }, - "structures": [ - { - "structure": "surviving_the_aftermath:construction2", - "weight": 1 - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/house_of_sakura.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/house_of_sakura.json deleted file mode 100644 index 6273a69..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/house_of_sakura.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "placement": { - "type": "minecraft:random_spread", - "salt": 1712650656, - "separation": 40, - "spacing": 80 - }, - "structures": [ - { - "structure": "surviving_the_aftermath:house_of_sakura", - "weight": 1 - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/logs.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/logs.json deleted file mode 100644 index 6737d2a..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/logs.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "placement": { - "type": "minecraft:random_spread", - "salt": 1321561321, - "separation": 40, - "spacing": 90 - }, - "structures": [ - { - "structure": "surviving_the_aftermath:logs", - "weight": 1 - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/nether_raid.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/nether_raid.json deleted file mode 100644 index d630427..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/nether_raid.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "placement": { - "type": "minecraft:random_spread", - "salt": 1629143766, - "separation": 40, - "spacing": 100 - }, - "structures": [ - { - "structure": "surviving_the_aftermath:nether_raid", - "weight": 1 - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/tent.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/tent.json deleted file mode 100644 index 6ae998c..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/tent.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "placement": { - "type": "minecraft:random_spread", - "salt": 1653821652, - "separation": 40, - "spacing": 90 - }, - "structures": [ - { - "structure": "surviving_the_aftermath:tent", - "weight": 1 - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo1.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo1.json deleted file mode 100644 index 5bb2ffc..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo1.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "placement": { - "type": "minecraft:random_spread", - "salt": 1365330241, - "separation": 40, - "spacing": 90 - }, - "structures": [ - { - "structure": "surviving_the_aftermath:wagon_cargo1", - "weight": 1 - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo2.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo2.json deleted file mode 100644 index d94eaab..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo2.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "placement": { - "type": "minecraft:random_spread", - "salt": 161766032, - "separation": 40, - "spacing": 90 - }, - "structures": [ - { - "structure": "surviving_the_aftermath:wagon_cargo2", - "weight": 1 - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo3.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo3.json deleted file mode 100644 index 526a6b2..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo3.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "placement": { - "type": "minecraft:random_spread", - "salt": 1733648479, - "separation": 40, - "spacing": 90 - }, - "structures": [ - { - "structure": "surviving_the_aftermath:wagon_cargo3", - "weight": 1 - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo4.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo4.json deleted file mode 100644 index 7591f65..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo4.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "placement": { - "type": "minecraft:random_spread", - "salt": 2081980804, - "separation": 40, - "spacing": 90 - }, - "structures": [ - { - "structure": "surviving_the_aftermath:wagon_cargo4", - "weight": 1 - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo5.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo5.json deleted file mode 100644 index aab2798..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo5.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "placement": { - "type": "minecraft:random_spread", - "salt": 418595573, - "separation": 40, - "spacing": 90 - }, - "structures": [ - { - "structure": "surviving_the_aftermath:wagon_cargo5", - "weight": 1 - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo6.json b/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo6.json deleted file mode 100644 index 82457cd..0000000 --- a/src/generated/resources/data/surviving_the_aftermath/worldgen/structure_set/wagon_cargo6.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "placement": { - "type": "minecraft:random_spread", - "salt": 947847921, - "separation": 40, - "spacing": 90 - }, - "structures": [ - { - "structure": "surviving_the_aftermath:wagon_cargo6", - "weight": 1 - } - ] -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/SurvivingTheAftermath.java b/src/main/java/com/pancake/surviving_the_aftermath/SurvivingTheAftermath.java index 066505b..625450a 100644 --- a/src/main/java/com/pancake/surviving_the_aftermath/SurvivingTheAftermath.java +++ b/src/main/java/com/pancake/surviving_the_aftermath/SurvivingTheAftermath.java @@ -1,95 +1,29 @@ package com.pancake.surviving_the_aftermath; import com.mojang.logging.LogUtils; -import com.pancake.surviving_the_aftermath.api.aftermath.AftermathAPI; -import com.pancake.surviving_the_aftermath.api.module.impl.amount.FixedAmountModule; -import com.pancake.surviving_the_aftermath.api.module.impl.amount.RandomAmountModule; -import com.pancake.surviving_the_aftermath.api.module.impl.condition.StageConditionModule; -import com.pancake.surviving_the_aftermath.api.module.impl.entity_info.EntityInfoModule; -import com.pancake.surviving_the_aftermath.api.module.impl.entity_info.EntityInfoWithEquipmentModule; -import com.pancake.surviving_the_aftermath.api.module.impl.weighted.EntityTypeWeightedListModule; -import com.pancake.surviving_the_aftermath.api.module.impl.weighted.ItemWeightedListModule; -import com.pancake.surviving_the_aftermath.common.config.AftermathConfig; -import com.pancake.surviving_the_aftermath.common.data.datagen.EventSubscriber; -import com.pancake.surviving_the_aftermath.common.data.pack.AftermathModuleLoader; -import com.pancake.surviving_the_aftermath.common.event.subscriber.EnchantmentSubscriber; -import com.pancake.surviving_the_aftermath.common.init.*; -import com.pancake.surviving_the_aftermath.common.raid.NetherRaid; -import com.pancake.surviving_the_aftermath.common.raid.module.NetherRaidModule; -import com.pancake.surviving_the_aftermath.common.tracker.MobBattleTracker; -import com.pancake.surviving_the_aftermath.common.tracker.RaidMobBattleTracker; -import com.pancake.surviving_the_aftermath.common.tracker.RaidPlayerBattleTracker; + +import com.pancake.surviving_the_aftermath.common.init.ModAftermathModule; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.AddReloadListenerEvent; import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.config.ModConfig; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import org.slf4j.Logger; -import java.lang.reflect.Field; - @Mod(SurvivingTheAftermath.MOD_ID) public class SurvivingTheAftermath { public static final String MOD_ID = "surviving_the_aftermath"; public static final Logger LOGGER = LogUtils.getLogger(); public SurvivingTheAftermath() { IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus(); - ModBlocks.BLOCKS.register(bus); - ModItems.ITEMS.register(bus); - ModTabs.TABS.register(bus); - ModVillagers.VILLAGER_PROFESSIONS.register(bus); - ModEnchantments.ENCHANTMENTS.register(bus); - ModSoundEvents.SOUND_EVENTS.register(bus); - ModStructurePieceTypes.STRUCTURE_PIECE_TYPES.register(bus); - ModStructureTypes.STRUCTURE_TYPES.register(bus); - ModMobEffects.MOB_EFFECTS.register(bus); - bus.addListener(EventSubscriber::onGatherData); - bus.addListener(EnchantmentSubscriber::onFMLClientSetup); - bus.addListener(this::commonSetup); MinecraftForge.EVENT_BUS.register(this); - MinecraftForge.EVENT_BUS.addListener(this::onDataPackLoad); + bus.addListener(ModAftermathModule::onNewRegistry); + ModAftermathModule.MODULE.register(bus); - ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, AftermathConfig.SPEC); } public static ResourceLocation asResource(String path) { return new ResourceLocation(MOD_ID, path); } - private void commonSetup(final FMLCommonSetupEvent event) { - AftermathAPI instance = AftermathAPI.getInstance(); - instance.registerWeightedListModule(EntityTypeWeightedListModule.IDENTIFIER, EntityTypeWeightedListModule.class); - instance.registerWeightedListModule(ItemWeightedListModule.IDENTIFIER, ItemWeightedListModule.class); - - instance.registerTracker(RaidMobBattleTracker.IDENTIFIER,RaidMobBattleTracker.class); - instance.registerTracker(RaidPlayerBattleTracker.IDENTIFIER,RaidPlayerBattleTracker.class); - instance.registerTracker(MobBattleTracker.IDENTIFIER,MobBattleTracker.class); - - instance.registerAmountModule(FixedAmountModule.IDENTIFIER,FixedAmountModule.class); - instance.registerAmountModule(RandomAmountModule.IDENTIFIER,RandomAmountModule.class); - - instance.registerEntityInfoModule(EntityInfoModule.IDENTIFIER, EntityInfoModule.class); - instance.registerEntityInfoModule(EntityInfoWithEquipmentModule.IDENTIFIER,EntityInfoWithEquipmentModule.class); - - instance.registerAftermathModule(NetherRaid.IDENTIFIER, NetherRaidModule.class); - instance.registerAftermathFactory(NetherRaid.IDENTIFIER, NetherRaid.Factory.class); - instance.registerConditionModule(StageConditionModule.LevelStageConditionModule.IDENTIFIER, StageConditionModule.LevelStageConditionModule.class); - instance.registerConditionModule(StageConditionModule.PlayerStageConditionModule.IDENTIFIER, StageConditionModule.PlayerStageConditionModule.class); - } - - @SubscribeEvent - public void onDataPackLoad(AddReloadListenerEvent event) { - event.addListener(new AftermathModuleLoader()); - } - - public static T getPrivateField(Object object, String fieldName, Class fieldType) throws NoSuchFieldException, IllegalAccessException { - Field field = object.getClass().getDeclaredField(fieldName); - field.setAccessible(true); - return fieldType.cast(field.get(object)); - } } diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/AftermathState.java b/src/main/java/com/pancake/surviving_the_aftermath/api/AftermathState.java deleted file mode 100644 index f2761e3..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/AftermathState.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.pancake.surviving_the_aftermath.api; - -public enum AftermathState { - START("start", 0), - READY("ready", 1), - ONGOING("ongoing", 2), - VICTORY("victory", 3), - LOSE("lose", 4), - CELEBRATING("celebrating", 5), - END("end", 6); - - private final String name; - private final int index; - - AftermathState(String name, int index) { - this.name = name; - this.index = index; - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/Constant.java b/src/main/java/com/pancake/surviving_the_aftermath/api/Constant.java deleted file mode 100644 index 16dcad7..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/Constant.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.pancake.surviving_the_aftermath.api; - -public class Constant { - public static final String IDENTIFIER = "identifier"; - public static final String REWARDS = "rewards"; - public static final String UUID = "uuid"; - public static final String MOD_NAME = "SurvivingTheAftermath"; - public static final String MODULE = "module"; - public static final String PLAYERS = "players"; - public static final String WAVES = "waves"; - public static final String AMOUNT = "amount"; - public static final String ENTITY_TYPE = "entityType"; - public static final String CURRENT_WAVE = "currentWave"; - public static final String READY_TIME = "readyTime"; - public static final String REWARD_TIME = "rewardTime"; - public static final String ENEMIES = "enemies"; - public static final String SPAWN_POS = "spawnPos"; - public static final String MIN = "min"; - public static final String MAX = "max"; - public static final String EQUIPMENT = "equipment"; - public static final String WEIGHT = "weight"; - public static final String CENTER_POS = "centerPos"; - public static final String PROGRESS = "progressPercent"; - public static final String ITEM = "item"; - public static final String DEATH_MAP = "deathMap"; - public static final String DEATH_COUNT = "deathCount"; - public static final String ESCAPE_MAP = "escapeMap"; - public static final String ESCAPE_TIME = "escapeTime"; - //观战者 - public static final String SPECTATOR_MAP = "spectatorMap"; - public static final String SPECTATOR_LIST = "spectatorList"; - public static final String TRACKER = "tracker"; - public static final String TOTAL_ENEMY = "totalEnemy"; - public static final String LEVEL_STAGES = "levelStages"; - public static final String PLAYER_STAGES = "playerStages"; -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/IAftermath.java b/src/main/java/com/pancake/surviving_the_aftermath/api/IAftermath.java deleted file mode 100644 index 2a5dfe2..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/IAftermath.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.pancake.surviving_the_aftermath.api; - -import com.pancake.surviving_the_aftermath.api.base.BaseAftermathModule; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.common.util.INBTSerializable; - -import java.util.List; -import java.util.Set; -import java.util.UUID; -import java.util.function.Predicate; - -public interface IAftermath extends IIdentifier, INBTSerializable { - void tick(); - - default void bindTrackers() { - - } - List getTrackers(); - - boolean isEnd(); - boolean isLose(); - boolean isCreate(); - UUID getUUID(); - - ResourceLocation getBarsResource(); - - int[] getBarsOffset(); - - Predicate validPlayer(); - - Set getEnemies(); - - Set getPlayers(); - - void updatePlayers(); - - void updateProgress(); - void spawnRewards(); - - void end(); - void lose(); - T getModule(); - - void ready(); -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/IAftermathFactory.java b/src/main/java/com/pancake/surviving_the_aftermath/api/IAftermathFactory.java deleted file mode 100644 index 1c69b49..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/IAftermathFactory.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.pancake.surviving_the_aftermath.api; - -import com.pancake.surviving_the_aftermath.api.base.BaseAftermathModule; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.server.level.ServerLevel; - -public interface IAftermathFactory{ - IAftermath create(ServerLevel level, CompoundTag compound); -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/IIdentifier.java b/src/main/java/com/pancake/surviving_the_aftermath/api/IIdentifier.java index 26a5af4..ab14efe 100644 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/IIdentifier.java +++ b/src/main/java/com/pancake/surviving_the_aftermath/api/IIdentifier.java @@ -2,4 +2,4 @@ public interface IIdentifier { String getUniqueIdentifier(); -} +} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/IJSONSerializable.java b/src/main/java/com/pancake/surviving_the_aftermath/api/IJSONSerializable.java deleted file mode 100644 index b848493..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/IJSONSerializable.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.pancake.surviving_the_aftermath.api; - -import com.google.gson.JsonElement; - -public interface IJSONSerializable { - void deserializeJson(JsonElement jsonElement); - JsonElement serializeJson(); -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/IModule.java b/src/main/java/com/pancake/surviving_the_aftermath/api/IModule.java new file mode 100644 index 0000000..e1f3cb4 --- /dev/null +++ b/src/main/java/com/pancake/surviving_the_aftermath/api/IModule.java @@ -0,0 +1,4 @@ +package com.pancake.surviving_the_aftermath.api; + +public interface IModule extends IIdentifier{ +} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/IStageData.java b/src/main/java/com/pancake/surviving_the_aftermath/api/IStageData.java deleted file mode 100644 index 597d150..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/IStageData.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.pancake.surviving_the_aftermath.api; - -import net.minecraft.nbt.CompoundTag; -import net.minecraftforge.common.util.INBTSerializable; - -import java.util.Collection; - -public interface IStageData extends IIdentifier, INBTSerializable { - Collection getStages(); - - boolean hasStage(String stage); - - void addStage(String stage); - - void removeStage(String stage); - - void clear(); - - -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/ITracker.java b/src/main/java/com/pancake/surviving_the_aftermath/api/ITracker.java deleted file mode 100644 index aaa8509..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/ITracker.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.pancake.surviving_the_aftermath.api; - -import net.minecraft.nbt.CompoundTag; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.util.INBTSerializable; - -import java.util.UUID; - -public interface ITracker extends IIdentifier, INBTSerializable { - static void register(ITracker tracker) { - MinecraftForge.EVENT_BUS.register(tracker); - } - static void unregister(ITracker tracker) { - MinecraftForge.EVENT_BUS.unregister(tracker); - } - - public ITracker setUUID(UUID uuid); -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/PortalShapeAccessor.java b/src/main/java/com/pancake/surviving_the_aftermath/api/PortalShapeAccessor.java deleted file mode 100644 index 97acb59..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/PortalShapeAccessor.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.pancake.surviving_the_aftermath.api; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; - -public interface PortalShapeAccessor { - //bottomLeft - BlockPos survivingTheAftermath$getBottomLeft(); - - //height - int survivingTheAftermath$getHeight(); - - //width - int survivingTheAftermath$getWidth(); - - //rightDir - Direction survivingTheAftermath$getRightDir(); -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/aftermath/AftermathAPI.java b/src/main/java/com/pancake/surviving_the_aftermath/api/aftermath/AftermathAPI.java deleted file mode 100644 index a8ed517..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/aftermath/AftermathAPI.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.pancake.surviving_the_aftermath.api.aftermath; - -import com.google.common.collect.Maps; -import com.mojang.logging.LogUtils; -import com.pancake.surviving_the_aftermath.api.IAftermathFactory; -import com.pancake.surviving_the_aftermath.api.ITracker; -import com.pancake.surviving_the_aftermath.api.module.*; -import com.pancake.surviving_the_aftermath.common.util.AftermathEventUtil; -import com.pancake.surviving_the_aftermath.common.util.RandomUtils; -import org.slf4j.Logger; - -import java.lang.reflect.InvocationTargetException; -import java.util.*; -import java.util.stream.Collectors; - -public class AftermathAPI { - private final Map> AFTERMATH_MODULE_MAP = Maps.newHashMap(); - private final Map> AFTERMATH_MODULES_MAP = Maps.newHashMap(); - private final Map>> WEIGHTED_LIST_MODULES_MAP = Maps.newHashMap(); - private final Map> AFTERMATH_FACTORY_MAP = Maps.newHashMap(); - private final Map> AMOUNT_MODULES_MAP = Maps.newHashMap(); - private final Map> ENTITY_INFO_MODULES_MAP = Maps.newHashMap(); - private final Map> CONDITION_MODULES_MAP = Maps.newHashMap(); - private final Map> TRACKERS = Maps.newHashMap(); - private static final AftermathAPI INSTANCE = new AftermathAPI(); - public static final Logger LOGGER = LogUtils.getLogger(); - public static AftermathAPI getInstance() { - return INSTANCE; - } - private AftermathAPI() {} - public void finishAftermathMap(Map> map) { - AFTERMATH_MODULE_MAP.clear(); - map.forEach(AftermathEventUtil::modify); - AFTERMATH_MODULE_MAP.putAll(map); - } - - public Map> getAftermathMap() { - return AFTERMATH_MODULE_MAP; - } - - public Optional getRandomAftermathModule(String identifier) { - List aftermathModules = getAftermathModules(identifier); - return Optional.ofNullable(RandomUtils.getRandomElement(aftermathModules)); - } - - public List getAftermathModules(String identifier) { - return AFTERMATH_MODULE_MAP.get(identifier); - } - - - public void registerTracker(String identifier, Class tracker) { - TRACKERS.put(identifier, tracker); - } - - public List getTracker(UUID uuid, String... identifiers) { - return Arrays.stream(identifiers) - .map(identifier -> getObjectInstance(TRACKERS, identifier)) - .filter(Objects::nonNull) - .map(tracker -> tracker.setUUID(uuid)) - .toList(); - } - - public void registerConditionModule(String identifier, Class conditionModule) { - CONDITION_MODULES_MAP.put(identifier, conditionModule); - } - - public IConditionModule getConditionModule(String identifier) { - return getObjectInstance(CONDITION_MODULES_MAP, identifier); - } - - - - public void registerAmountModule(String identifier, Class amountModule) { - AMOUNT_MODULES_MAP.put(identifier, amountModule); - } - - public IAmountModule getAmountModule(String identifier) { - return getObjectInstance(AMOUNT_MODULES_MAP, identifier); - } - - public void registerEntityInfoModule(String identifier, Class entityInfoModule) { - ENTITY_INFO_MODULES_MAP.put(identifier, entityInfoModule); - } - - public IEntityInfoModule getEntityInfoModule(String identifier) { - return getObjectInstance(ENTITY_INFO_MODULES_MAP, identifier); - } - - public void registerAftermathModule(String identifier, Class aftermathModule) { - AFTERMATH_MODULES_MAP.put(identifier, aftermathModule); - } - - public IAftermathModule getAftermathModule(String identifier) { - return getObjectInstance(AFTERMATH_MODULES_MAP, identifier); - } - - public void registerWeightedListModule(String identifier, Class> weightedListModule) { - WEIGHTED_LIST_MODULES_MAP.put(identifier, weightedListModule); - } - - public IWeightedListModule getWeightedListModule(String identifier) { - return getObjectInstance(WEIGHTED_LIST_MODULES_MAP, identifier); - } - - public void registerAftermathFactory(String identifier, Class aftermathFactory) { - AFTERMATH_FACTORY_MAP.put(identifier, aftermathFactory); - } - - public IAftermathFactory getAftermathFactory(String identifier) { - return getObjectInstance(AFTERMATH_FACTORY_MAP, identifier); - } - - private T getObjectInstance(Map> objectMap, String identifier) { - if (!objectMap.containsKey(identifier)) { - LOGGER.error("AftermathAPI Failed to find object with identifier {}", identifier); - } - try { - Class objectClass = objectMap.get(identifier); - return objectClass.getDeclaredConstructor().newInstance(); - } catch (InstantiationException e) { - LOGGER.error("AftermathAPI Failed to instantiate object with identifier {} error : {}", identifier, e); - } catch (IllegalAccessException e) { - LOGGER.error("AftermathAPI Failed to access object with identifier {} error : {}", identifier , e); - } catch (NoSuchMethodException e) { - LOGGER.error("AftermathAPI Failed to find constructor of object with identifier {} error : {}", identifier, e); - } catch (InvocationTargetException e) { - LOGGER.error("AftermathAPI Failed to invoke constructor of object with identifier {} error : {}", identifier, e); - }catch (NullPointerException e){ - LOGGER.error("AftermathAPI Failed to find object with identifier : {}", identifier); - } - return null; - } - - - - - -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/aftermath/AftermathManager.java b/src/main/java/com/pancake/surviving_the_aftermath/api/aftermath/AftermathManager.java deleted file mode 100644 index 5c8094b..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/aftermath/AftermathManager.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.pancake.surviving_the_aftermath.api.aftermath; - -import com.google.common.collect.Maps; -import com.pancake.surviving_the_aftermath.api.IAftermath; -import com.pancake.surviving_the_aftermath.api.IAftermathFactory; -import com.pancake.surviving_the_aftermath.api.ITracker; -import com.pancake.surviving_the_aftermath.api.base.BaseAftermathModule; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.server.level.ServerLevel; - -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; - -public class AftermathManager { - private final Map> AFTERMATH_MAP = Maps.newHashMap(); - private static final AftermathManager INSTANCE = new AftermathManager(); - public static AftermathManager getInstance() { return INSTANCE; } - private AftermathManager() {} - - public void tick() { - for (IAftermath raid : AFTERMATH_MAP.values()) { - if (raid.isEnd() || raid.isLose()) { - remove(raid); - } else { - raid.tick(); - } - } - } - - private void remove(IAftermath aftermath) { - AFTERMATH_MAP.remove(aftermath.getUUID()); - aftermath.getTrackers().forEach(ITracker::unregister); - } - - private void add(IAftermath aftermath) { - AFTERMATH_MAP.put(aftermath.getUUID(), aftermath); - List trackers = aftermath.getTrackers(); - trackers.forEach(ITracker::register); - } - - public Map> getAftermathMap() { - return AFTERMATH_MAP; - } - - public Optional> getAftermath(UUID uuid) { - return Optional.ofNullable(AFTERMATH_MAP.get(uuid)); - } - - public boolean create(IAftermath aftermath) { - if (aftermath.isCreate()) { - add(aftermath); - return true; - } - return false; - } - - public void create(ServerLevel level, CompoundTag compoundTag) { - IAftermathFactory aftermathFactory = AftermathAPI.getInstance().getAftermathFactory(compoundTag.getString("identifier")); - IAftermath aftermath = aftermathFactory.create(level, compoundTag); - add(aftermath); - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/base/BaseAftermath.java b/src/main/java/com/pancake/surviving_the_aftermath/api/base/BaseAftermath.java deleted file mode 100644 index fc45f21..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/base/BaseAftermath.java +++ /dev/null @@ -1,208 +0,0 @@ -package com.pancake.surviving_the_aftermath.api.base; - -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; -import com.mojang.logging.LogUtils; -import com.pancake.surviving_the_aftermath.api.AftermathState; -import com.pancake.surviving_the_aftermath.api.Constant; -import com.pancake.surviving_the_aftermath.api.IAftermath; -import com.pancake.surviving_the_aftermath.api.ITracker; -import com.pancake.surviving_the_aftermath.api.aftermath.AftermathAPI; -import com.pancake.surviving_the_aftermath.api.aftermath.AftermathManager; -import com.pancake.surviving_the_aftermath.api.module.IAftermathModule; -import com.pancake.surviving_the_aftermath.common.util.AftermathEventUtil; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.nbt.Tag; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerBossEvent; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.BossEvent; -import org.slf4j.Logger; - -import java.util.List; -import java.util.Set; -import java.util.UUID; -import java.util.function.Predicate; - -public abstract class BaseAftermath implements IAftermath { - protected static final Logger LOGGER = LogUtils.getLogger(); - protected final AftermathAPI API = AftermathAPI.getInstance(); - protected final AftermathManager MANAGER = AftermathManager.getInstance(); - protected final List TRACKERS = Lists.newArrayList(); - protected AftermathState state; - protected ServerLevel level; - protected Set players = Sets.newHashSet(); - protected Set enemies = Sets.newHashSet(); - protected T module; - private final String NAME = Constant.MOD_NAME + "." + getUniqueIdentifier(); - protected final ServerBossEvent progress = new ServerBossEvent(Component.empty(), BossEvent.BossBarColor.RED, BossEvent.BossBarOverlay.PROGRESS); - protected final UUID uuid = progress.getId(); - protected float progressPercent = progress.getProgress(); - public BaseAftermath(ServerLevel level) { - this.level = level; - this.module = (T) API.getRandomAftermathModule(getUniqueIdentifier()) - .orElseGet(() -> API.getAftermathMap().get(getUniqueIdentifier()).get(0)); - bindTrackers(); - - if (!AftermathEventUtil.start(this, players, level)) { - end(); - } - } - - @Override - public void tick() { - if (isEnd()) return; - - updateProgress(); - if (state == AftermathState.VICTORY){ - this.progressPercent = 0; - spawnRewards(); - } - } - - protected void addTracker(ITracker tracker) { - TRACKERS.add(tracker); - } - - @Override - public List getTrackers() { - return TRACKERS; - } - - @Override - public boolean isEnd() { - return this.state == AftermathState.END ; - } - - @Override - public boolean isLose() { - return this.state == AftermathState.LOSE; - } - - @Override - public UUID getUUID() { - return this.uuid; - } - - @Override - public CompoundTag serializeNBT() { - CompoundTag compoundTag = new CompoundTag(); - compoundTag.putString(Constant.IDENTIFIER, this.getUniqueIdentifier()); - compoundTag.put(Constant.MODULE, module.serializeNBT()); - compoundTag.putFloat(Constant.PROGRESS, progressPercent); - - ListTag tags = new ListTag(); - this.getTrackers().forEach(tracker -> { - tags.add(tracker.serializeNBT()); - }); - compoundTag.put(Constant.TRACKER, tags); - - ListTag playerTags = new ListTag(); - players.forEach(uuid -> playerTags.add(NbtUtils.createUUID(uuid))); - compoundTag.put(Constant.PLAYERS, playerTags); - - ListTag enemiesTags = new ListTag(); - enemies.forEach(uuid -> enemiesTags.add(NbtUtils.createUUID(uuid))); - compoundTag.put(Constant.ENEMIES, enemiesTags); - - return compoundTag; - } - - @Override - public void deserializeNBT(CompoundTag nbt) { - this.progressPercent = nbt.getFloat(Constant.PROGRESS); - CompoundTag moduleTag = nbt.getCompound(Constant.MODULE); - IAftermathModule aftermathModule = API.getAftermathModule(this.getUniqueIdentifier()); - aftermathModule.deserializeNBT(moduleTag); - this.module = (T) aftermathModule; - - ListTag tags = nbt.getList(Constant.TRACKER, Tag.TAG_COMPOUND); - tags.forEach(tag -> { - CompoundTag trackerTag = (CompoundTag) tag; - TRACKERS.stream() - .filter(tracker -> tracker.getUniqueIdentifier().equals(trackerTag.getString(Constant.IDENTIFIER))) - .map(tracker -> (ITracker) tracker) - .forEach(tracker -> tracker.deserializeNBT(trackerTag)); - }); - - - ListTag playerTags = nbt.getList(Constant.PLAYERS, Tag.TAG_INT_ARRAY); - playerTags.forEach(tag -> players.add(NbtUtils.loadUUID(tag))); - - ListTag enemiesTags = nbt.getList(Constant.ENEMIES, Tag.TAG_INT_ARRAY); - enemiesTags.forEach(tag -> enemies.add(NbtUtils.loadUUID(tag))); - } - - @Override - public Predicate validPlayer() { - return (Predicate) player -> !player.isSpectator(); - } - - - @Override - public Set getEnemies() { - return enemies; - } - - @Override - public Set getPlayers() { - return players; - } - - @Override - public void updatePlayers() { - final Set oldPlayers = Sets.newHashSet(progress.getPlayers()); - final Set newPlayers = Sets.newHashSet(level.getPlayers(this.validPlayer())); - players.clear(); - newPlayers.stream() - .filter(player -> !oldPlayers.contains(player)) - .forEach(progress::addPlayer); - oldPlayers.stream() - .filter(player -> !newPlayers.contains(player)) - .forEach(progress::removePlayer); - progress.getPlayers().forEach(player -> players.add(player.getUUID())); - } - - @Override - public void updateProgress() { - progress.setProgress(progressPercent); - updatePlayers(); - } - - @Override - public void end() { - AftermathEventUtil.end(this, players, level); - this.progress.removeAllPlayers(); - } - - @Override - public void lose() { - AftermathEventUtil.lose(this, players, level); - this.progress.removeAllPlayers(); - } - - public void setState(AftermathState aftermathState) { - this.state = aftermathState; - } - - public AftermathState getState() { - return state; - } - - @Override - public void spawnRewards() { - if (!AftermathEventUtil.celebrating(this, players, level)) { - return; - } - } - - @Override - public void ready() { - if (!AftermathEventUtil.ready(this, players, level)) { - end(); - } - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/base/BaseAftermathModule.java b/src/main/java/com/pancake/surviving_the_aftermath/api/base/BaseAftermathModule.java deleted file mode 100644 index b0d9933..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/base/BaseAftermathModule.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.pancake.surviving_the_aftermath.api.base; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.pancake.surviving_the_aftermath.api.Constant; -import com.pancake.surviving_the_aftermath.api.aftermath.AftermathAPI; -import com.pancake.surviving_the_aftermath.api.module.IAftermathModule; -import com.pancake.surviving_the_aftermath.api.module.IWeightedListModule; -import com.pancake.surviving_the_aftermath.api.module.impl.weighted.ItemWeightedListModule; -import com.pancake.surviving_the_aftermath.common.util.RegistryUtil; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.util.random.SimpleWeightedRandomList; -import net.minecraft.world.item.Item; - -import java.util.function.Supplier; - -public abstract class BaseAftermathModule implements IAftermathModule { - protected final AftermathAPI AFTERMATH_API = AftermathAPI.getInstance(); - protected ItemWeightedListModule Rewards = new ItemWeightedListModule(); - protected String jsonName; - @Override - public CompoundTag serializeNBT() { - CompoundTag compoundTag = new CompoundTag(); - compoundTag.putString(Constant.IDENTIFIER, getUniqueIdentifier()); - compoundTag.put(Constant.REWARDS, Rewards.serializeNBT()); - return compoundTag; - } - @Override - public void deserializeNBT(CompoundTag compoundTag) { - CompoundTag rewards = compoundTag.getCompound(Constant.REWARDS); - IWeightedListModule weightedListModule = AFTERMATH_API.getWeightedListModule(ItemWeightedListModule.IDENTIFIER); - if (weightedListModule instanceof ItemWeightedListModule Rewards) { - Rewards.deserializeNBT(rewards); - this.Rewards = Rewards; - } - } - @Override - public void deserializeJson(JsonElement jsonElement) { - AftermathAPI instance = AftermathAPI.getInstance(); - IWeightedListModule weightedListModule = instance.getWeightedListModule(ItemWeightedListModule.IDENTIFIER); - if (weightedListModule instanceof ItemWeightedListModule Rewards) { - Rewards.deserializeJson(jsonElement.getAsJsonObject().get(Constant.REWARDS)); - this.Rewards = Rewards; - } - } - @Override - public JsonElement serializeJson() { - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty(Constant.IDENTIFIER, getUniqueIdentifier()); - jsonObject.add(Constant.REWARDS, Rewards.serializeJson()); - return jsonObject; - } - @Override - public String getJsonName() { - return jsonName == null ? getUniqueIdentifier().toLowerCase() : jsonName.toLowerCase(); - } - @Override - public void setJsonName(String jsonName) { - this.jsonName = jsonName; - } - - public SimpleWeightedRandomList getRewardList() { - return Rewards.getWeightedList(); - } - public void setReward(Supplier rewardList){ - Rewards.setWeightedList(() -> rewardList.get().getWeightedList()); - } - public void addRewards(String itemStr, int weight){ - Rewards.add(RegistryUtil.getItemFromRegistryName(itemStr),weight); - } - public void removeRewards(String itemStr){ - Rewards.remove(RegistryUtil.getItemFromRegistryName(itemStr)); - } - public static class Builder { - protected T module; - - public Builder(T module,String jsonName) { - this.module = module; - this.module.setJsonName(jsonName); - } - protected ItemWeightedListModule Rewards; - public Builder setRewards(Supplier Rewards) { - this.Rewards = Rewards.get(); - return this; - } - public T build() { - module.setReward(() -> Rewards); - return module; - } - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/base/BaseTracker.java b/src/main/java/com/pancake/surviving_the_aftermath/api/base/BaseTracker.java deleted file mode 100644 index e0f87fd..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/base/BaseTracker.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.pancake.surviving_the_aftermath.api.base; - -import com.pancake.surviving_the_aftermath.api.ITracker; -import com.pancake.surviving_the_aftermath.api.aftermath.AftermathManager; -import net.minecraft.nbt.CompoundTag; - -import java.util.UUID; - -public abstract class BaseTracker implements ITracker { - protected final AftermathManager manager = AftermathManager.getInstance(); - protected UUID uuid; - - @Override - public ITracker setUUID(UUID uuid) { - this.uuid = uuid; - return this; - } - - @Override - public CompoundTag serializeNBT() { - return new CompoundTag(); - } - - @Override - public void deserializeNBT(CompoundTag nbt) { - - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/module/IAftermathModule.java b/src/main/java/com/pancake/surviving_the_aftermath/api/module/IAftermathModule.java deleted file mode 100644 index d7d073b..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/module/IAftermathModule.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.pancake.surviving_the_aftermath.api.module; - -import com.pancake.surviving_the_aftermath.api.IIdentifier; -import com.pancake.surviving_the_aftermath.api.IJSONSerializable; -import com.pancake.surviving_the_aftermath.api.module.impl.weighted.ItemWeightedListModule; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.util.random.SimpleWeightedRandomList; -import net.minecraft.world.item.Item; -import net.minecraftforge.common.util.INBTSerializable; - -import java.util.function.Supplier; - -public interface IAftermathModule extends IIdentifier, IJSONSerializable, INBTSerializable { - String getJsonName(); - - void setJsonName(String jsonName); -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/module/IAmountModule.java b/src/main/java/com/pancake/surviving_the_aftermath/api/module/IAmountModule.java index 40fe81d..9fcdb11 100644 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/module/IAmountModule.java +++ b/src/main/java/com/pancake/surviving_the_aftermath/api/module/IAmountModule.java @@ -1,10 +1,19 @@ package com.pancake.surviving_the_aftermath.api.module; -import com.pancake.surviving_the_aftermath.api.IIdentifier; -import com.pancake.surviving_the_aftermath.api.IJSONSerializable; -import net.minecraft.nbt.CompoundTag; -import net.minecraftforge.common.util.INBTSerializable; +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.codecs.KeyDispatchCodec; +import com.pancake.surviving_the_aftermath.api.IModule; +import com.pancake.surviving_the_aftermath.common.init.ModAftermathModule; +import com.pancake.surviving_the_aftermath.common.module.amount.IntegerAmountModule; +import com.pancake.surviving_the_aftermath.common.module.amount.RandomAmountModule; -public interface IAmountModule extends IIdentifier, IJSONSerializable, INBTSerializable { - int getSpawnAmount(); +import java.util.function.Function; + +public interface IAmountModule extends IModule { + public static final Codec CODEC = null; + Codec codec(); + abstract int getSpawnAmount(); + + abstract IAmountModule type(); } diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/module/IConditionModule.java b/src/main/java/com/pancake/surviving_the_aftermath/api/module/IConditionModule.java deleted file mode 100644 index 54ba257..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/module/IConditionModule.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.pancake.surviving_the_aftermath.api.module; - -import com.pancake.surviving_the_aftermath.api.IIdentifier; -import com.pancake.surviving_the_aftermath.api.IJSONSerializable; -import com.pancake.surviving_the_aftermath.api.stage.LevelStageData; -import com.pancake.surviving_the_aftermath.api.stage.PlayerStageData; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraftforge.common.util.INBTSerializable; - -public interface IConditionModule extends IIdentifier, IJSONSerializable, INBTSerializable { -// boolean checkCondition(Player player, PlayerStageData stageData); -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/module/IEntityInfoModule.java b/src/main/java/com/pancake/surviving_the_aftermath/api/module/IEntityInfoModule.java index 4220cf4..fab1aa6 100644 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/module/IEntityInfoModule.java +++ b/src/main/java/com/pancake/surviving_the_aftermath/api/module/IEntityInfoModule.java @@ -1,15 +1,7 @@ package com.pancake.surviving_the_aftermath.api.module; -import com.pancake.surviving_the_aftermath.api.IIdentifier; -import com.pancake.surviving_the_aftermath.api.IJSONSerializable; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.Entity; -import net.minecraftforge.common.util.INBTSerializable; -import net.minecraftforge.common.util.LazyOptional; +import com.pancake.surviving_the_aftermath.api.IModule; -import java.util.List; +public interface IEntityInfoModule extends IModule { -public interface IEntityInfoModule extends IIdentifier, IJSONSerializable, INBTSerializable { - List> spawnEntity(ServerLevel level); } diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/module/IWeightedListModule.java b/src/main/java/com/pancake/surviving_the_aftermath/api/module/IWeightedListModule.java deleted file mode 100644 index e42b1e1..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/module/IWeightedListModule.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.pancake.surviving_the_aftermath.api.module; - -import com.google.common.collect.Lists; -import com.pancake.surviving_the_aftermath.api.IIdentifier; -import com.pancake.surviving_the_aftermath.api.IJSONSerializable; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.util.random.SimpleWeightedRandomList; -import net.minecraftforge.common.util.INBTSerializable; -import org.checkerframework.checker.nullness.qual.Nullable; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Supplier; - -public interface IWeightedListModule extends IJSONSerializable, INBTSerializable, IIdentifier { - SimpleWeightedRandomList getWeightedList(); - - void setWeightedList(Supplier> weightedList); - void add(T t, int weight); - void remove(T t); - - List getList(); -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/module/IWeightedModule.java b/src/main/java/com/pancake/surviving_the_aftermath/api/module/IWeightedModule.java new file mode 100644 index 0000000..5136a36 --- /dev/null +++ b/src/main/java/com/pancake/surviving_the_aftermath/api/module/IWeightedModule.java @@ -0,0 +1,15 @@ +package com.pancake.surviving_the_aftermath.api.module; + +import com.pancake.surviving_the_aftermath.api.IModule; +import net.minecraft.util.random.SimpleWeightedRandomList; +import net.minecraft.util.random.WeightedEntry; + +import java.util.List; + +public interface IWeightedModule extends IModule { + SimpleWeightedRandomList getWeightedList(); + void add(T t, int weight); + void remove(T t); + + List> getList(); +} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/amount/FixedAmountModule.java b/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/amount/FixedAmountModule.java deleted file mode 100644 index 179d13a..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/amount/FixedAmountModule.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.pancake.surviving_the_aftermath.api.module.impl.amount; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.pancake.surviving_the_aftermath.api.Constant; -import com.pancake.surviving_the_aftermath.api.module.IAmountModule; -import net.minecraft.nbt.CompoundTag; - - -public class FixedAmountModule implements IAmountModule { - public static final String IDENTIFIER = "fixed_amount"; - protected int amount; - @Override - public String getUniqueIdentifier() { - return IDENTIFIER; - } - - @Override - public int getSpawnAmount() { - return amount; - } - - @Override - public CompoundTag serializeNBT() { - CompoundTag compoundTag = new CompoundTag(); - compoundTag.putString(Constant.IDENTIFIER, IDENTIFIER); - compoundTag.putInt(Constant.AMOUNT, amount); - return compoundTag; - } - - @Override - public void deserializeNBT(CompoundTag nbt) { - this.amount = nbt.getInt(Constant.AMOUNT); - } - @Override - public void deserializeJson(JsonElement jsonElement) { - this.amount = jsonElement.getAsJsonObject().get(Constant.AMOUNT).getAsInt(); - } - - @Override - public JsonElement serializeJson() { - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty(Constant.IDENTIFIER, IDENTIFIER); - jsonObject.addProperty(Constant.AMOUNT, amount); - return jsonObject; - } - - public static class Builder { - protected int amount; - - public Builder setAmount(int amount) { - this.amount = amount; - return this; - } - - public FixedAmountModule build() { - FixedAmountModule fixedAmountModule = new FixedAmountModule(); - fixedAmountModule.amount = this.amount; - return fixedAmountModule; - } - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/amount/RandomAmountModule.java b/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/amount/RandomAmountModule.java deleted file mode 100644 index d71f703..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/amount/RandomAmountModule.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.pancake.surviving_the_aftermath.api.module.impl.amount; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.pancake.surviving_the_aftermath.api.Constant; -import com.pancake.surviving_the_aftermath.api.module.IAmountModule; -import net.minecraft.nbt.CompoundTag; - -import java.util.Random; - -public class RandomAmountModule implements IAmountModule { - public static final String IDENTIFIER = "random_amount"; - protected final Random rand = new Random(); - protected int min; - protected int max; - @Override - public String getUniqueIdentifier() { - return IDENTIFIER; - } - - @Override - public int getSpawnAmount() { - this.max = Math.max(this.max, this.min); - return Math.max(0, this.rand.nextInt(this.max - this.min + 1) + this.min); - } - - @Override - public CompoundTag serializeNBT() { - CompoundTag compoundTag = new CompoundTag(); - compoundTag.putString(Constant.IDENTIFIER, IDENTIFIER); - compoundTag.putInt(Constant.MIN, min); - compoundTag.putInt(Constant.MAX, max); - return compoundTag; - } - - @Override - public void deserializeNBT(CompoundTag nbt) { - this.min = nbt.getInt(Constant.MIN); - this.max = nbt.getInt(Constant.MAX); - } - @Override - public void deserializeJson(JsonElement jsonElement) { - this.min = jsonElement.getAsJsonObject().get(Constant.MIN).getAsInt(); - this.max = jsonElement.getAsJsonObject().get(Constant.MAX).getAsInt(); - } - - @Override - public JsonElement serializeJson() { - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty(Constant.MAX, max); - jsonObject.addProperty(Constant.MIN, min); - jsonObject.addProperty(Constant.IDENTIFIER, IDENTIFIER); - return jsonObject; - } - - public static class Builder { - protected int min; - protected int max; - - public Builder setRange(int min, int max) { - this.min = min; - this.max = max; - return this; - } - public RandomAmountModule build() { - RandomAmountModule randomAmountModule = new RandomAmountModule(); - randomAmountModule.min = this.min; - randomAmountModule.max = this.max; - return randomAmountModule; - } - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/condition/StageConditionModule.java b/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/condition/StageConditionModule.java deleted file mode 100644 index 86b950c..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/condition/StageConditionModule.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.pancake.surviving_the_aftermath.api.module.impl.condition; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.pancake.surviving_the_aftermath.api.Constant; -import com.pancake.surviving_the_aftermath.api.module.IConditionModule; -import com.pancake.surviving_the_aftermath.common.capability.StageDataCap; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; - -public abstract class StageConditionModule implements IConditionModule { - protected String stageName; - - public StageConditionModule(String stageName) { - this.stageName = stageName; - } - - public boolean checkCondition(Level level){ - return false; - } - - public boolean checkCondition(Player player){ - return false; - } - - - @Override - public CompoundTag serializeNBT() { - CompoundTag compoundTag = new CompoundTag(); - compoundTag.putString("stageName", stageName); - return compoundTag; - } - - @Override - public void deserializeNBT(CompoundTag nbt) { - this.stageName = nbt.getString("stageName"); - } - - @Override - public void deserializeJson(JsonElement jsonElement) { - this.stageName = jsonElement.getAsString(); - } - - @Override - public JsonElement serializeJson() { - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("stageName", stageName); - return jsonObject; - } - - public static class LevelStageConditionModule extends StageConditionModule { - public static final String IDENTIFIER = Constant.LEVEL_STAGES; - public LevelStageConditionModule(String stageName) { - super(stageName); - } - - @Override - public boolean checkCondition(Level level) { - StageDataCap stageDataCap = StageDataCap.get(level).orElse(null); - return stageDataCap.getStageData().hasStage(stageName); - } - - @Override - public String getUniqueIdentifier() { - return IDENTIFIER; - } - } - - public static class PlayerStageConditionModule extends StageConditionModule { - public static final String IDENTIFIER = Constant.PLAYER_STAGES; - public PlayerStageConditionModule(String stageName) { - super(stageName); - } - - @Override - public boolean checkCondition(Player player) { - StageDataCap stageDataCap = StageDataCap.get(player).orElse(null); - return stageDataCap.getStageData().hasStage(stageName); - } - - @Override - public String getUniqueIdentifier() { - return IDENTIFIER; - } - } - - -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/entity_info/EntityInfoModule.java b/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/entity_info/EntityInfoModule.java deleted file mode 100644 index 55b3738..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/entity_info/EntityInfoModule.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.pancake.surviving_the_aftermath.api.module.impl.entity_info; - -import com.google.common.collect.Lists; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.pancake.surviving_the_aftermath.api.Constant; -import com.pancake.surviving_the_aftermath.api.aftermath.AftermathAPI; -import com.pancake.surviving_the_aftermath.api.module.IAmountModule; -import com.pancake.surviving_the_aftermath.api.module.IEntityInfoModule; -import com.pancake.surviving_the_aftermath.common.util.RegistryUtil; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.registries.ForgeRegistries; - -import java.util.List; -import java.util.function.Supplier; - -public class EntityInfoModule implements IEntityInfoModule { - public static final String IDENTIFIER = "entity_info"; - protected EntityType entityType; - protected IAmountModule amountModule; - @Override - public String getUniqueIdentifier() { - return IDENTIFIER; - } - - @Override - public CompoundTag serializeNBT() { - CompoundTag compoundTag = new CompoundTag(); - compoundTag.putString(Constant.IDENTIFIER, IDENTIFIER); - - ResourceLocation key = ForgeRegistries.ENTITY_TYPES.getKey(entityType); - assert key != null; - compoundTag.putString(Constant.ENTITY_TYPE, key.getPath()); - compoundTag.put(Constant.AMOUNT, amountModule.serializeNBT()); - return compoundTag; - } - - @Override - public void deserializeNBT(CompoundTag nbt) { - this.entityType = RegistryUtil.getEntityTypeFromRegistryName(nbt.getString(Constant.ENTITY_TYPE)); - CompoundTag compound = nbt.getCompound(Constant.AMOUNT); - IAmountModule amountModule = AftermathAPI.getInstance().getAmountModule(compound.getString(Constant.IDENTIFIER)); - amountModule.deserializeNBT(compound); - this.amountModule = amountModule; - } - @Override - public void deserializeJson(JsonElement jsonElement) { - this.entityType = RegistryUtil.getEntityTypeFromRegistryName(jsonElement.getAsJsonObject().get(Constant.ENTITY_TYPE).getAsString()); - JsonElement amountElement = jsonElement.getAsJsonObject().get(Constant.AMOUNT); - IAmountModule amountModule = AftermathAPI.getInstance().getAmountModule(amountElement.getAsJsonObject().get(Constant.IDENTIFIER).getAsString()); - amountModule.deserializeJson(amountElement); - this.amountModule = amountModule; - } - - @Override - public JsonElement serializeJson() { - JsonObject jsonObject = new JsonObject(); - jsonObject.add(Constant.AMOUNT, amountModule.serializeJson()); - jsonObject.addProperty(Constant.ENTITY_TYPE, RegistryUtil.getRegistryNameFromEntityType(entityType).toString()); - jsonObject.addProperty(Constant.IDENTIFIER, IDENTIFIER); - return jsonObject; - } - - @Override - public List> spawnEntity(ServerLevel level) { - List> arrayList = Lists.newArrayList(); - for (int i = 0; i < amountModule.getSpawnAmount(); i++) { - Entity entity = entityType.create(level); - arrayList.add(entity == null ? LazyOptional.empty() : LazyOptional.of(() -> entity)); - } - return arrayList; - } - - public static class Builder { - protected EntityType entityType; - protected IAmountModule amountModule; - - public Builder setEntityType(String entityTypeStr) { - this.entityType = RegistryUtil.getEntityTypeFromRegistryName(entityTypeStr); - return this; - } - - public Builder setAmountModule(Supplier amountModule) { - this.amountModule = amountModule.get(); - return this; - } - - public EntityInfoModule build() { - EntityInfoModule entityInfoModule = new EntityInfoModule(); - entityInfoModule.entityType = this.entityType; - entityInfoModule.amountModule = this.amountModule; - return entityInfoModule; - } - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/entity_info/EntityInfoWithEquipmentModule.java b/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/entity_info/EntityInfoWithEquipmentModule.java deleted file mode 100644 index 7287aea..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/entity_info/EntityInfoWithEquipmentModule.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.pancake.surviving_the_aftermath.api.module.impl.entity_info; - -import com.google.gson.JsonElement; -import com.pancake.surviving_the_aftermath.api.Constant; -import com.pancake.surviving_the_aftermath.api.aftermath.AftermathAPI; -import com.pancake.surviving_the_aftermath.api.module.IWeightedListModule; -import com.pancake.surviving_the_aftermath.api.module.impl.weighted.ItemWeightedListModule; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.Mob; -import net.minecraftforge.common.util.LazyOptional; - -import java.util.List; -import java.util.function.Supplier; - -public class EntityInfoWithEquipmentModule extends EntityInfoModule { - public static final String IDENTIFIER = "entity_info_equipment"; - private ItemWeightedListModule equipment; - - @Override - public String getUniqueIdentifier() { - return IDENTIFIER; - } - - @Override - public CompoundTag serializeNBT() { - CompoundTag compoundTag = super.serializeNBT(); - compoundTag.putString(Constant.IDENTIFIER, IDENTIFIER); - compoundTag.put("equipment", equipment.serializeNBT()); - return compoundTag; - } - - @Override - public void deserializeNBT(CompoundTag nbt) { - super.deserializeNBT(nbt); - IWeightedListModule weightedListModule = AftermathAPI.getInstance().getWeightedListModule(ItemWeightedListModule.IDENTIFIER); - weightedListModule.deserializeNBT(nbt.getCompound(Constant.EQUIPMENT)); - this.equipment = (ItemWeightedListModule) weightedListModule; - } - @Override - public void deserializeJson(JsonElement jsonElement) { - super.deserializeJson(jsonElement); - IWeightedListModule weightedListModule = AftermathAPI.getInstance().getWeightedListModule(ItemWeightedListModule.IDENTIFIER); - weightedListModule.deserializeJson(jsonElement.getAsJsonObject().get(Constant.EQUIPMENT)); - this.equipment = (ItemWeightedListModule) weightedListModule; - } - - public ItemWeightedListModule getEquipment() { - return equipment; - } - - @Override - public List> spawnEntity(ServerLevel level) { - List> arrayList = super.spawnEntity(level); - for (LazyOptional lazyOptional : arrayList) { - lazyOptional.ifPresent(entity -> { - if (entity instanceof Mob mob){ - equipment.getWeightedList().getRandomValue(level.random) - .ifPresent(item -> mob.equipItemIfPossible(item.getDefaultInstance())); - } - }); - } - return arrayList; - } - - @Override - public JsonElement serializeJson() { - JsonElement jsonElement = super.serializeJson(); - jsonElement.getAsJsonObject().add(Constant.EQUIPMENT, equipment.serializeJson()); - return jsonElement; - } - - public static class Builder extends EntityInfoModule.Builder{ - private ItemWeightedListModule equipment; - - public Builder setEquipment(Supplier equipment) { - this.equipment = equipment.get(); - return this; - } - - public EntityInfoWithEquipmentModule build() { - EntityInfoWithEquipmentModule entityInfoWithEquipmentModule = new EntityInfoWithEquipmentModule(); - entityInfoWithEquipmentModule.entityType = this.entityType; - entityInfoWithEquipmentModule.amountModule = this.amountModule; - entityInfoWithEquipmentModule.equipment = this.equipment; - return entityInfoWithEquipmentModule; - } - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/weighted/BaseWeightedListModule.java b/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/weighted/BaseWeightedListModule.java deleted file mode 100644 index 2cc06fc..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/weighted/BaseWeightedListModule.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.pancake.surviving_the_aftermath.api.module.impl.weighted; - -import com.google.common.collect.Lists; -import com.pancake.surviving_the_aftermath.api.module.IWeightedListModule; -import net.minecraft.util.random.SimpleWeightedRandomList; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Supplier; - -public abstract class BaseWeightedListModule implements IWeightedListModule { - protected SimpleWeightedRandomList weightedList; - @Override - public SimpleWeightedRandomList getWeightedList() { - return weightedList; - } - - @Override - public void setWeightedList(Supplier> weightedList){ - this.weightedList = weightedList.get(); - } - - @Override - public void add(T t, int weight) { - if (this.weightedList == null || t == null) return; - SimpleWeightedRandomList.Builder builder = SimpleWeightedRandomList.builder(); - - this.weightedList.unwrap() - .forEach(itemWeight -> builder.add(itemWeight.getData(), itemWeight.getWeight().asInt())); - builder.add(t, weight); - - this.weightedList = builder.build(); - } - - @Override - public void remove(T t) { - if (this.weightedList == null || t == null) return; - SimpleWeightedRandomList.Builder builder = SimpleWeightedRandomList.builder(); - - this.weightedList.unwrap().stream() - .filter(entry -> !(entry.getData().equals(t))) - .forEach(itemWeight -> builder.add(itemWeight.getData(), itemWeight.getWeight().asInt())); - - this.weightedList = builder.build(); - } - - public List getList(){ - ArrayList list = Lists.newArrayList(); - getWeightedList().unwrap().forEach(weightedEntry -> list.add(weightedEntry.getData())); - return list; - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/weighted/EntityTypeWeightedListModule.java b/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/weighted/EntityTypeWeightedListModule.java deleted file mode 100644 index 306403f..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/weighted/EntityTypeWeightedListModule.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.pancake.surviving_the_aftermath.api.module.impl.weighted; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.pancake.surviving_the_aftermath.api.Constant; -import com.pancake.surviving_the_aftermath.api.module.IWeightedListModule; -import com.pancake.surviving_the_aftermath.common.util.RegistryUtil; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.random.SimpleWeightedRandomList; -import net.minecraft.world.entity.EntityType; -import net.minecraftforge.registries.ForgeRegistries; - -import java.util.function.Supplier; - - -public class EntityTypeWeightedListModule extends BaseWeightedListModule> { - public static String IDENTIFIER = "entity_type_weighted"; - @Override - public String getUniqueIdentifier() { - return IDENTIFIER; - } - - @Override - public void deserializeNBT(CompoundTag compoundTag) { - SimpleWeightedRandomList.Builder> builder = new SimpleWeightedRandomList.Builder<>(); - compoundTag.getAllKeys().forEach(key -> { - EntityType entityType = ForgeRegistries.ENTITY_TYPES.getValue(new ResourceLocation(key)); - if (entityType != null) { - builder.add(entityType, compoundTag.getInt(key)); - } - }); - this.weightedList = builder.build(); - } - @Override - public CompoundTag serializeNBT() { - CompoundTag compoundTag = new CompoundTag(); - compoundTag.putString(Constant.IDENTIFIER, IDENTIFIER); - this.weightedList.unwrap().forEach(itemWeight -> { - ResourceLocation key = ForgeRegistries.ENTITY_TYPES.getKey(itemWeight.getData()); - if (key != null) { - compoundTag.putInt(key.toString(), itemWeight.getWeight().asInt()); - } - }); - return compoundTag; - } - @Override - public void deserializeJson(JsonElement jsonElement) { - SimpleWeightedRandomList.Builder> builder = new SimpleWeightedRandomList.Builder<>(); - jsonElement.getAsJsonArray().asList().stream() - .map(JsonElement::getAsJsonObject) - .forEach(entry -> { - String type = entry.get(Constant.ENTITY_TYPE).getAsString(); - int weight = entry.get(Constant.WEIGHT).getAsInt(); - EntityType entityType = ForgeRegistries.ENTITY_TYPES.getValue(new ResourceLocation(type)); - if (entityType != null) { - builder.add(entityType, weight); - } - }); - this.weightedList = builder.build(); - } - - @Override - public JsonElement serializeJson() { - JsonObject jsonObject = new JsonObject(); - this.weightedList.unwrap().forEach(itemWeight -> { - JsonObject entry = new JsonObject(); - entry.addProperty(Constant.ENTITY_TYPE, RegistryUtil.getRegistryNameFromEntityType(itemWeight.getData()).toString()); - entry.addProperty(Constant.WEIGHT, itemWeight.getWeight().asInt()); - jsonObject.add(RegistryUtil.getRegistryNameFromEntityType(itemWeight.getData()).toString(), entry); - }); - return jsonObject; - } - - public static class Builder { - protected SimpleWeightedRandomList.Builder> builder = new SimpleWeightedRandomList.Builder<>(); - - public Builder add(EntityType entityType, int weight) { - this.builder.add(entityType, weight); - return this; - } - - public EntityTypeWeightedListModule build() { - EntityTypeWeightedListModule entityTypeWeightedListModule = new EntityTypeWeightedListModule(); - entityTypeWeightedListModule.weightedList = this.builder.build(); - return entityTypeWeightedListModule; - } - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/weighted/ItemWeightedListModule.java b/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/weighted/ItemWeightedListModule.java deleted file mode 100644 index 9cabc27..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/module/impl/weighted/ItemWeightedListModule.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.pancake.surviving_the_aftermath.api.module.impl.weighted; - -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.pancake.surviving_the_aftermath.api.Constant; -import com.pancake.surviving_the_aftermath.api.module.IWeightedListModule; -import com.pancake.surviving_the_aftermath.common.util.RegistryUtil; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; -import net.minecraft.util.random.SimpleWeightedRandomList; -import net.minecraft.util.random.WeightedEntry; -import net.minecraft.world.item.Item; -import net.minecraftforge.registries.ForgeRegistries; - -import java.util.List; -import java.util.function.Supplier; - -public class ItemWeightedListModule extends BaseWeightedListModule{ - - public static final String IDENTIFIER = "item_weighted"; - - @Override - public void deserializeJson(JsonElement jsonElement) { - SimpleWeightedRandomList.Builder builder = new SimpleWeightedRandomList.Builder<>(); - jsonElement.getAsJsonArray().asList().stream() - .map(JsonElement::getAsJsonObject) - .forEach(entry -> { - String type = GsonHelper.getAsString(entry, "item"); - int weight = GsonHelper.getAsInt(entry, "weight"); - Item item = ForgeRegistries.ITEMS.getValue(new ResourceLocation(type)); - if (item != null) { - builder.add(item, weight); - } - }); - weightedList = builder.build(); - } - - @Override - public JsonElement serializeJson() { - JsonArray jsonElements = new JsonArray(); - weightedList.unwrap().forEach(itemWeight -> { - JsonObject jsonObject = new JsonObject(); - ResourceLocation key = ForgeRegistries.ITEMS.getKey(itemWeight.getData()); - if (key != null) { - jsonObject.addProperty(Constant.ITEM, key.toString()); - jsonObject.addProperty(Constant.WEIGHT, itemWeight.getWeight().asInt()); - } - jsonElements.add(jsonObject); - }); - return jsonElements; - } - - @Override - public void deserializeNBT(CompoundTag compoundTag) { - SimpleWeightedRandomList.Builder builder = new SimpleWeightedRandomList.Builder<>(); - compoundTag.getAllKeys().forEach(key -> { - Item item = ForgeRegistries.ITEMS.getValue(new ResourceLocation(key)); - if (item != null) { - builder.add(item, compoundTag.getInt(key)); - } - }); - weightedList = builder.build(); - } - - @Override - public CompoundTag serializeNBT() { - CompoundTag compoundTag = new CompoundTag(); - compoundTag.putString(Constant.IDENTIFIER, IDENTIFIER); - weightedList.unwrap().forEach(itemWeight -> { - ResourceLocation key = ForgeRegistries.ITEMS.getKey(itemWeight.getData()); - if (key != null) { - compoundTag.putInt(key.toString(), itemWeight.getWeight().asInt()); - } - }); - return compoundTag; - } - - @Override - public String getUniqueIdentifier() { - return IDENTIFIER; - } - - public static class Builder { - private final SimpleWeightedRandomList.Builder builder = new SimpleWeightedRandomList.Builder<>(); - - public Builder add(String itemStr, int weight) { - Item item = RegistryUtil.getItemFromRegistryName(itemStr); - builder.add(item, weight); - return this; - } - - public ItemWeightedListModule build() { - ItemWeightedListModule itemWeightedListModule = new ItemWeightedListModule(); - itemWeightedListModule.weightedList = builder.build(); - return itemWeightedListModule; - } - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/stage/LevelStageData.java b/src/main/java/com/pancake/surviving_the_aftermath/api/stage/LevelStageData.java deleted file mode 100644 index 2c2bad1..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/stage/LevelStageData.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.pancake.surviving_the_aftermath.api.stage; - -import com.google.common.collect.Sets; -import com.pancake.surviving_the_aftermath.api.Constant; -import com.pancake.surviving_the_aftermath.api.IStageData; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.StringTag; -import net.minecraft.nbt.Tag; - -import java.util.Collection; -import java.util.Collections; -import java.util.Set; - -public class LevelStageData extends StageData { - public LevelStageData() { - super(Constant.LEVEL_STAGES); - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/stage/PlayerStageData.java b/src/main/java/com/pancake/surviving_the_aftermath/api/stage/PlayerStageData.java deleted file mode 100644 index a8e6918..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/stage/PlayerStageData.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.pancake.surviving_the_aftermath.api.stage; - -import com.google.common.collect.Sets; -import com.pancake.surviving_the_aftermath.api.Constant; -import com.pancake.surviving_the_aftermath.api.IStageData; - -import java.util.Set; - -public class PlayerStageData extends StageData{ - public PlayerStageData() { - super(Constant.PLAYER_STAGES); - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/api/stage/StageData.java b/src/main/java/com/pancake/surviving_the_aftermath/api/stage/StageData.java deleted file mode 100644 index ded9d39..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/api/stage/StageData.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.pancake.surviving_the_aftermath.api.stage; - -import com.google.common.collect.Sets; -import com.pancake.surviving_the_aftermath.api.Constant; -import com.pancake.surviving_the_aftermath.api.IStageData; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.StringTag; -import net.minecraft.nbt.Tag; - -import java.util.Collection; -import java.util.Collections; -import java.util.Set; - -public abstract class StageData implements IStageData { - private final Set unlockedStages = Sets.newHashSet(); - private final String identifier; - - public StageData(String identifier) { - this.identifier = identifier; - } - @Override - public Collection getStages() { - - return Collections.unmodifiableCollection(this.unlockedStages); - } - - @Override - public boolean hasStage(String stage) { - - return this.unlockedStages.contains(stage.toLowerCase()); - } - - @Override - public void addStage(String stage) { - - this.unlockedStages.add(stage.toLowerCase()); - } - - @Override - public void removeStage(String stage) { - - this.unlockedStages.remove(stage.toLowerCase()); - } - - @Override - public void clear() { - - this.unlockedStages.clear(); - } - - - @Override - public String toString () { - - return "StageData [unlockedStages=" + this.unlockedStages + "]"; - } - - @Override - public String getUniqueIdentifier() { - return identifier; - } - - @Override - public CompoundTag serializeNBT() { - final CompoundTag tag = new CompoundTag(); - final ListTag list = new ListTag(); - for (final String stage : this.unlockedStages) { - list.add(StringTag.valueOf(stage)); - } - tag.put(identifier, list); - return tag; - } - - @Override - public void deserializeNBT(CompoundTag nbt) { - final ListTag list = nbt.getList(identifier, Tag.TAG_STRING); - for (int tagIndex = 0; tagIndex < list.size(); tagIndex++) { - this.addStage(list.getString(tagIndex)); - } - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/capability/AftermathCap.java b/src/main/java/com/pancake/surviving_the_aftermath/common/capability/AftermathCap.java deleted file mode 100644 index f543e4a..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/capability/AftermathCap.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.capability; - -import com.pancake.surviving_the_aftermath.api.IAftermath; -import com.pancake.surviving_the_aftermath.api.aftermath.AftermathManager; -import com.pancake.surviving_the_aftermath.api.base.BaseAftermathModule; -import com.pancake.surviving_the_aftermath.common.init.ModCapability; -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.Level; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ICapabilitySerializable; -import net.minecraftforge.common.util.INBTSerializable; -import net.minecraftforge.common.util.LazyOptional; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Map; -import java.util.UUID; - -public class AftermathCap implements INBTSerializable { - private static final AftermathManager AFTERMATH_MANAGER = AftermathManager.getInstance(); - private final ServerLevel level; - - public AftermathCap(ServerLevel level) { this.level = level;} - - @Override - public CompoundTag serializeNBT() { - CompoundTag compoundTag = new CompoundTag(); - for (Map.Entry> entry : AFTERMATH_MANAGER.getAftermathMap().entrySet()) { - UUID uuid = entry.getKey(); - IAftermath aftermath = entry.getValue(); - compoundTag.put(uuid.toString(), aftermath.serializeNBT()); - } - return compoundTag; - } - - @Override - public void deserializeNBT(CompoundTag compoundTag) { - for (String uuid : compoundTag.getAllKeys()) { - CompoundTag tag = compoundTag.getCompound(uuid); - AFTERMATH_MANAGER.create(level, tag); - } - } - - public static LazyOptional get(Level level) { - return level.getCapability(ModCapability.AFTERMATH_CAP); - } - - public void tick() { - AFTERMATH_MANAGER.tick(); - } - - public static class Provider implements ICapabilitySerializable { - private final LazyOptional instance; - - public Provider(ServerLevel level) { - instance = LazyOptional.of(() -> new AftermathCap(level)); - } - - - @Override - public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { - return ModCapability.AFTERMATH_CAP.orEmpty(cap, instance); - } - - @Override - public CompoundTag serializeNBT() { - return instance.orElseThrow(() -> new IllegalArgumentException("LazyOptional cannot be empty!")).serializeNBT(); - } - - @Override - public void deserializeNBT(CompoundTag nbt) { - instance.orElseThrow(() -> new IllegalArgumentException("LazyOptional cannot be empty!")).deserializeNBT(nbt); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/capability/StageDataCap.java b/src/main/java/com/pancake/surviving_the_aftermath/common/capability/StageDataCap.java deleted file mode 100644 index c8add2c..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/capability/StageDataCap.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.capability; - -import com.pancake.surviving_the_aftermath.api.stage.LevelStageData; -import com.pancake.surviving_the_aftermath.api.stage.PlayerStageData; -import com.pancake.surviving_the_aftermath.api.stage.StageData; -import com.pancake.surviving_the_aftermath.common.init.ModCapability; -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.ICapabilitySerializable; -import net.minecraftforge.common.util.INBTSerializable; -import net.minecraftforge.common.util.LazyOptional; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class StageDataCap implements ICapabilitySerializable { - private final LazyOptional instance; - private StageData stageData; - - public StageDataCap(Level level,LevelStageData stageData) { - this.instance = LazyOptional.of(() -> new StageDataCap(level,stageData)); - this.stageData = stageData; - } - - public StageDataCap(Player player, PlayerStageData stageData) { - this.instance = LazyOptional.of(() -> new StageDataCap(player, stageData)); - this.stageData = stageData; - } - - - public static LazyOptional get(Level level) { - return level.getCapability(ModCapability.STAGE_DATA_CAP); - } - - public static LazyOptional get(Player player) { - return player.getCapability(ModCapability.STAGE_DATA_CAP); - } - - @Override - public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { - return ModCapability.STAGE_DATA_CAP.orEmpty(cap, instance); - } - - @Override - public CompoundTag serializeNBT() { - return stageData.serializeNBT(); - } - - @Override - public void deserializeNBT(CompoundTag nbt) { - stageData.deserializeNBT(nbt); - } - - public StageData getStageData() { - return stageData; - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/config/AftermathConfig.java b/src/main/java/com/pancake/surviving_the_aftermath/common/config/AftermathConfig.java deleted file mode 100644 index 686ecd3..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/config/AftermathConfig.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.config; - -import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.fml.ModLoadingContext; - -public class AftermathConfig { - public static final ForgeConfigSpec SPEC; - public static final ForgeConfigSpec.Builder BUILDER = new ForgeConfigSpec.Builder(); - - //MobBattleTracker Config - public static ForgeConfigSpec.BooleanValue enableMobBattleTrackerHighlight; - public static ForgeConfigSpec.BooleanValue enableMobBattleTrackerRestrictedRange; - - - static { - BUILDER.comment("MobBattleTracker Config"); - - enableMobBattleTrackerHighlight = BUILDER.comment("Enable MobBattleTracker Highlight") - .define("enableMobBattleTrackerHighlight", true); - - enableMobBattleTrackerRestrictedRange = BUILDER.comment("Enable MobBattleTracker RestrictedRange") - .define("enableMobBattleTrackerRestrictedRange", true); - } - - static { - SPEC = BUILDER.build(); - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/AftermathModuleProviders.java b/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/AftermathModuleProviders.java deleted file mode 100644 index 9f4f4f1..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/AftermathModuleProviders.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.data.datagen; - -import com.google.common.collect.Lists; -import com.google.common.hash.Hashing; -import com.google.common.hash.HashingOutputStream; -import com.google.gson.stream.JsonWriter; -import com.pancake.surviving_the_aftermath.api.base.BaseAftermathModule; -import net.minecraft.Util; -import net.minecraft.data.CachedOutput; -import net.minecraft.data.DataProvider; -import net.minecraft.data.PackOutput; -import net.minecraft.util.GsonHelper; -import org.jetbrains.annotations.NotNull; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.nio.charset.StandardCharsets; -import java.nio.file.Path; -import java.util.List; -import java.util.concurrent.CompletableFuture; - -public abstract class AftermathModuleProviders implements DataProvider { - private final PackOutput output; - private final String modId; - private final List modules = Lists.newArrayList(); - - - public AftermathModuleProviders(PackOutput output, String modId) { - this.output = output; - this.modId = modId; - } - - @Override - @NotNull - public CompletableFuture run(@NotNull CachedOutput output) { - addModules(); - return CompletableFuture.runAsync(() -> modules.forEach(module -> { - try { - ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream(); - HashingOutputStream hashingoutputstream = new HashingOutputStream(Hashing.sha1(), bytearrayoutputstream); - - try (JsonWriter jsonwriter = new JsonWriter(new OutputStreamWriter(hashingoutputstream, StandardCharsets.UTF_8))) { - jsonwriter.setSerializeNulls(false); - jsonwriter.setIndent(" "); - GsonHelper.writeValue(jsonwriter, module.serializeJson(), KEY_COMPARATOR); - } - Path path = this.output.getOutputFolder(PackOutput.Target.DATA_PACK) - .resolve(this.modId).resolve("aftermath").resolve(module.getJsonName().toLowerCase() + ".json"); - output.writeIfNeeded(path, bytearrayoutputstream.toByteArray(), hashingoutputstream.hash()); - } catch (IOException ioexception) { - LOGGER.error("Failed to save file to {}", output, ioexception); - } - }), Util.backgroundExecutor()); - } - public void addModule(T module) { - modules.add(module); - } - public abstract void addModules(); - - @Override - @NotNull - public String getName() { - return "AftermathModuleProviders"; - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/EventSubscriber.java b/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/EventSubscriber.java deleted file mode 100644 index 6ebf085..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/EventSubscriber.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.data.datagen; - -import com.pancake.surviving_the_aftermath.common.data.datagen.raid.NetherRaidModuleProvider; -import net.minecraft.core.HolderLookup; -import net.minecraft.data.DataGenerator; -import net.minecraft.data.PackOutput; -import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.data.event.GatherDataEvent; - -import java.util.concurrent.CompletableFuture; - -public class EventSubscriber { - - public static void onGatherData(GatherDataEvent event) { - DataGenerator generator = event.getGenerator(); - PackOutput output = generator.getPackOutput(); - ExistingFileHelper existingFileHelper = event.getExistingFileHelper(); - CompletableFuture provider = event.getLookupProvider(); - ModTagProviders.ModBlockTagsProvider blockTagsProvider = - new ModTagProviders.ModBlockTagsProvider(output, provider, existingFileHelper); - generator.addProvider(event.includeServer(), blockTagsProvider); - generator.addProvider(event.includeServer(), new ModTagProviders.ModItemTagsProvider( - output, provider, blockTagsProvider.contentsGetter(), existingFileHelper)); - generator.addProvider(event.includeServer(), new ModTagProviders.ModBiomeTagsProvider(output, provider, existingFileHelper)); - generator.addProvider(event.includeServer(), new ModTagProviders.ModStructureTagsProvider(output, provider, existingFileHelper)); - generator.addProvider(event.includeServer(), new ModTagProviders.ModEntityTypeTagsProvider(output, provider, existingFileHelper)); - generator.addProvider(event.includeClient(), new ModItemModelProvider(output, existingFileHelper)); - generator.addProvider(event.includeClient(), new ModBlockStateProvider(output, existingFileHelper)); - generator.addProvider(event.includeClient(), new ModSoundProvider(output, existingFileHelper)); - generator.addProvider(event.includeServer(), new RegistryDataGenerator(output, provider)); - generator.addProvider(event.includeClient(), new ModLanguageProvider(output)); - generator.addProvider(event.includeClient(), new ModLanguageCNProvider(output)); - generator.addProvider(event.includeServer(), new ModLootTableProvider(output)); - generator.addProvider(event.includeServer(), new NetherRaidModuleProvider(output)); - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModBlockStateProvider.java b/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModBlockStateProvider.java deleted file mode 100644 index 46a4729..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModBlockStateProvider.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.data.datagen; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import net.minecraft.data.PackOutput; -import net.minecraftforge.client.model.generators.BlockStateProvider; -import net.minecraftforge.common.data.ExistingFileHelper; - -public class ModBlockStateProvider extends BlockStateProvider { - - public ModBlockStateProvider(PackOutput packOutput, ExistingFileHelper exFileHelper) { - super(packOutput, SurvivingTheAftermath.MOD_ID, exFileHelper); - } - - @Override - protected void registerStatesAndModels() { - - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModItemModelProvider.java b/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModItemModelProvider.java deleted file mode 100644 index a443444..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModItemModelProvider.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.data.datagen; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.init.ModItems; -import it.unimi.dsi.fastutil.objects.Object2FloatOpenHashMap; -import net.minecraft.data.PackOutput; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.PackType; -import net.minecraftforge.client.model.generators.ItemModelProvider; -import net.minecraftforge.client.model.generators.ModelFile; -import net.minecraftforge.common.data.ExistingFileHelper; - -import java.util.Map; - -public class ModItemModelProvider extends ItemModelProvider { - - public ModItemModelProvider(PackOutput output, ExistingFileHelper existingFileHelper) { - super(output, SurvivingTheAftermath.MOD_ID, existingFileHelper); - } - - @Override - protected void registerModels() { - this.basicItem(ModItems.RAW_FALUKORV.get()); - this.basicItem(ModItems.COOKED_FALUKORV.get()); - this.basicItem(ModItems.EGG_TART.get()); - this.basicItem(ModItems.STACK_OF_EGG_TARTS.get()); - this.basicItem(ModItems.HAMBURGER.get()); - this.basicItem(ModItems.TIANJIN_PANCAKE.get()); - this.basicItem(ModItems.NETHER_CORE.get()); - this.getBuilder(ModItems.MUSIC_DISK_ORCHELIAS_VOX.getId().toString()) - .parent(new ModelFile.UncheckedModelFile("item/template_music_disc")) - .texture("layer0", this.modLoc("item/music_disk_orchelias_vox")); - for (Map.Entry entry : ENCHANTMENTS.entrySet()) { - getBuilder("minecraft:item/enchanted_book") - .parent(new ModelFile.UncheckedModelFile("item/generated")) - .texture("layer0", mcLoc("item/enchanted_book")).override() - .predicate(modLoc("special"), entry.getValue()) - .model(generateModel(entry.getKey().split("\\.")[2])) - .end(); - } - } - - public ModelFile generateModel(String name) { - ResourceLocation location = modLoc("item/" + name); - if (!existingFileHelper.exists(location, PackType.CLIENT_RESOURCES, ".png", "textures")) { - location = mcLoc("item/enchanted_book"); - } - - return getBuilder(name).parent(new ModelFile.UncheckedModelFile("item/generated")).texture("layer0", location); - } - - public static Map ENCHANTMENTS = new Object2FloatOpenHashMap<>(); - - static { - String e = "enchantment." + SurvivingTheAftermath.MOD_ID + "."; - ENCHANTMENTS.put(e + "counter_attack", 0.1F); - ENCHANTMENTS.put(e + "bloodthirsty", 0.2F); - ENCHANTMENTS.put(e + "clean_water", 0.3F); - ENCHANTMENTS.put(e + "life_tree", 0.4F); - ENCHANTMENTS.put(e + "devoured", 0.5F); - ENCHANTMENTS.put(e + "frantic", 0.6F); - ENCHANTMENTS.put(e + "execute", 0.7F); - ENCHANTMENTS.put(e + "moon", 0.8F); - ENCHANTMENTS.put(e + "sun", 0.9F); - } -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModLanguageCNProvider.java b/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModLanguageCNProvider.java deleted file mode 100644 index 899363c..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModLanguageCNProvider.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.data.datagen; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.event.subscriber.RaidEventSubscriber; -import com.pancake.surviving_the_aftermath.common.init.ModEnchantments; -import com.pancake.surviving_the_aftermath.common.init.ModItems; -import com.pancake.surviving_the_aftermath.common.init.ModMobEffects; -import com.pancake.surviving_the_aftermath.common.tracker.RaidPlayerBattleTracker; -import net.minecraft.data.PackOutput; -import net.minecraftforge.common.data.LanguageProvider; - -public class ModLanguageCNProvider extends LanguageProvider { - - public ModLanguageCNProvider(PackOutput output) { - super(output, SurvivingTheAftermath.MOD_ID, "zh_cn"); - } - - @Override - protected void addTranslations() { - add("itemGroup." + SurvivingTheAftermath.MOD_ID, "劫后余生"); - add(ModItems.RAW_FALUKORV.get(), "生的法伦香肠"); - add(ModItems.COOKED_FALUKORV.get(), "熟的法伦香肠"); - add(ModItems.EGG_TART.get(), "蛋挞"); - add(ModItems.STACK_OF_EGG_TARTS.get(), "蛋挞堆"); - add(ModItems.HAMBURGER.get(), "汉堡"); - add(ModItems.TIANJIN_PANCAKE.get(), "煎饼果子"); - add(ModItems.NETHER_CORE.get(), "下界核心"); - add(ModItems.MUSIC_DISK_ORCHELIAS_VOX.get(), "音乐唱片"); - add(ModMobEffects.COWARDICE.get(),"懦弱"); - add(ModEnchantments.COUNTER_ATTACK.get(), "反击"); - add(ModEnchantments.BLOODTHIRSTY.get(), "渴血"); - add(ModEnchantments.CLEAN_WATER.get(), "净水"); - add(ModEnchantments.LIFE_TREE.get(), "树灵"); - add(ModEnchantments.DEVOURED.get(), "吞噬"); - add(ModEnchantments.FRANTIC.get(), "癫狂"); - add(ModEnchantments.EXECUTE.get(), "处决"); - add(ModEnchantments.RANGER.get(), "游侠"); - add(ModEnchantments.MOON.get(), "皎月"); - add(ModEnchantments.SUN.get(), "烈阳"); - add(RaidEventSubscriber.NETHER_RAID_START, "你感受到空气愈发炎热......"); - add(RaidEventSubscriber.NETHER_RAID_VICTORY, "望着最后一颗火星熄灭,你感觉它们不会再回来了,暂时......"); - add(RaidPlayerBattleTracker.PLAYER_BATTLE_ESCAPE, "请勿战斗过程逃跑,否则你将付出代价,倒计时开始......%s"); - add(RaidPlayerBattleTracker.PLAYER_BATTLE_PERSONAL_FAIL, "你虽然失败了但是可以继续相信你的队友"); - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModLanguageProvider.java b/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModLanguageProvider.java deleted file mode 100644 index 10d27f3..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModLanguageProvider.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.data.datagen; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.event.subscriber.RaidEventSubscriber; -import com.pancake.surviving_the_aftermath.common.init.ModEnchantments; -import com.pancake.surviving_the_aftermath.common.init.ModItems; -import com.pancake.surviving_the_aftermath.common.init.ModMobEffects; -import com.pancake.surviving_the_aftermath.common.tracker.RaidPlayerBattleTracker; -import net.minecraft.data.PackOutput; -import net.minecraftforge.common.data.LanguageProvider; - -public class ModLanguageProvider extends LanguageProvider { - - public ModLanguageProvider(PackOutput output) { - super(output, SurvivingTheAftermath.MOD_ID, "en_us"); - } - - @Override - protected void addTranslations() { - add("itemGroup." + SurvivingTheAftermath.MOD_ID, "Surviving the Aftermath"); - add(ModItems.RAW_FALUKORV.get(), "Raw Falukorv"); - add(ModItems.EGG_TART.get(), "Egg Tart"); - add(ModItems.STACK_OF_EGG_TARTS.get(), "Stack of Egg Tart"); - add(ModItems.HAMBURGER.get(), "Hamburger"); - add(ModItems.TIANJIN_PANCAKE.get(), "Tianjin Pancake"); - add(ModItems.NETHER_CORE.get(), "Nether Core"); - add(ModItems.MUSIC_DISK_ORCHELIAS_VOX.get(), "Music Disc"); - add(ModItems.MUSIC_DISK_ORCHELIAS_VOX.get().getDescriptionId() + ".desc", - "Hagali - Orchelia's vox (offvocal ver_)"); - add(ModMobEffects.COWARDICE.get(),"Cowardice"); - add(ModEnchantments.COUNTER_ATTACK.get(), "Counter Attack"); - add(ModEnchantments.BLOODTHIRSTY.get(), "Bloodthirsty"); - add(ModEnchantments.CLEAN_WATER.get(), "Clean Water"); - add(ModEnchantments.LIFE_TREE.get(), "Life Tree"); - add(ModEnchantments.DEVOURED.get(), "Devoured"); - add(ModEnchantments.FRANTIC.get(), "Frantic"); - add(ModEnchantments.EXECUTE.get(), "Execute"); - add(ModEnchantments.RANGER.get(), "Ranger"); - add(ModEnchantments.MOON.get(), "Moon"); - add(ModEnchantments.SUN.get(), "Sun"); - - add(RaidEventSubscriber.NETHER_RAID_START, "You feel the air getting hotter ....."); - add(RaidEventSubscriber.NETHER_RAID_VICTORY, "Looking at the last Mars extinguished, you feel they will not come back, temporarily......"); - add(RaidPlayerBattleTracker.PLAYER_BATTLE_ESCAPE, "Do not fight process escape, or you will pay the price, the countdown begins......%s"); - add(RaidPlayerBattleTracker.PLAYER_BATTLE_PERSONAL_FAIL, "Although you failed, you can continue to trust your teammates."); - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModLootTableProvider.java b/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModLootTableProvider.java deleted file mode 100644 index cc20b59..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModLootTableProvider.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.data.datagen; - - -import com.pancake.surviving_the_aftermath.common.data.datagen.loot.ModBlockLoot; -import com.pancake.surviving_the_aftermath.common.data.datagen.loot.ModChestLoot; -import com.pancake.surviving_the_aftermath.common.data.datagen.loot.ModEntityLoot; -import net.minecraft.data.PackOutput; -import net.minecraft.data.loot.LootTableProvider; -import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; - -import java.util.List; -import java.util.Set; - -public class ModLootTableProvider extends LootTableProvider { - - public ModLootTableProvider(PackOutput output) { - super(output, Set.of(), List.of( - new SubProviderEntry(ModBlockLoot::new, LootContextParamSets.BLOCK), - new SubProviderEntry(ModChestLoot::new, LootContextParamSets.CHEST), - new SubProviderEntry(ModEntityLoot::new, LootContextParamSets.ENTITY))); - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModSoundProvider.java b/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModSoundProvider.java deleted file mode 100644 index 90ee8f7..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModSoundProvider.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.data.datagen; - - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.init.ModSoundEvents; -import net.minecraft.data.PackOutput; -import net.minecraft.sounds.SoundEvent; -import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.common.data.SoundDefinitionsProvider; - -public class ModSoundProvider extends SoundDefinitionsProvider { - - protected ModSoundProvider(PackOutput packOutput, ExistingFileHelper helper) { - super(packOutput, SurvivingTheAftermath.MOD_ID, helper); - } - - @Override - public void registerSounds() { - addWithSameName(ModSoundEvents.ORCHELIAS_VOX.get(), true); - } - - private void addWithSameName(SoundEvent sound, boolean stream) { - add(sound, definition().with(sound(sound.getLocation()).stream(stream))); - } -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModTagProviders.java b/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModTagProviders.java deleted file mode 100644 index a80213c..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/ModTagProviders.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.data.datagen; - - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.init.ModItems; -import com.pancake.surviving_the_aftermath.common.init.ModStructures; -import com.pancake.surviving_the_aftermath.common.init.ModTags; -import net.minecraft.core.HolderLookup.Provider; -import net.minecraft.data.PackOutput; -import net.minecraft.data.tags.BiomeTagsProvider; -import net.minecraft.data.tags.EntityTypeTagsProvider; -import net.minecraft.data.tags.ItemTagsProvider; -import net.minecraft.data.tags.StructureTagsProvider; -import net.minecraft.tags.BiomeTags; -import net.minecraft.tags.ItemTags; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.level.biome.Biomes; -import net.minecraft.world.level.block.Block; -import net.minecraftforge.common.data.BlockTagsProvider; -import net.minecraftforge.common.data.ExistingFileHelper; -import org.jetbrains.annotations.Nullable; - -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.concurrent.CompletableFuture; - -@ParametersAreNonnullByDefault -public class ModTagProviders { - - public static class ModBlockTagsProvider extends BlockTagsProvider { - - public ModBlockTagsProvider(PackOutput output, CompletableFuture lookupProvider, - @Nullable ExistingFileHelper existingFileHelper) { - super(output, lookupProvider, SurvivingTheAftermath.MOD_ID, existingFileHelper); - } - - @Override - protected void addTags(Provider pProvider) { - - } - - } - - public static class ModItemTagsProvider extends ItemTagsProvider { - - public ModItemTagsProvider(PackOutput output, CompletableFuture lookupProvider, - CompletableFuture> blockTags, @Nullable ExistingFileHelper existingFileHelper) { - super(output, lookupProvider, blockTags, SurvivingTheAftermath.MOD_ID, existingFileHelper); - } - - @Override - protected void addTags(Provider provider) { - this.tag(ItemTags.MUSIC_DISCS).add(ModItems.MUSIC_DISK_ORCHELIAS_VOX.get()); - } - - } - - public static class ModBiomeTagsProvider extends BiomeTagsProvider { - - public ModBiomeTagsProvider(PackOutput output, CompletableFuture lookupProvider, - @Nullable ExistingFileHelper existingFileHelper) { - super(output, lookupProvider, SurvivingTheAftermath.MOD_ID, existingFileHelper); - } - - @Override - protected void addTags(Provider provider) { - tag(ModTags.HAS_CITY).add(Biomes.PLAINS); - tag(ModTags.HAS_NETHER_RAID).add(Biomes.PLAINS); - tag(ModTags.HAS_HOUSE_OF_SAKURA).add(Biomes.CHERRY_GROVE); - tag(ModTags.HAS_EXPANSION_BUILD).addTag(BiomeTags.IS_FOREST).add(Biomes.PLAINS); - tag(ModTags.HAS_BURNT_STRUCTURE).addTag(BiomeTags.IS_BADLANDS).addTag(BiomeTags.HAS_DESERT_PYRAMID); - } - - } - - public static class ModStructureTagsProvider extends StructureTagsProvider { - - public ModStructureTagsProvider(PackOutput output, CompletableFuture provider, - @Nullable ExistingFileHelper existingFileHelper) { - super(output, provider, SurvivingTheAftermath.MOD_ID, existingFileHelper); - } - - @Override - protected void addTags(Provider provider) { - tag(ModTags.NETHER_RAID).addOptional(ModStructures.NETHER_RAID.location()); - } - - } - - public static class ModEntityTypeTagsProvider extends EntityTypeTagsProvider { - - public ModEntityTypeTagsProvider(PackOutput output, CompletableFuture provider, - @Nullable ExistingFileHelper existingFileHelper) { - super(output, provider, SurvivingTheAftermath.MOD_ID, existingFileHelper); - } - - @Override - protected void addTags(Provider provider) { - this.tag(ModTags.NETHER_MOB).add(EntityType.ZOMBIFIED_PIGLIN, EntityType.GHAST, EntityType.MAGMA_CUBE, - EntityType.BLAZE, EntityType.SKELETON, EntityType.WITHER_SKELETON, EntityType.ENDERMAN, - EntityType.HOGLIN, EntityType.PIGLIN, EntityType.PIGLIN_BRUTE, EntityType.STRIDER); - } - - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/RegistryDataGenerator.java b/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/RegistryDataGenerator.java deleted file mode 100644 index f6a2c5e..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/RegistryDataGenerator.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.data.datagen; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.init.ModBiomes; -import com.pancake.surviving_the_aftermath.common.init.ModStructureSets; -import com.pancake.surviving_the_aftermath.common.init.ModStructures; -import net.minecraft.core.HolderLookup; -import net.minecraft.core.RegistrySetBuilder; -import net.minecraft.core.registries.Registries; -import net.minecraft.data.PackOutput; -import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider; - -import java.util.Set; -import java.util.concurrent.CompletableFuture; - -public class RegistryDataGenerator extends DatapackBuiltinEntriesProvider { - - public static final RegistrySetBuilder BUILDER = new RegistrySetBuilder() - .add(Registries.BIOME, ModBiomes::bootstrap) - .add(Registries.STRUCTURE, ModStructures::bootstrap) - .add(Registries.STRUCTURE_SET, ModStructureSets::bootstrap); - - public RegistryDataGenerator(PackOutput output, CompletableFuture provider) { - super(output, provider, BUILDER, Set.of(SurvivingTheAftermath.MOD_ID)); - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/loot/ModBlockLoot.java b/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/loot/ModBlockLoot.java deleted file mode 100644 index 0d42f0e..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/loot/ModBlockLoot.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.data.datagen.loot; - -import com.pancake.surviving_the_aftermath.common.util.RegistryUtil; -import net.minecraft.data.loot.packs.VanillaBlockLoot; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.storage.loot.BuiltInLootTables; -import net.minecraft.world.level.storage.loot.LootTable; - -import java.util.HashSet; -import java.util.Set; -import java.util.function.BiConsumer; - -public class ModBlockLoot extends VanillaBlockLoot { - - @Override - protected void generate() { - - } - - @Override - public void generate(BiConsumer biConsumer) { - this.generate(); - Set set = new HashSet<>(); - for(Block block : RegistryUtil.getKnownBlocks()) { - if (block.isEnabled(this.enabledFeatures)) { - ResourceLocation resourcelocation = block.getLootTable(); - if (resourcelocation != BuiltInLootTables.EMPTY && set.add(resourcelocation)) { - LootTable.Builder lootTable$builder = this.map.remove(resourcelocation); - if (lootTable$builder != null) { - biConsumer.accept(resourcelocation, lootTable$builder); - } - } - } - } - - if (!this.map.isEmpty()) { - throw new IllegalStateException("Created block loot tables for non-blocks: " + this.map.keySet()); - } - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/loot/ModChestLoot.java b/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/loot/ModChestLoot.java deleted file mode 100644 index 7a2040c..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/loot/ModChestLoot.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.data.datagen.loot; - -import net.minecraft.data.loot.packs.VanillaChestLoot; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.storage.loot.LootTable; - -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.function.BiConsumer; - -@ParametersAreNonnullByDefault -public class ModChestLoot extends VanillaChestLoot { - - @Override - public void generate(BiConsumer biConsumer) { - - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/loot/ModEntityLoot.java b/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/loot/ModEntityLoot.java deleted file mode 100644 index e51882a..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/loot/ModEntityLoot.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.data.datagen.loot; - -import com.google.common.collect.Sets; -import net.minecraft.data.loot.packs.VanillaEntityLoot; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.level.storage.loot.BuiltInLootTables; -import net.minecraft.world.level.storage.loot.LootTable; -import net.minecraftforge.registries.ForgeRegistries; - -import java.util.Map; -import java.util.Set; -import java.util.function.BiConsumer; - -public class ModEntityLoot extends VanillaEntityLoot { - - @Override - public void generate() { - - } - - @Override - public void generate(BiConsumer biConsumer) { -// this.generate(); -// Set set = Sets.newHashSet(); -// for (EntityType entityType : ForgeRegistries.ENTITY_TYPES) { -// if (entityType.isEnabled(this.allowed) && this.canHaveLootTable(entityType)) { -// Map map = this.map.remove(entityType); -// ResourceLocation resource = entityType.getDefaultLootTable(); -// if (resource.equals(BuiltInLootTables.EMPTY) && map != null) { -// map.forEach((resourceLocation, builder) -> { -// if (set.add(resourceLocation)) { -// biConsumer.accept(resourceLocation, builder); -// } -// }); -// } -// } -// } - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/raid/NetherRaidModuleProvider.java b/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/raid/NetherRaidModuleProvider.java deleted file mode 100644 index fccb5e6..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/data/datagen/raid/NetherRaidModuleProvider.java +++ /dev/null @@ -1,523 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.data.datagen.raid; - -import com.google.common.collect.Lists; -import com.pancake.surviving_the_aftermath.api.aftermath.AftermathAPI; -import com.pancake.surviving_the_aftermath.api.module.IEntityInfoModule; -import com.pancake.surviving_the_aftermath.api.module.impl.amount.FixedAmountModule; -import com.pancake.surviving_the_aftermath.api.module.impl.amount.RandomAmountModule; -import com.pancake.surviving_the_aftermath.api.module.impl.entity_info.EntityInfoModule; -import com.pancake.surviving_the_aftermath.api.module.impl.entity_info.EntityInfoWithEquipmentModule; -import com.pancake.surviving_the_aftermath.api.module.impl.weighted.ItemWeightedListModule; -import com.pancake.surviving_the_aftermath.common.data.datagen.AftermathModuleProviders; -import com.pancake.surviving_the_aftermath.common.raid.module.NetherRaidModule; -import net.minecraft.data.PackOutput; - -import java.util.List; - -public class NetherRaidModuleProvider extends AftermathModuleProviders { - private static final AftermathAPI AFTERMATH_API = AftermathAPI.getInstance(); - public NetherRaidModuleProvider(PackOutput output) { - super(output, "surviving_the_aftermath"); - } - - - @Override - public void addModules() { - NetherRaidModule netherRaidModule = new NetherRaidModule.Builder("common") - .setReadyTime(100) - /* 1 */ - .addWave(() -> List.of( - new EntityInfoModule.Builder() - .setEntityType("minecraft:piglin") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(4,5) - .build() - ).build() - )) - /* 2 */ - .addWave(() -> List.of( - new EntityInfoModule.Builder() - .setEntityType("minecraft:zombified_piglin") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(4, 5) - .build() - ).build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:hoglin") - .setAmountModule(() -> new FixedAmountModule.Builder() - .setAmount(1) - .build() - ).build() - )) - /* 3 */ - .addWave(() -> List.of( - new EntityInfoModule.Builder() - .setEntityType("minecraft:piglin") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(4, 5) - .build() - ).build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:hoglin") - .setAmountModule(() -> new FixedAmountModule.Builder() - .setAmount(1) - .build() - ).build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:magma_cube") - .setAmountModule(() -> new FixedAmountModule.Builder() - .setAmount(1) - .build() - ).build() - )) - /* 4 */ - .addWave(() -> List.of( - new EntityInfoModule.Builder() - .setEntityType("minecraft:piglin") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(4, 5) - .build() - ).build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:hoglin") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(1,2) - .build() - ).build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:magma_cube") - .setAmountModule(() -> new FixedAmountModule.Builder() - .setAmount(1) - .build() - ).build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:blaze") - .setAmountModule(() -> new FixedAmountModule.Builder() - .setAmount(1) - .build() - ).build() - )) - /* 5 */ - .addWave(() -> List.of( - new EntityInfoModule.Builder() - .setEntityType("minecraft:piglin") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(3, 4) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:hoglin") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(1, 2) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:magma_cube") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(1, 2) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:blaze") - .setAmountModule(() -> new FixedAmountModule.Builder() - .setAmount(1) - .build() - ) - .build(), - new EntityInfoWithEquipmentModule.Builder() - .setEquipment(() -> new ItemWeightedListModule.Builder() - .add("minecraft:golden_helmet", 1) - .add("minecraft:golden_chestplate", 1) - .add("minecraft:golden_leggings", 1) - .add("minecraft:golden_boots", 1) - .add("minecraft:golden_sword", 1) - .build() - ) - .setEntityType("minecraft:piglin_brute") - .setAmountModule(() -> new FixedAmountModule.Builder() - .setAmount(1) - .build() - ) - .build() - )) - /* 6 */ - .addWave(() -> List.of( - new EntityInfoWithEquipmentModule.Builder() - .setEquipment(() -> new ItemWeightedListModule.Builder() - .add("minecraft:golden_helmet", 1) - .add("minecraft:golden_chestplate", 1) - .add("minecraft:golden_leggings", 1) - .add("minecraft:golden_boots", 1) - .add("minecraft:golden_sword", 1) - .build() - ) - .setEntityType("minecraft:piglin") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(3, 4) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:hoglin") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(2, 3) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:magma_cube") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(1, 2) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:ghast") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(1, 3) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:blaze") - .setAmountModule(() -> new FixedAmountModule.Builder() - .setAmount(1) - .build() - ) - .build(), - new EntityInfoWithEquipmentModule.Builder() - .setEquipment(() -> new ItemWeightedListModule.Builder() - .add("minecraft:golden_helmet", 1) - .add("minecraft:golden_chestplate", 1) - .add("minecraft:golden_leggings", 1) - .add("minecraft:golden_boots", 1) - .add("minecraft:golden_sword", 1) - .build() - ) - .setEntityType("minecraft:piglin_brute") - .setAmountModule(() -> new FixedAmountModule.Builder() - .setAmount(1) - .build() - ) - .build() - )) - /* 7 */ - .addWave(() -> List.of( - new EntityInfoWithEquipmentModule.Builder() - .setEquipment(() -> new ItemWeightedListModule.Builder() - .add("minecraft:golden_helmet", 1) - .add("minecraft:golden_chestplate", 1) - .add("minecraft:golden_leggings", 1) - .add("minecraft:golden_boots", 1) - .add("minecraft:golden_sword", 1) - .build() - ) - .setEntityType("minecraft:piglin") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(3, 4) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:hoglin") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(3, 4) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:magma_cube") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(2, 4) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:ghast") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(2, 4) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:blaze") - .setAmountModule(() -> new FixedAmountModule.Builder() - .setAmount(2) - .build() - ) - .build(), - new EntityInfoWithEquipmentModule.Builder() - .setEquipment(() -> new ItemWeightedListModule.Builder() - .add("minecraft:golden_helmet", 1) - .add("minecraft:golden_chestplate", 1) - .add("minecraft:golden_leggings", 1) - .add("minecraft:golden_boots", 1) - .add("minecraft:golden_sword", 1) - .build() - ) - .setEntityType("minecraft:piglin_brute") - .setAmountModule(() -> new FixedAmountModule.Builder() - .setAmount(1) - .build() - ) - .build() - )) - /* 8 */ - .addWave(() -> List.of( - new EntityInfoWithEquipmentModule.Builder() - .setEquipment(() -> new ItemWeightedListModule.Builder() - .add("minecraft:golden_helmet", 1) - .add("minecraft:golden_chestplate", 1) - .add("minecraft:golden_leggings", 1) - .add("minecraft:golden_boots", 1) - .add("minecraft:golden_sword", 1) - .build() - ) - .setEntityType("minecraft:piglin") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(3, 4) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:hoglin") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(2, 4) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:magma_cube") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(3, 4) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:ghast") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(2, 4) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:blaze") - .setAmountModule(() -> new FixedAmountModule.Builder() - .setAmount(3) - .build() - ) - .build(), - new EntityInfoWithEquipmentModule.Builder() - .setEquipment(() -> new ItemWeightedListModule.Builder() - .add("minecraft:golden_helmet", 1) - .add("minecraft:golden_chestplate", 1) - .add("minecraft:golden_leggings", 1) - .add("minecraft:golden_boots", 1) - .add("minecraft:golden_sword", 1) - .build() - ) - .setEntityType("minecraft:piglin_brute") - .setAmountModule(() -> new FixedAmountModule.Builder() - .setAmount(2) - .build() - ) - .build() - )) - /* 9 */ - .addWave(() -> List.of( - new EntityInfoWithEquipmentModule.Builder() - .setEquipment(() -> new ItemWeightedListModule.Builder() - .add("minecraft:golden_helmet", 1) - .add("minecraft:golden_chestplate", 1) - .add("minecraft:golden_leggings", 1) - .add("minecraft:golden_boots", 1) - .add("minecraft:golden_sword", 1) - .build() - ) - .setEntityType("minecraft:piglin") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(4, 6) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:hoglin") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(3, 6) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:magma_cube") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(3, 5) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:ghast") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(3, 5) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:blaze") - .setAmountModule(() -> new FixedAmountModule.Builder() - .setAmount(4) - .build() - ) - .build(), - new EntityInfoWithEquipmentModule.Builder() - .setEquipment(() -> new ItemWeightedListModule.Builder() - .add("minecraft:golden_helmet", 1) - .add("minecraft:golden_chestplate", 1) - .add("minecraft:golden_leggings", 1) - .add("minecraft:golden_boots", 1) - .add("minecraft:golden_sword", 1) - .build() - ) - .setEntityType("minecraft:piglin_brute") - .setAmountModule(() -> new FixedAmountModule.Builder() - .setAmount(3) - .build() - ) - .build() - )) - /* 10 */ - .addWave(() -> List.of( - new EntityInfoWithEquipmentModule.Builder() - .setEquipment(() -> new ItemWeightedListModule.Builder() - .add("minecraft:golden_helmet", 1) - .add("minecraft:golden_chestplate", 1) - .add("minecraft:golden_leggings", 1) - .add("minecraft:golden_boots", 1) - .add("minecraft:golden_sword", 1) - .build() - ) - .setEntityType("minecraft:piglin") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(2, 6) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:hoglin") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(2, 6) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:magma_cube") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(2, 6) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:ghast") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(2, 6) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:blaze") - .setAmountModule(() -> new FixedAmountModule.Builder() - .setAmount(6) - .build() - ) - .build(), - new EntityInfoWithEquipmentModule.Builder() - .setEquipment(() -> new ItemWeightedListModule.Builder() - .add("minecraft:golden_helmet", 1) - .add("minecraft:golden_chestplate", 1) - .add("minecraft:golden_leggings", 1) - .add("minecraft:golden_boots", 1) - .add("minecraft:golden_sword", 1) - .build() - ) - .setEntityType("minecraft:piglin_brute") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(3, 5) - .build() - ) - .build() - )) - /* 11 */ - .addWave(() -> List.of( - new EntityInfoWithEquipmentModule.Builder() - .setEquipment(() -> new ItemWeightedListModule.Builder() - .add("minecraft:golden_helmet", 1) - .add("minecraft:golden_chestplate", 1) - .add("minecraft:golden_leggings", 1) - .add("minecraft:golden_boots", 1) - .add("minecraft:golden_sword", 1) - .build() - ) - .setEntityType("minecraft:piglin") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(1, 8) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:hoglin") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(1, 8) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:magma_cube") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(1, 8) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:ghast") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(1, 8) - .build() - ) - .build(), - new EntityInfoModule.Builder() - .setEntityType("minecraft:blaze") - .setAmountModule(() -> new RandomAmountModule.Builder() - .setRange(1, 8) - .build() - ) - .build(), - new EntityInfoWithEquipmentModule.Builder() - .setEquipment(() -> new ItemWeightedListModule.Builder() - .add("minecraft:netherite_helmet", 1) - .add("minecraft:netherite_chestplate", 1) - .add("minecraft:netherite_leggings", 1) - .add("minecraft:netherite_boots", 1) - .add("minecraft:netherite_sword", 1) - .build() - ) - .setEntityType("minecraft:piglin_brute") - .setAmountModule(() -> new FixedAmountModule.Builder() - .setAmount(8) - .build() - ) - .build() - )) - .setRewards(() -> new ItemWeightedListModule.Builder() - .add("minecraft:gold_ingot", 100) - .add("minecraft:diamond", 10) - .add("minecraft:emerald",20) - .add("minecraft:enchanted_golden_apple",2) - .add("minecraft:nether_scrap",2) - .add("surviving_the_aftermath:nether_core",1) - .build()) - .build(); - addModule(netherRaidModule); - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/data/pack/AftermathModuleLoader.java b/src/main/java/com/pancake/surviving_the_aftermath/common/data/pack/AftermathModuleLoader.java deleted file mode 100644 index e46a6ce..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/data/pack/AftermathModuleLoader.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.data.pack; - -import com.google.common.collect.Maps; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.api.Constant; -import com.pancake.surviving_the_aftermath.api.aftermath.AftermathAPI; -import com.pancake.surviving_the_aftermath.api.module.IAftermathModule; -import com.pancake.surviving_the_aftermath.common.util.AftermathEventUtil; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.resources.ResourceManager; -import net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener; -import net.minecraft.util.GsonHelper; -import net.minecraft.util.profiling.ProfilerFiller; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -public class AftermathModuleLoader extends SimpleJsonResourceReloadListener { - public static final Gson GSON = new GsonBuilder() - .setPrettyPrinting() - .create(); - public final Map> AFTERMATH_MODULE_MAP = Maps.newHashMap(); - - public AftermathModuleLoader() { - super(GSON, "aftermath"); - } - @Override - protected void apply(Map jsonElementMap, @NotNull ResourceManager manager, @NotNull ProfilerFiller filler) { - AFTERMATH_MODULE_MAP.clear(); - AftermathAPI instance = AftermathAPI.getInstance(); - jsonElementMap.forEach((resourceLocation, jsonElement) -> { - JsonObject asJsonObject = jsonElement.getAsJsonObject(); - String identifier = GsonHelper.getAsString(asJsonObject, Constant.IDENTIFIER); - IAftermathModule aftermathModule = instance.getAftermathModule(identifier); - try { - aftermathModule.deserializeJson(asJsonObject); - aftermathModule.setJsonName(resourceLocation.getPath()); - if (!AFTERMATH_MODULE_MAP.containsKey(identifier)) { - AFTERMATH_MODULE_MAP.put(identifier, new ArrayList<>(List.of(aftermathModule))); - } - AFTERMATH_MODULE_MAP.get(identifier).add(aftermathModule); - }catch (NullPointerException e) { - SurvivingTheAftermath.LOGGER.error("Failed to deserialize aftermath module: " + aftermathModule.getUniqueIdentifier() + "\n Error: " + e); - } - }); - instance.finishAftermathMap(AFTERMATH_MODULE_MAP); - } -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/effect/CowardiceEffect.java b/src/main/java/com/pancake/surviving_the_aftermath/common/effect/CowardiceEffect.java deleted file mode 100644 index 0cfef3e..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/effect/CowardiceEffect.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.effect; - -import net.minecraft.world.effect.MobEffect; -import net.minecraft.world.effect.MobEffectCategory; - -public class CowardiceEffect extends MobEffect { - public CowardiceEffect() { - super(MobEffectCategory.HARMFUL, 0x8B0000); - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/BaseEnchantment.java b/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/BaseEnchantment.java deleted file mode 100644 index f36de1f..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/BaseEnchantment.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.enchantment; - -import net.minecraft.util.Mth; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.effect.MobEffects; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.MobType; -import net.minecraft.world.entity.ai.attributes.Attributes; -import net.minecraft.world.entity.decoration.ArmorStand; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraft.world.item.enchantment.EnchantmentCategory; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.phys.AABB; -import net.minecraftforge.common.ToolActions; - -public class BaseEnchantment extends Enchantment { - protected static final EquipmentSlot[] ARMOR_SLOTS = new EquipmentSlot[]{EquipmentSlot.HEAD, EquipmentSlot.CHEST, EquipmentSlot.LEGS, EquipmentSlot.FEET}; - - public BaseEnchantment(Rarity rarity, EnchantmentCategory category, EquipmentSlot... applicableSlots) { - super(rarity, category, applicableSlots); - } - - @Override - public boolean isTreasureOnly() { - return true; - } - - @Override - public boolean isTradeable() { - return true; - } - - protected boolean hasDamageBonus() { - return false; - } - - protected float getDamageBonus(Player player, Entity target, int level) { - return 0.0F; - } - - @Override - public void doPostAttack(LivingEntity attacker, Entity target, int level) { - if (this.hasDamageBonus() && attacker instanceof Player player && target.isAttackable() && !target.skipAttackInteraction(attacker)) { - MobType mobType = target instanceof LivingEntity livingEntity ? livingEntity.getMobType() : MobType.UNDEFINED; - float mobTypeDamageBonus = EnchantmentHelper.getDamageBonus(player.getMainHandItem(), mobType); - float customDamageBonus = this.getDamageBonus(player, target, level); - float f = (float)attacker.getAttributeValue(Attributes.ATTACK_DAMAGE); - float f1 = customDamageBonus > 0.0F ? customDamageBonus : mobTypeDamageBonus; - float f2 = player.getAttackStrengthScale(0.5F); - if ((f *= 0.2F + f2 * f2 * 0.8F) > 0.0F || (f1 *= f2) > 0.0F) { - boolean flag = f2 > 0.9F, flag3 = false; - boolean flag2 = flag && player.fallDistance > 0.0F && !player.onGround() && !player.onClimbable() && !player.isInWater() && - !player.hasEffect(MobEffects.BLINDNESS) && !player.isPassenger() && target instanceof LivingEntity; - flag2 = flag2 && !player.isSprinting(); - f *= flag2 ? 1.5F : 1.0F; f += f1; - double d0 = player.walkDist - player.walkDistO; - if (flag && !flag2 && !player.isSprinting() && player.onGround() && d0 < (double) player.getSpeed()) { - ItemStack itemInHand = player.getItemInHand(InteractionHand.MAIN_HAND); - flag3 = itemInHand.canPerformAction(ToolActions.SWORD_SWEEP); - } - if (target.hurt(player.damageSources().playerAttack(player), f) && flag3) { - float f3 = 1.0F + EnchantmentHelper.getSweepingDamageRatio(player) * f; - AABB sweepHitBox = player.getItemInHand(InteractionHand.MAIN_HAND).getSweepHitBox(player, target); - for (LivingEntity livingEntity : player.level().getEntitiesOfClass(LivingEntity.class, sweepHitBox)) { - double entityReachSq = Mth.square(player.getEntityReach()); - double x = Mth.sin(player.getYRot() * ((float)Math.PI / 180F)); - double z = -Mth.cos(player.getYRot() * ((float)Math.PI / 180F)); - boolean flag4 = player.distanceToSqr(livingEntity) < entityReachSq; - boolean flag5 = (!(livingEntity instanceof ArmorStand) || !((ArmorStand)livingEntity).isMarker()); - if (livingEntity != player && livingEntity != target && !player.isAlliedTo(livingEntity) && flag4 && flag5) { - livingEntity.knockback(0.4F, x, z); - livingEntity.hurt(player.damageSources().playerAttack(player), f3); - } - } - } - } - } - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/BloodthirstyEnchantment.java b/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/BloodthirstyEnchantment.java deleted file mode 100644 index a586e45..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/BloodthirstyEnchantment.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.enchantment; - -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraft.world.item.enchantment.EnchantmentCategory; - -public class BloodthirstyEnchantment extends BaseEnchantment { - - public BloodthirstyEnchantment() { - super(Enchantment.Rarity.RARE, EnchantmentCategory.WEAPON, EquipmentSlot.MAINHAND); - } - - @Override - public int getMaxLevel() { - return 3; - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/CleanWaterEnchantment.java b/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/CleanWaterEnchantment.java deleted file mode 100644 index 783b28e..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/CleanWaterEnchantment.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.enchantment; - -import com.pancake.surviving_the_aftermath.common.init.ModTags; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.enchantment.DamageEnchantment; -import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraft.world.item.enchantment.EnchantmentCategory; - -public class CleanWaterEnchantment extends BaseEnchantment { - - public CleanWaterEnchantment() { - super(Rarity.RARE, EnchantmentCategory.WEAPON, EquipmentSlot.MAINHAND); - } - - @Override - public int getMaxLevel() { - return 4; - } - - @Override - protected boolean checkCompatibility(Enchantment other) { - return !(other instanceof DamageEnchantment) && super.checkCompatibility(other); - } - - @Override - protected boolean hasDamageBonus() { - return true; - } - - @Override - protected float getDamageBonus(Player player, Entity target, int level) { - return target.getType().is(ModTags.NETHER_MOB) ? level * 2.5F : 0.0F; - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/CounterattackEnchantment.java b/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/CounterattackEnchantment.java deleted file mode 100644 index e2bf4ae..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/CounterattackEnchantment.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.enchantment; - -import net.minecraft.util.Mth; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.attributes.Attributes; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ArmorItem; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraft.world.item.enchantment.EnchantmentCategory; -import net.minecraft.world.item.enchantment.Enchantments; - -public class CounterattackEnchantment extends BaseEnchantment { - - public CounterattackEnchantment() { - super(Enchantment.Rarity.RARE, EnchantmentCategory.ARMOR, BaseEnchantment.ARMOR_SLOTS); - } - - @Override - public int getMaxLevel() { - return 3; - } - - @Override - public int getMinCost(int level) { - return 10 + level * 7; - } - - @Override - public int getMaxCost(int level) { - return 50; - } - - @Override - public boolean canEnchant(ItemStack stack) { - return stack.getItem() instanceof ArmorItem; - } - - @Override - public void doPostHurt(LivingEntity target, Entity entity, int level){ - if (target instanceof Player player && entity.isAttackable()) { - float f = player.getAttackStrengthScale(0.5F); - float i = (float)player.getAttributeValue(Attributes.ATTACK_KNOCKBACK) + level; - if ((i += player.isSprinting() && f > 0.9F ? 1.0F : 0.0F) > 0) { - if (entity instanceof LivingEntity livingEntity) { - double x = Mth.sin(player.getYRot() * ((float)Math.PI / 180F)); - double z = -Mth.cos(player.getYRot() * ((float)Math.PI / 180F)); - livingEntity.knockback(i * 0.5F, x, z); - } - - player.setDeltaMovement(player.getDeltaMovement().multiply(0.6D, 1.0D, 0.6D)); - player.setSprinting(false); - } - } - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/DevouredEnchantment.java b/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/DevouredEnchantment.java deleted file mode 100644 index 9c77ae2..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/DevouredEnchantment.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.enchantment; - -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TieredItem; -import net.minecraft.world.item.TridentItem; -import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraft.world.item.enchantment.EnchantmentCategory; - -public class DevouredEnchantment extends BaseEnchantment { - - public DevouredEnchantment() { - super(Enchantment.Rarity.RARE, EnchantmentCategory.VANISHABLE, EquipmentSlot.MAINHAND); - } - - @Override - public int getMaxLevel() { - return 4; - } - - @Override - public boolean canEnchant(ItemStack stack) { - Item item = stack.getItem(); - return item instanceof TieredItem || item instanceof TridentItem; - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/ExecuteEnchantment.java b/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/ExecuteEnchantment.java deleted file mode 100644 index 7ddb314..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/ExecuteEnchantment.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.enchantment; - -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.enchantment.EnchantmentCategory; - -public class ExecuteEnchantment extends BaseEnchantment { - - public ExecuteEnchantment() { - super(Rarity.RARE, EnchantmentCategory.WEAPON, EquipmentSlot.MAINHAND); - } - - @Override - public int getMaxLevel() { - return 3; - } - - @Override - public int getMinCost(int level) { - return 20; - } - - @Override - public int getMaxCost(int level) { - return 50; - } - - @Override - public void doPostAttack(LivingEntity attacker, Entity target, int level) { - float[] percentage = new float[]{0.0F, 0.01F, 0.03F, 0.05F}; - if (target instanceof LivingEntity livingEntity) { - float maxHealth = livingEntity.getMaxHealth(); - float currentHealth = livingEntity.getHealth(); - if (currentHealth / maxHealth < percentage[level]) { - target.kill(); - } - } - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/FranticEnchantment.java b/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/FranticEnchantment.java deleted file mode 100644 index 6dc8f4c..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/FranticEnchantment.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.enchantment; - -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.ai.attributes.Attributes; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.enchantment.EnchantmentCategory; - -public class FranticEnchantment extends BaseEnchantment { - - public FranticEnchantment() { - super(Rarity.RARE, EnchantmentCategory.WEAPON, EquipmentSlot.MAINHAND); - } - - @Override - protected boolean hasDamageBonus() { - return true; - } - - @Override - protected float getDamageBonus(Player player, Entity target, int level) { - return (float) ((1 - player.getHealth() / player.getMaxHealth()) * 0.1 * level * player.getAttributeValue(Attributes.ATTACK_DAMAGE)); - } -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/LifeTreeEnchantment.java b/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/LifeTreeEnchantment.java deleted file mode 100644 index 11dfcfb..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/LifeTreeEnchantment.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.enchantment; - -import net.minecraft.world.item.ArmorItem; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.enchantment.EnchantmentCategory; -import net.minecraft.world.item.enchantment.Enchantments; - -public class LifeTreeEnchantment extends BaseEnchantment { - - public LifeTreeEnchantment() { - super(Rarity.RARE, EnchantmentCategory.ARMOR, BaseEnchantment.ARMOR_SLOTS); - } - - @Override - public int getMaxLevel() { - return 4; - } - - @Override - public int getMinCost(int level) { - return 15 + (level - 1) * 9; - } - - @Override - public int getMaxCost(int level) { - return super.getMinCost(level) + 50; - } - - @Override - public boolean canEnchant(ItemStack stack) { - return stack.getItem() instanceof ArmorItem; - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/RangerEnchantment.java b/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/RangerEnchantment.java deleted file mode 100644 index b9f0543..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/RangerEnchantment.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.enchantment; - -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.item.enchantment.EnchantmentCategory; - -public class RangerEnchantment extends BaseEnchantment { - - public RangerEnchantment() { - super(Rarity.RARE, EnchantmentCategory.BOW, EquipmentSlot.MAINHAND); - } - - @Override - public int getMinCost(int level) { - return 12 + (level - 1) * 20; - } - - @Override - public int getMaxCost(int level) { - return getMinCost(level) + 50; - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/SunAndMoonEnchantment.java b/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/SunAndMoonEnchantment.java deleted file mode 100644 index 764f86d..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/enchantment/SunAndMoonEnchantment.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.enchantment; - -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraft.world.item.enchantment.EnchantmentCategory; - -public class SunAndMoonEnchantment extends BaseEnchantment { - - public final int type; - - public SunAndMoonEnchantment(int type) { - super(Enchantment.Rarity.RARE, EnchantmentCategory.WEAPON, EquipmentSlot.MAINHAND); - this.type = type; - } - - @Override - public int getMaxLevel() { - return 4; - } - - @Override - protected boolean checkCompatibility(Enchantment other) { - return !(other instanceof SunAndMoonEnchantment); - } - - @Override - protected boolean hasDamageBonus() { - return true; - } - - @Override - protected float getDamageBonus(Player player, Entity target, int level) { - return (this.type == 0 && player.level().isDay()) || (this.type == 1 && player.level().isNight()) ? level : 0.0F; - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/event/AftermathEvent.java b/src/main/java/com/pancake/surviving_the_aftermath/common/event/AftermathEvent.java deleted file mode 100644 index 86fe3df..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/event/AftermathEvent.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.event; - -import com.pancake.surviving_the_aftermath.api.base.BaseAftermath; -import com.pancake.surviving_the_aftermath.api.base.BaseAftermathModule; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.util.random.SimpleWeightedRandomList; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.Level; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; - -import java.util.List; -import java.util.Set; -import java.util.UUID; -import java.util.function.Supplier; - -public class AftermathEvent extends Event { - private final BaseAftermath aftermath; - private final Set players; - private final ServerLevel level; - private final BaseAftermathModule module; - - public Set getPlayers() { - return players; - } - - public ServerLevel getLevel() { - return level; - } - - public BaseAftermath getAftermath() { - return aftermath; - } - - public BaseAftermathModule getModule(){return module;} - - public AftermathEvent(BaseAftermath aftermath,Set players, ServerLevel level) { - this.aftermath = aftermath; - this.players = players; - this.level = level; - this.module = aftermath.getModule(); - } - - @Cancelable - public static class Start extends AftermathEvent { - public Start(BaseAftermath aftermath,Set players, ServerLevel level) { - super(aftermath,players, level); - } - } - public static class End extends AftermathEvent { - - public End(BaseAftermath aftermath, Set players, ServerLevel level) { - super(aftermath, players, level); - } - } - @Cancelable - public static class Ready extends AftermathEvent { - - public Ready(BaseAftermath aftermath, Set players, ServerLevel level) { - super(aftermath, players, level); - } - } - - public static class Ongoing extends AftermathEvent { - - public Ongoing(BaseAftermath aftermath, Set players, ServerLevel level) { - super(aftermath, players, level); - } - } - public static class Victory extends AftermathEvent { - - public Victory(BaseAftermath aftermath, Set players, ServerLevel level) { - super(aftermath, players, level); - } - } - public static class Lose extends AftermathEvent { - - public Lose(BaseAftermath aftermath, Set players, ServerLevel level) { - super(aftermath, players, level); - } - } - @Cancelable - public static class Celebrating extends AftermathEvent { - public Celebrating(BaseAftermath aftermath, Set players, ServerLevel level) { - super(aftermath, players, level); - } - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/event/subscriber/ClientForgeEvent.java b/src/main/java/com/pancake/surviving_the_aftermath/common/event/subscriber/ClientForgeEvent.java deleted file mode 100644 index 140f3e9..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/event/subscriber/ClientForgeEvent.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.event.subscriber; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.api.IAftermath; -import com.pancake.surviving_the_aftermath.api.aftermath.AftermathManager; -import com.pancake.surviving_the_aftermath.api.base.BaseAftermathModule; -import net.minecraft.client.gui.components.LerpingBossEvent; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.CustomizeGuiOverlayEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; - -import java.util.Map; -import java.util.Optional; -import java.util.UUID; - -@Mod.EventBusSubscriber(modid = SurvivingTheAftermath.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE, value = Dist.CLIENT) -public class ClientForgeEvent { - @SubscribeEvent - public static void netherRaidProgress(CustomizeGuiOverlayEvent.BossEventProgress event) { - LerpingBossEvent bossEvent = event.getBossEvent(); - AftermathManager manager = AftermathManager.getInstance(); - manager.getAftermath(bossEvent.getId()).ifPresent(aftermath -> { - event.setCanceled(true); - var graphics = event.getGuiGraphics(); - ResourceLocation resource = aftermath.getBarsResource(); - int[] offset = aftermath.getBarsOffset(); - int frameWidth = offset[0]; - int frameHeight = offset[1]; - int barWidth = offset[2]; - int barHeight = offset[3]; - int frameOffset = offset[4]; - int barOffset = offset[5]; - - //渲染进度条框 - graphics.blit(resource, (graphics.guiWidth() - frameWidth) / 2, event.getY() - 10, - 0, frameOffset, frameWidth, frameHeight); - //渲染进度条 - graphics.blit(resource, (graphics.guiWidth() - barWidth) / 2, event.getY() - 10 + barOffset, - 0, 0, (int) (barWidth * event.getBossEvent().getProgress()), barHeight); - event.setIncrement(frameHeight); - }); - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/event/subscriber/EnchantmentSubscriber.java b/src/main/java/com/pancake/surviving_the_aftermath/common/event/subscriber/EnchantmentSubscriber.java deleted file mode 100644 index aac0103..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/event/subscriber/EnchantmentSubscriber.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.event.subscriber; - -import com.google.common.collect.Lists; -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.data.datagen.ModItemModelProvider; -import com.pancake.surviving_the_aftermath.common.init.ModEnchantments; -import com.pancake.surviving_the_aftermath.common.init.ModItems; -import net.minecraft.client.renderer.item.ItemProperties; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.util.Mth; -import net.minecraft.util.RandomSource; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.ai.attributes.AttributeModifier; -import net.minecraft.world.entity.ai.attributes.Attributes; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.*; -import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.EnchantmentInstance; -import net.minecraft.world.item.trading.MerchantOffer; -import net.minecraftforge.event.ItemAttributeModifierEvent; -import net.minecraftforge.event.entity.living.LivingDeathEvent; -import net.minecraftforge.event.entity.living.LivingEntityUseItemEvent; -import net.minecraftforge.event.entity.living.LivingHurtEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; -import net.minecraftforge.registries.RegistryObject; - -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.function.Function; - -@Mod.EventBusSubscriber -public class EnchantmentSubscriber { - - @SubscribeEvent - public static void onLivingUseItemTicking(LivingEntityUseItemEvent.Tick event) { - int rangerLevel = event.getItem().getEnchantmentLevel(ModEnchantments.RANGER.get()); - if (rangerLevel > 0 && event.getDuration() > event.getItem().getUseDuration() - 20) { - event.setDuration(event.getDuration() - rangerLevel); - } - } - - @SubscribeEvent - public static void onLivingHurt(LivingHurtEvent event) { - if (event.getSource().getEntity() instanceof Player player) { - ItemStack itemInHand = player.getItemInHand(player.getUsedItemHand()); - int enchantmentLevel = itemInHand.getEnchantmentLevel(ModEnchantments.BLOODTHIRSTY.get()); - if (!player.level().isClientSide && !itemInHand.isEmpty() && enchantmentLevel > 0) { - player.heal(event.getAmount() * 0.05F * enchantmentLevel); - } - } - } - - @SubscribeEvent - public static void onLivingDeath(LivingDeathEvent event) { - if (event.getSource().getEntity() instanceof Player player) { - ItemStack itemInHand = player.getItemInHand(player.getUsedItemHand()); - if (!player.level().isClientSide && (itemInHand.getItem() instanceof TieredItem || itemInHand.getItem() instanceof TridentItem)) { - int enchantmentLevel = itemInHand.getEnchantmentLevel(ModEnchantments.DEVOURED.get()); - if (enchantmentLevel > 0 && player.getRandom().nextInt(10) < enchantmentLevel) { - CompoundTag tag = itemInHand.getTag(); - if (tag != null){ - float addition = tag.contains("surviving_the_aftermath.devoured") ? tag.getFloat("surviving_the_aftermath.devoured") : 0; - if (addition < enchantmentLevel + 1) { - tag.putFloat("surviving_the_aftermath.devoured", addition + 0.1F); - player.setItemInHand(InteractionHand.MAIN_HAND, itemInHand); // Sync - } - } - } - } - } - } - - private final static Function DEVOURED_ATTRIBUTE = (addition) -> - new AttributeModifier(UUID.fromString("412C831F-22EA-43B8-B74B-D172019AD3D2"), - "devoured_enchantment", addition, AttributeModifier.Operation.ADDITION); - - private final static Function LIFE_TREE_ATTRIBUTE = (addition) -> - new AttributeModifier(UUID.fromString("312C831F-22EA-43B8-B74B-D172019AD3D2"), - "life_tree_enchantment", addition * 0.1, AttributeModifier.Operation.MULTIPLY_BASE); - - @SubscribeEvent - public static void onAttributeGet(ItemAttributeModifierEvent event) { - if (event.getSlotType() == EquipmentSlot.MAINHAND) { - CompoundTag tag = event.getItemStack().getTag(); - if (tag != null && tag.contains("surviving_the_aftermath.devoured")) { - event.addModifier(Attributes.ATTACK_DAMAGE, DEVOURED_ATTRIBUTE.apply(tag.getFloat("surviving_the_aftermath.devoured"))); - } - } - if(event.getItemStack().getItem() instanceof ArmorItem armorItem && armorItem.getEquipmentSlot() == event.getSlotType()){ - int lifeTreeLevel = event.getItemStack().getEnchantmentLevel(ModEnchantments.LIFE_TREE.get()); - if (lifeTreeLevel != 0) { - event.addModifier(Attributes.MAX_HEALTH, LIFE_TREE_ATTRIBUTE.apply(lifeTreeLevel)); - } - } - } - - @SuppressWarnings("unused") - public static void onFMLClientSetup(FMLClientSetupEvent event) { - ItemProperties.register(Items.ENCHANTED_BOOK, SurvivingTheAftermath.asResource("special"), (stack, world, entity, i) -> { - Map map = EnchantmentHelper.getEnchantments(stack); - if (map.size() != 1) return 0.0F; - String key = map.entrySet().iterator().next().getKey().getDescriptionId(); - return ModItemModelProvider.ENCHANTMENTS.getOrDefault(key, 0.0F); - }); - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/event/subscriber/ForgeEventSubscriber.java b/src/main/java/com/pancake/surviving_the_aftermath/common/event/subscriber/ForgeEventSubscriber.java deleted file mode 100644 index 2bf6702..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/event/subscriber/ForgeEventSubscriber.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.event.subscriber; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.api.aftermath.AftermathManager; -import com.pancake.surviving_the_aftermath.common.capability.AftermathCap; -import com.pancake.surviving_the_aftermath.common.init.ModTags; -import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.levelgen.Heightmap; -import net.minecraft.world.level.storage.ServerLevelData; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.event.level.LevelEvent; -import net.minecraftforge.event.level.LevelEvent.CreateSpawnPosition; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; - -import java.util.List; - -@EventBusSubscriber(modid = SurvivingTheAftermath.MOD_ID, bus = Bus.FORGE) -public class ForgeEventSubscriber { - @SubscribeEvent - public static void changeSpawn(CreateSpawnPosition event) { - if (event.getLevel() instanceof ServerLevel level) { - ServerLevelData settings = event.getSettings(); - BlockPos pos = level.findNearestMapStructure(ModTags.NETHER_RAID, - new BlockPos(settings.getXSpawn(), settings.getYSpawn(), settings.getZSpawn()), 100, false); - if (pos != null) { - settings.setSpawn(new BlockPos(pos.getX(), level.getHeight(Heightmap.Types.WORLD_SURFACE, pos.getX(), pos.getZ()), pos.getZ()), 0); - event.setCanceled(true); - } - } - } - - @SubscribeEvent - public static void onTickLevelTick(TickEvent.LevelTickEvent event) { - Level level = event.level; - if (event.phase == TickEvent.Phase.END && !level.isClientSide()) { - AftermathCap.get(level).ifPresent(AftermathCap::tick); - - } - } - @SubscribeEvent - public static void onLevel(LevelEvent.Unload event) { - if (event.getLevel().isClientSide()) return; - AftermathManager.getInstance().getAftermathMap().clear(); - } -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/event/subscriber/RaidEventSubscriber.java b/src/main/java/com/pancake/surviving_the_aftermath/common/event/subscriber/RaidEventSubscriber.java deleted file mode 100644 index 3b06b4e..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/event/subscriber/RaidEventSubscriber.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.event.subscriber; - -import com.pancake.surviving_the_aftermath.api.aftermath.AftermathManager; -import com.pancake.surviving_the_aftermath.common.event.AftermathEvent; -import com.pancake.surviving_the_aftermath.common.init.ModSoundEvents; -import com.pancake.surviving_the_aftermath.common.init.ModStructures; -import com.pancake.surviving_the_aftermath.common.raid.NetherRaid; -import com.pancake.surviving_the_aftermath.common.raid.api.BaseRaid; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.registries.Registries; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.portal.PortalShape; -import net.minecraftforge.event.entity.EntityJoinLevelEvent; -import net.minecraftforge.event.entity.EntityTravelToDimensionEvent; -import net.minecraftforge.event.level.BlockEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; - -import java.util.Objects; - - -@Mod.EventBusSubscriber -public class RaidEventSubscriber { - public static final String NETHER_RAID_START = "message.surviving_the_aftermath.nether_raid.start"; - public static final String NETHER_RAID_VICTORY = "message.surviving_the_aftermath.nether_raid.victory"; - @SubscribeEvent - public static void netherRaid(EntityTravelToDimensionEvent event) { - Entity entity = event.getEntity(); - Level level = entity.level(); - BlockPos pos = entity.blockPosition(); - if (level instanceof ServerLevel serverLevel) { - event.setCanceled(serverLevel.structureManager().getAllStructuresAt(pos) - .containsKey(level.registryAccess().registryOrThrow(Registries.STRUCTURE).get(ModStructures.NETHER_RAID))); - } - } - - @SubscribeEvent - public static void onBlock(BlockEvent.PortalSpawnEvent event) { - LevelAccessor level = event.getLevel(); - if (level instanceof ServerLevel serverLevel) { - PortalShape.findEmptyPortalShape(serverLevel, event.getPos(), Direction.Axis.X).ifPresent(portalShape -> { - portalShape.createPortalBlocks(); - NetherRaid netherRaid = new NetherRaid(serverLevel, event.getPos(),portalShape); - AftermathManager instance = AftermathManager.getInstance(); - if (instance.create(netherRaid)) { - event.setCanceled(true); - } - }); - } - } - @SubscribeEvent - public static void onRaidStart(AftermathEvent.Start event) - { - event.getPlayers().forEach(uuid -> { - Player player = event.getLevel().getPlayerByUUID(uuid); - if (player != null) { - player.displayClientMessage(Component.translatable(NETHER_RAID_START), true); - } - }); - } - - @SubscribeEvent - public static void onRaidVictory(AftermathEvent.Victory event) { - event.getPlayers().forEach(uuid -> { - Player player = event.getLevel().getPlayerByUUID(uuid); - Level level = Objects.requireNonNull(player).level(); - if (level.isClientSide) { - player.displayClientMessage(Component.translatable(NETHER_RAID_VICTORY), true); - level.playSeededSound(player, player.getX(), player.getY(), player.getZ(), - ModSoundEvents.ORCHELIAS_VOX.get(), SoundSource.NEUTRAL, 3.0F, 1.0F, level.random.nextLong()); - } - }); - } - - @SubscribeEvent - public static void joinRaid(EntityJoinLevelEvent event) { - AftermathManager.getInstance().getAftermathMap().values().stream() - .filter(aftermath -> aftermath instanceof BaseRaid) - .map(aftermath -> (BaseRaid) aftermath) - .forEach(raid -> raid.join(event.getEntity())); - } - - - -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/event/subscriber/VillagerSubscriber.java b/src/main/java/com/pancake/surviving_the_aftermath/common/event/subscriber/VillagerSubscriber.java deleted file mode 100644 index 10675a4..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/event/subscriber/VillagerSubscriber.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.event.subscriber; - -import com.google.common.collect.Lists; -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.init.ModEnchantments; -import com.pancake.surviving_the_aftermath.common.init.ModItems; -import com.pancake.surviving_the_aftermath.common.init.ModVillagers; -import com.pancake.surviving_the_aftermath.common.util.RegistryUtil; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.util.Mth; -import net.minecraft.util.RandomSource; -import net.minecraft.world.entity.npc.VillagerProfession; -import net.minecraft.world.entity.npc.VillagerTrades; -import net.minecraft.world.item.EnchantedBookItem; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraft.world.item.enchantment.EnchantmentInstance; -import net.minecraft.world.item.trading.MerchantOffer; -import net.minecraftforge.event.village.VillagerTradesEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.registries.RegistryObject; - -import java.util.List; - -@Mod.EventBusSubscriber(modid = SurvivingTheAftermath.MOD_ID) -public class VillagerSubscriber { - @SubscribeEvent - public static void addCustomTrades(VillagerTradesEvent event) { - final ItemStack emerald = new ItemStack(Items.EMERALD, 2); - final ItemStack diamond = new ItemStack(Items.DIAMOND, 1); - Int2ObjectMap> trades1 = event.getTrades(); - if (event.getType() == ModVillagers.RELIC_DEALER.get()) { - trades1.get(1).add((trader, random) -> enchantBookForNetherCore(random)); - } - if (event.getType() == VillagerProfession.BUTCHER) { - Int2ObjectMap> trades = trades1; - ItemStack rawFalukorv = new ItemStack(ModItems.RAW_FALUKORV.get(), 1); - trades.get(4).add((trader, random) -> newOffer(emerald, rawFalukorv)); - trades.get(5).add((trader, random) -> newOffer(diamond, rawFalukorv)); - } - if (event.getType() == VillagerProfession.FARMER) { - Int2ObjectMap> trades = trades1; - for (Item item : RegistryUtil.getKnownItems()) { - if (item.isEdible()) { - ItemStack foodStack = item.getDefaultInstance(); - trades.get(4).add((trader, random) -> newOffer(emerald, foodStack)); - trades.get(5).add((trader, random) -> newOffer(diamond, foodStack)); - } - } - } - } - - private static MerchantOffer newOffer(ItemStack baseCostA, ItemStack result) { - return new MerchantOffer(baseCostA, result, 12, 30, 1.0F); - } - - - private static MerchantOffer enchantBookForNetherCore(RandomSource random) { - List> list = Lists.newArrayList(ModEnchantments.ENCHANTMENTS.getEntries()); - Enchantment enchantment = list.get(random.nextInt(list.size())).get(); - int i = Mth.nextInt(random, enchantment.getMinLevel(), enchantment.getMaxLevel()); - int j = 2 + random.nextInt(5 + i * 10) + 3 * i; - ItemStack netherCore = new ItemStack(ModItems.NETHER_CORE.get(), Math.min(j, 64)); - ItemStack enchantedBook = EnchantedBookItem.createForEnchantment(new EnchantmentInstance(enchantment, i)); - return new MerchantOffer(netherCore, new ItemStack(Items.BOOK), enchantedBook, 12, 30, 0.2F); - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModAftermathModule.java b/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModAftermathModule.java new file mode 100644 index 0000000..a11950d --- /dev/null +++ b/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModAftermathModule.java @@ -0,0 +1,32 @@ +package com.pancake.surviving_the_aftermath.common.init; + +import com.google.common.collect.Maps; +import com.mojang.serialization.Codec; +import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; +import com.pancake.surviving_the_aftermath.api.IModule; +import com.pancake.surviving_the_aftermath.api.module.IAmountModule; +import com.pancake.surviving_the_aftermath.common.module.amount.IntegerAmountModule; +import com.pancake.surviving_the_aftermath.common.module.amount.RandomAmountModule; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.registries.*; + +import java.util.Map; +import java.util.function.Supplier; + +public class ModAftermathModule { + public static final ResourceKey> MODULE_KEY = ResourceKey.createRegistryKey(SurvivingTheAftermath.asResource("module")); + public static final DeferredRegister MODULE = DeferredRegister.create(MODULE_KEY, SurvivingTheAftermath.MOD_ID); + + public static final RegistryObject INTEGER_AMOUNT = MODULE.register(IntegerAmountModule.IDENTIFIER, IntegerAmountModule::new); + public static final RegistryObject RANDOM_AMOUNT = MODULE.register(RandomAmountModule.IDENTIFIER, RandomAmountModule::new); + + + + @SubscribeEvent + public static void onNewRegistry(NewRegistryEvent event) { + event.create(new RegistryBuilder<>().setName(MODULE_KEY.location())); + } + +} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModBiomes.java b/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModBiomes.java deleted file mode 100644 index d23db09..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModBiomes.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.init; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.level.biomes.ModBiomesMaker; -import net.minecraft.core.HolderGetter; -import net.minecraft.core.registries.Registries; -import net.minecraft.data.worldgen.BootstapContext; -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeGenerationSettings; -import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver; -import net.minecraft.world.level.levelgen.placement.PlacedFeature; - -public class ModBiomes { - - public static final ResourceKey BARREN = makeKey("barren"); - - private static ResourceKey makeKey(String name) { - return ResourceKey.create(Registries.BIOME, SurvivingTheAftermath.asResource(name)); - } - - public static void bootstrap(BootstapContext context) { - HolderGetter featureGetter = context.lookup(Registries.PLACED_FEATURE); - HolderGetter> carverGetter = context.lookup(Registries.CONFIGURED_CARVER); - BiomeGenerationSettings.Builder builder = new BiomeGenerationSettings.Builder(featureGetter, carverGetter); - context.register(BARREN, ModBiomesMaker.generateBarren(builder)); - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModBlocks.java b/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModBlocks.java deleted file mode 100644 index 01f6329..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModBlocks.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.init; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.Block; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; - -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.function.Function; -import java.util.function.Supplier; - -public class ModBlocks { - - public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, SurvivingTheAftermath.MOD_ID); - public static final Map> BLOCK_ITEMS = new LinkedHashMap<>(); - - private static RegistryObject register(String name, Supplier block) { - return register(name, block, supplier -> () -> new BlockItem(supplier.get(),new Item.Properties())); - } - - private static RegistryObject register(String name, Supplier block, Function, Supplier> item) { - RegistryObject register = BLOCKS.register(name, block); - BLOCK_ITEMS.put(name, () -> item.apply(register).get()); - return register; - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModCapability.java b/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModCapability.java deleted file mode 100644 index ad36ee3..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModCapability.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.init; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.api.stage.LevelStageData; -import com.pancake.surviving_the_aftermath.api.stage.PlayerStageData; -import com.pancake.surviving_the_aftermath.common.capability.AftermathCap; -import com.pancake.surviving_the_aftermath.common.capability.StageDataCap; -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraftforge.common.capabilities.*; -import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.event.AttachCapabilitiesEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -@Mod.EventBusSubscriber -public class ModCapability{ - public static final Capability AFTERMATH_CAP = CapabilityManager.get(new CapabilityToken<>() {}); - public static final Capability STAGE_DATA_CAP = CapabilityManager.get(new CapabilityToken<>() {}); - - @SubscribeEvent - public static void registerCapabilities(RegisterCapabilitiesEvent event) { - event.register(AftermathCap.class); - } - - @SubscribeEvent - public static void attachLevelCapability(AttachCapabilitiesEvent event) { - if (event.getObject().dimension() == Level.OVERWORLD && event.getObject() instanceof ServerLevel level) { - event.addCapability(SurvivingTheAftermath.asResource("aftermath_cap"), new AftermathCap.Provider(level)); - } - event.addCapability(SurvivingTheAftermath.asResource("stage_data_cap"), new StageDataCap(event.getObject(),new LevelStageData())); - } - - @SubscribeEvent - public static void attachEntityCapability(AttachCapabilitiesEvent event) { - if (event.getObject() instanceof Player player) { - event.addCapability(SurvivingTheAftermath.asResource("aftermath_cap"), new StageDataCap(player,new PlayerStageData())); - } - - } - -} - diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModEnchantments.java b/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModEnchantments.java deleted file mode 100644 index 248225a..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModEnchantments.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.init; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import net.minecraft.world.item.enchantment.Enchantment; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import com.pancake.surviving_the_aftermath.common.enchantment.*; -import net.minecraftforge.registries.RegistryObject; - -public class ModEnchantments { - - public static final DeferredRegister ENCHANTMENTS = DeferredRegister.create(ForgeRegistries.ENCHANTMENTS, SurvivingTheAftermath.MOD_ID); - public static final RegistryObject COUNTER_ATTACK = ENCHANTMENTS.register("counter_attack", CounterattackEnchantment::new); - public static final RegistryObject BLOODTHIRSTY = ENCHANTMENTS.register("bloodthirsty", BloodthirstyEnchantment::new); - public static final RegistryObject CLEAN_WATER = ENCHANTMENTS.register("clean_water", CleanWaterEnchantment::new); - public static final RegistryObject LIFE_TREE = ENCHANTMENTS.register("life_tree", LifeTreeEnchantment::new); - public static final RegistryObject DEVOURED = ENCHANTMENTS.register("devoured", DevouredEnchantment::new); - public static final RegistryObject FRANTIC = ENCHANTMENTS.register("frantic", FranticEnchantment::new); - public static final RegistryObject EXECUTE = ENCHANTMENTS.register("execute", ExecuteEnchantment::new); - public static final RegistryObject RANGER = ENCHANTMENTS.register("ranger", RangerEnchantment::new); - public static final RegistryObject MOON = ENCHANTMENTS.register("moon", () -> new SunAndMoonEnchantment(0)); - public static final RegistryObject SUN = ENCHANTMENTS.register("sun", () -> new SunAndMoonEnchantment(1)); - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModItems.java b/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModItems.java deleted file mode 100644 index 1f2590b..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModItems.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.init; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.effect.MobEffects; -import net.minecraft.world.food.FoodProperties; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.Rarity; -import net.minecraft.world.item.RecordItem; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; - -public class ModItems { - - public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, SurvivingTheAftermath.MOD_ID); - public static final RegistryObject RAW_FALUKORV = ITEMS.register("raw_falukorv", () -> new Item( - new Item.Properties().food((new FoodProperties.Builder()).nutrition(3).saturationMod(0.3F).build()))); - public static final RegistryObject COOKED_FALUKORV = ITEMS.register("cooked_falukorv", () -> new Item( - new Item.Properties().food((new FoodProperties.Builder()).nutrition(10).saturationMod(14.0F) - .effect(() -> new MobEffectInstance(MobEffects.DAMAGE_BOOST, 4800), 1.0F).build()))); - public static final RegistryObject EGG_TART = ITEMS.register("egg_tart", () -> new Item( - new Item.Properties().food((new FoodProperties.Builder()).nutrition(3).saturationMod(2.0F) - .effect(() -> new MobEffectInstance(MobEffects.HEALTH_BOOST, 4800), 1.0F).build()))); - public static final RegistryObject STACK_OF_EGG_TARTS = ITEMS.register("stack_of_egg_tarts", () -> new Item( - new Item.Properties().food((new FoodProperties.Builder()).nutrition(9).saturationMod(6.0F) - .effect(() -> new MobEffectInstance(MobEffects.HEALTH_BOOST, 3600, 1), 1.0F) - .effect(() -> new MobEffectInstance(MobEffects.CONFUSION, 60), 1.0F).build()))); - public static final RegistryObject HAMBURGER = ITEMS.register("hamburger", () -> new Item( - new Item.Properties().food((new FoodProperties.Builder()).nutrition(7).saturationMod(4.0F) - .effect(() -> new MobEffectInstance(MobEffects.REGENERATION, 6000), 1.0F).build()))); - public static final RegistryObject TIANJIN_PANCAKE = ITEMS.register("tianjin_pancake", () -> new Item( - new Item.Properties().food((new FoodProperties.Builder()).nutrition(8).saturationMod(14.0F) - .effect(() -> new MobEffectInstance(MobEffects.SATURATION, 4800), 1.0F) - .effect(() -> new MobEffectInstance(MobEffects.LUCK, 2400), 1.0F).build()))); - public static final RegistryObject NETHER_CORE = ITEMS.register("nether_core", () -> new Item(new Item.Properties())); - public static final RegistryObject MUSIC_DISK_ORCHELIAS_VOX = ITEMS.register("music_disk_orchelias_vox", () -> new RecordItem( - 15, ModSoundEvents.ORCHELIAS_VOX, (new Item.Properties()).stacksTo(1).rarity(Rarity.RARE), 269 * 20)); - - static { - ModBlocks.BLOCK_ITEMS.forEach(ITEMS::register); - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModMobEffects.java b/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModMobEffects.java deleted file mode 100644 index 253e323..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModMobEffects.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.init; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.effect.CowardiceEffect; -import net.minecraft.world.effect.MobEffect; -import net.minecraft.world.effect.MobEffectCategory; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; - -public class ModMobEffects { - - public static final DeferredRegister MOB_EFFECTS = DeferredRegister.create(ForgeRegistries.MOB_EFFECTS, SurvivingTheAftermath.MOD_ID); - - //懦弱 - public static final RegistryObject COWARDICE = MOB_EFFECTS.register("cowardice", CowardiceEffect::new); -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModSoundEvents.java b/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModSoundEvents.java deleted file mode 100644 index 4cfe7d2..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModSoundEvents.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.init; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import net.minecraft.sounds.SoundEvent; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; - -public class ModSoundEvents { - public static final DeferredRegister SOUND_EVENTS = DeferredRegister.create(ForgeRegistries.SOUND_EVENTS, SurvivingTheAftermath.MOD_ID); - - public static final RegistryObject ORCHELIAS_VOX = register("orchelias_vox"); - private static RegistryObject register(String name) { - return SOUND_EVENTS.register(name, () -> SoundEvent.createVariableRangeEvent(SurvivingTheAftermath.asResource(name))); - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModStructurePieceTypes.java b/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModStructurePieceTypes.java deleted file mode 100644 index e4aba4c..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModStructurePieceTypes.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.init; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.structure.BurntStructure; -import com.pancake.surviving_the_aftermath.common.structure.CityStructure; -import com.pancake.surviving_the_aftermath.common.structure.HouseOfSakura; -import com.pancake.surviving_the_aftermath.common.structure.NetherRaidStructure; -import com.pancake.surviving_the_aftermath.common.structure.expansion.*; -import net.minecraft.core.registries.Registries; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.RegistryObject; - -public class ModStructurePieceTypes { - - public static final DeferredRegister STRUCTURE_PIECE_TYPES = DeferredRegister.create(Registries.STRUCTURE_PIECE.location(), SurvivingTheAftermath.MOD_ID); - public static final RegistryObject HOUSE_OF_SAKURA = register("house_of_sakura", HouseOfSakura.Piece::new); - public static final RegistryObject NETHER_RAID = register("nether_raid", NetherRaidStructure.Piece::new); - public static final RegistryObject CITY = register("city", CityStructure.Piece::new); - public static final RegistryObject CAMP = register("camp", CampStructure.Piece::new); - public static final RegistryObject LOGS = register("logs", LogsStructure.Piece::new); - public static final RegistryObject TENT = register("tent", TentStructure.Piece::new); - public static final RegistryObject BRICK_WELL = register("brick_well", BrickWellStructure.Piece::new); - public static final RegistryObject COBBLESTONE_PILE = register("cobblestone_pile", CobblestonePileStructure.Piece::new); - public static final RegistryObject CONSTRUCTION_1 = register("construction1", (context, tag) -> new ConstructionStructure.Piece(context, tag, 1)); - public static final RegistryObject CONSTRUCTION_2 = register("construction2", (context, tag) -> new ConstructionStructure.Piece(context, tag, 2)); - public static final RegistryObject WAGON_CARGO_1 = register("wagon_cargo1", (context, tag) -> new WagonCargoStructure.Piece(context, tag, 1)); - public static final RegistryObject WAGON_CARGO_2 = register("wagon_cargo2", (context, tag) -> new WagonCargoStructure.Piece(context, tag, 2)); - public static final RegistryObject WAGON_CARGO_3 = register("wagon_cargo3", (context, tag) -> new WagonCargoStructure.Piece(context, tag, 3)); - public static final RegistryObject WAGON_CARGO_4 = register("wagon_cargo4", (context, tag) -> new WagonCargoStructure.Piece(context, tag, 4)); - public static final RegistryObject WAGON_CARGO_5 = register("wagon_cargo5", (context, tag) -> new WagonCargoStructure.Piece(context, tag, 5)); - public static final RegistryObject WAGON_CARGO_6 = register("wagon_cargo6", (context, tag) -> new WagonCargoStructure.Piece(context, tag, 6)); - public static final RegistryObject BURNT_1 = register("burnt_structure1", (context, tag) -> new BurntStructure.Piece(context, tag, 1)); - public static final RegistryObject BURNT_2 = register("burnt_structure2", (context, tag) -> new BurntStructure.Piece(context, tag, 2)); - public static final RegistryObject BURNT_3 = register("burnt_structure3", (context, tag) -> new BurntStructure.Piece(context, tag, 3)); - public static final RegistryObject BURNT_4 = register("burnt_structure4", (context, tag) -> new BurntStructure.Piece(context, tag, 4)); - public static final RegistryObject BURNT_5 = register("burnt_structure5", (context, tag) -> new BurntStructure.Piece(context, tag, 5)); - public static final RegistryObject BURNT_6 = register("burnt_structure6", (context, tag) -> new BurntStructure.Piece(context, tag, 6)); - - private static RegistryObject register(String name, StructurePieceType pieceType) { - return STRUCTURE_PIECE_TYPES.register(name, () -> pieceType); - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModStructureSets.java b/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModStructureSets.java deleted file mode 100644 index dfa597d..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModStructureSets.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.init; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import net.minecraft.core.registries.Registries; -import net.minecraft.data.worldgen.BootstapContext; -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.level.levelgen.structure.Structure; -import net.minecraft.world.level.levelgen.structure.StructureSet; -import net.minecraft.world.level.levelgen.structure.placement.RandomSpreadStructurePlacement; -import net.minecraft.world.level.levelgen.structure.placement.RandomSpreadType; - -import static com.pancake.surviving_the_aftermath.common.init.ModStructures.*; - -public class ModStructureSets { - - public static final ResourceKey HOUSE_OF_SAKURA_SET = register("house_of_sakura"); - public static final ResourceKey NETHER_RAID_SET = register("nether_raid"); - public static final ResourceKey CITY_SET = register("city"); - public static final ResourceKey CAMP_SET = register("camp"); - public static final ResourceKey LOGS_SET = register("logs"); - public static final ResourceKey TENT_SET = register("tent"); - public static final ResourceKey BRICK_WELL_SET = register("brick_well"); - public static final ResourceKey CONSTRUCTION_1_SET = register("construction1"); - public static final ResourceKey CONSTRUCTION_2_SET = register("construction2"); - public static final ResourceKey COBBLESTONE_PILE_SET = register("cobblestone_pile"); - - protected static ResourceKey register(String name) { - return ResourceKey.create(Registries.STRUCTURE_SET, SurvivingTheAftermath.asResource(name)); - } - - public static void bootstrap(BootstapContext context) { - int[] wagonCargoSalt = new int[]{0, 1365330241, 161766032, 1733648479, 2081980804, 418595573, 947847921}; - int[] burntSalt = new int[] {0, 104706480, 705540248, 1838764692, 1669956657, 1334899266, 2119656745}; - context.register(CITY_SET, new StructureSet(context.lookup(Registries.STRUCTURE).getOrThrow(CITY), - new RandomSpreadStructurePlacement(80, 40, RandomSpreadType.LINEAR, 2057068235))); - context.register(HOUSE_OF_SAKURA_SET, new StructureSet(context.lookup(Registries.STRUCTURE).getOrThrow(HOUSE_OF_SAKURA), - new RandomSpreadStructurePlacement(80, 40, RandomSpreadType.LINEAR, 1712650656))); - context.register(NETHER_RAID_SET, new StructureSet(context.lookup(Registries.STRUCTURE).getOrThrow(NETHER_RAID), - new RandomSpreadStructurePlacement(100, 40, RandomSpreadType.LINEAR, 1629143766))); - context.register(CAMP_SET, new StructureSet(context.lookup(Registries.STRUCTURE).getOrThrow(CAMP), - new RandomSpreadStructurePlacement(100, 40, RandomSpreadType.LINEAR, 1310135130))); - context.register(LOGS_SET, new StructureSet(context.lookup(Registries.STRUCTURE).getOrThrow(LOGS), - new RandomSpreadStructurePlacement(90, 40, RandomSpreadType.LINEAR, 1321561321))); - context.register(TENT_SET, new StructureSet(context.lookup(Registries.STRUCTURE).getOrThrow(TENT), - new RandomSpreadStructurePlacement(90, 40, RandomSpreadType.LINEAR, 1653821652))); - context.register(BRICK_WELL_SET, new StructureSet(context.lookup(Registries.STRUCTURE).getOrThrow(BRICK_WELL), - new RandomSpreadStructurePlacement(95, 40, RandomSpreadType.LINEAR, 1561323135))); - context.register(CONSTRUCTION_1_SET, new StructureSet(context.lookup(Registries.STRUCTURE).getOrThrow(CONSTRUCTION_1), - new RandomSpreadStructurePlacement(100, 40, RandomSpreadType.LINEAR, 761313131))); - context.register(CONSTRUCTION_2_SET, new StructureSet(context.lookup(Registries.STRUCTURE).getOrThrow(CONSTRUCTION_2), - new RandomSpreadStructurePlacement(85, 40, RandomSpreadType.LINEAR, 498231431))); - context.register(COBBLESTONE_PILE_SET, new StructureSet(context.lookup(Registries.STRUCTURE).getOrThrow(COBBLESTONE_PILE), - new RandomSpreadStructurePlacement(75, 40, RandomSpreadType.LINEAR, 795416633))); - for (int i = 1; i <= 6; i++) { - ResourceKey wagonCargoSet = register("wagon_cargo" + i); - ResourceKey burntSet = register("burnt_structure" + i); - ResourceKey wagonCargo = ModStructures.register("wagon_cargo" + i); - ResourceKey burnt = ModStructures.register("burnt_structure" + i); - context.register(wagonCargoSet, new StructureSet(context.lookup(Registries.STRUCTURE).getOrThrow(wagonCargo), - new RandomSpreadStructurePlacement(90, 40, RandomSpreadType.LINEAR, wagonCargoSalt[i]))); - context.register(burntSet, new StructureSet(context.lookup(Registries.STRUCTURE).getOrThrow(burnt), - new RandomSpreadStructurePlacement(80, 40, RandomSpreadType.LINEAR, burntSalt[i]))); - } - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModStructureTypes.java b/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModStructureTypes.java deleted file mode 100644 index b655b26..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModStructureTypes.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.init; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.structure.BurntStructure; -import com.pancake.surviving_the_aftermath.common.structure.CityStructure; -import com.pancake.surviving_the_aftermath.common.structure.HouseOfSakura; -import com.pancake.surviving_the_aftermath.common.structure.NetherRaidStructure; -import com.pancake.surviving_the_aftermath.common.structure.expansion.*; -import net.minecraft.core.registries.Registries; -import net.minecraft.world.level.levelgen.structure.Structure; -import net.minecraft.world.level.levelgen.structure.StructureType; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.RegistryObject; - -import java.util.function.Function; - -public class ModStructureTypes { - - public static final DeferredRegister> STRUCTURE_TYPES = DeferredRegister.create(Registries.STRUCTURE_TYPE.location(), SurvivingTheAftermath.MOD_ID); - public static final RegistryObject> HOUSE_OF_SAKURA = register("house_of_sakura", HouseOfSakura::new); - public static final RegistryObject> NETHER_RAID = register("nether_raid", NetherRaidStructure::new); - public static final RegistryObject> CITY = register("city", CityStructure::new); - public static final RegistryObject> CAMP = register("camo", CampStructure::new); - public static final RegistryObject> LOGS = register("logs", LogsStructure::new); - public static final RegistryObject> TENT = register("tent", TentStructure::new); - public static final RegistryObject> BRICK_WELL = register("brick_well", BrickWellStructure::new); - public static final RegistryObject> COBBLESTONE_PILE = register("cobblestone_pile", CobblestonePileStructure::new); - public static final RegistryObject> CONSTRUCTION_1 = register("construction1", (settings) -> new ConstructionStructure(settings, 1)); - public static final RegistryObject> CONSTRUCTION_2 = register("construction2", (settings) -> new ConstructionStructure(settings, 2)); - public static final RegistryObject> WAGON_CARGO_1 = register("wagon_cargo1", (settings) -> new WagonCargoStructure(settings, 1)); - public static final RegistryObject> WAGON_CARGO_2 = register("wagon_cargo2", (settings) -> new WagonCargoStructure(settings, 2)); - public static final RegistryObject> WAGON_CARGO_3 = register("wagon_cargo3", (settings) -> new WagonCargoStructure(settings, 3)); - public static final RegistryObject> WAGON_CARGO_4 = register("wagon_cargo4", (settings) -> new WagonCargoStructure(settings, 4)); - public static final RegistryObject> WAGON_CARGO_5 = register("wagon_cargo5", (settings) -> new WagonCargoStructure(settings, 5)); - public static final RegistryObject> WAGON_CARGO_6 = register("wagon_cargo6", (settings) -> new WagonCargoStructure(settings, 6)); - public static final RegistryObject> BURNT_1 = register("burnt_structure1", (settings) -> new BurntStructure(settings, 1)); - public static final RegistryObject> BURNT_2 = register("burnt_structure2", (settings) -> new BurntStructure(settings, 2)); - public static final RegistryObject> BURNT_3 = register("burnt_structure3", (settings) -> new BurntStructure(settings, 3)); - public static final RegistryObject> BURNT_4 = register("burnt_structure4", (settings) -> new BurntStructure(settings, 4)); - public static final RegistryObject> BURNT_5 = register("burnt_structure5", (settings) -> new BurntStructure(settings, 5)); - public static final RegistryObject> BURNT_6 = register("burnt_structure6", (settings) -> new BurntStructure(settings, 6)); - - private static RegistryObject> register(String name, Function function) { - return STRUCTURE_TYPES.register(name, () -> () -> Structure.simpleCodec(function)); - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModStructures.java b/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModStructures.java deleted file mode 100644 index 0f18160..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModStructures.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.init; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.structure.BurntStructure; -import com.pancake.surviving_the_aftermath.common.structure.CityStructure; -import com.pancake.surviving_the_aftermath.common.structure.HouseOfSakura; -import com.pancake.surviving_the_aftermath.common.structure.NetherRaidStructure; -import com.pancake.surviving_the_aftermath.common.structure.expansion.*; -import net.minecraft.core.registries.Registries; -import net.minecraft.data.worldgen.BootstapContext; -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.level.levelgen.GenerationStep; -import net.minecraft.world.level.levelgen.structure.Structure; -import net.minecraft.world.level.levelgen.structure.TerrainAdjustment; - -import java.util.Map; - -public class ModStructures { - public static final ResourceKey HOUSE_OF_SAKURA = register("house_of_sakura"); - public static final ResourceKey NETHER_RAID = register("nether_raid"); - public static final ResourceKey CITY = register("city"); - public static final ResourceKey CAMP = register("camp"); - public static final ResourceKey LOGS = register("logs"); - public static final ResourceKey TENT = register("tent"); - public static final ResourceKey BRICK_WELL = register("brick_well"); - public static final ResourceKey CONSTRUCTION_1 = register("construction1"); - public static final ResourceKey CONSTRUCTION_2 = register("construction2"); - public static final ResourceKey COBBLESTONE_PILE = register("cobblestone_pile"); - - protected static ResourceKey register(String name) { - return ResourceKey.create(Registries.STRUCTURE, SurvivingTheAftermath.asResource(name)); - } - - public static void bootstrap(BootstapContext context) { - Structure.StructureSettings expansionBuildSettings = new Structure.StructureSettings( - context.lookup(Registries.BIOME).getOrThrow(ModTags.HAS_EXPANSION_BUILD), Map.of(), - GenerationStep.Decoration.SURFACE_STRUCTURES, TerrainAdjustment.NONE); - Structure.StructureSettings burntStructureSettings = new Structure.StructureSettings( - context.lookup(Registries.BIOME).getOrThrow(ModTags.HAS_BURNT_STRUCTURE), Map.of(), - GenerationStep.Decoration.SURFACE_STRUCTURES, TerrainAdjustment.NONE); - context.register(CITY, new CityStructure(new Structure.StructureSettings( - context.lookup(Registries.BIOME).getOrThrow(ModTags.HAS_CITY), Map.of(), - GenerationStep.Decoration.SURFACE_STRUCTURES, TerrainAdjustment.BEARD_BOX))); - context.register(HOUSE_OF_SAKURA, new HouseOfSakura(new Structure.StructureSettings( - context.lookup(Registries.BIOME).getOrThrow(ModTags.HAS_HOUSE_OF_SAKURA), Map.of(), - GenerationStep.Decoration.SURFACE_STRUCTURES, TerrainAdjustment.BEARD_THIN))); - context.register(NETHER_RAID, new NetherRaidStructure(new Structure.StructureSettings( - context.lookup(Registries.BIOME).getOrThrow(ModTags.HAS_NETHER_RAID), Map.of(), - GenerationStep.Decoration.SURFACE_STRUCTURES, TerrainAdjustment.BEARD_THIN))); - context.register(CAMP, new CampStructure(expansionBuildSettings)); - context.register(LOGS, new LogsStructure(expansionBuildSettings)); - context.register(TENT, new TentStructure(expansionBuildSettings)); - context.register(BRICK_WELL, new BrickWellStructure(expansionBuildSettings)); - context.register(CONSTRUCTION_1, new ConstructionStructure(expansionBuildSettings, 1)); - context.register(CONSTRUCTION_2, new ConstructionStructure(expansionBuildSettings, 2)); - context.register(COBBLESTONE_PILE, new CobblestonePileStructure(expansionBuildSettings)); - for (int i = 1; i <= 6; i++) { - ResourceKey wagonCargo = register("wagon_cargo" + i); - ResourceKey burnt = register("burnt_structure" + i); - context.register(wagonCargo, new WagonCargoStructure(expansionBuildSettings, i)); - context.register(burnt, new BurntStructure(burntStructureSettings, i)); - } - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModTabs.java b/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModTabs.java deleted file mode 100644 index 372a5de..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModTabs.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.init; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import net.minecraft.core.registries.Registries; -import net.minecraft.network.chat.Component; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.RegistryObject; - -public class ModTabs { - - public static final DeferredRegister TABS = DeferredRegister - .create(Registries.CREATIVE_MODE_TAB.location(), SurvivingTheAftermath.MOD_ID); - - public static final RegistryObject TAB = TABS.register("tab", - () -> CreativeModeTab.builder().title(Component.translatable("itemGroup." + SurvivingTheAftermath.MOD_ID)) - .icon(() -> new ItemStack(ModItems.NETHER_CORE.get())) - .displayItems((params, output) -> ModItems.ITEMS.getEntries() - .forEach(item -> output.accept(item.get()))).build()); - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModTags.java b/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModTags.java deleted file mode 100644 index 454bbef..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModTags.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.init; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import net.minecraft.core.Registry; -import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceKey; -import net.minecraft.tags.TagKey; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.levelgen.structure.Structure; - -public class ModTags { - - public static final TagKey HAS_CITY = createTag(Registries.BIOME, "has_city"); - public static final TagKey HAS_HOUSE_OF_SAKURA = createTag(Registries.BIOME, "has_house_of_sakura"); - public static final TagKey HAS_NETHER_RAID = createTag(Registries.BIOME, "has_nether_raid"); - public static final TagKey HAS_EXPANSION_BUILD = createTag(Registries.BIOME, "has_expansion_build"); - public static final TagKey HAS_BURNT_STRUCTURE = createTag(Registries.BIOME, "has_burnt_structure"); - public static final TagKey NETHER_RAID = createTag(Registries.STRUCTURE, "nether_raid"); - public static final TagKey> NETHER_MOB = createTag(Registries.ENTITY_TYPE, "nether_mob"); - - private static TagKey createTag(ResourceKey> resourceKey, String name) { - return TagKey.create(resourceKey, SurvivingTheAftermath.asResource(name)); - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModVillagers.java b/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModVillagers.java deleted file mode 100644 index ab91a4d..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/init/ModVillagers.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.init; - -import com.google.common.collect.ImmutableSet; -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceKey; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.world.entity.ai.village.poi.PoiType; -import net.minecraft.world.entity.npc.VillagerProfession; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; - -public class ModVillagers { - - public static final ResourceKey RELIC_DEALER_POI = ResourceKey.create(Registries.POINT_OF_INTEREST_TYPE, SurvivingTheAftermath.asResource("relic_dealer")); - public static final DeferredRegister VILLAGER_PROFESSIONS = DeferredRegister.create(ForgeRegistries.VILLAGER_PROFESSIONS, SurvivingTheAftermath.MOD_ID); - public static final RegistryObject RELIC_DEALER = VILLAGER_PROFESSIONS.register("relic_dealer", () -> new VillagerProfession( - "relic_dealer", x -> x.is(RELIC_DEALER_POI), x -> x.is(RELIC_DEALER_POI), ImmutableSet.of(), ImmutableSet.of(), SoundEvents.VILLAGER_WORK_CLERIC)); - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/level/biomes/ModBiomesMaker.java b/src/main/java/com/pancake/surviving_the_aftermath/common/level/biomes/ModBiomesMaker.java deleted file mode 100644 index 8e505ad..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/level/biomes/ModBiomesMaker.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.level.biomes; - -import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.data.worldgen.BiomeDefaultFeatures; -import net.minecraft.util.Mth; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.MobCategory; -import net.minecraft.world.level.biome.*; - -public class ModBiomesMaker { - - public static Biome generateBarren(BiomeGenerationSettings.Builder builder) { - Biome.BiomeBuilder biomeBuilder = new Biome.BiomeBuilder(); - BiomeSpecialEffects.Builder effects = new BiomeSpecialEffects.Builder(); - MobSpawnSettings.Builder spawnInfo = new MobSpawnSettings.Builder(); - effects.waterColor(4159204).waterFogColor(329011).fogColor(12638463) - .skyColor(calculateSkyColor(2.0F)) - .ambientParticle(new AmbientParticleSettings(ParticleTypes.WHITE_ASH, 0.118093334F)); - spawnInfo.addSpawn(MobCategory.MONSTER, new MobSpawnSettings.SpawnerData( - EntityType.ZOMBIFIED_PIGLIN, 100, 4, 4)); - BiomeDefaultFeatures.commonSpawns(spawnInfo); - biomeBuilder.hasPrecipitation(true).temperature(0.8F).downfall(0.9F) - .specialEffects(effects.build()).mobSpawnSettings(spawnInfo.build()).generationSettings(builder.build()) - .temperatureAdjustment(Biome.TemperatureModifier.NONE).build(); - return biomeBuilder.build(); - } - - protected static int calculateSkyColor(float p_194844_) { - float $$1 = p_194844_ / 3.0F; - $$1 = Mth.clamp($$1, -1.0F, 1.0F); - return Mth.hsvToRgb(0.62222224F - $$1 * 0.05F, 0.5F + $$1 * 0.1F, 1.0F); - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/mixin/MoveControlMixin.java b/src/main/java/com/pancake/surviving_the_aftermath/common/mixin/MoveControlMixin.java deleted file mode 100644 index 60bd00b..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/mixin/MoveControlMixin.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.mixin; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Vec3i; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.world.entity.Mob; -import net.minecraft.world.entity.ai.control.MoveControl; -import net.minecraft.world.entity.monster.Ghast; -import net.minecraft.world.level.Level; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.Set; - -@Mixin(MoveControl.class) -public abstract class MoveControlMixin { - @Accessor - abstract public void setWantedX(double wantedX); - - @Accessor - abstract public void setWantedY(double wantedY); - - @Accessor - abstract public void setWantedZ(double wantedZ); - - @Accessor - abstract public void setSpeedModifier(double speedModifier); - //返回 - @Inject(method = "setWantedPosition", at = @At("RETURN")) - private void setWantedPosition(double p_24984_, double p_24985_, double p_24986_, double p_24987_, CallbackInfo ci) { - Set tags = getMob().getTags(); - if (!tags.isEmpty()) { - String tag = tags.iterator().next(); - if (tag.contains("restricted_range")) { - String[] split = tag.split(":"); - if (split.length == 2) { - String[] pos = split[1].split(", "); - if (pos.length == 3) { - setWantedX(Integer.parseInt(pos[0])); - setWantedY(Integer.parseInt(pos[1])); - setWantedZ(Integer.parseInt(pos[2])); - setSpeedModifier(p_24987_); - getMob().removeTag(tag); - } - } - } - } - } - - @Accessor - abstract public Mob getMob(); -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/mixin/PortalShapeMixin.java b/src/main/java/com/pancake/surviving_the_aftermath/common/mixin/PortalShapeMixin.java deleted file mode 100644 index 7118349..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/mixin/PortalShapeMixin.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.mixin; - -import com.pancake.surviving_the_aftermath.api.PortalShapeAccessor; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.level.portal.PortalShape; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; - -@Mixin(PortalShape.class) -public class PortalShapeMixin implements PortalShapeAccessor { - //bottomLeft - @Shadow - private BlockPos bottomLeft; - - //height - @Shadow - private int height; - - //width - @Final - @Shadow - private int width; - - //rightDir - @Final - @Shadow - private Direction rightDir; - - - @Override - public BlockPos survivingTheAftermath$getBottomLeft() { - return bottomLeft; - } - - @Override - public int survivingTheAftermath$getHeight() { - return height; - } - - @Override - public int survivingTheAftermath$getWidth() { - return width; - } - - @Override - public Direction survivingTheAftermath$getRightDir() { - return rightDir; - } -} - - diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/mixin/VillagerMixin.java b/src/main/java/com/pancake/surviving_the_aftermath/common/mixin/VillagerMixin.java deleted file mode 100644 index 73a2c01..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/mixin/VillagerMixin.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.mixin; - -import com.pancake.surviving_the_aftermath.common.init.ModMobEffects; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.npc.AbstractVillager; -import net.minecraft.world.entity.npc.Villager; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.trading.MerchantOffer; -import net.minecraft.world.level.Level; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(Villager.class) -public abstract class VillagerMixin extends AbstractVillager { - public VillagerMixin(EntityType entityType, Level level) { - super(entityType, level); - } - - @Inject(method = "updateSpecialPrices",at = @At("RETURN")) - private void updateSpecialPrices(Player player, CallbackInfo ci) { - if (player.hasEffect(ModMobEffects.COWARDICE.get())) { - for (MerchantOffer offer : this.getOffers()) { - double d0 = 0.3D + 0.0625D; - int j = (int) Math.floor(d0 * (double) offer.getBaseCostA().getCount()); - offer.addToSpecialPriceDiff(Math.max(j, 1)); - } - } - } -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/module/amount/IntegerAmountModule.java b/src/main/java/com/pancake/surviving_the_aftermath/common/module/amount/IntegerAmountModule.java new file mode 100644 index 0000000..1b46929 --- /dev/null +++ b/src/main/java/com/pancake/surviving_the_aftermath/common/module/amount/IntegerAmountModule.java @@ -0,0 +1,50 @@ +package com.pancake.surviving_the_aftermath.common.module.amount; + +import com.mojang.datafixers.util.Either; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import com.pancake.surviving_the_aftermath.api.module.IAmountModule; +import com.pancake.surviving_the_aftermath.common.module.weighted.EntityTypeWeightedModule; + +import java.util.function.Function; + +public class IntegerAmountModule implements IAmountModule { + public static final String IDENTIFIER = "integer_amount"; + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.INT.fieldOf("amount").forGetter(IntegerAmountModule::getAmount) + ).apply(instance, IntegerAmountModule::new)); + protected int amount; + + public IntegerAmountModule(int amount) { + this.amount = amount; + } + + public IntegerAmountModule() { + } + + @Override + public String getUniqueIdentifier() { + return IDENTIFIER; + } + + @Override + public Codec codec() { + return CODEC; + } + + @Override + public int getSpawnAmount() { + return amount; + } + + @Override + public IAmountModule type() { + return this; + } + + public int getAmount() { + return amount; + } + + +} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/module/amount/RandomAmountModule.java b/src/main/java/com/pancake/surviving_the_aftermath/common/module/amount/RandomAmountModule.java new file mode 100644 index 0000000..620e2db --- /dev/null +++ b/src/main/java/com/pancake/surviving_the_aftermath/common/module/amount/RandomAmountModule.java @@ -0,0 +1,57 @@ +package com.pancake.surviving_the_aftermath.common.module.amount; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import com.pancake.surviving_the_aftermath.api.module.IAmountModule; + +import java.util.Random; + +public class RandomAmountModule implements IAmountModule { + public static final String IDENTIFIER = "random_amount"; + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.INT.fieldOf("min").forGetter(RandomAmountModule::getMin), + Codec.INT.fieldOf("max").forGetter(RandomAmountModule::getMax) + ).apply(instance, RandomAmountModule::new)); + + @Override + public Codec codec() { + return CODEC; + } + @Override + public IAmountModule type() { + return this; + } + private final Random rand = new Random(); + protected int min; + protected int max; + + public RandomAmountModule(int min, int max) { + this.min = min; + this.max = max; + } + + public RandomAmountModule() { + } + + @Override + public String getUniqueIdentifier() { + return IDENTIFIER; + } + + + @Override + public int getSpawnAmount() { + this.max = Math.max(this.max, this.min); + return Math.max(0, this.rand.nextInt(this.max - this.min + 1) + this.min); + } + + + + public int getMin() { + return min; + } + + public int getMax() { + return max; + } +} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/module/entity_info/EntityInfoModule.java b/src/main/java/com/pancake/surviving_the_aftermath/common/module/entity_info/EntityInfoModule.java new file mode 100644 index 0000000..8134d94 --- /dev/null +++ b/src/main/java/com/pancake/surviving_the_aftermath/common/module/entity_info/EntityInfoModule.java @@ -0,0 +1,38 @@ +package com.pancake.surviving_the_aftermath.common.module.entity_info; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import com.pancake.surviving_the_aftermath.api.module.IAmountModule; +import com.pancake.surviving_the_aftermath.api.module.IEntityInfoModule; +import com.pancake.surviving_the_aftermath.common.init.ModAftermathModule; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.entity.EntityType; + +public class EntityInfoModule implements IEntityInfoModule { + public static final String IDENTIFIER = "entity_info"; + public final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + BuiltInRegistries.ENTITY_TYPE.byNameCodec().fieldOf("entity_type").forGetter(EntityInfoModule::getEntityType), + IAmountModule.CODEC.fieldOf("amount_module").forGetter(EntityInfoModule::getAmountModule) + + ).apply(instance, EntityInfoModule::new)); + protected EntityType entityType; + protected IAmountModule amountModule; + +public EntityInfoModule(EntityType entityType, IAmountModule amountModule) { + this.entityType = entityType; + this.amountModule = amountModule; + } + + @Override + public String getUniqueIdentifier() { + return IDENTIFIER; + } + + public EntityType getEntityType() { + return entityType; + } + + public IAmountModule getAmountModule() { + return amountModule; + } +} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/module/weighted/BaseWeightedModule.java b/src/main/java/com/pancake/surviving_the_aftermath/common/module/weighted/BaseWeightedModule.java new file mode 100644 index 0000000..0314fbc --- /dev/null +++ b/src/main/java/com/pancake/surviving_the_aftermath/common/module/weighted/BaseWeightedModule.java @@ -0,0 +1,37 @@ +package com.pancake.surviving_the_aftermath.common.module.weighted; + +import com.pancake.surviving_the_aftermath.api.module.IWeightedModule; +import net.minecraft.util.random.SimpleWeightedRandomList; +import net.minecraft.util.random.WeightedEntry; +import net.minecraft.util.random.WeightedEntry.Wrapper; + +import java.util.List; + + +public abstract class BaseWeightedModule implements IWeightedModule { + protected List> list; + + @Override + public void add(T t, int weight) { + this.list.add(WeightedEntry.wrap(t, weight)); + } + + @Override + public void remove(T t) { + this.list.removeIf(wrapper -> wrapper.getData().equals(t)); + } + + @Override + public SimpleWeightedRandomList getWeightedList() { + SimpleWeightedRandomList.Builder builder = SimpleWeightedRandomList.builder(); + this.list.forEach(build -> { + builder.add(build.getData(), build.getWeight().asInt()); + }); + return builder.build(); + } + + @Override + public List> getList() { + return this.list; + } +} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/module/weighted/EntityTypeWeightedModule.java b/src/main/java/com/pancake/surviving_the_aftermath/common/module/weighted/EntityTypeWeightedModule.java new file mode 100644 index 0000000..c3b1bf9 --- /dev/null +++ b/src/main/java/com/pancake/surviving_the_aftermath/common/module/weighted/EntityTypeWeightedModule.java @@ -0,0 +1,28 @@ +package com.pancake.surviving_the_aftermath.common.module.weighted; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.util.random.WeightedEntry; +import net.minecraft.world.entity.EntityType; +import net.minecraftforge.registries.ForgeRegistries; + +import java.util.List; +import java.util.stream.Collectors; + +public class EntityTypeWeightedModule extends BaseWeightedModule> { + public static final String IDENTIFIER = "entity_type_weighted"; + + public static final Codec>>> CODEC = WeightedEntry.Wrapper.codec(BuiltInRegistries.ENTITY_TYPE.byNameCodec()) + .listOf().comapFlatMap(list -> { + List>> filteredList = list.stream() + .filter(wrapper -> ForgeRegistries.ENTITY_TYPES.containsKey(ForgeRegistries.ENTITY_TYPES.getKey(wrapper.getData()))) + .collect(Collectors.toList()); + return DataResult.success(filteredList); + }, list -> list); + + @Override + public String getUniqueIdentifier() { + return IDENTIFIER; + } +} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/module/weighted/ItemWeightedModule.java b/src/main/java/com/pancake/surviving_the_aftermath/common/module/weighted/ItemWeightedModule.java new file mode 100644 index 0000000..8b49119 --- /dev/null +++ b/src/main/java/com/pancake/surviving_the_aftermath/common/module/weighted/ItemWeightedModule.java @@ -0,0 +1,25 @@ +package com.pancake.surviving_the_aftermath.common.module.weighted; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.util.random.WeightedEntry; +import net.minecraft.world.item.Item; + +import java.util.List; +import java.util.stream.Collectors; + +public class ItemWeightedModule extends BaseWeightedModule { + public static final String IDENTIFIER = "item_weighted"; + public static final Codec>> CODEC = WeightedEntry.Wrapper.codec(BuiltInRegistries.ITEM.byNameCodec()) + .listOf().comapFlatMap(list -> { + List> filteredList = list.stream() + .filter(wrapper -> BuiltInRegistries.ITEM.containsKey(BuiltInRegistries.ITEM.getKey(wrapper.getData()))) + .collect(Collectors.toList()); + return DataResult.success(filteredList); + }, list -> list); + @Override + public String getUniqueIdentifier() { + return IDENTIFIER; + } +} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/raid/NetherRaid.java b/src/main/java/com/pancake/surviving_the_aftermath/common/raid/NetherRaid.java deleted file mode 100644 index 31b73b6..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/raid/NetherRaid.java +++ /dev/null @@ -1,358 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.raid; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Sets; -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.api.AftermathState; -import com.pancake.surviving_the_aftermath.api.Constant; -import com.pancake.surviving_the_aftermath.api.IAftermath; -import com.pancake.surviving_the_aftermath.api.IAftermathFactory; -import com.pancake.surviving_the_aftermath.api.base.BaseAftermathModule; -import com.pancake.surviving_the_aftermath.api.module.IEntityInfoModule; -import com.pancake.surviving_the_aftermath.common.init.ModStructures; -import com.pancake.surviving_the_aftermath.api.PortalShapeAccessor; -import com.pancake.surviving_the_aftermath.common.raid.api.BaseRaid; -import com.pancake.surviving_the_aftermath.common.raid.module.NetherRaidModule; -import com.pancake.surviving_the_aftermath.common.structure.NetherRaidStructure; -import com.pancake.surviving_the_aftermath.common.tracker.RaidMobBattleTracker; -import com.pancake.surviving_the_aftermath.common.tracker.RaidPlayerBattleTracker; -import com.pancake.surviving_the_aftermath.common.util.AftermathEventUtil; -import com.pancake.surviving_the_aftermath.common.util.RandomUtils; -import com.pancake.surviving_the_aftermath.common.util.SpawnEntityUtil; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.core.particles.SimpleParticleType; -import net.minecraft.core.registries.Registries; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.nbt.Tag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.util.SpawnUtil; -import net.minecraft.world.entity.*; -import net.minecraft.world.entity.ai.memory.MemoryModuleType; -import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.entity.monster.Ghast; -import net.minecraft.world.entity.monster.Slime; -import net.minecraft.world.entity.monster.hoglin.Hoglin; -import net.minecraft.world.entity.monster.piglin.AbstractPiglin; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.Mirror; -import net.minecraft.world.level.levelgen.structure.StructureStart; -import net.minecraft.world.level.levelgen.structure.TemplateStructurePiece; -import net.minecraft.world.level.levelgen.structure.templatesystem.*; -import net.minecraft.world.level.portal.PortalShape; -import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.Vec3; -import net.minecraft.world.phys.shapes.VoxelShape; -import net.minecraftforge.common.util.LazyOptional; -import org.jetbrains.annotations.NotNull; - -import javax.annotation.Nullable; -import java.util.*; -import java.util.function.Predicate; - -public class NetherRaid extends BaseRaid { - public static final String IDENTIFIER = "nether_raid"; - private static final ResourceLocation BARS_RESOURCE = SurvivingTheAftermath.asResource("textures/gui/nether_raid_bars.png"); - protected Set spawnPos = Sets.newHashSet(); - private int readyTime; - private static final int MAX_REWARD_TIME = 10 * 20; - private int rewardTime = MAX_REWARD_TIME; - public NetherRaid(ServerLevel level, BlockPos centerPos ,PortalShape portalShape) { - super(level,centerPos); - setSpawnPos(portalShape); - this.readyTime = getModule().getReadyTime(); - } - - public NetherRaid(ServerLevel level, CompoundTag compoundTag) { - super(level); - this.deserializeNBT(compoundTag); - } - - @Override - public CompoundTag serializeNBT() { - CompoundTag compoundTag = super.serializeNBT(); - compoundTag.putInt(Constant.READY_TIME, readyTime); - compoundTag.putInt(Constant.REWARD_TIME, rewardTime); - - ListTag listTag = new ListTag(); - spawnPos.forEach(blockPos -> listTag.add(NbtUtils.writeBlockPos(blockPos))); - compoundTag.put(Constant.SPAWN_POS, listTag); - return compoundTag; - } - - @Override - public void deserializeNBT(CompoundTag nbt) { - super.deserializeNBT(nbt); - - this.readyTime = nbt.getInt(Constant.READY_TIME); - this.rewardTime = nbt.getInt(Constant.REWARD_TIME); - - ListTag tags = nbt.getList(Constant.SPAWN_POS, Tag.TAG_COMPOUND); - tags.forEach(tag -> { - BlockPos blockPos = NbtUtils.readBlockPos((CompoundTag) tag); - spawnPos.add(blockPos); - - }); - } - - @Override - public void tick() { - super.tick(); - if (state == AftermathState.CELEBRATING){ - if (rewardTime <= 0){ - end(); - return; - } - spawnRewards(); - rewardTime--; - } - } - - @Override - public boolean isCreate() { - return level.structureManager().getAllStructuresAt(this.centerPos) - .containsKey(level.registryAccess().registryOrThrow(Registries.STRUCTURE).get(ModStructures.NETHER_RAID)) - && super.isCreate(); - } - - @Override - public ResourceLocation getBarsResource() { - return BARS_RESOURCE; - } - - @Override - public int[] getBarsOffset() { - return new int[]{192,23,182,4,5,4}; - } - - @Override - public void spawnRewards() { - super.spawnRewards(); - BlockPos blockPos = RandomUtils.getRandomElement(spawnPos); - Direction dir = Direction.Plane.HORIZONTAL.stream().filter(d -> level.isEmptyBlock(blockPos.relative(d)) - && !spawnPos.contains(blockPos.relative(d))).findFirst().orElse(Direction.UP); - Vec3 vec = Vec3.atCenterOf(blockPos); - module.getRewardList().getRandomValue(level.random).ifPresent(reward -> { - ItemEntity itemEntity = new ItemEntity(level, vec.x, vec.y, vec.z, new ItemStack(reward), - dir.getStepX() * 0.2, 0.2, dir.getStepZ() * 0.2f); - itemEntity.setInvulnerable(true); - level.addFreshEntity(itemEntity); - }); - } - - @Override - public NetherRaidModule getModule() { - return (NetherRaidModule) module; - } - - - @Override - public String getUniqueIdentifier() { - return IDENTIFIER; - } - - protected void updateStructure() { - StructureStart start = this.level.structureManager().getStructureAt(centerPos, Objects.requireNonNull(this.level.registryAccess().registryOrThrow(Registries.STRUCTURE).get(ModStructures.NETHER_RAID))); - if (start != StructureStart.INVALID_START) { - Optional template = this.level.getStructureManager().get(NetherRaidStructure.STRUCTURE_TRANSFORMED); - template.ifPresent(t -> { - if (start.getPieces().get(0) instanceof TemplateStructurePiece piece) { - BlockPos pos = piece.templatePosition(); - StructurePlaceSettings settings = new StructurePlaceSettings().setRotation(piece.getRotation()).setMirror(Mirror.NONE) - .addProcessor(new BlockIgnoreProcessor(ImmutableList.of(Blocks.AIR, Blocks.STRUCTURE_BLOCK, Blocks.NETHER_PORTAL, Blocks.OBSIDIAN))) - .addProcessor(new StructureProcessor() { - - @Override - @NotNull - protected StructureProcessorType getType() { - return null; - } - - @Override - public StructureTemplate.StructureBlockInfo process(@NotNull LevelReader levelReader, - @NotNull BlockPos p_74141_, - @NotNull BlockPos p_74142_, - @NotNull StructureTemplate.StructureBlockInfo blockInfo, - @NotNull StructureTemplate.StructureBlockInfo relativeBlockInfo, - @NotNull StructurePlaceSettings p_74145_, - @Nullable StructureTemplate template) { - if (level.random.nextFloat() < 0.9) { - return new StructureTemplate.StructureBlockInfo(relativeBlockInfo.pos(), - levelReader.getBlockState(relativeBlockInfo.pos()), relativeBlockInfo.nbt()); - } else { - return relativeBlockInfo; - } - } - }); - t.placeInWorld(this.level, pos, pos, settings, this.level.random, 2); - } - }); - } - } - - @Override - public Predicate validPlayer() { - Predicate predicate = (Predicate) super.validPlayer(); - return predicate.and((player) -> Math.sqrt(player.distanceToSqr(Vec3.atCenterOf(centerPos))) < getRadius()); - } - - @Override - public void updateProgress() { - super.updateProgress(); - - if (state == AftermathState.START){ - ready(); - return; - } - if (state == AftermathState.READY){ - ready(); - return; - } - if (state == AftermathState.ONGOING){ - AftermathEventUtil.ongoing(this, players, level); - checkNextWave(); - spawnWave(); - EnemyTotalRatio(); - } - } - - @Override - public void ready(){ - super.ready(); - if (readyTime <= 0){ - AftermathEventUtil.ongoing(this, players, level); - return; - } - this.progressPercent = 1 - (float) readyTime / getModule().getReadyTime(); - readyTime--; - } - - @Override - protected List> spawnEntities(IEntityInfoModule module) { - if (players.isEmpty()) return Collections.emptyList(); - List> arrayList = module.spawnEntity(level); - for (LazyOptional lazyOptional : arrayList) { - lazyOptional.ifPresent(entity -> { - if (entity instanceof Mob mob){ - BlockPos blockPos = RandomUtils.getRandomElement(spawnPos); - mob.moveTo(blockPos.getX() + 0.5, blockPos.getY() , blockPos.getZ()+ 0.5); - mob.setPersistenceRequired(); - Player target = randomPlayersUnderAttack(); - mob.getBrain().setMemory(MemoryModuleType.ANGRY_AT, target.getUUID()); - mob.setTarget(target); - - for (var slot : EquipmentSlot.values()) { - mob.setDropChance(slot, 0); - } - - - if (entity instanceof AbstractPiglin piglin) { - piglin.setImmuneToZombification(true); - } - if (entity instanceof Hoglin hoglin) { - hoglin.setImmuneToZombification(true); - } - if (entity instanceof Slime slime) { - slime.finalizeSpawn(level, level.getCurrentDifficultyAt(slime.blockPosition()), MobSpawnType.EVENT, null, null); - } - if (entity instanceof Ghast ghast) { - ghast.setPos(ghast.getX(), ghast.getY() + 20, ghast.getZ()); - } - - for (int i = 0; i < 5; i++) { - if (isBlocked(level, mob)) { - Direction.Plane.HORIZONTAL.stream().forEach(direction -> { - if (level.isEmptyBlock(mob.blockPosition().relative(direction))) { - mob.moveTo(Vec3.atCenterOf(mob.blockPosition().relative(direction))); - } - }); - } - } - - - enemies.add(mob.getUUID()); - totalEnemy++; - level.addFreshEntityWithPassengers(mob); - } - }); - } - return arrayList; - } - - private boolean isBlocked(ServerLevel level, Entity entity) { - for (var shape : level.getBlockCollisions(entity, entity.getBoundingBox())) { - return !shape.isEmpty(); - } - return false; - } - - - - protected void spawnWave() { - if (enemies.isEmpty() && state == AftermathState.ONGOING){ - LOGGER.info(getUniqueIdentifier() +": spawn wave " + currentWave); - module.getWaves().get(currentWave).forEach(this::spawnEntities); - updateStructure(); - } - enemies.removeIf(uuid -> level.getEntity(uuid) == null); - } - - private void EnemyTotalRatio(){ - if (enemies.isEmpty()) return; - this.progressPercent = enemies.size() / (float) totalEnemy; - } - - protected void checkNextWave(){ - if (enemies.isEmpty()){ - if(this.currentWave >= module.getWaves().size() - 1) { - AftermathEventUtil.victory(this, players, level); - } else { - currentWave++; - totalEnemy = 0; - AftermathEventUtil.ongoing(this, players, level); - } - } - } - - protected void setSpawnPos(PortalShape portalShape){ - spawnPos.clear(); - spawnPos.add(centerPos); - PortalShapeAccessor portalShapeMixin = (PortalShapeAccessor ) portalShape; - BlockPos bottomLeft = portalShapeMixin.survivingTheAftermath$getBottomLeft(); - int height = portalShapeMixin.survivingTheAftermath$getHeight(); - int width = portalShapeMixin.survivingTheAftermath$getWidth(); - Direction rightDir = portalShapeMixin.survivingTheAftermath$getRightDir(); - BlockPos.betweenClosed(bottomLeft, bottomLeft.relative(Direction.UP, height - 1).relative(rightDir, width - 1)) - .forEach(blockPos -> spawnPos.add(new BlockPos(blockPos.getX(), blockPos.getY(), blockPos.getZ()))); - } - - @Override - public void bindTrackers() { - super.bindTrackers(); - API.getTracker(uuid, RaidMobBattleTracker.IDENTIFIER, - RaidPlayerBattleTracker.IDENTIFIER) - .forEach(this::addTracker); - } - - @Override - public boolean join(Entity entity) { - return entity.getType() == EntityType.MAGMA_CUBE && super.join(entity); - } - - public static class Factory implements IAftermathFactory { - @Override - public IAftermath create(ServerLevel level, CompoundTag compound) { - return new NetherRaid(level, compound); - } - } - - -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/raid/api/BaseRaid.java b/src/main/java/com/pancake/surviving_the_aftermath/common/raid/api/BaseRaid.java deleted file mode 100644 index 489de5e..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/raid/api/BaseRaid.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.raid.api; - - -import com.mojang.logging.LogUtils; -import com.pancake.surviving_the_aftermath.api.AftermathState; -import com.pancake.surviving_the_aftermath.api.Constant; -import com.pancake.surviving_the_aftermath.api.IAftermath; -import com.pancake.surviving_the_aftermath.api.base.BaseAftermath; -import com.pancake.surviving_the_aftermath.api.base.BaseAftermathModule; -import com.pancake.surviving_the_aftermath.api.module.IEntityInfoModule; -import com.pancake.surviving_the_aftermath.common.raid.module.BaseRaidModule; -import com.pancake.surviving_the_aftermath.common.tracker.MobBattleTracker; -import com.pancake.surviving_the_aftermath.common.tracker.RaidMobBattleTracker; -import com.pancake.surviving_the_aftermath.common.tracker.RaidPlayerBattleTracker; -import com.pancake.surviving_the_aftermath.common.util.RandomUtils; -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.player.Player; -import net.minecraftforge.common.util.LazyOptional; -import org.slf4j.Logger; - -import java.util.List; -import java.util.Map; -import java.util.UUID; - -public abstract class BaseRaid extends BaseAftermath implements IRaid{ - public static final Logger LOGGER = LogUtils.getLogger(); - protected int currentWave = -1; - protected int totalEnemy = 0; - protected BlockPos centerPos; - public BaseRaid(ServerLevel level, BlockPos centerPos) { - super(level); - this.centerPos = centerPos; - } - - public BaseRaid(ServerLevel level) { - super(level); - } - - @Override - public void bindTrackers() { - API.getTracker(uuid, MobBattleTracker.IDENTIFIER) - .forEach(this::addTracker); - } - - @Override - public boolean isCreate() { - Map> aftermathMap = MANAGER.getAftermathMap(); - return aftermathMap.values().stream() - .filter(aftermath -> aftermath instanceof IRaid) - .map(aftermath -> (IRaid) aftermath) - .noneMatch(raid -> raid.getCenterPos().distSqr(centerPos) < Math.pow(raid.getRadius(), 2)); - - } - - @Override - public BlockPos getCenterPos() { - return centerPos; - } - - @Override - public int getRadius() { - return 50; - } - protected abstract List> spawnEntities(IEntityInfoModule module); - - @Override - public CompoundTag serializeNBT() { - CompoundTag compoundTag = super.serializeNBT(); - compoundTag.putInt(Constant.CURRENT_WAVE, currentWave); - compoundTag.put(Constant.CENTER_POS, NbtUtils.writeBlockPos(centerPos)); - compoundTag.putInt(Constant.TOTAL_ENEMY, totalEnemy); - return compoundTag; - } - - @Override - public void deserializeNBT(CompoundTag nbt) { - super.deserializeNBT(nbt); - this.currentWave = nbt.getInt(Constant.CURRENT_WAVE); - this.centerPos = NbtUtils.readBlockPos(nbt.getCompound(Constant.CENTER_POS)); - this.totalEnemy = nbt.getInt(Constant.TOTAL_ENEMY); - } - - - public Player randomPlayersUnderAttack(){ - return level.getPlayerByUUID(RandomUtils.getRandomElement(players)); - } - - - public boolean join(Entity entity) { - if (state == AftermathState.ONGOING && - Math.sqrt(entity.blockPosition().distSqr(centerPos)) < getRadius() && - enemies.add(entity.getUUID())) { - totalEnemy++; - return true; - } - return false; - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/raid/api/IRaid.java b/src/main/java/com/pancake/surviving_the_aftermath/common/raid/api/IRaid.java deleted file mode 100644 index b12878a..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/raid/api/IRaid.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.raid.api; - -import net.minecraft.core.BlockPos; - -public interface IRaid { - BlockPos getCenterPos(); - int getRadius(); -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/raid/api/IRaidModule.java b/src/main/java/com/pancake/surviving_the_aftermath/common/raid/api/IRaidModule.java deleted file mode 100644 index 9d35b3c..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/raid/api/IRaidModule.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.raid.api; - -import com.pancake.surviving_the_aftermath.api.module.IEntityInfoModule; - -import java.util.List; - -public interface IRaidModule { - List> getWaves(); -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/raid/module/BaseRaidModule.java b/src/main/java/com/pancake/surviving_the_aftermath/common/raid/module/BaseRaidModule.java deleted file mode 100644 index ec54f6c..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/raid/module/BaseRaidModule.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.raid.module; - -import com.google.common.collect.Lists; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.pancake.surviving_the_aftermath.api.Constant; -import com.pancake.surviving_the_aftermath.api.aftermath.AftermathAPI; -import com.pancake.surviving_the_aftermath.api.base.BaseAftermathModule; -import com.pancake.surviving_the_aftermath.api.module.IEntityInfoModule; -import com.pancake.surviving_the_aftermath.common.raid.api.IRaidModule; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; -import net.minecraft.util.GsonHelper; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Supplier; - -public abstract class BaseRaidModule extends BaseAftermathModule implements IRaidModule { - protected List> waves = Lists.newArrayList(); - - @Override - public CompoundTag serializeNBT() { - CompoundTag compoundTag = super.serializeNBT(); - ListTag waves = new ListTag(); - for (List wave : this.waves) { - ListTag listTag = new ListTag(); - for (IEntityInfoModule entityInfoModule : wave) { - listTag.add(entityInfoModule.serializeNBT()); - } - waves.add(listTag); - } - compoundTag.put(Constant.WAVES, waves); - return compoundTag; - } - - @Override - public void deserializeNBT(CompoundTag compoundTag) { - super.deserializeNBT(compoundTag); - ListTag waves = compoundTag.getList(Constant.WAVES, 9); - for (Tag wave : waves) { - ListTag listTag = (ListTag) wave; - ArrayList modules = Lists.newArrayList(); - for (Tag tag: listTag) { - CompoundTag compoundTag1 = (CompoundTag) tag; - IEntityInfoModule entityInfoModule = AftermathAPI.getInstance().getEntityInfoModule(compoundTag1.getString(Constant.IDENTIFIER)); - entityInfoModule.deserializeNBT(compoundTag1); - modules.add(entityInfoModule); - } - this.waves.add(modules); - } - } - - @Override - public void deserializeJson(JsonElement jsonElement) { - super.deserializeJson(jsonElement); - jsonElement.getAsJsonObject().get(Constant.WAVES).getAsJsonArray().forEach(jsonElement1 -> { - ArrayList modules = Lists.newArrayList(); - jsonElement1.getAsJsonArray().forEach(jsonElement2 -> { - IEntityInfoModule entityInfoModule = AftermathAPI.getInstance().getEntityInfoModule(GsonHelper.getAsString(jsonElement2.getAsJsonObject(), Constant.IDENTIFIER)); - entityInfoModule.deserializeJson(jsonElement2); - modules.add(entityInfoModule); - }); - this.waves.add(modules); - }); - } - - @Override - public JsonElement serializeJson() { - JsonElement jsonElement = super.serializeJson(); - JsonArray jsonArray = new JsonArray(); - for (List wave : waves) { - JsonArray jsonArray1 = new JsonArray(); - for (IEntityInfoModule entityInfoModule : wave) { - jsonArray1.add(entityInfoModule.serializeJson()); - } - jsonArray.add(jsonArray1); - } - jsonElement.getAsJsonObject().add(Constant.WAVES, jsonArray); - return jsonElement; - } - - @Override - public List> getWaves() { - return waves; - } - - protected void setWaves(List> waves) { - this.waves = waves; - } - - @Override - public abstract String getUniqueIdentifier(); - - public static class Builder extends BaseAftermathModule.Builder{ - protected List> waves = Lists.newArrayList(); - - public Builder(T module,String jsonName) { - super(module,jsonName); - } - - public Builder addWave(Supplier> wave) { - this.waves.add(wave.get()); - return this; - } - - public Builder addWaves(Supplier>> waves) { - this.waves = waves.get(); - return this; - } - - @Override - public T build() { - T module = super.build(); - if (module instanceof BaseRaidModule baseRaidModule) { - baseRaidModule.setWaves(waves); - } - return module; - } - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/raid/module/NetherRaidModule.java b/src/main/java/com/pancake/surviving_the_aftermath/common/raid/module/NetherRaidModule.java deleted file mode 100644 index 14d5a75..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/raid/module/NetherRaidModule.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.raid.module; - -import com.google.gson.JsonElement; -import com.pancake.surviving_the_aftermath.api.Constant; -import com.pancake.surviving_the_aftermath.common.raid.NetherRaid; -import net.minecraft.nbt.CompoundTag; - -public class NetherRaidModule extends BaseRaidModule { - protected int readyTime; - @Override - public CompoundTag serializeNBT() { - CompoundTag compoundTag = super.serializeNBT(); - compoundTag.putInt(Constant.READY_TIME,readyTime); - return compoundTag; - } - - @Override - public void deserializeNBT(CompoundTag compoundTag) { - super.deserializeNBT(compoundTag); - this.readyTime = compoundTag.getInt(Constant.READY_TIME); - } - - @Override - public void deserializeJson(JsonElement jsonElement) { - super.deserializeJson(jsonElement); - this.readyTime = jsonElement.getAsJsonObject().get(Constant.READY_TIME).getAsInt(); - } - - @Override - public JsonElement serializeJson() { - JsonElement jsonElement = super.serializeJson(); - jsonElement.getAsJsonObject().addProperty(Constant.READY_TIME,readyTime); - return jsonElement; - } - - @Override - public String getUniqueIdentifier() { - return NetherRaid.IDENTIFIER; - } - - public int getReadyTime() { - return readyTime; - } - - protected void setReadyTime(int readyTime) { - this.readyTime = readyTime; - } - - - public static class Builder extends BaseRaidModule.Builder{ - private int readyTime; - - public Builder(String jsonName) { - super(new NetherRaidModule(), jsonName); - } - - public Builder setReadyTime(int readyTime) { - this.readyTime = readyTime; - return this; - } - - @Override - public NetherRaidModule build() { - NetherRaidModule build = super.build(); - build.setReadyTime(this.readyTime); - return build; - } - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/AbstractStructure.java b/src/main/java/com/pancake/surviving_the_aftermath/common/structure/AbstractStructure.java deleted file mode 100644 index 78c37f9..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/AbstractStructure.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.structure; - -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.RandomSource; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.ServerLevelAccessor; -import net.minecraft.world.level.StructureManager; -import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.block.Mirror; -import net.minecraft.world.level.block.Rotation; -import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.Heightmap; -import net.minecraft.world.level.levelgen.WorldgenRandom; -import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.Structure; -import net.minecraft.world.level.levelgen.structure.StructureType; -import net.minecraft.world.level.levelgen.structure.TemplateStructurePiece; -import net.minecraft.world.level.levelgen.structure.pieces.PiecesContainer; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; -import net.minecraft.world.level.levelgen.structure.templatesystem.BlockIgnoreProcessor; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; -import net.minecraft.world.level.storage.loot.BuiltInLootTables; - -import java.util.Optional; - -public abstract class AbstractStructure extends Structure { - - public AbstractStructure(StructureSettings settings) { - super(settings); - } - - @Override - protected Optional findGenerationPoint(GenerationContext context) { - return onTopOfChunkCenter(context, Heightmap.Types.WORLD_SURFACE_WG, (pieces) -> { - ChunkPos chunk = context.chunkPos(); - WorldgenRandom rand = context.random(); - int x = chunk.getMinBlockX(); - int z = chunk.getMinBlockZ(); - int y = context.chunkGenerator().getFirstOccupiedHeight( - x, z, Heightmap.Types.WORLD_SURFACE_WG, - context.heightAccessor(), context.randomState()); - BlockPos pos = new BlockPos(x, y, z); - Rotation rotation = Rotation.getRandom(rand); - pieces.addPiece(new Piece(this.pieceType(), context.structureTemplateManager(), this.location(), pos, rotation)); - }); - } - - @Override - public void afterPlace(WorldGenLevel pLevel, StructureManager pStructureManager, ChunkGenerator pChunkGenerator, - RandomSource pRandom, BoundingBox pBoundingBox, ChunkPos pChunkPos, PiecesContainer pPieces) { - BlockPos.betweenClosedStream(pBoundingBox).forEach(p -> { - if (pLevel.getBlockEntity(p) instanceof RandomizableContainerBlockEntity chest) { - chest.setLootTable(BuiltInLootTables.DESERT_PYRAMID, pRandom.nextLong()); - } - }); - } - - @Override - public abstract StructureType type(); - - public abstract StructurePieceType pieceType(); - - public abstract ResourceLocation location(); - - public static class Piece extends TemplateStructurePiece { - - public Piece(StructurePieceType type, StructureTemplateManager structureTemplateManager, ResourceLocation location, BlockPos templatePosition, Rotation rotation) { - super(type, 0, structureTemplateManager, location, location.toString(), makeSettings(rotation), templatePosition); - } - - public Piece(StructurePieceType type, StructureTemplateManager structureManager, CompoundTag tag) { - super(type, tag, structureManager, (location) -> makeSettings(Rotation.valueOf(tag.getString("rot")))); - } - - public Piece(StructurePieceType type, StructurePieceSerializationContext context, CompoundTag tag) { - this(type, context.structureTemplateManager(), tag); - } - - @Override - protected void handleDataMarker(String name, BlockPos pos, ServerLevelAccessor level, RandomSource random, BoundingBox box) {} - - @Override - protected void addAdditionalSaveData(StructurePieceSerializationContext context, CompoundTag tag) { - super.addAdditionalSaveData(context, tag); - tag.putString("rot", this.placeSettings.getRotation().name()); - } - - private static StructurePlaceSettings makeSettings(Rotation rotation) { - return new StructurePlaceSettings().setRotation(rotation).setMirror(Mirror.NONE).addProcessor(BlockIgnoreProcessor.STRUCTURE_AND_AIR); - } - - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/BurntStructure.java b/src/main/java/com/pancake/surviving_the_aftermath/common/structure/BurntStructure.java deleted file mode 100644 index 72775f5..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/BurntStructure.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.structure; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.init.ModStructurePieceTypes; -import com.pancake.surviving_the_aftermath.common.init.ModStructureTypes; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.levelgen.structure.StructureType; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - -import java.util.function.Supplier; - -@SuppressWarnings("unchecked") -public class BurntStructure extends AbstractStructure { - - private final int index; - - private static final Supplier>[] STRUCTURE_TYPES = new Supplier[] {null, - ModStructureTypes.BURNT_1, ModStructureTypes.BURNT_2, ModStructureTypes.BURNT_3, - ModStructureTypes.BURNT_4, ModStructureTypes.BURNT_5, ModStructureTypes.BURNT_6}; - - private static final Supplier[] STRUCTURE_PIECE_TYPES = new Supplier[] {null, - ModStructurePieceTypes.BURNT_1, ModStructurePieceTypes.BURNT_2, - ModStructurePieceTypes.BURNT_3, ModStructurePieceTypes.BURNT_4, - ModStructurePieceTypes.BURNT_5, ModStructurePieceTypes.BURNT_6}; - - public BurntStructure(StructureSettings settings, int index) { - super(settings); - this.index = index; - } - - @Override - public StructureType type() { - return STRUCTURE_TYPES[this.index].get(); - } - - @Override - public StructurePieceType pieceType() { - return STRUCTURE_PIECE_TYPES[this.index].get(); - } - - @Override - public ResourceLocation location() { - return SurvivingTheAftermath.asResource("burnt_structure" + this.index); - } - - public static class Piece extends AbstractStructure.Piece { - - public Piece(StructurePieceSerializationContext context, CompoundTag tag, int index) { - super(BurntStructure.STRUCTURE_PIECE_TYPES[index].get(), context, tag); - } - - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/CityStructure.java b/src/main/java/com/pancake/surviving_the_aftermath/common/structure/CityStructure.java deleted file mode 100644 index 39fc385..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/CityStructure.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.structure; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.init.ModStructurePieceTypes; -import com.pancake.surviving_the_aftermath.common.init.ModStructureTypes; -import net.minecraft.core.BlockPos; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.RandomSource; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.npc.Villager; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.StructureManager; -import net.minecraft.world.level.WorldGenLevel; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.structure.BoundingBox; -import net.minecraft.world.level.levelgen.structure.StructureType; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - -public class CityStructure extends AbstractStructure { - - public CityStructure(StructureSettings settings) { - super(settings); - } - - @Override - public StructureType type() { - return ModStructureTypes.CITY.get(); - } - - @Override - public StructurePieceType pieceType() { - return ModStructurePieceTypes.CITY.get(); - } - - @Override - public ResourceLocation location() { - return SurvivingTheAftermath.asResource("city"); - } - - public static class Piece extends AbstractStructure.Piece { - - public Piece(StructurePieceSerializationContext context, CompoundTag tag) { - super(ModStructurePieceTypes.CITY.get(), context.structureTemplateManager(), tag); - } - - @SuppressWarnings("deprecation") - @Override - public void postProcess(WorldGenLevel level, StructureManager structureManager, ChunkGenerator generator, - RandomSource rand, BoundingBox box, ChunkPos chunkPos, BlockPos pos) { - super.postProcess(level, structureManager, generator, rand, box, chunkPos, pos); - BlockPos spawnPos = new BlockPos(rand.nextInt(box.minX(), box.maxX()), pos.getY(), rand.nextInt(box.minZ(), box.maxZ())); - for (int y = spawnPos.getY(); y < box.maxY(); y++) { - BlockState state1 = this.getBlock(level, spawnPos.getX(), y, spawnPos.getZ(), box); - BlockState state2 = this.getBlock(level, spawnPos.getX(), y + 1, spawnPos.getZ(), box); - if (state1.isAir() && state2.isAir()) { - Villager villager = EntityType.VILLAGER.create(level.getLevel()); - villager.moveTo(spawnPos.getX(), y, spawnPos.getZ()); - BuiltInRegistries.VILLAGER_TYPE.getRandom(rand).ifPresent((profession) -> - villager.setVillagerData(villager.getVillagerData().setType(profession.value()))); - BuiltInRegistries.VILLAGER_PROFESSION.getRandom(rand).ifPresent((profession) -> - villager.setVillagerData(villager.getVillagerData().setProfession(profession.value()))); - level.addFreshEntity(villager); - break; - } - } - } - - } -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/HouseOfSakura.java b/src/main/java/com/pancake/surviving_the_aftermath/common/structure/HouseOfSakura.java deleted file mode 100644 index 4571663..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/HouseOfSakura.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.structure; - - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.init.ModStructurePieceTypes; -import com.pancake.surviving_the_aftermath.common.init.ModStructureTypes; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.levelgen.structure.StructureType; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - -public class HouseOfSakura extends AbstractStructure { - - public HouseOfSakura(StructureSettings settings) { - super(settings); - } - - @Override - public StructureType type() { - return ModStructureTypes.HOUSE_OF_SAKURA.get(); - } - - @Override - public StructurePieceType pieceType() { - return ModStructurePieceTypes.HOUSE_OF_SAKURA.get(); - } - - @Override - public ResourceLocation location() { - return SurvivingTheAftermath.asResource("house_of_sakura"); - } - - public static class Piece extends AbstractStructure.Piece { - - public Piece(StructurePieceSerializationContext context, CompoundTag tag) { - super(ModStructurePieceTypes.HOUSE_OF_SAKURA.get(), context.structureTemplateManager(), tag); - } - - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/NetherRaidStructure.java b/src/main/java/com/pancake/surviving_the_aftermath/common/structure/NetherRaidStructure.java deleted file mode 100644 index 10012f9..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/NetherRaidStructure.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.structure; - - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.init.ModStructurePieceTypes; -import com.pancake.surviving_the_aftermath.common.init.ModStructureTypes; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.levelgen.structure.StructureType; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - -public class NetherRaidStructure extends AbstractStructure { - - - public static final ResourceLocation STRUCTURE_TRANSFORMED = SurvivingTheAftermath.asResource("nether_invasion_portal_transformed"); - - public NetherRaidStructure(StructureSettings settings) { - super(settings); - } - - @Override - public StructureType type() { - return ModStructureTypes.NETHER_RAID.get(); - } - - @Override - public StructurePieceType pieceType() { - return ModStructurePieceTypes.NETHER_RAID.get(); - } - - @Override - public ResourceLocation location() { - return SurvivingTheAftermath.asResource("nether_invasion_portal"); - } - - public static class Piece extends AbstractStructure.Piece { - - public Piece(StructurePieceSerializationContext context, CompoundTag tag) { - super(ModStructurePieceTypes.NETHER_RAID.get(), context.structureTemplateManager(), tag); - } - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/BrickWellStructure.java b/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/BrickWellStructure.java deleted file mode 100644 index 05b582c..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/BrickWellStructure.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.structure.expansion; - - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.init.ModStructurePieceTypes; -import com.pancake.surviving_the_aftermath.common.init.ModStructureTypes; -import com.pancake.surviving_the_aftermath.common.structure.AbstractStructure; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.levelgen.structure.StructureType; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - -public class BrickWellStructure extends AbstractStructure { - - public BrickWellStructure(StructureSettings settings) { - super(settings); - } - - @Override - public StructureType type() { - return ModStructureTypes.BRICK_WELL.get(); - } - - @Override - public StructurePieceType pieceType() { - return ModStructurePieceTypes.BRICK_WELL.get(); - } - - @Override - public ResourceLocation location() { - return SurvivingTheAftermath.asResource("brick_well"); - } - - public static class Piece extends AbstractStructure.Piece { - - public Piece(StructurePieceSerializationContext context, CompoundTag tag) { - super(ModStructurePieceTypes.BRICK_WELL.get(), context, tag); - } - - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/CampStructure.java b/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/CampStructure.java deleted file mode 100644 index 8936561..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/CampStructure.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.structure.expansion; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.init.ModStructurePieceTypes; -import com.pancake.surviving_the_aftermath.common.init.ModStructureTypes; -import com.pancake.surviving_the_aftermath.common.structure.AbstractStructure; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.levelgen.structure.StructureType; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - -public class CampStructure extends AbstractStructure { - - public CampStructure(StructureSettings settings) { - super(settings); - } - - @Override - public StructureType type() { - return ModStructureTypes.CAMP.get(); - } - - @Override - public StructurePieceType pieceType() { - return ModStructurePieceTypes.CAMP.get(); - } - - @Override - public ResourceLocation location() { - return SurvivingTheAftermath.asResource("camp"); - } - - public static class Piece extends AbstractStructure.Piece { - - public Piece(StructurePieceSerializationContext context, CompoundTag tag) { - super(ModStructurePieceTypes.CAMP.get(), context, tag); - } - - } - - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/CobblestonePileStructure.java b/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/CobblestonePileStructure.java deleted file mode 100644 index d6d6546..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/CobblestonePileStructure.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.structure.expansion; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.init.ModStructurePieceTypes; -import com.pancake.surviving_the_aftermath.common.init.ModStructureTypes; -import com.pancake.surviving_the_aftermath.common.structure.AbstractStructure; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.levelgen.structure.StructureType; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - -public class CobblestonePileStructure extends AbstractStructure { - - public CobblestonePileStructure(StructureSettings settings) { - super(settings); - } - - @Override - public StructureType type() { - return ModStructureTypes.COBBLESTONE_PILE.get(); - } - - @Override - public StructurePieceType pieceType() { - return ModStructurePieceTypes.COBBLESTONE_PILE.get(); - } - - @Override - public ResourceLocation location() { - return SurvivingTheAftermath.asResource("cobblestone_pile"); - } - - public static class Piece extends AbstractStructure.Piece { - - public Piece(StructurePieceSerializationContext context, CompoundTag tag) { - super(ModStructurePieceTypes.COBBLESTONE_PILE.get(), context, tag); - } - - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/ConstructionStructure.java b/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/ConstructionStructure.java deleted file mode 100644 index 4f03914..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/ConstructionStructure.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.structure.expansion; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.init.ModStructurePieceTypes; -import com.pancake.surviving_the_aftermath.common.init.ModStructureTypes; -import com.pancake.surviving_the_aftermath.common.structure.AbstractStructure; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.levelgen.structure.StructureType; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - -public class ConstructionStructure extends AbstractStructure { - - private final int index; - - public ConstructionStructure(StructureSettings settings, int index) { - super(settings); - this.index = index; - } - - @Override - public StructureType type() { - return this.index == 1 ? ModStructureTypes.CONSTRUCTION_1.get() : ModStructureTypes.CONSTRUCTION_2.get(); - } - - @Override - public StructurePieceType pieceType() { - return this.index == 1 ? ModStructurePieceTypes.CONSTRUCTION_1.get() : ModStructurePieceTypes.CONSTRUCTION_2.get(); - } - - @Override - public ResourceLocation location() { - return SurvivingTheAftermath.asResource("construction" + this.index); - } - - public static class Piece extends AbstractStructure.Piece { - - public Piece(StructurePieceSerializationContext context, CompoundTag tag, int index) { - super(index == 1 ? ModStructurePieceTypes.CONSTRUCTION_1.get() : ModStructurePieceTypes.CONSTRUCTION_2.get(), context, tag); - } - - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/LogsStructure.java b/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/LogsStructure.java deleted file mode 100644 index 4a0964a..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/LogsStructure.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.structure.expansion; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.init.ModStructurePieceTypes; -import com.pancake.surviving_the_aftermath.common.init.ModStructureTypes; -import com.pancake.surviving_the_aftermath.common.structure.AbstractStructure; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.levelgen.structure.StructureType; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - -public class LogsStructure extends AbstractStructure { - - public LogsStructure(StructureSettings settings) { - super(settings); - } - - @Override - public StructureType type() { - return ModStructureTypes.LOGS.get(); - } - - @Override - public StructurePieceType pieceType() { - return ModStructurePieceTypes.LOGS.get(); - } - - @Override - public ResourceLocation location() { - return SurvivingTheAftermath.asResource("logs"); - } - - public static class Piece extends AbstractStructure.Piece { - - public Piece(StructurePieceSerializationContext context, CompoundTag tag) { - super(ModStructurePieceTypes.LOGS.get(), context, tag); - } - - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/TentStructure.java b/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/TentStructure.java deleted file mode 100644 index 030acce..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/TentStructure.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.structure.expansion; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.init.ModStructurePieceTypes; -import com.pancake.surviving_the_aftermath.common.init.ModStructureTypes; -import com.pancake.surviving_the_aftermath.common.structure.AbstractStructure; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.levelgen.structure.StructureType; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - -public class TentStructure extends AbstractStructure { - - public TentStructure(StructureSettings settings) { - super(settings); - } - - @Override - public StructureType type() { - return ModStructureTypes.TENT.get(); - } - - @Override - public StructurePieceType pieceType() { - return ModStructurePieceTypes.TENT.get(); - } - - @Override - public ResourceLocation location() { - return SurvivingTheAftermath.asResource("tent"); - } - - public static class Piece extends AbstractStructure.Piece { - - public Piece(StructurePieceSerializationContext context, CompoundTag tag) { - super(ModStructurePieceTypes.TENT.get(), context, tag); - } - - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/WagonCargoStructure.java b/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/WagonCargoStructure.java deleted file mode 100644 index 45ab173..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/WagonCargoStructure.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.structure.expansion; - -import com.pancake.surviving_the_aftermath.SurvivingTheAftermath; -import com.pancake.surviving_the_aftermath.common.init.ModStructurePieceTypes; -import com.pancake.surviving_the_aftermath.common.init.ModStructureTypes; -import com.pancake.surviving_the_aftermath.common.structure.AbstractStructure; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.levelgen.structure.StructureType; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; - -import java.util.function.Supplier; - -@SuppressWarnings("unchecked") -public class WagonCargoStructure extends AbstractStructure { - - private final int index; - - private static final Supplier>[] STRUCTURE_TYPES = new Supplier[] {null, - ModStructureTypes.WAGON_CARGO_1, ModStructureTypes.WAGON_CARGO_2, ModStructureTypes.WAGON_CARGO_3, - ModStructureTypes.WAGON_CARGO_4, ModStructureTypes.WAGON_CARGO_5, ModStructureTypes.WAGON_CARGO_6}; - - private static final Supplier[] STRUCTURE_PIECE_TYPES = new Supplier[] {null, - ModStructurePieceTypes.WAGON_CARGO_1, ModStructurePieceTypes.WAGON_CARGO_2, - ModStructurePieceTypes.WAGON_CARGO_3, ModStructurePieceTypes.WAGON_CARGO_4, - ModStructurePieceTypes.WAGON_CARGO_5, ModStructurePieceTypes.WAGON_CARGO_6}; - - public WagonCargoStructure(StructureSettings settings, int index) { - super(settings); - this.index = index; - } - - @Override - public StructureType type() { - return STRUCTURE_TYPES[this.index].get(); - } - - @Override - public StructurePieceType pieceType() { - return STRUCTURE_PIECE_TYPES[this.index].get(); - } - - @Override - public ResourceLocation location() { - return SurvivingTheAftermath.asResource("wagon_cargo" + this.index); - } - - public static class Piece extends AbstractStructure.Piece { - - public Piece(StructurePieceSerializationContext context, CompoundTag tag, int index) { - super(WagonCargoStructure.STRUCTURE_PIECE_TYPES[index].get(), context, tag); - } - - } - -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/package-info.java b/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/package-info.java deleted file mode 100644 index 0cf39f9..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/expansion/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -@FieldsAreNonnullByDefault -package com.pancake.surviving_the_aftermath.common.structure.expansion; - -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/package-info.java b/src/main/java/com/pancake/surviving_the_aftermath/common/structure/package-info.java deleted file mode 100644 index 2e177de..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/structure/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -@FieldsAreNonnullByDefault -package com.pancake.surviving_the_aftermath.common.structure; - -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/tracker/MobBattleTracker.java b/src/main/java/com/pancake/surviving_the_aftermath/common/tracker/MobBattleTracker.java deleted file mode 100644 index 356b15e..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/tracker/MobBattleTracker.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.tracker; - - -import com.pancake.surviving_the_aftermath.api.base.BaseTracker; -import com.pancake.surviving_the_aftermath.common.config.AftermathConfig; -import net.minecraft.world.entity.LivingEntity; -import net.minecraftforge.event.entity.living.LivingEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; - -import java.util.Set; -import java.util.UUID; - - -public class MobBattleTracker extends BaseTracker { - public static final String IDENTIFIER = "mob_battle_tracker"; - @Override - public String getUniqueIdentifier() { - return IDENTIFIER; - } - - @SubscribeEvent - public void onLivingAddHighlight(LivingEvent.LivingTickEvent event) { - if(!AftermathConfig.enableMobBattleTrackerHighlight.get()) return; - - LivingEntity entity = event.getEntity(); - if (entity.level().isClientSide()) return; - - manager.getAftermath(uuid).ifPresent(aftermath -> { - Set enemies = aftermath.getEnemies(); - if (enemies.contains(entity.getUUID())) { - entity.setGlowingTag(true); - } - }); - } - -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/tracker/RaidMobBattleTracker.java b/src/main/java/com/pancake/surviving_the_aftermath/common/tracker/RaidMobBattleTracker.java deleted file mode 100644 index 5ecb1b0..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/tracker/RaidMobBattleTracker.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.tracker; - - -import com.pancake.surviving_the_aftermath.common.config.AftermathConfig; -import com.pancake.surviving_the_aftermath.common.raid.api.BaseRaid; -import net.minecraft.core.BlockPos; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.level.Level; -import net.minecraftforge.event.entity.living.LivingEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; - -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; - -public class RaidMobBattleTracker extends MobBattleTracker{ - public static final String IDENTIFIER = "raid_mob_battle_tracker"; - - @Override - public String getUniqueIdentifier() { - return IDENTIFIER; - } - - @SubscribeEvent - public void onLivingRestrictedRange(LivingEvent.LivingTickEvent event) { - if(!AftermathConfig.enableMobBattleTrackerRestrictedRange.get()) return; - - manager.getAftermath(uuid).ifPresent(aftermath -> { - if (aftermath instanceof BaseRaid raid){ - LivingEntity entity = event.getEntity(); - Level level = entity.level(); - if (level.isClientSide) return; - Set enemies = raid.getEnemies(); - if (enemies.contains(entity.getUUID())) { - BlockPos centerPos = raid.getCenterPos(); - BlockPos pos = entity.blockPosition(); - double distance = Math.sqrt(centerPos.distSqr(pos)); - if (distance > 50) { - double value = level.random.nextInt(30); - BlockPos blockPos = new BlockPos((int) (centerPos.getX() + value), centerPos.getY() + level.random.nextInt(10,20), (int) (centerPos.getZ() + value)); - entity.addTag("restricted_range:" + blockPos.toShortString()); - } - } - } - }); - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/tracker/RaidPlayerBattleTracker.java b/src/main/java/com/pancake/surviving_the_aftermath/common/tracker/RaidPlayerBattleTracker.java deleted file mode 100644 index 6691d54..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/tracker/RaidPlayerBattleTracker.java +++ /dev/null @@ -1,253 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.tracker; - - -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import com.pancake.surviving_the_aftermath.api.Constant; -import com.pancake.surviving_the_aftermath.api.IAftermath; -import com.pancake.surviving_the_aftermath.api.base.BaseTracker; -import com.pancake.surviving_the_aftermath.api.base.BaseAftermath; -import com.pancake.surviving_the_aftermath.api.base.BaseAftermathModule; -import com.pancake.surviving_the_aftermath.common.event.AftermathEvent; -import com.pancake.surviving_the_aftermath.common.init.ModMobEffects; -import com.pancake.surviving_the_aftermath.common.raid.api.BaseRaid; -import com.pancake.surviving_the_aftermath.common.util.AftermathEventUtil; -import com.pancake.surviving_the_aftermath.common.util.RandomUtils; -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.nbt.Tag; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.effect.MobEffectInstance; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.GameType; -import net.minecraft.world.level.Level; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; - -import java.util.*; -import java.util.stream.Collectors; - -public class RaidPlayerBattleTracker extends BaseTracker { - public static final String IDENTIFIER = "player_battle_tracker"; - public static final String PLAYER_BATTLE_PERSONAL_FAIL = "message.surviving_the_aftermath.tracker.personal_fail"; - public static final String PLAYER_BATTLE_ESCAPE = "message.surviving_the_aftermath.tracker.escape"; - private static final int MAX_DEATH_COUNT = 3; - private final Set players = Sets.newHashSet(); - private final Map deathMap = Maps.newHashMap(); - private final Map escapeMap = Maps.newHashMap(); - private final Map> spectatorMap = Maps.newHashMap(); - @Override - public String getUniqueIdentifier() { - return IDENTIFIER; - } - - @SubscribeEvent - public void updatePlayer(AftermathEvent.Ongoing event) { - Level level = event.getLevel(); - Set uuids = Sets.newHashSet(); - Set eventPlayers = event.getPlayers(); - for (UUID uuid : players) { - if (!eventPlayers.contains(uuid)) { - uuids.add(uuid); - } - } - for (UUID uuid : uuids) { - players.remove(uuid); - Player player = level.getPlayerByUUID(uuid); - if (player != null) { - escapeMap.put(uuid, level.getGameTime()); - } else { - deathMap.put(uuid, deathMap.getOrDefault(uuid, 0) + 1); - } - } - - for (UUID uuid : eventPlayers) { - if (!players.contains(uuid)) { - Player player = level.getPlayerByUUID(uuid); - if (player instanceof ServerPlayer serverPlayer && serverPlayer.gameMode.getGameModeForPlayer() != GameType.SPECTATOR) { - escapeMap.remove(uuid); - players.add(uuid); - } - } - } - } - - @SubscribeEvent - public void onPlayerRespawn(PlayerEvent.PlayerRespawnEvent event) { - Player player = event.getEntity(); - Level level = player.level(); - if (!level.isClientSide && player instanceof ServerPlayer serverPlayer) { - if (deathMap.containsKey(serverPlayer.getUUID())) { - Integer deathCount = deathMap.get(serverPlayer.getUUID()); - - if (!players.isEmpty()) { - player.displayClientMessage(Component.translatable(PLAYER_BATTLE_PERSONAL_FAIL), true); - setSpectator(serverPlayer, level); - deathMap.remove(serverPlayer.getUUID()); - return; - } - - if (deathCount >= MAX_DEATH_COUNT || spectatorMap.containsKey(serverPlayer.getUUID())) { - restorePlayerGameMode(level); - manager.getAftermath(uuid).ifPresent(IAftermath::lose); - } - } - } - } - - - - - @SubscribeEvent - public void onPlayerEscape(TickEvent.PlayerTickEvent event) { - Player player = event.player; - Level level = player.level(); - UUID uuidPlayer = player.getUUID(); - - if (!level.isClientSide && escapeMap.containsKey(uuidPlayer)) { - Long lastEscapeTime = escapeMap.get(uuidPlayer); - long time = level.getGameTime() - lastEscapeTime; - - manager.getAftermath(uuid).ifPresent(aftermath -> { - if (aftermath instanceof BaseRaid raid){ - - BlockPos centerPos = raid.getCenterPos(); - BlockPos pos = player.blockPosition(); - double distance = Math.sqrt(centerPos.distSqr(pos)); - - - if (lastEscapeTime != 0L && time > 20 * 5) { - player.addEffect(new MobEffectInstance(ModMobEffects.COWARDICE.get(), 45 * 60 * 20)); - if (distance > 120) { - player.addEffect(new MobEffectInstance(ModMobEffects.COWARDICE.get(), 45 * 60 * 20, 1)); - escapeMap.remove(uuid); - AftermathEventUtil.lose((BaseAftermath) aftermath,players, (ServerLevel) level); - restorePlayerGameMode(level); - } - } else { - player.displayClientMessage(Component.translatable(PLAYER_BATTLE_ESCAPE, 20 * 5 - time), true); - } - } - }); - } - } - - public void restorePlayerGameMode(Level level) { - spectatorMap.values().stream() - .flatMap(Collection::stream) - .map(level::getPlayerByUUID) - .filter(player -> player instanceof ServerPlayer) - .map(player -> (ServerPlayer) player) - .forEach(player -> player.setGameMode(GameType.SURVIVAL)); - } - - private void setSpectator(ServerPlayer player, Level level) { - Player target = level.getPlayerByUUID(RandomUtils.getRandomElement(players)); - if (!(target instanceof ServerPlayer serverTarget)) return; - - if (spectatorMap.containsKey(player.getUUID())) { - Set uuids = spectatorMap.get(player.getUUID()); - if (uuids != null) { - uuids.add(player.getUUID()); - for (UUID uuid1 : uuids) { - if (level.getPlayerByUUID(uuid1) instanceof ServerPlayer serverPlayer) { - if (!spectatorMap.containsKey(serverTarget.getUUID())) { - spectatorMap.put(serverTarget.getUUID(), Sets.newHashSet()); - } - spectatorMap.get(serverTarget.getUUID()).add(serverPlayer.getUUID()); - serverPlayer.setCamera(serverTarget); - } - } - spectatorMap.remove(player.getUUID()); - } - - } else { - spectatorMap.put(serverTarget.getUUID(), Sets.newHashSet()); - spectatorMap.get(serverTarget.getUUID()).add(player.getUUID()); - player.setCamera(serverTarget); - } - player.setGameMode(GameType.SPECTATOR); - } - - @Override - public CompoundTag serializeNBT() { - CompoundTag compoundTag = super.serializeNBT(); - compoundTag.putString(Constant.IDENTIFIER, getUniqueIdentifier()); - - ListTag playerTags = new ListTag(); - players.forEach(uuid -> playerTags.add(NbtUtils.createUUID(uuid))); - compoundTag.put(Constant.PLAYERS, playerTags); - - - ListTag deathTag = new ListTag(); - deathMap.forEach((uuid, deathCount) -> { - CompoundTag tag = new CompoundTag(); - tag.putUUID(Constant.UUID, uuid); - tag.putInt(Constant.DEATH_COUNT, deathCount); - deathTag.add(tag); - }); - compoundTag.put(Constant.DEATH_MAP, deathTag); - - - ListTag escapeTag = new ListTag(); - escapeMap.forEach((uuid, escapeTime) -> { - CompoundTag tag = new CompoundTag(); - tag.putUUID(Constant.UUID, uuid); - tag.putLong(Constant.ESCAPE_TIME, escapeTime); - escapeTag.add(tag); - }); - compoundTag.put(Constant.ESCAPE_MAP, escapeTag); - - - ListTag spectatorTag = new ListTag(); - spectatorMap.forEach((uuid, spectatorUUIDs) -> { - CompoundTag tag = new CompoundTag(); - ListTag spectatorUUIDsTag = new ListTag(); - spectatorUUIDs.forEach(spectatorUUID -> spectatorUUIDsTag.add(NbtUtils.createUUID(spectatorUUID))); - tag.put(Constant.UUID, NbtUtils.createUUID(uuid)); - tag.put(Constant.SPECTATOR_LIST, spectatorUUIDsTag); - spectatorTag.add(tag); - }); - compoundTag.put(Constant.SPECTATOR_MAP, spectatorTag); - - return compoundTag; - } - - @Override - public void deserializeNBT(CompoundTag nbt) { - super.deserializeNBT(nbt); - ListTag playerTags = nbt.getList(Constant.PLAYERS, Tag.TAG_INT_ARRAY); - playerTags.forEach(tag -> players.add(NbtUtils.loadUUID(tag))); - - ListTag deathTag = nbt.getList(Constant.DEATH_MAP,Tag.TAG_COMPOUND); - deathTag.forEach(tag -> { - CompoundTag compoundTag = (CompoundTag) tag; - UUID uuid = compoundTag.getUUID(Constant.UUID); - int deathCount = compoundTag.getInt(Constant.DEATH_COUNT); - deathMap.put(uuid, deathCount); - }); - - ListTag escapeTag = nbt.getList(Constant.ESCAPE_MAP,Tag.TAG_COMPOUND); - escapeTag.forEach(tag -> { - CompoundTag compoundTag = (CompoundTag) tag; - UUID uuid = compoundTag.getUUID(Constant.UUID); - long escapeTime = compoundTag.getLong(Constant.ESCAPE_TIME); - escapeMap.put(uuid, escapeTime); - }); - - - ListTag spectatorTag = nbt.getList(Constant.SPECTATOR_MAP,Tag.TAG_COMPOUND); - spectatorTag.forEach(tag -> { - CompoundTag compoundTag = (CompoundTag) tag; - UUID uuid = compoundTag.getUUID(Constant.UUID); - ListTag spectatorUUIDsTag = compoundTag.getList(Constant.SPECTATOR_LIST, Tag.TAG_INT_ARRAY); - Set spectatorUUIDs = spectatorUUIDsTag.stream().map(NbtUtils::loadUUID).collect(Collectors.toSet()); - spectatorMap.put(uuid, spectatorUUIDs); - }); - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/util/AftermathEventUtil.java b/src/main/java/com/pancake/surviving_the_aftermath/common/util/AftermathEventUtil.java deleted file mode 100644 index c838ec6..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/util/AftermathEventUtil.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.util; - -import com.pancake.surviving_the_aftermath.api.AftermathState; -import com.pancake.surviving_the_aftermath.api.base.BaseAftermath; -import com.pancake.surviving_the_aftermath.api.module.IAftermathModule; -import com.pancake.surviving_the_aftermath.common.event.AftermathEvent; -import com.pancake.surviving_the_aftermath.compat.kubejs.util.AftermathEventJSUtil; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.util.random.SimpleWeightedRandomList; -import net.minecraft.world.item.Item; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.ModList; - -import java.util.List; -import java.util.Set; -import java.util.UUID; - -public class AftermathEventUtil { - public static boolean start(BaseAftermath aftermath, Set players, ServerLevel level) { - aftermath.setState(AftermathState.START); - boolean postForge = !MinecraftForge.EVENT_BUS.post(new AftermathEvent.Start(aftermath, players, level)); - if (isKubejs()) { - boolean postJS = AftermathEventJSUtil.start(aftermath, players, level); - return postForge && postJS; - } - return postForge; - } - public static boolean ready(BaseAftermath aftermath, Set players, ServerLevel level) { - aftermath.setState(AftermathState.READY); - boolean postForge = !MinecraftForge.EVENT_BUS.post(new AftermathEvent.Ready(aftermath, players, level)); - if (isKubejs()){ - boolean postJS = AftermathEventJSUtil.ready(aftermath, players, level); - return postForge && postJS; - } - return postForge; - } - public static boolean ongoing(BaseAftermath aftermath, Set players, ServerLevel level) { - aftermath.setState(AftermathState.ONGOING); - boolean postForge = !MinecraftForge.EVENT_BUS.post(new AftermathEvent.Ongoing(aftermath, players, level)); - if (isKubejs()){ - boolean postJS = AftermathEventJSUtil.ongoing(aftermath, players, level); - return postForge && postJS; - } - return postForge; - } - public static boolean victory(BaseAftermath aftermath, Set players, ServerLevel level) { - aftermath.setState(AftermathState.VICTORY); - boolean postForge = !MinecraftForge.EVENT_BUS.post(new AftermathEvent.Victory(aftermath, players, level)); - if (isKubejs()){ - boolean postJS = AftermathEventJSUtil.victory(aftermath, players, level); - return postForge && postJS; - } - return postForge; - } - public static boolean celebrating(BaseAftermath aftermath, Set players, ServerLevel level) { - aftermath.setState(AftermathState.CELEBRATING); - boolean postForge = !MinecraftForge.EVENT_BUS.post(new AftermathEvent.Celebrating(aftermath, players, level)); - if (isKubejs()){ - boolean postJS = AftermathEventJSUtil.celebrating(aftermath, players, level); - return postForge && postJS; - } - return postForge; - } - public static boolean lose(BaseAftermath aftermath, Set players, ServerLevel level) { - aftermath.setState(AftermathState.LOSE); - boolean postForge = !MinecraftForge.EVENT_BUS.post(new AftermathEvent.Lose(aftermath, players, level)); - if (isKubejs()){ - boolean postJS = AftermathEventJSUtil.lose(aftermath, players, level); - return postForge && postJS; - } - return postForge; - } - public static boolean end(BaseAftermath aftermath, Set players, ServerLevel level) { - aftermath.setState(AftermathState.END); - boolean postForge = !MinecraftForge.EVENT_BUS.post(new AftermathEvent.End(aftermath, players, level)); - if (isKubejs()){ - boolean postJS = AftermathEventJSUtil.end(aftermath, players, level); - return postForge && postJS; - } - return postForge; - } - - public static boolean modify(String identifier, List aftermathModules) { - if (isKubejs()){ - return AftermathEventJSUtil.modify(identifier, aftermathModules); - } - return true; - } - - private static boolean isKubejs() { - return ModList.get().isLoaded("kubejs"); - } - -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/util/RandomUtils.java b/src/main/java/com/pancake/surviving_the_aftermath/common/util/RandomUtils.java deleted file mode 100644 index 46902a2..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/util/RandomUtils.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.util; - -import java.util.Collection; -import java.util.List; -import java.util.Random; -import java.util.Set; - -public class RandomUtils { - private static final Random RANDOM = new Random(); - public static T getRandomElement(Collection collection) { - int size = collection.size(); - if (size == 0) { - throw new IllegalArgumentException("Collection cannot be empty."); - } - int randomIndex = RANDOM.nextInt(size); - if (collection instanceof List) { - return ((List) collection).get(randomIndex); - } else { - int i = 0; - for (T item : collection) { - if (i == randomIndex) { - return item; - } - i++; - } - throw new IllegalStateException("Unexpected condition: randomIndex matched no element."); - } - } - - public static boolean randomChanceOf(double percent) { - return RANDOM.nextDouble() <= percent; - } - - -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/util/RegistryUtil.java b/src/main/java/com/pancake/surviving_the_aftermath/common/util/RegistryUtil.java deleted file mode 100644 index 92bf2a5..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/util/RegistryUtil.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.util; - -import com.mojang.logging.LogUtils; -import com.pancake.surviving_the_aftermath.common.init.ModBlocks; -import com.pancake.surviving_the_aftermath.common.init.ModItems; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.Block; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; -import org.slf4j.Logger; - -public class RegistryUtil { - public static final Logger LOGGER = LogUtils.getLogger(); - public static EntityType getEntityTypeFromRegistryName(String registryName) { - EntityType entityType = ForgeRegistries.ENTITY_TYPES.getValue(ResourceLocation.tryParse(registryName)); - if (entityType == null) { - LOGGER.error("Entity with registry name {} does not exist!", registryName); - } - return entityType; - } - public static ResourceLocation getRegistryNameFromEntityType(EntityType entityType) { - return ForgeRegistries.ENTITY_TYPES.getKey(entityType); - } - - - public static Block getBlockFromRegistryName(String registryName) { - Block block = ForgeRegistries.BLOCKS.getValue(ResourceLocation.tryParse(registryName)); - if (block == null) { - LOGGER.error("Block with registry name {} does not exist!", registryName); - } - return block; - } - - public static ResourceLocation getRegistryNameFromBlock(Block block) { - return ForgeRegistries.BLOCKS.getKey(block); - } - - public static Item getItemFromRegistryName(String registryName) { - Item item = ForgeRegistries.ITEMS.getValue(ResourceLocation.tryParse(registryName)); - if (item == null) { - LOGGER.error("Item with registry name {} does not exist!", registryName); - } - return item; - } - - public static ResourceLocation getRegistryNameFromItem(Item item) { - return ForgeRegistries.ITEMS.getKey(item); - } - - - public static Iterable getKnownBlocks() { - return ModBlocks.BLOCKS.getEntries().stream().map(RegistryObject::get)::iterator; - } - - public static Iterable getKnownItems() { - return ModItems.ITEMS.getEntries().stream().map(RegistryObject::get)::iterator; - } - -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/util/SpawnEntityUtil.java b/src/main/java/com/pancake/surviving_the_aftermath/common/util/SpawnEntityUtil.java deleted file mode 100644 index a9a24a6..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/util/SpawnEntityUtil.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.util; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.util.Mth; -import net.minecraft.util.SpawnUtil; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.level.block.state.BlockState; - -import java.util.Optional; - -public class SpawnEntityUtil { - public static Optional trySpawnMob(EntityType entityType, ServerLevel serverLevel, BlockPos pos, int attemptCount, int offsetRadius, int p_216410_, SpawnUtil.Strategy strategy) { - BlockPos.MutableBlockPos blockpos$mutableblockpos = pos.mutable(); - - for(int i = 0; i < attemptCount; ++i) { - int j = Mth.randomBetweenInclusive(serverLevel.random, -offsetRadius, offsetRadius); - int k = Mth.randomBetweenInclusive(serverLevel.random, -offsetRadius, offsetRadius); - blockpos$mutableblockpos.setWithOffset(pos, j, p_216410_, k); - if (serverLevel.getWorldBorder().isWithinBounds(blockpos$mutableblockpos) && moveToPossibleSpawnPosition(serverLevel, p_216410_, blockpos$mutableblockpos, strategy)) { - Entity entity = entityType.create(serverLevel); - if (entity != null) { - entity.moveTo(blockpos$mutableblockpos.getX(), blockpos$mutableblockpos.getY(), blockpos$mutableblockpos.getZ(), serverLevel.random.nextFloat() * 360.0F, 0.0F); - serverLevel.addFreshEntityWithPassengers(entity); - return Optional.of(entity); - } - } - } - - return Optional.empty(); - } - - public static boolean moveToPossibleSpawnPosition(ServerLevel p_216399_, int p_216400_, BlockPos.MutableBlockPos p_216401_, SpawnUtil.Strategy p_216402_) { - BlockPos.MutableBlockPos blockpos$mutableblockpos = (new BlockPos.MutableBlockPos()).set(p_216401_); - BlockState blockstate = p_216399_.getBlockState(blockpos$mutableblockpos); - - for(int i = p_216400_; i >= -p_216400_; --i) { - p_216401_.move(Direction.DOWN); - blockpos$mutableblockpos.setWithOffset(p_216401_, Direction.UP); - BlockState blockstate1 = p_216399_.getBlockState(p_216401_); - if (p_216402_.canSpawnOn(p_216399_, p_216401_, blockstate1, blockpos$mutableblockpos, blockstate)) { - p_216401_.move(Direction.UP); - return true; - } - - blockstate = blockstate1; - } - - return false; - } -} \ No newline at end of file diff --git a/src/main/java/com/pancake/surviving_the_aftermath/common/util/StructureUtil.java b/src/main/java/com/pancake/surviving_the_aftermath/common/util/StructureUtil.java deleted file mode 100644 index 32da76e..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/common/util/StructureUtil.java +++ /dev/null @@ -1,185 +0,0 @@ -package com.pancake.surviving_the_aftermath.common.util; - -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import net.minecraft.core.BlockPos; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - - -public class StructureUtil { -// public static int[] getSize(StructureTemplate structureTemplate) { -// return new int[]{structureTemplate.getSize().getX(), structureTemplate.getSize().getY(), structureTemplate.getSize().getZ()}; -// } -// public static StructureModule getStructureModule(StructureTemplate structureTemplate) { -// CompoundTag template = structureTemplate.save(new CompoundTag()); -// ListTag blocks = template.getList("blocks", 10); -// List structureBlockInfo = Lists.newArrayList(); -// Map structurePalette = getStructurePalette(structureTemplate); -// blocks.stream() -// .map(tag -> (CompoundTag)tag) -// .forEach(block -> { -// ListTag listtag = block.getList("pos", 3); -// int x = listtag.getInt(0); -// int y = listtag.getInt(1); -// int z = listtag.getInt(2); -// -// int state = block.getInt("state"); -// -// CompoundTag nbt = null; -// if (block.contains("nbt")) { -// nbt = block.getCompound("nbt"); -// } -// structureBlockInfo.add(new StructureTemplate.StructureBlockInfo(new BlockPos(x, y, z), structurePalette.get(state), nbt)); -// }); -// StructureModule structureModule = new StructureModule(structureBlockInfo, structurePalette, null); -// System.out.println(structureModule.blocks.size()); -// return structureModule; -// } -// -// public static Map getStructurePalette(StructureTemplate structureTemplate) { -// CompoundTag template = structureTemplate.save(new CompoundTag()); -// HashMap map = Maps.newHashMap(); -// ListTag palettesTag = template.getList("palette", 10); -// for (int i = 0; i < palettesTag.size(); i++) { -// CompoundTag palette = palettesTag.getCompound(i); -// BlockState blockState = NbtUtils.readBlockState(BuiltInRegistries.BLOCK.asLookup(), palette); -// map.put(i, blockState); -// } -// return map; -// } -// public static boolean randomCoordinatesCompareStructure(Level level, BlockPos currentPos,StructureModule structureModule) { -// BlockState currentState = level.getBlockState(currentPos); -// if (currentState.getBlock() == Blocks.AIR) { -// return false; -// } -// if (structureModule.palette.values().stream().anyMatch(state -> state.equals(currentState))) { -// for (StructureTemplate.StructureBlockInfo info : structureModule.blocks) { -// if (info.state().equals(currentState)) { -// //获取可能的原点信息 -// BlockPos originPos = currentPos.offset(-info.pos().getX(), -info.pos().getY(), -info.pos().getZ()); -// //对比结构 -// if (compareStructure(level, originPos, structureModule)) { -// System.out.println("对比成功"); -// return true; -// }else { -// System.out.println("对比失败"); -// } -// -// } -// } -// } -// return false; -// } -// public static boolean compareStructure(Level level, BlockPos originPos, StructureModule structureModule) { -// for (StructureTemplate.StructureBlockInfo info : structureModule.blocks) { -// BlockPos currentPos = originPos.offset(info.pos().getX(), info.pos().getY(), info.pos().getZ()); -// BlockState currentState = level.getBlockState(currentPos); -// -//// if (info.state().isAir()) continue; -// if (!info.state().equals(currentState)) { -// System.out.println("currentState:" + currentState); -// System.out.println("info.state():" + info.state()); -// return false; -// } -// } -// return true; -// } - //记录类 StructureModule -// public record StructureModule(List blocks,Map palette,List entities) { -// public StructureModule clearAir() { -// List blocks = Lists.newArrayList(); -// this.blocks.forEach(block -> { -// if (!block.state().isAir()) { -// blocks.add(block); -// } -// }); -// Map palette = Maps.newHashMap(); -// this.palette.forEach((key, value) -> { -// if (!value.isAir()) { -// palette.put(key, value); -// } -// }); -// return new StructureModule(blocks, palette, this.entities); -// } -// } - //清除StructureModule里面的AIR - -// public static StructureModule createStructureModule(StructureTemplate structureTemplate) { -// CompoundTag compoundTag = structureTemplate.save(new CompoundTag()); -// int[] moduleSize = new int[3]; -// ListTag size = compoundTag.getList("size", 3); -// for (int i = 0; i < size.size(); i++) { -// moduleSize[i] = size.getInt(i); -// } -// -// Map palettes = Maps.newHashMap(); -// compoundTag.getList("palette", 10).forEach(palette -> { -// BlockState blockState = NbtUtils.readBlockState(BuiltInRegistries.BLOCK.asLookup(), (CompoundTag) palette); -// palettes.put(compoundTag.getList("palette", 10).indexOf(palette), blockState); -// }); -// -// -// List blockInfos = Lists.newArrayList(); -// ListTag blocks = compoundTag.getList("blocks", 10); -// for (int i = 0; i < blocks.size(); i++) { -// CompoundTag block = blocks.getCompound(i); -// int[] pos = new int[3]; -// ListTag posTag = block.getList("pos", 3); -// int x = posTag.getInt(0); -// int y = posTag.getInt(1); -// int z = posTag.getInt(2); -// BlockPos blockPos = new BlockPos(x, y, z); -// -// -// Tag state = block.get("state"); -// -// BlockState blockState = palettes.get(((IntTag) state).getAsInt()); -// -// CompoundTag nbtTag = null; -// if (block.contains("nbt")) { -// nbtTag = block.getCompound("nbt"); -// } -// -// blockInfos.add(new StructureTemplate.StructureBlockInfo(blockPos, blockState, nbtTag)); -// } - -// List entityInfos = Lists.newArrayList(); -// ListTag entities = compoundTag.getList("entities", 10); -// for (int i = 0; i < entities.size(); i++) { -// CompoundTag entity = entities.getCompound(i); -// CompoundTag nbt = (CompoundTag)entity.get("nbt"); -// double[] poseArray = new double[3]; -// int[] blockPosArray = new int[3]; -// -// -// ListTag pos = (ListTag)entity.get("pos"); -// assert pos != null; -// pos.forEach(pose -> { -// poseArray[pos.indexOf(pose)] = ((DoubleTag)pose).getAsDouble(); -// }); -// -// -// ListTag blockPos = (ListTag) entity.get("blockPos"); -// assert blockPos != null; -// blockPos.forEach(blockPose -> { -// blockPosArray[blockPos.indexOf(blockPose)] = ((IntTag)blockPose).getAsInt(); -// }); -// -// assert nbt != null; -// EntityType entityType = EntityType.byString(nbt.getString("id")).isPresent() ? EntityType.byString(nbt.getString("id")).get() : null; -// entityInfos.add(new StructureTemplate.StructureEntityInfo(entityType, nbt, poseArray, blockPosArray)); -// } -// return new StructureModule(blockInfos,palettes, null); -// } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/ModExtra.java b/src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/ModExtra.java deleted file mode 100644 index 6ee9249..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/ModExtra.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.pancake.surviving_the_aftermath.compat.kubejs; - -import com.pancake.surviving_the_aftermath.api.aftermath.AftermathAPI; -import com.pancake.surviving_the_aftermath.api.module.IAftermathModule; -import dev.latvian.mods.kubejs.event.Extra; - -import java.util.List; - -public class ModExtra{ - protected static final AftermathAPI API = AftermathAPI.getInstance(); - - public static final Extra AFTERMATH_TYPE = new Extra().transformer(ModExtra::toRegistryAftermath); - - - private static List toRegistryAftermath(Object object){ - if (object == null) { - return null; - } - if (object instanceof String str) { - return API.getAftermathModules(str); - } - return null; - } - - public static boolean validateKeyExists(Object o) { - if (!(o instanceof String key)) { - return false; // 如果对象不是字符串, 直接返回false - } - - return API.getAftermathMap().containsKey(key); - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/ModKubeJSPlugin.java b/src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/ModKubeJSPlugin.java deleted file mode 100644 index 7df3054..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/ModKubeJSPlugin.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.pancake.surviving_the_aftermath.compat.kubejs; - -import com.pancake.surviving_the_aftermath.api.module.impl.amount.FixedAmountModule; -import com.pancake.surviving_the_aftermath.api.module.impl.entity_info.EntityInfoModule; -import com.pancake.surviving_the_aftermath.api.module.impl.entity_info.EntityInfoWithEquipmentModule; -import com.pancake.surviving_the_aftermath.api.module.impl.weighted.EntityTypeWeightedListModule; -import com.pancake.surviving_the_aftermath.api.module.impl.weighted.ItemWeightedListModule; -import com.pancake.surviving_the_aftermath.common.raid.module.NetherRaidModule; -import com.pancake.surviving_the_aftermath.compat.kubejs.event.AftermathEvents; -import dev.latvian.mods.kubejs.KubeJSPlugin; -import dev.latvian.mods.kubejs.script.BindingsEvent; - -public class ModKubeJSPlugin extends KubeJSPlugin { - - @Override - public void registerEvents() { - AftermathEvents.register(); - } - - public void registerBindings( BindingsEvent event ) { - event.add("FixedAmountModule.Builder", FixedAmountModule.Builder.class); - event.add("RandomAmountModule.Builder", FixedAmountModule.Builder.class); - event.add("EntityInfoModule.Builder",EntityInfoModule.Builder.class); - event.add("EntityInfoWithEquipmentModule.Builder", EntityInfoWithEquipmentModule.Builder.class); - event.add("EntityTypeWeightedListModule.Builder", EntityTypeWeightedListModule.Builder.class); - event.add("ItemWeightedListModule.Builder", ItemWeightedListModule.Builder.class); - event.add("NetherRaidModule.Builder", NetherRaidModule.Builder.class); - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/event/AftermathEventJS.java b/src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/event/AftermathEventJS.java deleted file mode 100644 index 54b66dc..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/event/AftermathEventJS.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.pancake.surviving_the_aftermath.compat.kubejs.event; - -import com.pancake.surviving_the_aftermath.api.base.BaseAftermath; -import com.pancake.surviving_the_aftermath.api.base.BaseAftermathModule; -import com.pancake.surviving_the_aftermath.common.event.AftermathEvent; -import dev.latvian.mods.kubejs.event.EventJS; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.util.random.SimpleWeightedRandomList; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.Level; -import net.minecraftforge.eventbus.api.Cancelable; - -import java.util.Set; -import java.util.UUID; -import java.util.function.Supplier; - -public class AftermathEventJS extends EventJS { - private final BaseAftermath aftermath; - private final Set players; - private final ServerLevel level; - private final BaseAftermathModule module; - - public Set getPlayers() { - return players; - } - - public ServerLevel getLevel() { - return level; - } - - public BaseAftermath getAftermath() { - return aftermath; - } - public BaseAftermathModule getModule(){return module;} - - public AftermathEventJS(BaseAftermath aftermath, Set players, ServerLevel level) { - this.aftermath = aftermath; - this.players = players; - this.level = level; - this.module = aftermath.getModule(); - } - - public static class StartJS extends AftermathEventJS { - public StartJS(BaseAftermath aftermath,Set players, ServerLevel level) { - super(aftermath,players, level); - } - } - public static class EndJS extends AftermathEventJS { - - public EndJS(BaseAftermath aftermath, Set players, ServerLevel level) { - super(aftermath, players, level); - } - } - public static class ReadyJS extends AftermathEventJS { - - public ReadyJS(BaseAftermath aftermath, Set players, ServerLevel level) { - super(aftermath, players, level); - } - } - - public static class OngoingJS extends AftermathEventJS { - - public OngoingJS(BaseAftermath aftermath, Set players, ServerLevel level) { - super(aftermath, players, level); - } - } - public static class VictoryJS extends AftermathEventJS { - - public VictoryJS(BaseAftermath aftermath, Set players, ServerLevel level) { - super(aftermath, players, level); - } - } - public static class LoseJS extends AftermathEventJS { - - public LoseJS(BaseAftermath aftermath, Set players, ServerLevel level) { - super(aftermath, players, level); - } - } - - public static class CelebratingJS extends AftermathEventJS { - public CelebratingJS(BaseAftermath aftermath, Set players, ServerLevel level) { - super(aftermath, players, level); - } - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/event/AftermathEvents.java b/src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/event/AftermathEvents.java deleted file mode 100644 index d01ded2..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/event/AftermathEvents.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.pancake.surviving_the_aftermath.compat.kubejs.event; - -import com.pancake.surviving_the_aftermath.compat.kubejs.ModExtra; -import dev.latvian.mods.kubejs.event.EventGroup; -import dev.latvian.mods.kubejs.event.EventHandler; -import dev.latvian.mods.kubejs.event.Extra; - -public interface AftermathEvents { - EventGroup GROUP = EventGroup.of("AftermathEvents"); - - //Start - EventHandler START = GROUP.server("start", () -> AftermathEventJS.StartJS.class).hasResult(); - - //End - EventHandler END = GROUP.server("end", () -> AftermathEventJS.EndJS.class); - - //Ready - EventHandler READY = GROUP.server("ready", () -> AftermathEventJS.ReadyJS.class); - - //Ongoing - EventHandler ONGOING = GROUP.server("ongoing", () -> AftermathEventJS.OngoingJS.class); - - //Victory - EventHandler VICTORY = GROUP.server("victory", () -> AftermathEventJS.VictoryJS.class); - - //Lose - EventHandler LOSE = GROUP.server("lose", () -> AftermathEventJS.LoseJS.class); - - //Celebrating - EventHandler CELEBRATING = GROUP.server("celebrating", () -> AftermathEventJS.CelebratingJS.class).hasResult(); - - EventHandler MODIFY = GROUP.startup("modify", () -> AftermathModifyEventJS.class) - .extra(ModExtra.AFTERMATH_TYPE.validator(ModExtra::validateKeyExists)); - - static void register() { - GROUP.register(); - } - -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/event/AftermathModifyEventJS.java b/src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/event/AftermathModifyEventJS.java deleted file mode 100644 index b36f000..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/event/AftermathModifyEventJS.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.pancake.surviving_the_aftermath.compat.kubejs.event; - -import com.pancake.surviving_the_aftermath.api.module.IAftermathModule; -import dev.latvian.mods.kubejs.event.EventJS; - -import java.util.List; - -public class AftermathModifyEventJS extends EventJS { - private final String identifier; - private final List aftermathModules; - - public AftermathModifyEventJS(String identifier, List aftermathModules) { - this.identifier = identifier; - this.aftermathModules = aftermathModules; - } - - public String getIdentifier() { - return identifier; - } - - public List getAftermathModules() { - return aftermathModules; - } - - public void remove(String JsonName) { - aftermathModules.removeIf(aftermathModule -> aftermathModule.getJsonName().equals(JsonName)); - } - - public void add(IAftermathModule aftermathModule) { - aftermathModules.add(aftermathModule); - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/util/AftermathEventJSUtil.java b/src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/util/AftermathEventJSUtil.java deleted file mode 100644 index 91b06d8..0000000 --- a/src/main/java/com/pancake/surviving_the_aftermath/compat/kubejs/util/AftermathEventJSUtil.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.pancake.surviving_the_aftermath.compat.kubejs.util; - -import com.pancake.surviving_the_aftermath.api.base.BaseAftermath; -import com.pancake.surviving_the_aftermath.api.module.IAftermathModule; -import com.pancake.surviving_the_aftermath.compat.kubejs.event.AftermathEventJS; -import com.pancake.surviving_the_aftermath.compat.kubejs.event.AftermathEvents; -import com.pancake.surviving_the_aftermath.compat.kubejs.event.AftermathModifyEventJS; -import dev.latvian.mods.kubejs.event.EventResult; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.util.random.SimpleWeightedRandomList; -import net.minecraft.world.item.Item; - -import java.util.List; -import java.util.Set; -import java.util.UUID; - -public class AftermathEventJSUtil { - public static boolean start(BaseAftermath aftermath, Set players, ServerLevel level) { - return AftermathEvents.START.post(new AftermathEventJS.StartJS(aftermath, players, level)).pass(); - } - //post ready - public static boolean ready(BaseAftermath aftermath, Set players, ServerLevel level) { - return AftermathEvents.READY.post(new AftermathEventJS.ReadyJS(aftermath, players, level)).pass(); - } - public static boolean ongoing(BaseAftermath aftermath, Set players, ServerLevel level) { - return AftermathEvents.ONGOING.post(new AftermathEventJS.OngoingJS(aftermath, players, level)).pass(); - } - public static boolean victory(BaseAftermath aftermath, Set players, ServerLevel level) { - return AftermathEvents.VICTORY.post(new AftermathEventJS.VictoryJS(aftermath, players, level)).pass(); - } - public static boolean celebrating(BaseAftermath aftermath, Set players, ServerLevel level) { - return AftermathEvents.CELEBRATING.post(new AftermathEventJS.CelebratingJS(aftermath, players, level)).pass(); - } - public static boolean lose(BaseAftermath aftermath, Set players, ServerLevel level) { - return AftermathEvents.LOSE.post(new AftermathEventJS.LoseJS(aftermath, players, level)).pass(); - } - public static boolean end(BaseAftermath aftermath, Set players, ServerLevel level) { - return AftermathEvents.END.post(new AftermathEventJS.EndJS(aftermath, players, level)).pass(); - } - - public static boolean modify(String identifier, List aftermathModules) { - return AftermathEvents.MODIFY.post(new AftermathModifyEventJS(identifier, aftermathModules)).pass(); - } -} diff --git a/src/main/java/com/pancake/surviving_the_aftermath/event/PlayerEvent.java b/src/main/java/com/pancake/surviving_the_aftermath/event/PlayerEvent.java new file mode 100644 index 0000000..3ea72e2 --- /dev/null +++ b/src/main/java/com/pancake/surviving_the_aftermath/event/PlayerEvent.java @@ -0,0 +1,94 @@ +package com.pancake.surviving_the_aftermath.event; + +import com.google.gson.JsonElement; +import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.DynamicOps; +import com.mojang.serialization.JsonOps; +import com.pancake.surviving_the_aftermath.api.module.IAmountModule; +import com.pancake.surviving_the_aftermath.common.init.ModAftermathModule; +import com.pancake.surviving_the_aftermath.common.module.amount.IntegerAmountModule; +import com.pancake.surviving_the_aftermath.common.module.amount.RandomAmountModule; +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.Tag; +import net.minecraft.util.random.WeightedEntry; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.Level; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +@Mod.EventBusSubscriber +public class PlayerEvent { + @SubscribeEvent + public static void onPlayerInteractRightClickBlock(PlayerInteractEvent.RightClickBlock event) { + Level level = event.getLevel(); + InteractionHand hand = event.getHand(); + if (level.isClientSide() || hand != InteractionHand.MAIN_HAND) { + return; + } + +// List>> entityList = Arrays.asList( +// WeightedEntry.wrap(EntityType.CREEPER, 10), +// WeightedEntry.wrap(EntityType.ZOMBIE, 20) +// ); +// + +// +// EntityTypeWeightedListModule module = new EntityTypeWeightedListModule(); +// + +// module.Codec.encodeStart(opsNBT, entityList).result().ifPresent(nbt -> { +// DataResult>>> parse = module.Codec.parse(opsNBT, nbt); +// parse.result().ifPresent(list -> { +// System.out.println("opsNBT List: " + list); +// }); +// System.out.println("opsNBT nbt" + nbt); +// }); +// Object o1 = module.transformedCodec.encodeStart(opsJSON, entityList).result().get(); +// System.out.println("opsNBT: " + o); +// System.out.println("opsJSON: " + o1); +// +// module.Codec.encodeStart(opsJSON, entityList).result().ifPresent(jsonElement -> { +// DataResult>>> parse = module.Codec.parse(opsJSON, jsonElement); +// parse.result().ifPresent(list -> { +// System.out.println("opsJSON List: " + list); +// }); +// System.out.println("opsJSON jsonElement: " + jsonElement); +// }); +// +// module.transformedCodec.encodeStart(opsJSON, entityList).result().ifPresent(json -> { +// DataResult>>> result = module.transformedCodec.parse(opsNBT, json); +// result.result().ifPresent(list -> { +// System.out.println("opsJSON List: " + list); +// }); +// }); + + + RandomAmountModule randomAmountModule = new RandomAmountModule(1, 5); + IntegerAmountModule integerAmountModule = new IntegerAmountModule(10); + + DynamicOps opsNBT = NbtOps.INSTANCE; + DynamicOps opsJSON = JsonOps.INSTANCE; + + IAmountModule.CODEC.encodeStart(opsNBT, randomAmountModule).result().ifPresent(nbt -> { + DataResult parse = IAmountModule.CODEC.parse(opsNBT, nbt); + parse.result().ifPresent(module -> { + System.out.println("opsNBT module: " + module); + }); + System.out.println("opsNBT nbt" + nbt); + }); + + + + + + + } +} diff --git a/src/main/resources/data/surviving_the_aftermath/structures/brick_well.nbt b/src/main/resources/data/surviving_the_aftermath/structures/brick_well.nbt deleted file mode 100644 index e61344b011d37f2f294555e376f2d4f6d49ddcfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmV-50?Pd#iwFP!00000|GkyLj+-zLh6e))kZyac)KyQtSL(Uvo~xdEjlAp-taUK5 zou=D2=v&vx0&!S7_O7Z}Ldf{{eE-ZCxdJF5Q|u3>05CrJ;ax(3oo1S$g2O0bamPjd zpei%@TteClHEx(j3c1o$5aprzTjqSPeXh9J zhFFP%b>q>5Y8YY>2Wy@e@vxRX<)}3tu9&w4WZ&r);p3KdSWDXIuUnzi<63Fa;rdQ8 za~Z*?dVf-#tyfU}kfKLjpftiM45c%_66+fiOsROI=WC= z(({~iW$d&Q`O}3Kj{H%3bJCjc|Jhb2q-E>6z1ZUwdf_>OXY816%pDvLQq~!rmw)W| zAQ=ih%%1SWgzS3AwA|t3=hj_|J>`7v!->x5Z>Au5bp6tGOIi1tdM~G& diff --git a/src/main/resources/data/surviving_the_aftermath/structures/burnt_structure1.nbt b/src/main/resources/data/surviving_the_aftermath/structures/burnt_structure1.nbt deleted file mode 100644 index 56d9495d96227e6ce61dcdb64f67f2840928cac2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3551 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 diff --git a/src/main/resources/data/surviving_the_aftermath/structures/burnt_structure4.nbt b/src/main/resources/data/surviving_the_aftermath/structures/burnt_structure4.nbt deleted file mode 100644 index 9398b32b900e957cc47fae91fdc41e1f2a66c3fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2033 zcmZ`%2~ZPP7zQc=!W0W_1C^sz39Ud_O(X=tI0YO>0#1uuPEM&rJh%cPpdbu|p)jo! zg_SGQbQ-EgVt{D@v}Ck$w)E#QAE+mVx_gh1 z)7hymTNo6u9d9Ln)5XP&&4_=&{N_oSlJv1FyZyt=7dnPw@ps zTJkN?=5Xr7N(JWm#X-Al1se=1Uy=B zCR~4j5~BnzkIH_vZuPD7JHt@v1)*g@)7$#x)sX4*fSRNUEf5lHK407RB`gdYRiu zI4CtDOQQG~U7rY|1p#cjoBrIBifL219}NsgK$jHtp)ZWM{ZUfFqrbp03DZJZQ)5{@^cctKmqxt;9rI$1l6~!yOJZr z)3spS*RbWMv$U=vN0FHmVXS39&LZx(N@fsf$h1Qzry+eUh1Td|ED2_sxctHET^t4Z zlQHV)V#-P6{f^juWZtaRNBlV{UJ2wUf)h{D1!TOC!y=q1jx6dIOowz{qC0DX_IZPt zSX!aE(+zCiICPZEiy%AiU02y2$E~{}D2>D*DhqvuzSm2Dv$uyC3F>6e13_@4Hj?G%>j_ zvVv9KecO!*o)!Ux?DHb{HZeFedf|jYd5_Z5C0m-5C9sLYW(sT$mW`;aGX*^O`_Q9M zah7l!fLCO$r4u6U3Nw`R9~dG4nP&m(6_>y>%*hSfXYa#$J)^Zy?w*m&z($Tc(c1*c zb*E`RPpjaPTBHl6doB5y51!~p{}4P36m`?W$+F>e!Jk}gJ1026G2 z0{U%x4D%9mq|+= z)Ve{vSxt-Lhjr&R2XradW}VmBuh-#y<7$g8>nO@4pjM#^M4O+W2b0Po)cB~P1A<;G zs)o}l{i;{P@r8XAmXB9z8g_Ky6Ypt8o{!DXFG3KbX~(cRK4d@|dyiP2?@GNo)*+S7 z4K$@JElVM_dQDY;hh6|P>^}@t1TAYW~ZMwf2<(n)-tU!;M!JUNj1E zMwV(N?g^1-H1|bI(r9X9!;sfn5rt;|V+S-eSovyyN7{weCSC)OUr%1E^@>Wfwd)uf UX}pF{yWXU~mdAD=1?%bk3m_HV_y7O^ diff --git a/src/main/resources/data/surviving_the_aftermath/structures/burnt_structure5.nbt b/src/main/resources/data/surviving_the_aftermath/structures/burnt_structure5.nbt deleted file mode 100644 index b6ddfe66599dff4ab3081fd2475c383fdcfaaecd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 517 zcmV+g0{Zy6L9f^gFulwpCZ%MvyoWDv1&H zw3_}w|GFT>fEeuDN=1sI!147x7$Wb83Q|}9HbO+hC%=7f3fh{huYGMC4M#zns5JdS@DW7DK7!M1n?5TO8_rj z@mfBI3V12trGS?LUJ7{8ZCyFx6_`|?z@+*FCe=M|WH@B2M3 z2D}*XV!(?5F9y6A@DjjF051W&1n?5TO8_qgycFD-k+O+(?zo9T*wKApz%AExsMTUCuY?vKW_t{G+u(EAA*FYc?Z z?swQD^KKdByuBLQ(e7JkThk4j^DRC8>W6lXJ)g~y@>AJ3(+BvM*3jl?pZj5B;KwQO zVx4>0&tms|h3a3jE9@ H^b7z1VzLNm diff --git a/src/main/resources/data/surviving_the_aftermath/structures/burnt_structure6.nbt b/src/main/resources/data/surviving_the_aftermath/structures/burnt_structure6.nbt deleted file mode 100644 index a1554516d144ade47746f931779c01121bdc14eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 511 zcmV86{ai=tbDl14HS zN+d|SX?la+x|AE)f})=xU<;-{zV~KCVDtk1NPnT@>o1j7kB z(Fy|-d7>F+m?xfLhP5X%b@2r+PRPS2^2{-OCG)t4C#a2>n^pVFVpc$jk{|oZtoLJGI`Qn9!e?(4Vo__|7we7bAFaLS3BT#V5V? z5Vg5aA^GaD`9CZ&`0%9lvux`hvN;cs7)C3D+aA$gs9A0YT$XUx$QBDLD*srB##GYc z%v>1e-vnlBghKDJ8(Z5Q#NR}N@bM~FTk#83C}RKJYJ;{LcmWf?r33Z~{fST46GkiP zj#wUY;e_%RpJ#{4_$i4_Kexh|!w*WVP;U8U~nm^+R002c~ B`7!_i diff --git a/src/main/resources/data/surviving_the_aftermath/structures/camp.nbt b/src/main/resources/data/surviving_the_aftermath/structures/camp.nbt deleted file mode 100644 index 3a5b4d29a6d2b7aed59097afbe3dba154cb71880..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2350 zcmdT^YfO`86n4poi&!A@!krF()G-1S1rgJXd zr)@3L%yl>%ax2uX2pv@0ZO|2|Qf7fKpAB>sO2yKaUfKJ#+#LP8AM1}d@8z85a?bgR zu6<{d{kPORF<9hF_Wx);Fj~O)c2m%;q~YBv&P3_a(j%q8*Jr=M(RR69*s{CgYTRc~ z+jlP#w$&`&CRT2H@9ny(#z1#6)%~qI7o{z?^jzZ^T4a*ea+zStZ0JkW}EmYcX;7))wNnKXA##X@nV2vH&Z5*U6WC&RjkZCMFwGM8*qp@WA zLtd6NxG99znjNZ<&DNxCuVZhWo(;vBh02?eU`at|rZS45@Mimc9BnYJHh8*I^13GRGPc=W z6QnZrvy`47rwgvi3DuZi)+8GIDRT!kH&lK2k?t?SiBJK_QirCxO9+oM^hOYXWHPs< zpmDr?V26n<$EvzrD4FTVL6^4Els#hhL|VPBn4r|g4C+eDP_k+{J9ND9BCKyAK2|5z z2Vr8HXbZI55qwQzy-F)P=94>1Sah}~Z$X9YqsNz#emS>j>V20I=Zi=By&ufWSYJEI zOYS-9fj1AdCR|s$p1sDtJkNvE%>zEU=dPYexL)XS_F4xj7bQQmJa3$%Esinqk_U~p z2P0kglJ6N^ov@BxynU`51H<`hHTuKR<+0*0S^|Y-l*mV8MV%lw39$G44(OuNfC3Dl zoA?}+TJ3mQomxo&`-tW3Pylxf|*BfipmhED^Dv>_n?w zUxPCjaEmh)V5~QGZWeqstBqcfQ=I9n3ja}mBdJIU2#D9HH?|aKdjH>kd$aasM6o9( zxCOlUuLTMTzZh;ZzH~QRMdCTQjUl3D4ZM2I{3MKDbnASexdY0)IGD$)fGpD`Y~M+L zlX>2tF^TS)#W|N0);ZnM57RT0v>2T{$B(R(+r+%IrKxtJkDG+=lUs46$9fmdnCpWA z$Wr?Actd@Hc7jTX^)o5v^;6}C8;BM$70rkIgwxN$1@KQ~=MbpSVIJXp6wa8>v^!}wL3Djj=evF}rxESAHzCX?+ z5u*%@d|q@>K$%sqpE64L4TVt(qkC#4UuOzGTVxxnw?ZUA2^+ed8De{4aTN`^cpb~z GwCNxIc(fP* diff --git a/src/main/resources/data/surviving_the_aftermath/structures/city.nbt b/src/main/resources/data/surviving_the_aftermath/structures/city.nbt deleted file mode 100644 index 882412af4906808b5e964b2a8ba627d4a29d8279..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 348800 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 Dd5z29 diff --git a/src/main/resources/data/surviving_the_aftermath/structures/construction2.nbt b/src/main/resources/data/surviving_the_aftermath/structures/construction2.nbt deleted file mode 100644 index 91ca79d001ed329973edc4accd319ec87ecc3666..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3486 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 Dd*U|1 diff --git a/src/main/resources/data/surviving_the_aftermath/structures/logs.nbt b/src/main/resources/data/surviving_the_aftermath/structures/logs.nbt deleted file mode 100644 index 5728f3e98e43aa382c88b21bf7994b3e67805459..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 543 zcmV+)0^t20iwFP!00000|E-tZYU3~vg-04m%@5suf_;&_-s{q;E(m)pjT?}+F&}D!w19Tan z%K}{%=(0eU1G*g0<$$hpPbEhIj0PA67y~dCU>v|)uP=<6Vax)fgd9D?e9hsR{k7zy zg`6qFKn?>r2FNi$jumpI>tltS>H0V!XWHe29O;=V;JKgY9$*+?YV%X`QG$;&V^g2$ z8Y;j?13p^tnPZmLM*}_#_%PtZfDZ#c2JkU}j{$rP;9~(FEBHuzur@yy@Ns~T6MW{F zrS)-u4_)T0w%>KdXJj#)_}7HoVDOQ$JEZ2nll5= z3^+63%z!fk&IWKcfU^Od4d845XA3x6z}X7U(|NXlvjv h|C6~rCsiDow!eJwzeCEgYl&{(=>ve9gLrKa000P_0%HIG diff --git a/src/main/resources/data/surviving_the_aftermath/structures/nether_invasion_portal.nbt b/src/main/resources/data/surviving_the_aftermath/structures/nether_invasion_portal.nbt deleted file mode 100644 index 76dfe9fcdb8f99b84937afc0a80f3609da1671fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40716 zcmeIbdtB2;)<53;`fc4lU2)q!PZe)$x2?AIf)bH(NwU4gwM8j)E#3et5LB#G0TDuy z?b=7S4^e8p5d_jUEzqK*u2_^?>Qco^Ad7%e1X4>ST!d%?gd`;SzRxF!1ZWo@{`vj! z>x)i4bLPyMnKLu*Idf({AKg-Z`w;V={b1wuea~Jz+N4YC`ns#W@Yt8j-dq3d7VYc7 zfA9L!6D@!J_)q_l=6$6u<(-wvm;d>Ljh)T?SF87~*}mod0(QeQDs7TsSBa>kuUKrb z+dB2B6=7CGfX&L);(vR0Pjj8tc0+0R65FF~z4}=lVuhQy-_34RTDW$FQefEC-(m0U zX*Sw*T5GU9Ky2tswwKzhcYoH~Y+}1bY3;FZk7)8^iDSZ=X7y*dt5wlnEp1Yh^?cGy z+d5@%Nxn6{%3m?p&>vTNdXavQ*4tqFF6pI(Zj)6x6AY&B{J0_R(W;uW=A@bXEPACX z@22r$$t;mf73zOms`f*^Wd}gZ-N7a%hWs0;`h8 z_fbb?U%%jga=(=S3=^Ld&Y9KEk?jdfHzjSzHYD+V=7fVI$#++$Hu-vA^9GSejo=Nw zPhoh|?-X-cl>se{A4pr~7~Xv;TbeqNpDt7Bc54&x6T9uAzu|ys=Z3P$E$S50^-w`e z-9m%3E&W+m@PY6qmyQDo@ppU!3#($`*&}+-^$R8JKJS{i=oaf)wKQMsQPUH^FY2oF*X62Wtp}w1d92FS zL`dTHd2{#lBv>!^dzbX87KcgOgbOLnCp99wBUfeFt?|sP@TjqDU?_&wEtk*gDLwrJ z!|Zq1w5Y$ZsUJ;_;1|84F5#fqQ;7_->t(7>{wa@|gn29yaw-wI#Zh4M*Q}LBPvk~Y zDTZq|LR(TNurfP5YR)WRRldvj(L`jcA7Ryau4}P=AZ-d@)y&{$#{}~ext0F<9BIyO z8N&>sx5{6$RWFiq_h=4DtCFQb6Zu8)7yNbQs#uQ7KPFAuHPeGK3zAiflcjA26+=gI zcLJX{srfZC%Ipy&3G7Wrn6eD0gBw5FlA`J^%P=jRQKRa1UCTEod9s2n#OgQmn409( zyMrL?i^w)MsJgR`l3Gi3{A~4gj~d-pXWuZa$fs~_1FBPd`^Dk3{s^X+=Cl9J(Cx1eZn_Va`qaSLyNZN*M z`Bsk_;kFjVyYFzV9`4E7IjqVUzK?>Rolxa3yAhrpbwSnLlqv1{3JMLsm!J&|&o*q~ zr|X!ssyylDEGD@qr^?^ZZ#t6TJtIZshS921#ReRd=0E9CWAbJMb0f2(s#S~C(l(!` zS&dIdP%)ZErEOWyQ*zOqOB8dPsOV7KRQBA0p#BV1Z1f>%i#IFS$j|QBtLnCH;1@Mr z@Hh5J+lstcjq4a0h72jkpz@dHMKTpn0Be&fRs`YGrOG|_t2OS19lL_1ZHbtLC64w75YK{i$Fdnh;N zg1-z3TT|(8Oq8~TxT9xeQobiEQ^2Y@wY{b72c>85o6zJ(s@VB=JCB&c(i{U!uSb2r zHhDnYab`{=r47t4>Tz3^loN2lpEzxES)JT|8#61aFwy)D5AY?bD@%NL1q1RHPe-MC z+@?gGwikLRTvP>n#D)$x_G1RG)jHL|TdLTQN`ID2nsvOd^T)VGSN3BkmHBy*?Cv5_ z@vh)_Ze-&59E~E9*Q*ir%-bCz;3syvvRVI-WVx>4sU`E|k-WpztYLQg@Du1H{P5RtK&?#*?ieWj2C0wu{OzASz zv0AW_Z(jdL$mlhlv1H~L0{G_Nb=IAe1hX%H3P938GR9oxYSgB6#vuk81?&0sI#e`J zy7|0EjU*ylP@w9bb%Y3Qf@IA^fLPaYkDAg|{Gxpr-PfdT#m7~#do!g?6Ildp4q*&z zl2qYBD&4g>amBl`6TW!v4w0gIfI6s%Pn|$0yOvET>VQIOkbxkTI*M@xZWXa#%-B2+YH0SmQ}<|Y;^_+&)3{w}M=(pH?}U6OeC<(M>-S!7iC z>(4N{B)BSCz`&D0O^PxtWX5ge6lt4pB?#AbcdEdwcW=S3>;vjg0I><&f3Nk^c<1) zJ{w608Y?@>;2p<{bcFh{(NWB5fV#Axy2viv#xGK1n*M>twfbhG-mh^ts(OK=jwjtu z^FY>EcZ`f;76AjTBBlP6Qj#v^6khZf9L8$o$tsOU+Iy%?JRw{`1&7sn!k)B99b_?i zI*?6>%H+S!O5}&jbiSgc>b=+S2@-2@E&_$9%YvV60LHOa#1j zHG9+$ewn?gSq>}&P@{CsbQ(13|F{RsMU;r5`ZK885i#`lY01Eh-{#!emkLF;v+BP0fv=4^7pX-IY1s~ohW8e7?2u# zQMb{DuGYr?5uWd|t_u|S;JPH@r9UQ0Y0 zn6`<4zu(6yj#RULn_e!-dih^Ht0_rWgy(CzJ6-WtQTa1njpt@yd13GS2069L`Qd{}c>pVSLH z)aoz`VKM3){R%RkoB#=}*FT8pzWrC?x@V9|+e$s;O0N^@n&p7Eq$~S1Da6|u#3zv3?XQrK!{OD#O{vF z=&j+|#!E02SMq)Autv#-5(M<*O+2nByb_OPaW~+3weKpULt5N2t!$X2+r1-LCrl?})dDNV^;9v2_ zdyzBGu_}}J=_X0Co;>$wyyq2vBFSSwjL#+cZo0xf7>R!(BXU zsn1i)U@ZuENuITCW{RZu>$ZkZ0+p?1V|U|r9=q_;3Z9^@w>i!jQyWw4rT}Pju32|A zT4!{&UAcQ{Q-H>7jD7DwpxbRxgQEAh|B9r zP(zEiyfnbEF+P%#P*$H>pr*EkxpoS#B+Nq^roOc>Td!r+7`DR}tyXn6ZsMUpkgKpN zI;_+J>|!S+Xj4+>IDjI7fiEkL2MUk~D85Kp=2YgaJ>od|#At^M!qs(oFLKSPz3e@G$ zhEyn;(O<<~AcFbTS(wn%m#lA-srx%BOJG^5k9pLn$Y_+<%9>It`c3chWHn{G`eN#* zq?#Ijwrv!4NjRa68eKap;CKLeXu6Hny*+1GX3M6_t)`V^vd`AT07+;m+Y=;Pv;|Ax zp7_x6Vi`*~<>P8?@LGPNZLVDHN7kU=yo6(@g*6#i*%@+;*%FR%Hptwd(Q zf4H)_x$qG%d#;f5#8QbE+=!BCYtW({_O5%V2gONXG*`ni_MnQRmdw)_WH`Z%B)xx znm*TL1y(fL>a~q&2Q-{gebP&-Ws=@=oj}c)Zj%}oJ+}GS^(3hMbvjAW$-~uIg%L;) z&CBOZs6KI_)!+s*SbRgseJY-xs8F>=f2yzeu|4LfHECB5*g{HK=Ke@-SCH(>R&*Ff zJe!XWGiSV3!DdA)l&i(P%_3t_t?^52*nGOES4ld$azb^2r+k6C!wX3=vg7%ecJO5O z+ZEm0GIPSxrLfR^vO^c_YpY|I0Y3I^<_U_(V=0Ws!{KTj_j0R2MwRubuQ?^**sEay z7CmxdQ@|1U|Hx&5el@8%$w4yjR_h<-rK>G7nlN|JrM5k%T9~?-&X~7G%4EK@SE_&Y z%Z|e&2F8oYl(>i+B>P~K$iv*fRCfa8>pETg$^V3R(y$PF;`-UFVEBskt=Mhex^eDq z5%7V!kLwfSDzwR)4@ndM6RvS|J;#*M2nB!wI7{X`Un~<)lcNf9`EF0 z&VA0EWe~i<6EAI^tinwD&~{>GjWClHFp*~o@2+Q=C7Z;Z@!X~0R#>~@MYehc=b8FY zOC2!BMZvjo9rM=k6byRV_pk(v-RiT|NyvY>E^3;8; ztHZm!`g+5*#|4zSr4-u_cWFJ0%tYH!psy2!LhBZ>R^02h%agTc0 zH?SqI!X#b?U_ThqZT$9N4eA?LrOK7RdUAiYwHT_m#M4f#_zlFh8CMonZc_g>f0;); z>l?S4Ji&QuT1ca=J&oVZE(6pRiM6S1jrwC2qjhz|@zkzLW7u|MOm^7a&JD16EI~Z2 zQs0pjC(FAXUd#T6!q6!0*t}XMi!$61c6q4v0b1?UMqL-C0moQ(I5SWGY3REx+R*-t zJj>~z$yz~KVqa5?U6|iB(HPg1dM+6~0L$o6H(KcA%BA-9oBEhgc8lO+Rn0ehq>73B zwdJW3qtdE{4P|?vjO}a7;Ruv;HTQa!SfblFUAm_KY^Z=m6es&UuBz4d9U8*TWLRa& z_N)&l&v&f;j%j12qH84vc9FeaW9rhi&RUMa&{Yizt7s{#x7gHgVY!_uYQmPzFS7RO zPk}1EAG^!-tB(Y_w|dlQZ>e&p#JV=h=YwR#1~+=S=3_+L*tgm?F3InD8IJPmvTcB! zqNO(?o4b@>3KkC>$iVYZS`iT&`e_WGr>^esc~Pzph%50hPcJ6>wYM$Ze&cME+F$)f zWOm0LiFs;IJ*y^4-71Q-Hh!v0P!=6o!_#)mH-za0~A6-n?q^e({!Gsp;V4C3mOg^9`wt!2yb*i?&+ zV<$>j%QG&&jGPg%+5$=0jVpjo<8rvy3cTXrYtTnvk?mYwcV>YcM&8!-jk`B3p=x1} zc3g>H=acQ)=+!pu4|2=w2ya$|x8t|da>;K}%Z+nU%A$$aLoM)_z?BWHmMw#uqqJA1 z6|(!;)gI=oO|HU#0sw?1+bgY3RWM~StMlQ?R!#&)Xzx>9N_8E(+Gc5x9?(Xjpw62O zsg^qHkq`kdc$EdRmqMmLBT>?Iba67(A=!huh?D3au#&~lRYT6eCK# zJ6s*t;!(d8p6vBvp5^bb#eGAHsv2}U>_K-2z>yVMkosp=)h4(7fJew(f;F*w##@YG zDSaI0o@8PAtkfM=OsTN8o8QtkNwOwZpYf6__ZGVu^P(i1=?Mq<$1;$;Uv9iA18G!PquWvyyL@&ZvR#fv)>l@ zw3AicGoyH#M`49_hkRVk`Ye5~Bi}P zJ1lQt$Dw%?JI%&axT2`JasTuvT0z9ixt8s&!mMx9=j$xAR(1T}TODm1;FoNoQ7dl9a;i~jNmt7uk@ zkGObOXFN~#LDDXj27LB;@(x)m+GIY-geReB<5pGWf$- zp9`1d=RXI~>ege{C$N54iQmFoTCDk!{U*)388GRPD1K8T0gfa7z2>$bz8dnkTrS#;_(CwsyZW_oXR!SG9U;tynX<>hy-YSUfD=?NLb3 z!r_jMo?$hwvBYf=29YIOVymh)>ns~MRxIu_^Sd59TpgKnx#XojZ&>N*Gfz8bdXVO( z14fLeC0U1>u>R><6WTHMBwa6~)$7XjyG=>&mv|H%sfI%#^}48}i%#>p6aK<)zj)DK z1{Z5bovIrrOy(6VmT(r%vbnCpeWmJanI=w}`xMqr>~&KlT_1JZ4pp=FqqpN;(1Tc@ z+$K8#Z-enQIy-9qmn5QlMlzl4U#mHbXRkwW1hqE3q4#y|5w;2E$OU=ue@Qq&8YK1? z^XD02@6`7cO5y6?e7-D1b-oU=xvrhJaHwWTT9V)Ewq*$&uo>?D5Vzcd1w{K_z~Eba zLd)qdYXY?{eA|t49YxrY8Vgf2adD}=hG@2nf-SdXTXhXm9FdeJzsTyDFD~hW!SfM^ z-2xk+v{*K)EY;F|N7yh&g(I-@wr*Id@h5H7@m};Ghxuzei~~y7&h3q4iODSrOjKdK zA;x}*ZZqg$h2c5^`q_9^(&Y+Y1Z!pJ`j#6XByiLgZ-W7ceT|{FSv%wO-#~%Y#!#HY z#vVT;?Zy7L!^Aw&=@}0CjG2x@%yN_-ctoVWpwHFymz-Ix9B(?50FCMmOE z^Hf)=!d^+VulK3;)!_w&?_`{x+m1r_5g#dVd24*JS+AM~5KexVi?{Pue%(f(7|VEwm>#Zi3s5a?0{BJ49XZ;?V)i4eVhK z#lF|yxnUBkNOMDT=WB(4+(U8!`}n&s$t7Jq0K;~1i0*qjDX1!Szu}{mZqDT1TlB3` zi#{ffd)m$k(mpLp=*zl$x!fq>3Z8etkX3FaH;?SIh}x5-RFPOhv)F} zv`$-B@ke>oZDFP&pM{-7(fO-!ukf_`O_|Ez{;D9&=S5e|JMa2xam?}ajkEgxo0_}- z^8D$^kRYDs;{dwGAd;oRB&vW()ND`HF4e>ZTv)*qzxvao*Dtmft-xmf>OvNyMci*7 zw|dPqe(dotJ^Pce;c-N>_03qCs;BX@JyosdrBQvi&<|ik)E|2x&yN@hJk7If%X4-! zv;mn#dsMCIuVHVKzYLqqqS@6a`VzmXLdUSMDW`+W*yW#VO;qbnY!G(d@f8>MWyTv) z?E*fhDNX6UP&qSAI~fL=;pgxAw{NidEyOL1jtPdA?@HJU^)4#Q1jEhmlKd9RTvWOV zhFjnH%}i5F1oW6h8$>hGlrAc+t4jN!i|Sy_=zoUWNkxm)Ck>|ajyrCMpP_hc7~Ohd zyuWn4C0(Z#F=skhjGXCoUZca|?s>S+wA+{q8n}}I=hRH2*iVaz>2Oao%in;{ky#7j zg>wvneVUZr1HByF0wN()@sl zxb|0?ufiEnO~)nNZA3&p3e9~KTF!1BGrj_+2FM^@*5U+@<^&6r6Tne-I$cP1fX4r`P@og$QfX~igi<`pkGWF7W^Py0ds zGtA4q#I@w3#1 z)aiz#EPK(Sde&F)YN@|~SBrfhT_;wZ|DZZ+8A+Q>(xg;GB+wqIJ|XTd`+|@F4+^ru zMVqw@xZmsFzANHB59NWOss3UJYaEq;oizIZ{GGl2TQXV5|L=(9LF9VMT6X+hI*!{z za;Nc8PE?;6;~oM$RU{SrwgXrbA$5{=#xZB!9iipo9brr!nwrje;Jf$VBBYk|TqHqr zNYH3ROh-y*W+TZOtd!BS#95@H8r)eWG!Hv!&UTn%?-X%n-j60B>Q+KCvcrJXfhZ

++#BJW`!?5d-dCg~uM{GX;(0A6W}W71XT0fM`kYsux3DJM;ch=20K?RZ>Kj zOGt5V$cs~4J4^qvz@uL9)%x%P%W9Qx#`VYI2}16SkS9yv(zzn-5Szfm?9na zhpx2wO|ir;fK!WPlz+AUr)-ExUI{Uib0B8c3W$O2>1R*&YBBlg1%G9&^onMlK4H~} znpK7bTk1ARZ}t`!R{hbhy_2>tOeQ}ayjxzYaQ&|7FO`@HD`}!0{TdUs=`S=$RuK7y*Pq%G zP5IdQl^O5SJ;f4p~FxL{Oy;_YN<9UZhNSe@qGc?RNXjH7Hp$_h{;1gIPMKJ&^Ac7 zQ`v=+nV4cpZv!)Hbvtq3CTAC>Ls1P|M4}n00A!^pe5S4+{O`bPiCl;V6CHrgJQyvR zl#5v#K|hp<+%Nhfan(+n5A0=U66(PeNI5W5x6w>(coEa|%qmRNn7j;rHfE~s9d8_M z9H&{m?pAlTax$3m#Zl@`wcYaFCUvK|a3KD_d@$l@Wrze@64!4bDuxR&zf`LN**n)S zZsHyX2#MALmrDOZH#ja4bj{7fqNg}U*Byosi`52h@uK>Pl;}o@!f&uO#Z=RIVeFFj zw%7UDo6q!rhq2gVaHEpz17^E3>mM**^ zeskT~t>FdS^>F;z-p5&%r5r9!IK=46(vY`Pc!GM*>59qlBH}I^?kyEWEx}=OJ~(hW zbg=Y6(~gJhuH0xBs&_wC#Xwb2D;$@rM^-#bE4HRgH}sozp-ofSPk!c|Bmm^mgQ`{f zTj)&v8V;E0vfKy>%$@Co_=Q~N;UX@d!cC9cs3X{0EDNVg-OAyhDv`A4tY`bf>0yps z7Xh~j+g(12t-#in_K* z{@!!+mJf53Kj=7Q&h`Bd!+cVQW8c(Gk1eLV_1cLnb*e_37zW>`uA&1YRfc;%Y8-o} z6WcND+L=c}tWh9}5DWGLmM@JnS`C9Jin_9+zO`BVV?Ghbg=NXSdZT(&6%*vT`m4&G z^+)$<3bBc+j(HE>0JerMTF~Rb7B8Vp(Z*FSO5C%ef{k;P*aoHB45K9LGhE(pb@jph z6z0)Sd(s-(khWR9lV8L^|CI?{^ms|em2ET{){8cDH)uHq+^M#1Zeb;M1+eVR8ypX^ z>KHL@fMr>3MB1ua&u}Y~?lDEnOullR4HayVIZTllF{}`^^#xx@&AHtl_i-ljt=x&j z-vGD*&Ts(;4t}k<5D6=&B=1Tjz$DSx05%M9B)vy@Dm4Z;sJ2>f?_e)X?21MKh2UNX z(tKn+j7nZ^J)?|3Gf>*ECNttk<6sJaDTKOb@VgsifK@bTGb|X#A5T3M2+R)4MXCf_ z2FIN+x)x@TP+k_Lswve^K9UH$cKmhU{sO5d$pTZaV2m%=UyeUlb`A`%?u_gmW=lB~ zuC*%IYm{fb5sd#mJG+8x0o^_n_kRucdK$dxUzLvfVwjjLv%oI zhLC2LtUjcRysls1O_Jmb%(kAW(FUJ;6sDK{&GCj z3Mh3ja7z6hzqanv-<5GLY~Te?x->lCU)sPoOP;6OL|wlf8h~Pm{bmpDjpC0kd7(*} zQ!lk0O^!(qoU;d2a}KEWO>;@h?X7PO4M1^ZA8b4?^XW@%H%Lz8-yz2lT*#`)+qRdT z6Vy0uh@N=C&!gPIU{J*11Fv!3rM6;{<&^?ij^Hw6xjYFhu+9fKnAa^fxb_s@jyY`? zUZXef@a{!IL|2B2sd!t zIo#E5|DS3}MD2gUrJftWV;v5ZN$~Cg#}#XEyAQoh6{wT&Z#Uz_qt=^vVu%N%XXI6` zSQIi@SP5~%p~Ry-1II5&9_lysAB@~jMLzPYy1=hC

qL}K2FJ6r8Hsuxw}MlWU3 zB|Zr_!fpSlI!c{;U@3DNPVX1Cn2vRoy5f~j97kiz?en*SD%ZIG3r}SGZ?C{n7V`=n zVQ?nlc5P!2zt;1M4m5cWUbt$Xc4fPouEVh9`A-kLg9R5~<_@@EaAsgy&C7fpi?vV6 zVy<>FR>rD7VksRYxyC&Ocl00Oz^+~M#h~jj?pc1VumCrS0*(9sabPeoH2=XDH@bk& zgMn11{Y|I-5ZG>c~{Rw(_XwdbtNBf$$G1!~}d*Vwuu08XBl|zG0@6us>L!vZl zon&b2A)HxZL|w~czj-+~ax;X@muGzmCwYM+@$lh5^%a!;?-K!Jqh%i6l3@)S5hW-X z+VUOd8-UK-$Yo;>n3@dbw^|8TPJS`=0J!4JU$$#BRWq80zT1C0qHmzk`k2JRJw;*tUj4Uh^UF zz+7g(2^+R&9?a)oCvGOrY~oC#>V%nZ{or_@;fcGn>^BoT;i_Y!(9&L%N07Ycisv%C zH-dLVsB9qb8Xzw+$5o+{9T~`o{G3mE&E`Mn<~xxa{bzX~-&5ONAlv8?AX#fAr8!it*tGVCVy zo5KRZ3jNi$oTzP=$#xpOb4OsT19I`QnzQ6Kw_mKvXw?Iajyjxb-L3xRYK%Va94jKs zhvZKlFo0VcndtEOEyB}Z4gjxpb~)_l&%SUD3L@`pn^ZSI#Yp|^i;S`ajET7C(f=a? zdjHOa6yY4ON?~Xr=l!5e_=_?|lj|5)&c*3xVHY&>4Rrfpz`yi5MTP{h1x3n548WoS zYlPy3Lot^~mAS7jJBiK5Cquv)w(>!;m7gc``K>E};m-($UnLj@<2*v~)r8_Fh!Mu} z^PA6eX5q%Y6A6&}7D4W3aCQuS#)Kza4y)LlPN?ijs2oKs8nEOlmJNRE1T00LfhF!$ zV%bA1lfDG{O@9OE=XDV1x9$0R2ZXLYZ_(>NpIzw>uYHx6lHa&@{L9M>A_G`K25<<$ zaLE^F02PZVt7!GMdi z6O`s0+$#qY8zN|tb_$qf+liv20b*T?0W!vb_I*yQZDwu#Ne->-$0KSLr%>YIK;>1n zauqOoFgnou%ekRZXu*7E-g}8;k&cpn7!zLk00AL^6TibY4t>Oi2wy_hd!#0kh6=8VL>21ZUTFza?L~$*3+Sg8X7Mk9NWu~F^X?So2IPBCjjwrp) z>)dW@Ga33$mHRi*5sk6^ay3S)8fdg?YTn+7zJAaEE;-B;!Fp=khF=Q=j~Ma602BZe zcMbw3M&*j;!<`|TPXl%St?o*)OPn-27}Xyd*+alqg6(_R9Wpw9S;pwXM+_^Wab$1e zOi|mErkTiN2Va5#IwY{D?1t&`tOamnu!GZ0#)&LhV89VR=RQf2SVY!jEZNI#u$OCV zz62!aya`ASI6{{30d71%v230kvITx&6mLHoHtMICvnXN91l2=$TD3(mT53qrbPsZu>^>11c)^Rh&cd6 zj`Fhim`weD0H5UE}^ni`)ODJ;tN>oJj7I z_~=RCoHS^1#X@}iBOUL(TUYSSB7EgVc_7f9hW8lS-SD#0K(LNy4P$^im1h0DfXhH` z7~$yH0tRx2vbKeifn{5Su{_3r3@j(sSZj3WoGc)v{Tgb^R5Vw-6_vF1`+h%>>g|Zm zm)lN6)N;R-m@5vC;AIjC8%9Z|u`YgqU<9kRlTeDwh#y-pg3D&3>E%YyGsa*9YbdjS zuAr54Yyq>xI!x^WIbas1_WP$Ggv@y7~DQPsg= zK?>0ZgWmN?rHcZ}&pc=7`7SqTIRIXf&bO7HRYlh3WlPnAB#u19vl1`7Z^40eVjY=^ zUlWwCs*wo&(%{gjBfkfc@I4ZJ@daEKtyPovL$(|U&pit3T(kt%xpiy$i2!^;>OP6S z^W@V2K#n_2fc!qrOKWf9#5A{jxxrw<*8`nN*f|{qn7eoZ%x7)`nEygvxHFQE0?b{! z0Om8dk-^CQ;?nS?KWsuS5l$bhnIZBeAO5YOB!2A+h3a-?$)fg5yrW#}o3o}eH+~y^ z!lTI>Zl=~x>3+vbd#{J{O z>Q1myN=LP03}_*CVs&^+oRmMTFNQ})be6e-fH|J&uCWEQQabTl4TMZi3jQ}yM~B=F zN2Ui1vKfB7NrWMP_Q3dkJ^(emOYJo?^d!-cNmQ)s%*;6kl+{fER90H%%r3J~RUc{2)nU z{*l1^9PRs4=w0V2IY4dq6|CO7_-+(PFx81f-@pQhBj0Kgb%OE%@z2pB04AXi7J>UD zM=pT4`wG~%p&3AITi~Jl}BLID?>d^SQwmXA zrlRdB>+ZJ*#`-^~;?4~mg_i-pdkPqmPOzHt0Ko`Whwu9w!SL7uM@@$EGrn*11x)O* z1&oR9#LD=-F#{K45R54x5OHGdzC|$Xr2Kyq9no11x5^Y+7snVdJv)@&;Z}L@4uOXx zh1?_$5`Z7C_TW=BI{kLLb+2jrhOEdt;?s*D1pbo;2^jvGI6ekq5k71IB?=9+zCU<7 zhGcRaIy&|8uaA$BqavP`7N=fjqQkM8H5|Qvw7xt7`O%n>v;;ySL-rc$`|z0eln^l8 zBjI%l#^vxZVbo)UQB#0X^p#7XTOC@mIL~de1GI*a=tDX%VY1K*GXd^C9a$ zjuws%!g>v1y@Iell(1e&>x4KH2D{A%2D>$mu)c$^UPD-~s5!M9h7cW%R?*R@Zw}5& z^%*!Xbt2-MQHU$Z7QrW+aJ>VyA&J-!Qi^m94YZSgJ`||S8YO7T!n=u8?8eaW+A}oC1_PRQgAsbN(Om(E9dke+=FBf< z;{eZxt{{&wpyBGwihF}cHem_M6yTOnH00Bpn-R5V3c-gfLros-4HlEpck=z{y3u)Q zC1Ti})7ikhss{)NBc1rW3u$YjBd^gI1EwZJ`I(!7xiPp$Io5z+)`?$um$0RQR-!Qm zBUqXHCCXZp@=`jf&YPaGb^G^c~^#_+Rq+p?i zI`$!49UW^x9qYueWoF?+xH{@HG)ST7kU#~8i!;SI@yrFZ=-&k};_XRc_{R-inBv+q z39tB2;O2rGEZR?p2GXICdujN35!Mh|MwZ~69tt?KuzT3{D%PLDfEJ^{$i1ghd=DRA zOIjaZE6;TVNj?{FH}QYyHsfSZtUYd9uyAl|v2ciU*Hq@(-vWNyKZBibdlh!RHJMOY zoC`p)Lzq7q@5z7>n9r?+eJ{?1eQ$qDgB8OKuL>a! z;J1GU;71Wy4Tch{s9Np#>WBTad=@^=O+4u&60b=>WR`NK3hRIq38mnaC;4)&{e7_D zrK(>I805Eq2ILe+sdKc(-3(i(0&u$M0(-cm*_sYA01HBP+r2@LH7IUuL3P>4-gQ# zIPp7>-;QhK(Dj%CrY1vK9msDdq#0vCAmha9Kz=R(#25nt2q#ts`N!B#On;8-EXVOp zGSgjS3Yg=Yq5KZycT(^$eGiY0><|X{owPGdS;M2y=CD6!G10lX=INucD}PZ9ZRGmlyi6(&&~lU)QQqSXiraw zxf4@68LvAG3jipDDWjy^r#W~++|p>%yNaO3DFC7{pyEUvg-2&Hi^6IJc)@g7kew8P zzhOi~rE2_Z9D({TX#?>ldAg6##YuPLn$q@CLVW?=+RZh-jg>H(@&{xRYf*dgrPx~E35q) zUd|m1%G`dM3t6{D29@kk5>pg#5k+7q3sOYn_kyvshu%ZPmT#wpc&JBx!$OZC!l@YZk&I}}~l@k&-+>Z|9rTO5* zK9CN8n|XBX0YRM;e_J#exzP2P1EwZJ`MZs@>!`@avNOhj)*dHT^N-{pKS9%Xi~&t* zC)Tng+9EnB|JS1^huSx%5(#lY;+EbYzF*jbEGQ@oSU09XT#- zMvq?=%xgkU17+B_86F)uux#U2g^2Mzj8w(IvM|b!8#%JvM%9I&tgLY=^21}|6fiy% zCyLC4flLR&z6;DI|2qqB823bW#q6q+eT8c?+?BY@BhJQqOE!P}%Ts`Gd~VUE!Y7dj zIPnTHh%@*Ae;iqGSK?F|>~J;FVgZrZcCfHmSggOgSl|eF`bvD@X`BDd6dVCN9Bc*9wpeJ)?@~%zrY9H+Ue^P_X7fU zCkivsArS{$_X4}(jG*JV;nHIZ%Vz6dJmp}7**TI|9?;O9o!~ASjeyPa!y|>Q?9k|tuOp{lA;kP$1^6jkixvUog!rmG9t(6|kS=8=-sb)_3aLNM;FnQYJiw}{o6}-%g z7js$Ou5q*RX4g;QwbBgK<3M2K4v)dagxb(v@;PZ}fTQq3TH z_oZ(fEghtcs+eC9&^}%P_2U&_9f?4 zZmYWX`lMyvQ{`7b@BJh1`0JgoOV*~;r%XNd)Tt?pw#?twb&l`8fPc%Gy2X8C?b_Oq z?{iPVajv>F$UTH!`uD)7K*8fNwx;Nlp;P4Fe%3pe_ui|Wn)3OMhagG)o_fX9Q-uC_)A_ z_3L^W)CaSaL9zGQ=h9NW!7zak)SyaJ-eE1+Y%0;Z2wz|rvvST|k)H^wW#cf10M z$15Op4|}ZhoEeVChQoq!+yat^)d2AL1fb9JQGjFmhd=+3xBQia$4?IY%4dI8^7p_4 zZ-w|>`=>Kc6y}m$Vb6kB& zz_-^@ruKCFv;nal3wc(bLV6;-Nl6Po5NagD2+EzhqHuU&N%bvqCkg!gv8Ud{_X zb#X*uq&O=4v0*8{AY?=v1{*(WQyD2ko6JD6lM)_K00YV65x_w5cmyzzJRSkl2~EZ$ z;OKY-tQ)U@8{-w=J6-|B;}yU_^2j;)i^Gv1*@>NjWGBk6&;5}C2$F{gxDk6tvEbcp z@14z6&jxZu9sq`&yr`JkbN#0viFxbKb9urgrvH+2j`sggplrE_eeIvlX#~w%37W41 znq}@usR^ea2I95M0Yp{?5C{s)sYe!W$!;^6cco}M4$K!R0>14l-B{}n?AwwJ?DMPv zzHZ4TeDx8=I+5Z+Z^6rk4F3Vxq;b&=Bb{S7Keel`TVT+7C9a^);?b& zIfqo<B4bgQ?pC{Ot1cxq*b+&r{tGww?KdgLo|K-7wHdFp$~v(ob#8v_lz6fn^;* zmbC|2)KYY-+#eG%kYI|~Xp=RRz3sqw1>kdZdg^`oR*x+Qm-F`i<6>^$5?9Ylv*o<& z;kC~nMSTv8ns{CN=C!{KN%;jKBinGV@uN1CkutQ&L1bJwE8zhJ&`2JS0L^%7pc!us zyvADtukqHPaJ)4r9B&Qc$6JH=@z%hxDIWWHW;Vq`+4an>dML$tG7p~+BLy(K>iYt| zZTsPM>xtzP-ANAi`Ue5XK$RfE5bW?h0LVNk09o!2XGh>{<*cnYozwW9-~u#HivTox zURn})o8Sw0JT2m=!O-z$n!#WQII=M4+YR~K&aS`lx4;hnjwj_;NoEJhjH9){hrl>4 z+p|BGtm6)U0P&lY?Eq(ec1!y_ciDCB_&5_QWNrkO3RJl(0Ia#<0RcT*E$E0UDq-gs@t1v8I9+ zbSDZ5f?Zu71+4BQE4r7gXaQNE#73s26FcL$cA`9>0DL}lE{%s?7|kI^QSgC4!FwKC z6w7&?Fq%u3xSrC?{-wm7z3~r!yI~;PF9;dghQY>iDJzgC|k5>oL9W_U3oU+&xAJD@+BtT4tTB$G?YG zR&lJC&42Yn*1Q|lONSfjL`5}>>(--B%yds(Q*Yv$pJs(1B%R^h1 zY^;5#cI)@Kzky5kp`MZ_<&S*Y^>i3$>~K~4EDt_NCli}Kf@??Z3kMK6+@GygaT_)| z9x8H|GbMi893VecwSl=pY{{fIKJT5kQ`kmuXEI#ScBYGkch) z`=qk)#KYtR{{b&M#gxQxNf`xZj4ue?|20ik5|C|H=Wtf z64pNfXEu(_;D3J2;moFA;1rzM&jb!Qv+whKzueu{@Ohw*A3G%Xeuyhk8 z=_gVP(@ucy8Mdf>(H0oFVYQNT$N2O3Amq8Gtf^eB0`(o%QzywNb^~<_m)JyL%eCgh zTVV;*U>)iI{#eT#z9)B4p6R1Cl>w?PqK&m5*YqAYbwJ$;VHo?@g=Q`u#EfGkjVQuK%5(%0s^7Kf^11qmm~{ zJcRY3=fyc7p%9P)h$I84=eFy~#9j$9sIy2m)_}Zwivb=gPza!2@iq`1;y9EyiSn9| z*VAx62g4{XI5$d;OBZv4yj^=; z?rnSl>65N34{&c!LH;^nw5q+#%OP#5XCOGzbHTCvFA38OZBJQxu0N$}Pn>3WKSh&J z@UVPe9#FDk6)N8RB1CV8==Re{rwYZfnQI{V(4134r{IMC5HJ~q1fPR$dm7v$Q9NN8z(v1a+ z@}eSC?O99saRK;t+&3sFU^NPwGYP6MdUctQ}=u z#6j_)f~bj30vTtO6UDiRe=C4-R{ie<*#A}I+uVNktirdulaTJ56H~>W((v&4~`#rvKq`WAlMV z_pDj68MAJ4ggXn2{T^MTnHq35)86DeOWD`hAv5jv;u?N_U##!Tt0~;| zZA{5Y@z2vt{hhB0&0FnvOqwY|<8@oxMvk@X&inSy^<^(L*f%yus^7b&-)S^XRtkE` zr??sHC6^azeGB6ROS!wwDR%ZMXLx1J%*vP{iiv8lcE$dm)ZWRVCD*JQ*V}hQ+IJbR zwyhVPGVF+NX!L#Q8apv@v9a&!>ASb83@aZ!-?O`1en1hTyx|so`{%s9-i=?>7&*2_ zqeUHkKW)-=#+Q9t9Mj*TNh&a%ceBms*6I^=b+734q6AT9>SU$0x+7`lHO-2EAj^?5 z!}UCIYLYTXOuRBM1Ba>@wcMB>LCcH6IXgRN{;QD#`S-ZL;MEx(9B<8sMSU35H zKiKa4)6l3E&sgVvUNECPbXyiz-1~0B)zZn{d-Q(4Db<<(v_ku1!*4UJ9d#d+{4rE% zjnw4_EKQ!6Gv}t8&89KNi;Ii7qPrS}xZQT=_jk*X)h=O|bmFDdeM|eu2-2k7;}BFX~t1+_40fw!YJ0 z@z!b+dY=r@e^Qz#R+tYz&h1=f-@5sRK=j`6^Qntl`x{EkYNc|Pvbj_3>-N2c^Hp%) z)gYsBMNvs(lE^H`DEnvMIc=H9nyTiWuhQEj)2#=pCVMICy?1TjxjfObLuh+rS6`>C z#){G6X1mGy(HK83@-c&<@%gRFbZ*7oE5&XV$!8w2z4n3KP1Af_X!>f-C-E6KIek8qi$aa+dIkB zv@NPB@kIRToCNor54_CpW&ED|p;$Rb{c!Zm^Uryeb48vDl61ut0(Y04y|OIfm89xh s)*scsUtrEKx1Y8seCPPuPYGg6;&&}PUuvIepXl}a@z_5fnfTEE11k*(9{>OV diff --git a/src/main/resources/data/surviving_the_aftermath/structures/nether_invasion_portal_transformed.nbt b/src/main/resources/data/surviving_the_aftermath/structures/nether_invasion_portal_transformed.nbt deleted file mode 100644 index bcaa608439dbcbc243f3d261e8d748bb06ba51fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20895 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 diff --git a/src/main/resources/data/surviving_the_aftermath/structures/tent.nbt b/src/main/resources/data/surviving_the_aftermath/structures/tent.nbt deleted file mode 100644 index 87cf65a42beae4978798d9d6129373b5efa57db1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2338 zcmbW0dsNbC8poTmaaw0|kL(OK>ab&mHEa6o;Eoq6&aT+5MLAX;nehfXnWb4?CpBPf zTV0HD-5SLUvd7L5?__x?4MHh#y~H>ssf4VdcodOPxr6Kr&1q_O&z{b3_~YSupZCM} z`#jH!xbog6`^VZ@BR(d^e|+$-IhS$90MdmDZf*6w%BtpjM|NYsP36_6u^QIhM`B7D zw`ehYEDA^0riR}T^Hi4BJ>UCmySuAot!~=S>NZrj%UN|!t5R-o(EdHd&X|>Qepk?a z27J^c*3477;bHA}gZ+n0nsT_Obf|7-#VC29FWD{k?elfTRT7#Uj{DG&eI4&)eLlO8 zRzx-Puw;T41}a0)2VHP;j`bhh_D7m&g2Ld#v^#%>PF`ws#W4s~4lqxQK<3+5WBhUi zy5evgN&l?x$+r4%sEqm9tRr%D3(QdX1}lQ`;=gi$&kEPSS!erC zyx{TD(CgY-FwCpw8z`JRaCq6zNCb70tkBG4Lo{b{Y>Wco%oW z6FD^Ft#v{UIVUB+yX5lisa>*LM?H#j5~YfV+^19$8)l04(Q=M17ckDJkO?CZJ7hep z%wuN2!m1)3)z#G!KiXE0gQ6}q!f@9K)4xSCtN{fmK6Z*&w+uz*(s!XpPHS`P*Wi6Y z&{^IMYR0wHLof5V4%JDo=FJp|QO#FeTbPy)EPK zPE~`3**EEkSM>G43EbSrD0`2#!j!K%73URQ;Z~e#9$#KS;W}7$MDS&*M}JMoeYd@E z7n5?lT>6$FWHj(m!n`!zE2y(H3zM?W6nZmL{L zk~4w7g1Ic7UOX*b$PO}$nizbH3AIVvtq<(OV|*Wh-~3~?V|xgW zk}Ti!%SO~bQaJ) zo5ueofuXnvFfNebO{@PGqrEr_^ZP211zAf1DyrZd}<3sz2>oRf44o6-=Vl=B!+*eKAS zw@jT;gG+56*)F^m{$iXjPzUQ?hP1e6xA~L%IchEi!>=(Kh;^Y=2)6=xDw(ic$p&k) zaw-81i3;|hX`1+9=Oj*GwItt`p8*vuI#8?Nfc<;RluEBV1fBrrsvZEuf3sb-hrfjN zN`!kg;0yo}J?%gj)A1H?)glG1NJ&7jP;?eNp0$``#;hvwQ4d=;%oWU)exacv zkX_B$mQ3M>ldD&=6Ucd*6xJA7f>M$w=;d7gEZwNAyQ|kFlQ3z{l;_>zzcg$3tUB(} zxo$qWYAL}Y`NF&!Fs7-Orb|g1?mR&RMYq1_GCaDXw?1Id6{;EbQ`L${OwP-5Ad@$L zl3w0BE8*vpVrbj|Ap5X)=Zsi9x zY~N|roR%vsa@qWgl{5Ib1Eh_w$4&F{)IE#p4~1Wi9cGcS@jH?-&m1(0(CSX4_4=9+ zaj~~?$Aa|2(ies+^4gkK&SLb_;R#L3Ac9$RUm0zxXyyJZ!}P0SwmFeBH4OXZE;V@}9!si(!G$Fk!A#1?Dk%^Yg`O*wuTF4J2 zEKALV^1LQHT|azJ@kl1B4*mN&Z-Vpy6BZR1Y9)Gbf7hd#pBI?sGlpah7zWMQn7}~? z6fPFBMT!S_l7!b@!k;z#@k2x5N!8HvQH(Lp$|T;2Yl{w3YblSc@90kmd`}QIZTb%o C&+c~s diff --git a/src/main/resources/data/surviving_the_aftermath/structures/wagon_cargo1.nbt b/src/main/resources/data/surviving_the_aftermath/structures/wagon_cargo1.nbt deleted file mode 100644 index 1884af5e8fdb82e3e24b83b34f830513bda04b54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 733 zcmV<30wVn%iwFP!00000|Gk&pPTMd5g&qI(Z|rKDH0@&VvFlw=yV`AKirYqnII@kZ z@dkVAIe=4BV&~8eDuoL8a?WSRPMakm3&LG}rx_unKW5?J{jnf(-TK_WP;Ny9|@&Tx9O^r5p<6Fd&BkIULA|OzFPLfi3}DQvq~ErgRS%BR*s6dCEru zJ`(VefDd`R_ET&A^fNcdOnt^tV9ihYR6th+bWxy-0yzxG8TJ^!l)5<3#euHKl;)5F zJ_7I&fR6xt1mGh99|`zKz()c;B)$X8)c#@&!vh?ct#{j`ZEv#cT~E8(EizyrYKSA-2yJh$ zx1Q71A*0y-$JQdH2>Rv!zxWVJ=Y-4%clA%r2qFD32?y_w8JX(V*S^+{^p6>ltH!MF z-8{VLW`uRd#gnRdFe02+UO%02jiDKa0yz}OVL%Q8ayY?0D)*hgMj^QG~L zOm2K4lN+DN(oVK9L#w%o7X+n9_c~ z^jRdBan75>eLj~%fgA?pFd&BmIg!cTS2@rnfH@UFS7dVcaB;=w+IlYeNWez|J`(UD zPjg>d^Ov8wDW>!pM}ak8@~MEX3h1Ih7X@+{kTdKtfXQ`npo;@tk;#oA2YdwJBLE)( z_z1v90zMM(k${f`d`Nr-n9}}Y1)s>2_E*WL0(>gKrviK^;6ni)3iwdKhXFne@L_-t z1AI8(!vP--_;A2S06qfn5rB^Xd?er_0UrtY$b`?NQ;qgs_h0Alri6c02TeX6>Q=9< z+WOBMTkFm8UN_zH;d?)c%-xw$wGDqG&c9jHY1{v&U`iIJP+=Rh+vyDvTh%xnPV_%I zO_(>`kn--F;yQa=>!oYd>N1V*RkI~>WxO|sMEImLCv8V>$gNt}?T(1nSicV;A+HS% z_Na&Y_vd<}?w8)GZez@|t9k72#S`Vi?Nzw6sS649ZtpMKhr+ji7KWLqt^1#K&Kz&6 zyLEIQ3jb+zCw03#siyhcvd7;JZJ(YkrLAtm&t1RRZ@A>wALN%KWXQ$&+3O~ pz9_H0YwK#$hTG~d@*Do!p&DTo007m+Tf6`O diff --git a/src/main/resources/data/surviving_the_aftermath/structures/wagon_cargo3.nbt b/src/main/resources/data/surviving_the_aftermath/structures/wagon_cargo3.nbt deleted file mode 100644 index 794912d8e2d3a5d422093f7d4f9531a9d5981874..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 703 zcmV;w0zmyAiwFP!00000|Gk*qZqqOrh8_R)k4YQ=65>uc<`{9rY2|iq8!e3^+f@a3 zz+K~Pa~j&(ekp8~vT4hc_kHrkN!QH@nGx>lpPCUu`fU<6-fuH9)vd36tsUuKGa^@w zSwFaW_@SE-))^NMs^Z3oa9(-+e8e?|W*7?OP#}i^ISk0*08>S$f-}mL&a1=>uMtxv zmICnB$0H31;lW6U^90B$%;}yt3v? z^NCDuK9R}ICo;MD2*4*YW1mTap#YQfk$_KR#y-;oGxnJ!n4HgJPr)ZLW1o3~p#W35 z-_Ly(31*!0Ch?rl^3ZN@8xo5bz;&W|1mwY7PBLN=? z_>kvoUt06$@3|?a^d3inHDB_nfUXMYqCgh~au|>^++zTf>*7Ec2f8AYn;{2$1mGh8 z9|8CXz()c;67Z3Lj|6;3{0=as`->HPB2&7*Ng%hG5&6?N;9tu~CiF;XwbR(}a1` z4Jq$WDXz1JwO+bLtWh!5;Kb z|KU_`)WgzS)!iF&aW+r=y?CNrxSa~8HgzGP-tPQ)`%w7q&%!YO+PeQ)=gi@@x?89F zSolxVoz(5}sG8<)%bxZQZJ#cd(nh!8>$YFwH=Oe85BVil(T$gtAGPz>ujz9_H0YwK#$hKK1d@*4)!`=eJC008S!TT}o5 diff --git a/src/main/resources/data/surviving_the_aftermath/structures/wagon_cargo4.nbt b/src/main/resources/data/surviving_the_aftermath/structures/wagon_cargo4.nbt deleted file mode 100644 index 5fc8c8c10428790467f3a94092247e76ed0b3bbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 703 zcmV;w0zmyAiwFP!00000|Gk*oZqqOTh8>@JVi!n&gm@FKxkg-ZTe+RvMor_$c2&U} z@YXonoQAHpe+pZrtlIMB|G)TqM6MdM z-n)7DrkfGg85b|A;=zb;UU~g=#WjXz7z*T2Acp}t49MXCQ$?qOGs=|itHcbi5mP0Y z3ScO}unbcHK9L#w&;&yPCg(!|pUC8VB9rrpOwMN*#}UI4%-Dw~n6ZyYFk>HiWzCny zCo;M5iA-*MB9j{*0r*5_>@!I)6ku{b67Y%4*k_tx#y+zIlk<7#DfmQY>@!a=6ktmG z{nBTVV8%Ib63_Wu4h3=;ki&o+4&+28_gv*bmjLEe09}#EJ;TKnpKI&6Wxkt2$`%_E5Ka zZPmtq?v96UU$-Qlx;vjzwGF=-&c9jHY1{vUU`iIJkZc>X-RgTHHmY$tTKWXQ$&+5l#z9_H0YwK#$hNtN-@*4^KZfIB)006CGQXT*R diff --git a/src/main/resources/data/surviving_the_aftermath/structures/wagon_cargo5.nbt b/src/main/resources/data/surviving_the_aftermath/structures/wagon_cargo5.nbt deleted file mode 100644 index 60a0ffb2c7e52c6e928a17450f0a11f0bde986ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 712 zcmV;(0yq61iwFP!00000|Gk*oZrU&ah8>?cbiLX^n)W8U-u1Mr-6BH`L=ACd8!`3< zd+RxE9WsjTe{3yMTDAG||6hCvrE@}NguD8uW`vObn1qA($BayM>uXI=OcrYTIS6)9|afzWBh5|Vh$YDSZ19CXPRMDy6j54MBDlx-r#8e5U z0vHM~EW=cQPh`eEG{I1S$@x&gCo(yo$mDz?lk*wIam26$Gxp&LX6z#p%-Ba>So5Xv ziA-*MB9j}R$mGUH06vi!`%DrH1(=+V1biYh_L(M_vCk~Qb5l&|J&povzT{H@T@}zpfi4QA8jrMS-SS9;+ZwLDMbTh*+ITpI7qE)hQI%t71HFXURS>UKj!Ypmaf zkdW5~2fNop{fAS%QTGdPRd;91v%7ih@5K}4!fjQ!wW$jU^=9kO+lRt;e-?(Rsjd5; zbAL))ikOKGj!@O9I#{wr?z^#}PSR?(Hy$`9K4 u%d`6N**NF7%?oVX*HXx=?Ti8=H(!)j-?eqMX~T2&7x@hil;l8i6#xKB_g^Cb diff --git a/src/main/resources/data/surviving_the_aftermath/structures/wagon_cargo6.nbt b/src/main/resources/data/surviving_the_aftermath/structures/wagon_cargo6.nbt deleted file mode 100644 index e70716b9ceae21357872c801b3bc93b64ebaa2ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 706 zcmV;z0zLg7iwFP!00000|Gk*oZrU&ah8>?ct#{j`ZEv#cT~E8(Ei%+V)DTCu5!&8h zZ#{?BA*0y-$JQdH2>Rv!zxWVJ=Y-4%clA%r2qFD32?y_w8JX(V*S^+{^p6>ltH!J! z+&sMKW`uRd#gnRdFe02+UO%02jiDKa0yz}OVL%Q8ayY?0D)*hgMj^QG~L zOm2K4lN+DN+DpU8}T<_U%ZOliMg z`YaO6IOk2`KA+2>Kn??P7?8t(oXF(vs~qSOz?=%8D>AuzxVYkTZ9SKKB;X?f9|`!7 zr@1e!`ODAT6jS<)qrjRk`BXqx1$0rMivl?e$Qkw+z~s6((8YnS$mGV513m)q5rB^X zd<5Vl0UrtYNWez|J|sQ^Olg0yf=^^h`>W(r0X`MrQvp5{@S%VY1$-#r!vG%!_%OhS z0X`h?;eZbZd^q4E03QMP2*5`GJ`(VefR6-xWWs0CsYZLR`>*qNQ^LQhy(S;`b*tA_ zZTx4ej?1;_I&GJy@BJh)cV|Y`HvEk^|7K0V`u`M6$>JC)Y-6@teNV(jHBN^U{f|x) z=1n)GygR43&K}l!=^C}VOyfJ%Y=~SL@6A3DKIzO++tC|xqt