From 94c3676dead6ad772d1de5dfd6b4750f07af2098 Mon Sep 17 00:00:00 2001 From: craisinlord Date: Mon, 27 Jul 2026 23:18:45 -0500 Subject: [PATCH] WIP 1.20.1 port 1.0.3 update 2 new squirrel anims --- fabric-1.20.1/build.gradle | 144 ++ fabric-1.20.1/gradle.properties | 30 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59536 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + fabric-1.20.1/gradlew | 234 +++ fabric-1.20.1/gradlew.bat | 89 + fabric-1.20.1/settings.gradle | 8 + .../fabric/AntarchyConfigModuleFabric.java | 293 ++++ .../antarchy/fabric/AntarchyFabric.java | 328 ++++ .../fabric/AntarchyFabricContent.java | 468 +++++ .../AntarchyFabricDispenserBehaviors.java | 69 + .../antarchy/fabric/AntarchyFabricEvents.java | 289 ++++ .../antarchy/fabric/AntarchyWoodTypes.java | 18 + .../antarchy/fabric/BloodglassManager.java | 236 +++ .../antarchy/fabric/FabricInfinityCompat.java | 47 + .../fabric/client/AntarchyFabricClient.java | 14 + .../client/AntarchyFabricClientBootstrap.java | 507 ++++++ .../fabric/client/AntarchyKeyBindings.java | 65 + .../fabric/client/BigBerthaClientHandler.java | 39 + .../BloodCrystalKatanaTrailClientState.java | 42 + .../BloodCrystalKatanaTrailHandler.java | 203 +++ .../fabric/client/BloodglassHudRenderer.java | 64 + .../client/BrutalflyElytraClientHandler.java | 73 + .../client/BrutalflyElytraHudRenderer.java | 46 + .../fabric/client/BrutalflyElytraModel.java | 62 + .../client/DiamondMinecartClientHandler.java | 42 + .../client/DorrieJumpClientHandler.java | 58 + .../fabric/client/DorrieJumpHudRenderer.java | 45 + .../fabric/client/DreadClientHandler.java | 385 +++++ .../fabric/client/DreadHudRenderer.java | 34 + .../fabric/client/ElythiaFireflyManager.java | 85 + .../FallenKingCrownArmorStandLayer.java | 47 + .../fabric/client/FallenKingCrownLayer.java | 59 + .../client/GravityGunClientHandler.java | 61 + .../HerculesBeetleChargeHudRenderer.java | 50 + .../client/HerculesBeetleClientHandler.java | 68 + .../InvertedGeyserEruptionParticle.java | 79 + .../client/JumpyBootsClientHandler.java | 95 ++ .../fabric/client/JumpyBootsHudRenderer.java | 49 + .../client/KeybindingConflictFixStore.java | 40 + .../fabric/client/LucidSoundHandler.java | 227 +++ .../fabric/client/MogglesClientRenderer.java | 54 + .../fabric/client/ParalyzedClientHandler.java | 89 + .../fabric/client/ParalyzedHudRenderer.java | 49 + .../fabric/client/ReverieTrailHandler.java | 253 +++ .../ScorpionWhipTetherRenderHandler.java | 141 ++ .../fabric/client/StinkySoundHandler.java | 50 + .../fabric/client/TriffidGooHudRenderer.java | 47 + .../MultipartClientPartLevelRegistry.java | 37 + .../renderer/MultipartPartRenderer.java | 26 + .../fabric/content/fluid/AntiwaterFluid.java | 445 +++++ .../content/fluid/AntiwaterLiquidBlock.java | 61 + .../fabric/content/fluid/SimpleFluid.java | 171 ++ .../FabricKrakenMultipartLayout.java | 65 + .../entity/multipart/MultipartPartEntity.java | 199 +++ .../MultipartServerPartLevelRegistry.java | 37 + .../fabric/item/DeferredSpawnEggItem.java | 13 + .../fabric/mixin/AntimetalInversionMixin.java | 81 + .../mixin/AntiwaterItemEntityMixin.java | 50 + .../mixin/AntiwaterLivingEntityMixin.java | 110 ++ .../fabric/mixin/BloodglassEffectMixin.java | 33 + .../fabric/mixin/BloodglassEquipMixin.java | 23 + .../fabric/mixin/BloodglassRespawnMixin.java | 17 + .../mixin/DreamCampfireBlockEntityMixin.java | 29 + .../fabric/mixin/DreamSandMovementMixin.java | 113 ++ .../fabric/mixin/ElytraFallFlyingMixin.java | 27 + .../fabric/mixin/ElytraStartFlyingMixin.java | 32 + .../mixin/JumpyBootsFallDamageMixin.java | 46 + .../mixin/LivingEntityJumpingAccessor.java | 11 + .../mixin/WaterlikeFluidItemEntityMixin.java | 29 + .../WaterlikeFluidLivingEntityMixin.java | 64 + .../fabric/mixin/WoodTypeInvoker.java | 13 + .../client/BloodglassChatOrderMixin.java | 17 + .../BrutalflyElytraExperienceBarMixin.java | 21 + .../fabric/mixin/client/CameraShakeMixin.java | 50 + .../mixin/client/CrossbowArmPoseMixin.java | 37 + .../mixin/client/DuctTapeInputMixin.java | 30 + .../client/GravityGunMouseScrollMixin.java | 18 + .../client/KeybindingConflictFixMixin.java | 68 + .../fabric/mixin/client/LiquidFogMixin.java | 89 + .../client/MultipartClientSpawnMixin.java | 20 + .../MultipartEntityLevelRegistryMixin.java | 34 + .../MultipartEntityLevelRegistryMixin.java | 37 + .../mixin/infinity/PortalCreatorMixin.java | 39 + .../AntarchyFabricClientNetworking.java | 88 + .../network/AntarchyFabricNetworking.java | 405 +++++ .../fabric/registry/AntarchyFabricBlocks.java | 1192 +++++++++++++ .../AntarchyFabricCreativeModeTabs.java | 53 + .../registry/AntarchyFabricEntities.java | 523 ++++++ .../AntarchyFabricEntityAttributes.java | 128 ++ .../fabric/registry/AntarchyFabricItems.java | 1500 +++++++++++++++++ .../fabric/registry/AntarchyFabricMisc.java | 901 ++++++++++ .../fabric/registry/AntarchyFabricSounds.java | 469 ++++++ .../AntarchyFabricSpawnPlacements.java | 75 + .../fabric/registry/DeferredBlock.java | 11 + .../fabric/registry/DeferredHolder.java | 37 + .../fabric/registry/DeferredItem.java | 11 + .../fabric/registry/DeferredRegister.java | 121 ++ .../fabric/util/CustomFluidPhysicsChecks.java | 91 + .../fabric/util/JumpyBootsFabricHelper.java | 19 + .../resources/antarchy-fabric.mixins.json | 14 + .../src/main/resources/fabric.mod.json | 36 + forge-1.20.1/build.gradle | 166 ++ forge-1.20.1/gradle.properties | 29 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59536 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + forge-1.20.1/gradlew | 234 +++ forge-1.20.1/gradlew.bat | 89 + forge-1.20.1/settings.gradle | 10 + .../forge/AntarchyConfigModuleForge.java | 426 +++++ .../antarchy/forge/AntarchyForge.java | 408 +++++ .../forge/AntarchyForgeFluidTypes.java | 277 +++ .../antarchy/forge/AntarchyMiscConfig.java | 192 +++ .../antarchy/forge/AntarchyMobsConfig.java | 789 +++++++++ .../antarchy/forge/AntarchyToolsConfig.java | 702 ++++++++ .../antarchy/forge/AntarchyWoodTypes.java | 17 + .../antarchy/forge/ForgeInfinityCompat.java | 37 + .../forge/client/AntarchyForgeClient.java | 489 ++++++ .../forge/client/AntarchyKeyBindings.java | 62 + .../forge/client/BigBerthaClientHandler.java | 44 + .../BloodCrystalKatanaTrailHandler.java | 210 +++ .../client/BrutalflyElytraClientHandler.java | 87 + .../client/BrutalflyElytraHudRenderer.java | 45 + .../forge/client/CameraShakeHandler.java | 49 + .../client/DiamondMinecartClientHandler.java | 51 + .../forge/client/DorrieJumpClientHandler.java | 65 + .../forge/client/DorrieJumpHudRenderer.java | 44 + .../forge/client/DreadClientHandler.java | 392 +++++ .../forge/client/DreadHudRenderer.java | 28 + .../forge/client/DuctTapeClientHandler.java | 39 + .../forge/client/ElythiaFireflyManager.java | 91 + .../FallenKingCrownArmorStandLayer.java | 46 + .../forge/client/FallenKingCrownLayer.java | 58 + .../client/GravityCameraRollHandler.java | 30 + .../forge/client/GravityGunClientHandler.java | 67 + .../HerculesBeetleChargeHudRenderer.java | 47 + .../client/HerculesBeetleClientHandler.java | 84 + .../InvertedGeyserEruptionParticle.java | 77 + .../forge/client/JumpyBootsClientHandler.java | 117 ++ .../forge/client/JumpyBootsHudRenderer.java | 48 + .../forge/client/LucidSoundHandler.java | 292 ++++ .../forge/client/MogglesClientRenderer.java | 63 + .../forge/client/ParalyzedClientHandler.java | 96 ++ .../forge/client/ParalyzedHudRenderer.java | 44 + .../client/ParalyzedStoneRenderHandler.java | 18 + .../forge/client/ReverieTrailHandler.java | 282 ++++ .../ScorpionWhipTetherRenderHandler.java | 151 ++ .../forge/client/StinkySoundHandler.java | 56 + .../client/ThoraxisGravityCameraHandler.java | 18 + .../forge/client/TriffidGooHudRenderer.java | 45 + .../forge/client/WaspSoundHandler.java | 121 ++ .../forge/content/block/WildCornBlock.java | 55 + .../forge/content/fluid/AntiwaterFluid.java | 463 +++++ .../content/fluid/AntiwaterFluidType.java | 76 + .../entity/multipart/MultipartPartEntity.java | 195 +++ .../multipart/MultipartPartLevelRegistry.java | 64 + .../client/LiquidBlockRendererMixin.java | 39 + .../entity/MultipartEntityBridgeMixin.java | 56 + .../MultipartEntityLevelRegistryMixin.java | 34 + .../entity/ParalyzedMobFreezeMixin.java | 25 + .../infinity/ConfigGenInvocationMixin.java | 37 + .../item/BucketItemThoraxisWaterMixin.java | 83 + .../ClientLevelPartEntitiesAccessor.java | 16 + .../level/LevelStemDiagnosticMixin.java | 24 + .../ServerLevelPartEntitiesAccessor.java | 16 + .../network/AntarchyForgeNetworkCore.java | 81 + .../network/AntarchyGravityNetworking.java | 116 ++ .../network/BrutalflyElytraNetworking.java | 78 + .../forge/network/DorrieJumpNetworking.java | 29 + .../network/HerculesBeetleNetworking.java | 55 + .../forge/network/JumpyBootsNetworking.java | 76 + .../forge/network/MultipartNetworking.java | 78 + .../network/ThoraxisWeatherNetworking.java | 59 + .../forge/registry/AntarchyForgeBlocks.java | 673 ++++++++ .../AntarchyForgeCreativeModeTabs.java | 61 + .../forge/registry/AntarchyForgeEntites.java | 416 +++++ .../AntarchyForgeEntityAttributes.java | 98 ++ .../forge/registry/AntarchyForgeEvents.java | 1304 ++++++++++++++ .../forge/registry/AntarchyForgeItems.java | 1012 +++++++++++ .../forge/registry/AntarchyForgeMisc.java | 410 +++++ .../AntarchyForgePayloadHandlers.java | 43 + .../forge/registry/AntarchyForgeSounds.java | 188 +++ .../AntarchyForgeSpawnPlacements.java | 63 + .../registry/AntarchyGeoItemExtensions.java | 59 + .../forge/registry/DeferredRegister.java | 78 + .../forge/worldgen/CornPatchFeature.java | 62 + .../forge/worldgen/LumenLilyPadFeature.java | 52 + .../src/main/resources/META-INF/mods.toml | 30 + .../main/resources/antarchy-forge.mixins.json | 23 + 189 files changed, 26514 insertions(+) create mode 100644 fabric-1.20.1/build.gradle create mode 100644 fabric-1.20.1/gradle.properties create mode 100644 fabric-1.20.1/gradle/wrapper/gradle-wrapper.jar create mode 100644 fabric-1.20.1/gradle/wrapper/gradle-wrapper.properties create mode 100644 fabric-1.20.1/gradlew create mode 100644 fabric-1.20.1/gradlew.bat create mode 100644 fabric-1.20.1/settings.gradle create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyConfigModuleFabric.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabric.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricContent.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricDispenserBehaviors.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricEvents.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyWoodTypes.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/BloodglassManager.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/FabricInfinityCompat.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClient.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClientBootstrap.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyKeyBindings.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BigBerthaClientHandler.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BloodCrystalKatanaTrailClientState.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BloodCrystalKatanaTrailHandler.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BloodglassHudRenderer.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BrutalflyElytraClientHandler.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BrutalflyElytraHudRenderer.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BrutalflyElytraModel.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/DiamondMinecartClientHandler.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/DorrieJumpClientHandler.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/DorrieJumpHudRenderer.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/DreadClientHandler.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/DreadHudRenderer.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/ElythiaFireflyManager.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/FallenKingCrownArmorStandLayer.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/FallenKingCrownLayer.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/GravityGunClientHandler.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/HerculesBeetleChargeHudRenderer.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/HerculesBeetleClientHandler.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/InvertedGeyserEruptionParticle.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/JumpyBootsClientHandler.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/JumpyBootsHudRenderer.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/KeybindingConflictFixStore.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/LucidSoundHandler.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/MogglesClientRenderer.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/ParalyzedClientHandler.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/ParalyzedHudRenderer.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/ReverieTrailHandler.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/ScorpionWhipTetherRenderHandler.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/StinkySoundHandler.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/TriffidGooHudRenderer.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/multipart/MultipartClientPartLevelRegistry.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/renderer/MultipartPartRenderer.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/content/fluid/AntiwaterFluid.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/content/fluid/AntiwaterLiquidBlock.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/content/fluid/SimpleFluid.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/entity/multipart/FabricKrakenMultipartLayout.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/entity/multipart/MultipartPartEntity.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/entity/multipart/MultipartServerPartLevelRegistry.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/item/DeferredSpawnEggItem.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/AntimetalInversionMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/AntiwaterItemEntityMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/AntiwaterLivingEntityMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/BloodglassEffectMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/BloodglassEquipMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/BloodglassRespawnMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/DreamCampfireBlockEntityMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/DreamSandMovementMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/ElytraFallFlyingMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/ElytraStartFlyingMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/JumpyBootsFallDamageMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/LivingEntityJumpingAccessor.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/WaterlikeFluidItemEntityMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/WaterlikeFluidLivingEntityMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/WoodTypeInvoker.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/BloodglassChatOrderMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/BrutalflyElytraExperienceBarMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/CameraShakeMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/CrossbowArmPoseMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/DuctTapeInputMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/GravityGunMouseScrollMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/KeybindingConflictFixMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/LiquidFogMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/MultipartClientSpawnMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/MultipartEntityLevelRegistryMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/entity/MultipartEntityLevelRegistryMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/infinity/PortalCreatorMixin.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricClientNetworking.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricNetworking.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricBlocks.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricCreativeModeTabs.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricEntities.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricEntityAttributes.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricItems.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricMisc.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricSounds.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricSpawnPlacements.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/DeferredBlock.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/DeferredHolder.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/DeferredItem.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/DeferredRegister.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/util/CustomFluidPhysicsChecks.java create mode 100644 fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/util/JumpyBootsFabricHelper.java create mode 100644 fabric-1.20.1/src/main/resources/antarchy-fabric.mixins.json create mode 100644 fabric-1.20.1/src/main/resources/fabric.mod.json create mode 100644 forge-1.20.1/build.gradle create mode 100644 forge-1.20.1/gradle.properties create mode 100644 forge-1.20.1/gradle/wrapper/gradle-wrapper.jar create mode 100644 forge-1.20.1/gradle/wrapper/gradle-wrapper.properties create mode 100644 forge-1.20.1/gradlew create mode 100644 forge-1.20.1/gradlew.bat create mode 100644 forge-1.20.1/settings.gradle create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyConfigModuleForge.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyForge.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyForgeFluidTypes.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyMiscConfig.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyMobsConfig.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyToolsConfig.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyWoodTypes.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/ForgeInfinityCompat.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/AntarchyForgeClient.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/AntarchyKeyBindings.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/BigBerthaClientHandler.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/BloodCrystalKatanaTrailHandler.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/BrutalflyElytraClientHandler.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/BrutalflyElytraHudRenderer.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/CameraShakeHandler.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DiamondMinecartClientHandler.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DorrieJumpClientHandler.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DorrieJumpHudRenderer.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DreadClientHandler.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DreadHudRenderer.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DuctTapeClientHandler.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ElythiaFireflyManager.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/FallenKingCrownArmorStandLayer.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/FallenKingCrownLayer.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/GravityCameraRollHandler.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/GravityGunClientHandler.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/HerculesBeetleChargeHudRenderer.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/HerculesBeetleClientHandler.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/InvertedGeyserEruptionParticle.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/JumpyBootsClientHandler.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/JumpyBootsHudRenderer.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/LucidSoundHandler.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/MogglesClientRenderer.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ParalyzedClientHandler.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ParalyzedHudRenderer.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ParalyzedStoneRenderHandler.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ReverieTrailHandler.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ScorpionWhipTetherRenderHandler.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/StinkySoundHandler.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ThoraxisGravityCameraHandler.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/TriffidGooHudRenderer.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/WaspSoundHandler.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/content/block/WildCornBlock.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/content/fluid/AntiwaterFluid.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/content/fluid/AntiwaterFluidType.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/entity/multipart/MultipartPartEntity.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/entity/multipart/MultipartPartLevelRegistry.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/client/LiquidBlockRendererMixin.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/entity/MultipartEntityBridgeMixin.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/entity/MultipartEntityLevelRegistryMixin.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/entity/ParalyzedMobFreezeMixin.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/infinity/ConfigGenInvocationMixin.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/item/BucketItemThoraxisWaterMixin.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/level/ClientLevelPartEntitiesAccessor.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/level/LevelStemDiagnosticMixin.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/level/ServerLevelPartEntitiesAccessor.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/AntarchyForgeNetworkCore.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/AntarchyGravityNetworking.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/BrutalflyElytraNetworking.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/DorrieJumpNetworking.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/HerculesBeetleNetworking.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/JumpyBootsNetworking.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/MultipartNetworking.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/ThoraxisWeatherNetworking.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeBlocks.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeCreativeModeTabs.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeEntites.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeEntityAttributes.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeEvents.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeItems.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeMisc.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgePayloadHandlers.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeSounds.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeSpawnPlacements.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyGeoItemExtensions.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/DeferredRegister.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/worldgen/CornPatchFeature.java create mode 100644 forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/worldgen/LumenLilyPadFeature.java create mode 100644 forge-1.20.1/src/main/resources/META-INF/mods.toml create mode 100644 forge-1.20.1/src/main/resources/antarchy-forge.mixins.json diff --git a/fabric-1.20.1/build.gradle b/fabric-1.20.1/build.gradle new file mode 100644 index 00000000..c9e7f992 --- /dev/null +++ b/fabric-1.20.1/build.gradle @@ -0,0 +1,144 @@ +plugins { + id 'net.fabricmc.fabric-loom-remap' version '1.15.5' + id 'maven-publish' +} + +group = mod_group_id +version = "${mod_version}+${project.name}" + +base { + archivesName = "${mod_id}-fabric-1.20.1" +} + +repositories { + maven { url "https://maven.fabricmc.net/" } + mavenCentral() + maven { url "https://www.cursemaven.com" } + maven { url "https://maven.blamejared.com" } + maven { url "https://repo.spongepowered.org/repository/maven-public/" } + maven { url "https://jitpack.io" } + exclusiveContent { + forRepository { + maven { + name = "GeckoLib" + url = "https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/" + } + } + filter { + includeGroup("software.bernie.geckolib") + includeGroup("com.eliotlash.mclib") + } + } +} + +// Handle duplicates from common-1.20.1's resources +tasks.withType(AbstractCopyTask).configureEach { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} + +java { + toolchain { languageVersion = JavaLanguageVersion.of(17) } + withSourcesJar() +} + +// Add common-1.20.1's sources directly. Path is relative because fabric-1.20.1 is its +// own standalone Gradle build (Fabric Loom can't configure two different-Minecraft-version +// loom projects in the same Gradle invocation) — there is no `:common-1.20.1` project here. +sourceSets { + main { + java { + srcDirs += file('../common-1.20.1/src/main/java') + } + resources { + srcDirs += file('../common-1.20.1/src/main/resources') + } + } +} + +dependencies { + minecraft "com.mojang:minecraft:${minecraft_version}" + mappings loom.officialMojangMappings() + + modImplementation "net.fabricmc:fabric-loader:${fabric_loader_version}" + modApi "net.fabricmc.fabric-api:fabric-api:${fabric_api_version}" + + modImplementation "software.bernie.geckolib:geckolib-fabric-${minecraft_version}:${geckolib_version}" + + modCompileOnly("curse.maven:sizeable_foliage-${sizeable_foliage_curseforge_id}:${sizeable_foliage_curseforge_file_id_fabric}") + modLocalRuntime("curse.maven:sizeable_foliage-${sizeable_foliage_curseforge_id}:${sizeable_foliage_curseforge_file_id_fabric}") + + modCompileOnly("curse.maven:intapi-${intapi_curseforge_id}:${intapi_curseforge_file_id_fabric}") + modLocalRuntime("curse.maven:intapi-${intapi_curseforge_id}:${intapi_curseforge_file_id_fabric}") + + modCompileOnly("curse.maven:pehkui-${pehkui_curseforge_id}:${pehkui_curseforge_file_id_fabric}") + modLocalRuntime("curse.maven:pehkui-${pehkui_curseforge_id}:${pehkui_curseforge_file_id_fabric}") + + modCompileOnly(files("$rootDir/../infinite_dimensions_jars/infinity-2.7.2+1.20.1-fabric.jar")) + modLocalRuntime(files("$rootDir/../infinite_dimensions_jars/infinity-2.7.2+1.20.1-fabric.jar")) + + compileOnly "mezz.jei:jei-${minecraft_version}-common-api:${jei_version}" + compileOnly "mezz.jei:jei-${minecraft_version}-fabric-api:${jei_version}" + modLocalRuntime "mezz.jei:jei-${minecraft_version}-fabric:${jei_version}" + + annotationProcessor "org.spongepowered:mixin:0.8.7:processor" +} + +loom { + mixin { + useLegacyMixinAp = true + defaultRefmapName = "antarchy.mixins.refmap.json" + } +} + +tasks.named('processResources', ProcessResources).configure { + var replaceProperties = [ + version : project.version, + minecraft_version : minecraft_version, + fabric_loader_version: fabric_loader_version, + mod_id : mod_id, + mod_name : mod_name, + mod_description : mod_description, + mod_author : mod_author, + license : license, + homepage_url : homepage_url, + issues_url : issues_url, + sources_url : sources_url, + logo_fabric : logo_fabric + ] + inputs.properties replaceProperties + + filesMatching('fabric.mod.json') { + expand replaceProperties + } +} + +// common-1.20.1's mixins.json ships refmap-free — inject the refmap key into fabric's +// own copy after copying (matches the fabric-1.21.1 / neoforge-1.21.1 convention). +tasks.named('processResources', ProcessResources).configure { + doLast { + var commonMixinConfig = new File(destinationDir, 'antarchy-common.mixins.json') + var json = new groovy.json.JsonSlurper().parse(commonMixinConfig) + json.put('refmap', 'antarchy.mixins.refmap.json') + commonMixinConfig.text = groovy.json.JsonOutput.prettyPrint(groovy.json.JsonOutput.toJson(json)) + } +} + +publishing { + publications { + mavenJava(MavenPublication) { + groupId = project.group + artifactId = project.base.archivesName.get() + version = project.version + + artifact(project.tasks.named('remapJar')) + artifact(project.tasks.named('remapSourcesJar')) { + classifier = 'sources' + } + + pom { + name = "${mod_name} (Fabric 1.20.1)" + description = mod_description + } + } + } +} diff --git a/fabric-1.20.1/gradle.properties b/fabric-1.20.1/gradle.properties new file mode 100644 index 00000000..26bbd254 --- /dev/null +++ b/fabric-1.20.1/gradle.properties @@ -0,0 +1,30 @@ +org.gradle.jvmargs=-Xmx4G +org.gradle.java.home=C:/Program Files/Java/jdk-21.0.10 + +mod_id=antarchy +mod_name=Antarchy +mod_description=ANTS! ANTS! ANTS! ANTS! +mod_author=CraisinLord +mod_group_id=com.craisinlord +mod_version=1.0.2 +license=All Rights Reserved +homepage_url=https://www.curseforge.com/minecraft/mc-mods/antarchy +issues_url= +sources_url= +logo_fabric=assets/antarchy/antarchy_logo.png + +minecraft_version=1.20.1 +fabric_loader_version=0.15.6 +fabric_api_version=0.92.0+1.20.1 + +jei_version=15.20.0.104 +geckolib_version=4.8.4 + +sizeable_foliage_curseforge_id=1601832 +sizeable_foliage_curseforge_file_id_fabric=8468698 + +intapi_curseforge_id=817709 +intapi_curseforge_file_id_fabric=7921667 + +pehkui_curseforge_id=319596 +pehkui_curseforge_file_id_fabric=5419266 diff --git a/fabric-1.20.1/gradle/wrapper/gradle-wrapper.jar b/fabric-1.20.1/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7454180f2ae8848c63b8b4dea2cb829da983f2fa GIT binary patch literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL literal 0 HcmV?d00001 diff --git a/fabric-1.20.1/gradle/wrapper/gradle-wrapper.properties b/fabric-1.20.1/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..c61a118f --- /dev/null +++ b/fabric-1.20.1/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/fabric-1.20.1/gradlew b/fabric-1.20.1/gradlew new file mode 100644 index 00000000..c53aefaa --- /dev/null +++ b/fabric-1.20.1/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/fabric-1.20.1/gradlew.bat b/fabric-1.20.1/gradlew.bat new file mode 100644 index 00000000..107acd32 --- /dev/null +++ b/fabric-1.20.1/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/fabric-1.20.1/settings.gradle b/fabric-1.20.1/settings.gradle new file mode 100644 index 00000000..340ad678 --- /dev/null +++ b/fabric-1.20.1/settings.gradle @@ -0,0 +1,8 @@ +pluginManagement { + repositories { + maven { url "https://maven.fabricmc.net/" } + gradlePluginPortal() + } +} + +rootProject.name = 'fabric-1.20.1' diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyConfigModuleFabric.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyConfigModuleFabric.java new file mode 100644 index 00000000..8b30b89f --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyConfigModuleFabric.java @@ -0,0 +1,293 @@ +package com.craisinlord.antarchy.fabric; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.config.ConfigResetGuard; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.JsonParser; +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.resources.ResourceKey; + +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.Map; + +public final class AntarchyConfigModuleFabric { + private static final Gson GSON = new GsonBuilder().disableHtmlEscaping().setPrettyPrinting().create(); + private static final Path CONFIG_DIR = FabricLoader.getInstance() + .getConfigDir() + .resolve(Antarchy.MODID); + private static final Path LEGACY_CONFIG_PATH = CONFIG_DIR.resolve("antarchy.json"); + private static final Map SETTINGS = buildBindings(); + + private AntarchyConfigModuleFabric() { + } + + public static void init() { + ConfigResetGuard.wipeIfNeeded( + CONFIG_DIR, + ConfigSection.MOBS.path, + ConfigSection.TOOLS.path, + ConfigSection.MISC.path, + LEGACY_CONFIG_PATH + ); + JsonObject legacy = readConfig(LEGACY_CONFIG_PATH); + Map loaded = new LinkedHashMap<>(); + Map normalized = new LinkedHashMap<>(); + + for (ConfigSection section : ConfigSection.values()) { + loaded.put(section, readConfig(section.path)); + normalized.put(section, new JsonObject()); + } + + for (Map.Entry entry : SETTINGS.entrySet()) { + String key = entry.getKey(); + SettingBinding binding = entry.getValue(); + JsonObject loadedSection = loaded.get(binding.section); + JsonElement element = loadedSection != null ? loadedSection.get(key) : null; + if (element == null && legacy != null) { + element = legacy.get(key); + } + Object value = binding.readValue(element); + binding.apply(value); + normalized.get(binding.section).add(key, binding.toJson(value)); + } + + for (Map.Entry entry : normalized.entrySet()) { + writeConfig(entry.getKey().path, entry.getValue()); + } + } + + private static JsonObject readConfig(Path path) { + if (!Files.exists(path)) { + return null; + } + + try (Reader reader = Files.newBufferedReader(path)) { + JsonElement parsed = JsonParser.parseReader(reader); + if (parsed.isJsonObject()) { + return parsed.getAsJsonObject(); + } + Antarchy.LOGGER.warn("Fabric config at {} is not a JSON object, using defaults", path); + } catch (IOException | JsonParseException e) { + Antarchy.LOGGER.warn("Failed to read Fabric config at {}, using defaults", path, e); + } + + return null; + } + + private static void writeConfig(Path path, JsonObject root) { + try { + Files.createDirectories(path.getParent()); + try (Writer writer = Files.newBufferedWriter(path)) { + GSON.toJson(root, writer); + } + } catch (IOException e) { + Antarchy.LOGGER.warn("Failed to write Fabric config at {}", path, e); + } + } + + private static Map buildBindings() { + Map getters = new LinkedHashMap<>(); + for (Method method : AntarchySettings.class.getMethods()) { + if (!isPublicStatic(method) || method.getParameterCount() != 0 || method.getReturnType() == Void.TYPE) { + continue; + } + getters.put(method.getName(), method); + } + + return Arrays.stream(AntarchySettings.class.getMethods()) + .filter(AntarchyConfigModuleFabric::isPublicStatic) + .filter(method -> method.getName().startsWith("set")) + .filter(method -> method.getParameterCount() == 1) + .sorted(Comparator.comparing(Method::getName)) + .collect(LinkedHashMap::new, (bindings, setter) -> { + String propertyName = decapitalize(setter.getName().substring(3)); + Method getter = getters.get(propertyName); + if (getter == null) { + return; + } + if (!isSupported(setter.getParameterTypes()[0], getter.getReturnType())) { + return; + } + bindings.put(propertyName, new SettingBinding(propertyName, getter, setter, ConfigSection.forProperty(propertyName))); + }, Map::putAll); + } + + private static boolean isPublicStatic(Method method) { + int modifiers = method.getModifiers(); + return java.lang.reflect.Modifier.isPublic(modifiers) && java.lang.reflect.Modifier.isStatic(modifiers); + } + + private static boolean isSupported(Class setterType, Class getterType) { + if (setterType == boolean.class || setterType == int.class || setterType == double.class || setterType == float.class) { + return getterType == setterType; + } + return setterType == String.class && ResourceKey.class.isAssignableFrom(getterType); + } + + private static String decapitalize(String value) { + if (value.isEmpty()) { + return value; + } + return Character.toLowerCase(value.charAt(0)) + value.substring(1); + } + + private enum ConfigSection { + MOBS("antarchy_mobs.json"), + TOOLS("antarchy_tools.json"), + MISC("antarchy_misc.json"); + + private final Path path; + + ConfigSection(String fileName) { + this.path = CONFIG_DIR.resolve(fileName); + } + + private static ConfigSection forProperty(String name) { + if (isMiscSetting(name)) { + return MISC; + } + if (isToolSetting(name)) { + return TOOLS; + } + return MOBS; + } + + private static boolean isMiscSetting(String name) { + return name.equals("disableInfinityBookPortalCreation") + || name.equals("rainbowAntsLeadToInfinityDimensions") + || name.equals("permanentPortalsEnabled") + || name.equals("permanentPortalsFlintAndSteelEnabled") + || name.equals("elythiaPortalEnabled") + || name.equals("thoraxisPortalEnabled") + || name.equals("cavarynPortalEnabled") + || name.equals("hushweedSporeLifetimeSeconds") + || name.equals("elythiaFireflyParticlesEnabled") + || name.equals("duplicatorTreeEnabled") + || name.equals("glowingTorchflowers") + || name.equals("glowVinesUnderLeaves") + || name.equals("swingThroughGrassEnabled") + || name.equals("fabricKeybindingConflictFixEnabled") + || name.equals("experimentalSettingsPopupDisabled") + || name.equals("entitySpecificFireOverlayEnabled") + || name.equals("dreamSandEnabled") + || name.startsWith("dreamSand") + || name.equals("ichorWitherEnabled") + || name.startsWith("diamondMinecart"); + } + + private static boolean isToolSetting(String name) { + return name.equals("sizeChangingRaysEnabled") + || name.startsWith("sizeRay") + || name.equals("shrinkingPotionDelta") + || name.equals("growthPotionDelta") + || name.startsWith("ultimate") + || name.startsWith("battleAxe") + || name.startsWith("bigBertha") + || name.startsWith("attitudeAdjuster") + || name.startsWith("scorpionWhip") + || name.startsWith("bloodCrystal") + || name.startsWith("nightmareHelmet") + || name.startsWith("nightmareChestplate") + || name.startsWith("nightmareLeggings") + || name.startsWith("nightmareBoots") + || name.startsWith("nightmareArmorDreadAura") + || name.startsWith("primordialArmor") + || name.startsWith("nightmareSword") + || name.startsWith("basiliskDagger") + || name.startsWith("squidzooka") + || name.equals("invertProjectilesFromInvertedPlayers") + || name.startsWith("gravityGun") + || name.startsWith("critterCage") + || name.startsWith("minersDream") + || name.equals("potentNyxiteInvertedDurationSeconds") + || name.equals("corneaEarNightVisionSeconds") + || name.startsWith("american") + || name.startsWith("mogglesVision") + || name.equals("ductTapeRepairPercentPerUse") + || name.startsWith("fallenKingCrown"); + } + } + + private static final class SettingBinding { + private final String name; + private final Method getter; + private final Method setter; + private final Class setterType; + private final ConfigSection section; + + private SettingBinding(String name, Method getter, Method setter, ConfigSection section) { + this.name = name; + this.getter = getter; + this.setter = setter; + this.setterType = setter.getParameterTypes()[0]; + this.section = section; + } + + private Object readValue(JsonElement element) { + Object defaultValue = getCurrentValue(); + if (element == null || element.isJsonNull()) { + return defaultValue; + } + + try { + if (setterType == boolean.class) { + return element.getAsBoolean(); + } + if (setterType == int.class) { + return element.getAsInt(); + } + if (setterType == double.class) { + return element.getAsDouble(); + } + if (setterType == float.class) { + return element.getAsFloat(); + } + if (setterType == String.class) { + return element.getAsString(); + } + } catch (RuntimeException e) { + Antarchy.LOGGER.warn("Invalid Fabric config value for {}, using default", name, e); + } + + return defaultValue; + } + + private void apply(Object value) { + try { + setter.invoke(null, value); + } catch (IllegalAccessException | InvocationTargetException e) { + throw new IllegalStateException("Failed to apply config value for " + name, e); + } + } + + private JsonElement toJson(Object value) { + return GSON.toJsonTree(value); + } + + private Object getCurrentValue() { + try { + Object value = getter.invoke(null); + if (setterType == String.class && value instanceof ResourceKey resourceKey) { + return resourceKey.location().toString(); + } + return value; + } catch (IllegalAccessException | InvocationTargetException e) { + throw new IllegalStateException("Failed to read config default for " + name, e); + } + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabric.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabric.java new file mode 100644 index 00000000..7cdd94f5 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabric.java @@ -0,0 +1,328 @@ +package com.craisinlord.antarchy.fabric; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricEntities; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.AntarchyGameRules; +import com.craisinlord.antarchy.content.entity.trades.DrTrayaurusTradeManager; +import com.craisinlord.antarchy.content.item.BloodCrystalShardItem; +import com.craisinlord.antarchy.fabric.network.AntarchyFabricNetworking; +import net.fabricmc.fabric.api.biome.v1.BiomeModifications; +import net.fabricmc.fabric.api.biome.v1.BiomeSelectors; +import net.fabricmc.fabric.api.gamerule.v1.GameRuleFactory; +import net.fabricmc.fabric.api.gamerule.v1.GameRuleRegistry; +import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener; +import net.fabricmc.fabric.api.resource.ResourceManagerHelper; +import net.fabricmc.api.ModInitializer; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.PackType; +import net.minecraft.server.packs.resources.PreparableReloadListener; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.tags.TagKey; +import net.minecraft.util.profiling.ProfilerFiller; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; + +public final class AntarchyFabric implements ModInitializer { + private static final TagKey SHELLSTONE_BIOMES = TagKey.create( + Registries.BIOME, + new ResourceLocation(Antarchy.MODID, "has_shellstone") + ); + private static final ResourceKey SHELLSTONE_UPPER = ResourceKey.create( + Registries.PLACED_FEATURE, + new ResourceLocation(Antarchy.MODID, "shellstone_upper") + ); + private static final ResourceKey SHELLSTONE_LOWER = ResourceKey.create( + Registries.PLACED_FEATURE, + new ResourceLocation(Antarchy.MODID, "shellstone_lower") + ); + private static final TagKey MISSILE_SQUID_SPAWN_BIOMES = TagKey.create( + Registries.BIOME, + new ResourceLocation(Antarchy.MODID, "missile_squid_spawn_biomes") + ); + private static final TagKey OCTOPUS_BOMB_SPAWN_BIOMES = TagKey.create( + Registries.BIOME, + new ResourceLocation(Antarchy.MODID, "octopus_bomb_spawn_biomes") + ); + private static final TagKey MANTIS_OVERWORLD_SPAWN_BIOMES = TagKey.create( + Registries.BIOME, + new ResourceLocation(Antarchy.MODID, "mantis_overworld_spawn_biomes") + ); + private static final TagKey OVERWORLD_ANT_NEST_SPAWN_BIOMES = TagKey.create( + Registries.BIOME, + new ResourceLocation(Antarchy.MODID, "overworld_ant_nest_spawn_biomes") + ); + private static final TagKey RED_ANT_NEST_SPAWN_BIOMES = TagKey.create( + Registries.BIOME, + new ResourceLocation(Antarchy.MODID, "red_ant_nest_spawn_biomes") + ); + private static final TagKey IS_ELYTHIA = TagKey.create( + Registries.BIOME, + new ResourceLocation(Antarchy.MODID, "is_elythia") + ); + private static final TagKey APPLE_COW_SPAWN_BIOMES = TagKey.create( + Registries.BIOME, + new ResourceLocation(Antarchy.MODID, "apple_cow_spawn_biomes") + ); + private static final TagKey GOLDEN_APPLE_COW_SPAWN_BIOMES = TagKey.create( + Registries.BIOME, + new ResourceLocation(Antarchy.MODID, "golden_apple_cow_spawn_biomes") + ); + private static final TagKey FLYING_SQUIRREL_SPAWN_BIOMES = TagKey.create( + Registries.BIOME, + new ResourceLocation(Antarchy.MODID, "flying_squirrel_spawn_biomes") + ); + private static final TagKey FLOWER_FOREST_BUTTERFLY_SPAWN_BIOMES = TagKey.create( + Registries.BIOME, + new ResourceLocation(Antarchy.MODID, "flower_forest_butterfly_spawn_biomes") + ); + private static final TagKey FLOWER_FOREST_CATERPILLAR_SPAWN_BIOMES = TagKey.create( + Registries.BIOME, + new ResourceLocation(Antarchy.MODID, "flower_forest_caterpillar_spawn_biomes") + ); + private static final TagKey MILKWEED_SPAWN_BIOMES = TagKey.create( + Registries.BIOME, + new ResourceLocation(Antarchy.MODID, "milkweed_spawn_biomes") + ); + private static final TagKey WILD_CORN_SPAWN_BIOMES = TagKey.create( + Registries.BIOME, + new ResourceLocation(Antarchy.MODID, "wild_corn_spawn_biomes") + ); + private static final ResourceKey BROWN_ANT_NEST = ResourceKey.create( + Registries.PLACED_FEATURE, + new ResourceLocation(Antarchy.MODID, "brown_ant_nest") + ); + private static final ResourceKey RAINBOW_ANT_NEST = ResourceKey.create( + Registries.PLACED_FEATURE, + new ResourceLocation(Antarchy.MODID, "rainbow_ant_nest") + ); + private static final ResourceKey TERMITE_NEST = ResourceKey.create( + Registries.PLACED_FEATURE, + new ResourceLocation(Antarchy.MODID, "termite_nest") + ); + private static final ResourceKey RED_ANT_NEST = ResourceKey.create( + Registries.PLACED_FEATURE, + new ResourceLocation(Antarchy.MODID, "red_ant_nest") + ); + private static final ResourceKey URANIUM_ORE = ResourceKey.create( + Registries.PLACED_FEATURE, + new ResourceLocation(Antarchy.MODID, "uranium_ore") + ); + private static final ResourceKey TITANIUM_ORE = ResourceKey.create( + Registries.PLACED_FEATURE, + new ResourceLocation(Antarchy.MODID, "titanium_ore") + ); + private static final ResourceKey FLOWER_FOREST_MILKWEED = ResourceKey.create( + Registries.PLACED_FEATURE, + new ResourceLocation(Antarchy.MODID, "flower_forest_milkweed") + ); + private static final ResourceKey CORN_PATCH = ResourceKey.create( + Registries.PLACED_FEATURE, + new ResourceLocation(Antarchy.MODID, "corn_patch") + ); + private static final TagKey HAS_SEASHELL = TagKey.create( + Registries.BIOME, + new ResourceLocation(Antarchy.MODID, "has_seashell") + ); + private static final TagKey HAS_RARE_SEASHELL = TagKey.create( + Registries.BIOME, + new ResourceLocation(Antarchy.MODID, "has_rare_seashell") + ); + private static final ResourceKey SEASHELL_PATCH = ResourceKey.create( + Registries.PLACED_FEATURE, + new ResourceLocation(Antarchy.MODID, "seashell_patch") + ); + private static final ResourceKey SEASHELL_PATCH_RARE = ResourceKey.create( + Registries.PLACED_FEATURE, + new ResourceLocation(Antarchy.MODID, "seashell_patch_rare") + ); + @Override + public void onInitialize() { + AntarchyGameRules.bootstrap((name, category, defaultValue) -> + GameRuleRegistry.register(name, category, GameRuleFactory.createBooleanRule(defaultValue)) + ); + AntarchyFabricNetworking.register(); + AntarchyFabricNetworking.bootstrapMultipartCommon(); + AntarchyConfigModuleFabric.init(); + AntarchyFabricContent.register(); + registerWorldgenFeatures(); + AntarchyFabricEvents.register(); + BloodglassManager.register(); + Antarchy.init(); + BloodCrystalShardItem.SYNC_BLOODGLASS = BloodglassManager::syncBloodglass; + registerTradeReloadListener(); + } + + private static void registerTradeReloadListener() { + DrTrayaurusTradeManager delegate = new DrTrayaurusTradeManager(); + ResourceManagerHelper.get(PackType.SERVER_DATA).registerReloadListener(new IdentifiableResourceReloadListener() { + @Override + public ResourceLocation getFabricId() { + return new ResourceLocation(Antarchy.MODID, "trayaurus_trades"); + } + + @Override + public CompletableFuture reload(PreparableReloadListener.PreparationBarrier barrier, ResourceManager manager, + ProfilerFiller prepareProfiler, ProfilerFiller applyProfiler, + Executor prepareExecutor, Executor applyExecutor) { + return delegate.reload(barrier, manager, prepareProfiler, applyProfiler, prepareExecutor, applyExecutor); + } + }); + } + + private static final TagKey CAVARYN_BIOMES = TagKey.create( + Registries.BIOME, + new ResourceLocation(Antarchy.MODID, "is_cavaryn") + ); + private static final TagKey DORRIE_OVERWORLD_SPAWN_BIOMES = TagKey.create( + Registries.BIOME, + new ResourceLocation(Antarchy.MODID, "dorrie_overworld_spawn_biomes") + ); + private static final TagKey DORRIE_ELYTHIA_SPAWN_BIOMES = TagKey.create( + Registries.BIOME, + new ResourceLocation(Antarchy.MODID, "dorrie_elythia_spawn_biomes") + ); + + private static void registerWorldgenFeatures() { + BiomeModifications.addFeature( + BiomeSelectors.tag(SHELLSTONE_BIOMES), + GenerationStep.Decoration.UNDERGROUND_ORES, + SHELLSTONE_UPPER + ); + BiomeModifications.addFeature( + BiomeSelectors.tag(SHELLSTONE_BIOMES), + GenerationStep.Decoration.UNDERGROUND_ORES, + SHELLSTONE_LOWER + ); + BiomeModifications.addSpawn( + BiomeSelectors.tag(MISSILE_SQUID_SPAWN_BIOMES), + net.minecraft.world.entity.MobCategory.MONSTER, + AntarchyFabricEntities.MISSILE_SQUID.get(), + 2, 1, 2 + ); + BiomeModifications.addSpawn( + BiomeSelectors.tag(OCTOPUS_BOMB_SPAWN_BIOMES), + net.minecraft.world.entity.MobCategory.MONSTER, + AntarchyFabricEntities.OCTOPUS_BOMB.get(), + 2, 1, 2 + ); + BiomeModifications.addSpawn( + BiomeSelectors.tag(MANTIS_OVERWORLD_SPAWN_BIOMES), + net.minecraft.world.entity.MobCategory.MONSTER, + AntarchyFabricEntities.MANTIS.get(), + 8, 1, 1 + ); + BiomeModifications.addSpawn( + BiomeSelectors.tag(MANTIS_OVERWORLD_SPAWN_BIOMES), + net.minecraft.world.entity.MobCategory.MONSTER, + AntarchyFabricEntities.ALPHA_MANTIS.get(), + 1, 1, 1 + ); + BiomeModifications.addFeature( + BiomeSelectors.tag(OVERWORLD_ANT_NEST_SPAWN_BIOMES), + GenerationStep.Decoration.VEGETAL_DECORATION, + BROWN_ANT_NEST + ); + BiomeModifications.addFeature( + BiomeSelectors.tag(OVERWORLD_ANT_NEST_SPAWN_BIOMES), + GenerationStep.Decoration.VEGETAL_DECORATION, + RAINBOW_ANT_NEST + ); + BiomeModifications.addFeature( + BiomeSelectors.tag(OVERWORLD_ANT_NEST_SPAWN_BIOMES), + GenerationStep.Decoration.VEGETAL_DECORATION, + TERMITE_NEST + ); + BiomeModifications.addFeature( + BiomeSelectors.tag(RED_ANT_NEST_SPAWN_BIOMES), + GenerationStep.Decoration.VEGETAL_DECORATION, + RED_ANT_NEST + ); + BiomeModifications.addFeature( + BiomeSelectors.foundInOverworld(), + GenerationStep.Decoration.UNDERGROUND_ORES, + URANIUM_ORE + ); + BiomeModifications.addFeature( + BiomeSelectors.foundInOverworld(), + GenerationStep.Decoration.UNDERGROUND_ORES, + TITANIUM_ORE + ); + BiomeModifications.addFeature( + BiomeSelectors.tag(IS_ELYTHIA), + GenerationStep.Decoration.UNDERGROUND_ORES, + URANIUM_ORE + ); + BiomeModifications.addFeature( + BiomeSelectors.tag(IS_ELYTHIA), + GenerationStep.Decoration.UNDERGROUND_ORES, + TITANIUM_ORE + ); + BiomeModifications.addFeature( + BiomeSelectors.tag(MILKWEED_SPAWN_BIOMES), + GenerationStep.Decoration.VEGETAL_DECORATION, + FLOWER_FOREST_MILKWEED + ); + BiomeModifications.addFeature( + BiomeSelectors.tag(WILD_CORN_SPAWN_BIOMES), + GenerationStep.Decoration.VEGETAL_DECORATION, + CORN_PATCH + ); + BiomeModifications.addFeature( + BiomeSelectors.tag(HAS_SEASHELL), + GenerationStep.Decoration.VEGETAL_DECORATION, + SEASHELL_PATCH + ); + BiomeModifications.addFeature( + BiomeSelectors.tag(HAS_RARE_SEASHELL), + GenerationStep.Decoration.VEGETAL_DECORATION, + SEASHELL_PATCH_RARE + ); + BiomeModifications.addSpawn( + BiomeSelectors.tag(APPLE_COW_SPAWN_BIOMES), + net.minecraft.world.entity.MobCategory.CREATURE, + AntarchyFabricEntities.APPLE_COW.get(), + 10, 2, 4 + ); + BiomeModifications.addSpawn( + BiomeSelectors.tag(GOLDEN_APPLE_COW_SPAWN_BIOMES), + net.minecraft.world.entity.MobCategory.CREATURE, + AntarchyFabricEntities.GOLDEN_APPLE_COW.get(), + 1, 1, 3 + ); + BiomeModifications.addSpawn( + BiomeSelectors.tag(FLYING_SQUIRREL_SPAWN_BIOMES), + net.minecraft.world.entity.MobCategory.CREATURE, + AntarchyFabricEntities.FLYING_SQUIRREL.get(), + 8, 1, 3 + ); + BiomeModifications.addSpawn( + BiomeSelectors.tag(FLOWER_FOREST_BUTTERFLY_SPAWN_BIOMES), + net.minecraft.world.entity.MobCategory.AMBIENT, + AntarchyFabricEntities.BUTTERFLY.get(), + 28, 2, 5 + ); + BiomeModifications.addSpawn( + BiomeSelectors.tag(FLOWER_FOREST_CATERPILLAR_SPAWN_BIOMES), + net.minecraft.world.entity.MobCategory.CREATURE, + AntarchyFabricEntities.CATERPILLAR.get(), + 24, 2, 4 + ); + BiomeModifications.addSpawn( + BiomeSelectors.tag(DORRIE_OVERWORLD_SPAWN_BIOMES), + net.minecraft.world.entity.MobCategory.CREATURE, + AntarchyFabricEntities.DORRIE.get(), + 1, 1, 1 + ); + BiomeModifications.addSpawn( + BiomeSelectors.tag(DORRIE_ELYTHIA_SPAWN_BIOMES), + net.minecraft.world.entity.MobCategory.CREATURE, + AntarchyFabricEntities.DORRIE.get(), + 10, 1, 2 + ); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricContent.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricContent.java new file mode 100644 index 00000000..0f7d5725 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricContent.java @@ -0,0 +1,468 @@ +package com.craisinlord.antarchy.fabric; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.compat.infinity.InfinityCompat; +import com.craisinlord.antarchy.compat.infinity.InfinityCompatVersion; +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.block.*; +import com.craisinlord.antarchy.content.AntarchySoundEvents; +import com.craisinlord.antarchy.content.item.BloodCrystalKatanaItem; +import com.craisinlord.antarchy.fabric.network.AntarchyFabricNetworking; +import com.craisinlord.antarchy.fabric.registry.DeferredHolder; +import com.craisinlord.antarchy.content.entity.lucid.LucidEntity; +import com.craisinlord.antarchy.content.entity.lucid.LucidBoltEntity; +import com.craisinlord.antarchy.content.entity.lucid.LucidEyeProjectileEntity; +import com.craisinlord.antarchy.content.item.ScorpionWhipTetherSync; +import com.craisinlord.antarchy.content.network.ImpactShakeSync; +import com.craisinlord.antarchy.content.network.HerculesBeetleImpactShakeSync; +import com.craisinlord.antarchy.content.network.HordeIntensitySync; +import com.craisinlord.antarchy.content.portal.PermanentPortalType; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.alchemy.Potion; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.Potions; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.block.LiquidBlock; +import net.fabricmc.loader.api.FabricLoader; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricBlocks; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricItems; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricEntities; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricCreativeModeTabs; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricSounds; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricMisc; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricEntityAttributes; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricSpawnPlacements; + +public final class AntarchyFabricContent { + + + public static Potion potionHolder(DeferredHolder potion) { + return potion.get(); + } + + + + private static boolean isModLoaded(String modId) { + return FabricLoader.getInstance().isModLoaded(modId); + } + + + + public static net.minecraft.world.level.material.FlowingFluid lookupFlowingFluid(String path) { + return (net.minecraft.world.level.material.FlowingFluid) BuiltInRegistries.FLUID.get(new ResourceLocation(Antarchy.MODID, path)); + } + + + + public static Item lookupItem(String path) { + return BuiltInRegistries.ITEM.get(new ResourceLocation(Antarchy.MODID, path)); + } + + + + public static LiquidBlock lookupLiquidBlock(String path) { + return (LiquidBlock) BuiltInRegistries.BLOCK.get(new ResourceLocation(Antarchy.MODID, path)); + } + + + + public static void register() { + com.craisinlord.antarchy.content.entity.UpwardFallingBlockEntity.TYPE = AntarchyFabricEntities.UPWARD_FALLING_BLOCK; + net.fabricmc.fabric.api.registry.FabricBrewingRecipeRegistry.registerPotionRecipe(net.minecraft.world.item.alchemy.Potions.AWKWARD, Ingredient.of(AntarchyFabricItems.LUCID_EYE.get()), potionHolder(AntarchyFabricMisc.INVERSION)); + net.fabricmc.fabric.api.registry.FabricBrewingRecipeRegistry.registerPotionRecipe(potionHolder(AntarchyFabricMisc.INVERSION), Ingredient.of(Items.REDSTONE), potionHolder(AntarchyFabricMisc.LONG_INVERSION)); + net.fabricmc.fabric.api.registry.FabricBrewingRecipeRegistry.registerPotionRecipe(net.minecraft.world.item.alchemy.Potions.AWKWARD, Ingredient.of(AntarchyFabricItems.STINK_BUG_ITEM.get()), potionHolder(AntarchyFabricMisc.STINKY_POTION)); + net.fabricmc.fabric.api.registry.FabricBrewingRecipeRegistry.registerPotionRecipe(potionHolder(AntarchyFabricMisc.STINKY_POTION), Ingredient.of(Items.REDSTONE), potionHolder(AntarchyFabricMisc.LONG_STINKY)); + net.fabricmc.fabric.api.registry.FabricBrewingRecipeRegistry.registerPotionRecipe(net.minecraft.world.item.alchemy.Potions.AWKWARD, Ingredient.of(AntarchyFabricItems.BASILISK_FANG.get()), potionHolder(AntarchyFabricMisc.PARALYSIS)); + net.fabricmc.fabric.api.registry.FabricBrewingRecipeRegistry.registerPotionRecipe(potionHolder(AntarchyFabricMisc.PARALYSIS), Ingredient.of(Items.REDSTONE), potionHolder(AntarchyFabricMisc.LONG_PARALYSIS)); + net.fabricmc.fabric.api.registry.FabricBrewingRecipeRegistry.registerPotionRecipe(net.minecraft.world.item.alchemy.Potions.AWKWARD, Ingredient.of(AntarchyFabricItems.MOLEWORM_ITEM.get()), potionHolder(AntarchyFabricMisc.HASTE)); + net.fabricmc.fabric.api.registry.FabricBrewingRecipeRegistry.registerPotionRecipe(potionHolder(AntarchyFabricMisc.HASTE), Ingredient.of(Items.GLOWSTONE_DUST), potionHolder(AntarchyFabricMisc.STRONG_HASTE)); + net.fabricmc.fabric.api.registry.FabricBrewingRecipeRegistry.registerPotionRecipe(net.minecraft.world.item.alchemy.Potions.AWKWARD, Ingredient.of(AntarchyFabricItems.URANIUM_NUGGET.get()), potionHolder(AntarchyFabricMisc.SHRINKING)); + net.fabricmc.fabric.api.registry.FabricBrewingRecipeRegistry.registerPotionRecipe(potionHolder(AntarchyFabricMisc.SHRINKING), Ingredient.of(Items.GLOWSTONE_DUST), potionHolder(AntarchyFabricMisc.STRONG_SHRINKING)); + net.fabricmc.fabric.api.registry.FabricBrewingRecipeRegistry.registerPotionRecipe(potionHolder(AntarchyFabricMisc.STRONG_SHRINKING), Ingredient.of(Items.GLOWSTONE_DUST), potionHolder(AntarchyFabricMisc.EXTREME_SHRINKING)); + net.fabricmc.fabric.api.registry.FabricBrewingRecipeRegistry.registerPotionRecipe(net.minecraft.world.item.alchemy.Potions.AWKWARD, Ingredient.of(AntarchyFabricItems.TITANIUM_NUGGET.get()), potionHolder(AntarchyFabricMisc.GROWING)); + net.fabricmc.fabric.api.registry.FabricBrewingRecipeRegistry.registerPotionRecipe(potionHolder(AntarchyFabricMisc.GROWING), Ingredient.of(Items.GLOWSTONE_DUST), potionHolder(AntarchyFabricMisc.STRONG_GROWING)); + net.fabricmc.fabric.api.registry.FabricBrewingRecipeRegistry.registerPotionRecipe(potionHolder(AntarchyFabricMisc.STRONG_GROWING), Ingredient.of(Items.GLOWSTONE_DUST), potionHolder(AntarchyFabricMisc.EXTREME_GROWING)); + net.fabricmc.fabric.api.registry.FabricBrewingRecipeRegistry.registerPotionRecipe(net.minecraft.world.item.alchemy.Potions.AWKWARD, Ingredient.of(AntarchyFabricItems.CLOUD_SHARK_FIN.get()), net.minecraft.world.item.alchemy.Potions.SLOW_FALLING); + net.fabricmc.fabric.api.registry.FabricBrewingRecipeRegistry.registerPotionRecipe(net.minecraft.world.item.alchemy.Potions.AWKWARD, Ingredient.of(AntarchyFabricItems.JUMPY_BUG_LEG.get()), Potions.LEAPING); + net.fabricmc.fabric.api.registry.FabricBrewingRecipeRegistry.registerPotionRecipe(net.minecraft.world.item.alchemy.Potions.AWKWARD, Ingredient.of(AntarchyFabricItems.CORNEA_EAR.get()), net.minecraft.world.item.alchemy.Potions.NIGHT_VISION); + + AntarchyFabricSounds.SOUND_EVENTS.register(); + AntarchyFabricMisc.FLUIDS.register(); + AntarchyFabricBlocks.BLOCKS.register(); + AntarchyFabricEntities.ENTITY_TYPES.register(); + AntarchyFabricMisc.ATTRIBUTES.register(); + AntarchyFabricEntityAttributes.register(); + AntarchyFabricSpawnPlacements.register(); + AntarchyFabricBlocks.BLOCK_ENTITY_TYPES.register(); + AntarchyFabricMisc.PARTICLE_TYPES.register(); + AntarchyFabricMisc.FEATURES.register(); + AntarchyFabricMisc.BIOME_SOURCES.register(); + AntarchyFabricMisc.DENSITY_FUNCTION_TYPES.register(); + AntarchyFabricMisc.MOB_EFFECTS.register(); + AntarchyFabricMisc.POTIONS.register(); + AntarchyFabricItems.ITEMS.register(); + AntarchyFabricMisc.MENUS.register(); + AntarchyFabricMisc.RECIPE_SERIALIZERS.register(); + AntarchyFabricCreativeModeTabs.CREATIVE_MODE_TABS.register(); + + PermanentPortalType.bindBlocks( + () -> AntarchyFabricBlocks.MOSSY_OURANWOOD_WOOD.get(), + () -> AntarchyFabricBlocks.ELYTHIA_PORTAL.get(), + () -> AntarchyFabricBlocks.NYXITE.get(), + () -> AntarchyFabricBlocks.THORAXIS_PORTAL.get(), + () -> AntarchyFabricBlocks.MYRMITE.get(), + () -> AntarchyFabricBlocks.CAVARYN_PORTAL.get() + ); + + AntarchySoundEvents.bind( + AntarchyFabricSounds.SQUIDZOOKA_FIRE, + AntarchyFabricSounds.SHRINK_RAY_SOUND, + AntarchyFabricSounds.GROWTH_RAY_SOUND, + AntarchyFabricSounds.SIZE_RAY_CHARGE, + AntarchyFabricSounds.ANT_AMBIENT, + AntarchyFabricSounds.ANT_IDLE, + AntarchyFabricSounds.ANT_HURT, + AntarchyFabricSounds.ANT_BITE, + AntarchyFabricSounds.ANT_GATHER, + AntarchyFabricSounds.ANT_NEST, + AntarchyFabricSounds.CLOUD_SHARK_BITE, + AntarchyFabricSounds.CLOUD_SHARK_IDLE, + AntarchyFabricSounds.CLOUD_SHARK_HURT, + AntarchyFabricSounds.CLOUD_SHARK_DEATH, + AntarchyFabricSounds.CLOUD_SHARK_FLY, + AntarchyFabricSounds.CATERPILLAR_IDLE, + AntarchyFabricSounds.CATERPILLAR_HURT, + AntarchyFabricSounds.CATERPILLAR_CRAWL, + AntarchyFabricSounds.BUTTERFLY_HURT, + AntarchyFabricSounds.BRUTALFLY_IDLE, + AntarchyFabricSounds.BRUTALFLY_DEATH, + AntarchyFabricSounds.ELYTHIA_FIREFLY_AMBIENT, + AntarchyFabricSounds.MISSILE_SQUID_AMBIENT, + AntarchyFabricSounds.MISSILE_SQUID_HURT, + AntarchyFabricSounds.MISSILE_SQUID_DEATH, + AntarchyFabricSounds.MISSILE_SQUID_ATTACK, + AntarchyFabricSounds.KRAKEN_FLYING_LOOP, + AntarchyFabricSounds.KRAKEN_FLYING_SIDEWAYS_LOOP, + AntarchyFabricSounds.KRAKEN_ATTACK, + AntarchyFabricSounds.KRAKEN_SPIN, + AntarchyFabricSounds.KRAKEN_ROAR, + AntarchyFabricSounds.KRAKEN_SUMMON, + AntarchyFabricSounds.KRAKEN_HURT, + AntarchyFabricSounds.KRAKEN_DEATH, + AntarchyFabricSounds.BASILISK_IDLE_LOOP, + AntarchyFabricSounds.BASILISK_SLITHER_LOOP, + AntarchyFabricSounds.BASILISK_BITE, + AntarchyFabricSounds.BASILISK_HISS, + AntarchyFabricSounds.BASILISK_HURT, + AntarchyFabricSounds.BASILISK_DEATH, + AntarchyFabricSounds.THORAXIS_NIGHTMARE_WASTES_AMBIENT, + AntarchyFabricSounds.THORAXIS_NIGHTMARE_WASTES_ADDITIONS, + AntarchyFabricSounds.THORAXIS_NIGHTMARE_WASTES_MOOD, + AntarchyFabricSounds.THORAXIS_DREAM_DUNES_AMBIENT, + AntarchyFabricSounds.THORAXIS_DREAM_DUNES_ADDITIONS, + AntarchyFabricSounds.THORAXIS_DREAM_DUNES_MOOD, + AntarchyFabricSounds.THORAXIS_LUCID_POOLS_AMBIENT, + AntarchyFabricSounds.THORAXIS_LUCID_POOLS_ADDITIONS, + AntarchyFabricSounds.THORAXIS_LUCID_POOLS_MOOD, + AntarchyFabricSounds.LUCID_AMBIENT, + AntarchyFabricSounds.LUCID_FLYING, + AntarchyFabricSounds.LUCID_ATTACK, + AntarchyFabricSounds.LUCID_BOLT_SOUND, + AntarchyFabricSounds.LUCID_HURT, + AntarchyFabricSounds.LUCID_DEATH, + AntarchyFabricSounds.REVERIE_IDLE, + AntarchyFabricSounds.REVERIE_HURT, + AntarchyFabricSounds.REVERIE_WORRY, + AntarchyFabricSounds.REVERIE_SAVE, + AntarchyFabricSounds.REVERIE_JOIN_PLAYER, + AntarchyFabricSounds.REVERIE_ALERT, + AntarchyFabricSounds.FLYING_SQUIRREL_IDLE, + AntarchyFabricSounds.FLYING_SQUIRREL_BEG, + AntarchyFabricSounds.FLYING_SQUIRREL_NUT, + AntarchyFabricSounds.FLYING_SQUIRREL_GLIDE_LOOP, + AntarchyFabricSounds.FLYING_SQUIRREL_HURT, + AntarchyFabricSounds.FLYING_SQUIRREL_DEATH, + AntarchyFabricSounds.NIGHTMARE_IDLE, + AntarchyFabricSounds.NIGHTMARE_HURT, + AntarchyFabricSounds.NIGHTMARE_ROAR, + AntarchyFabricSounds.NIGHTMARE_DEATH, + AntarchyFabricSounds.NIGHTMARE_BITE, + AntarchyFabricSounds.NIGHTMARE_FLAP, + AntarchyFabricSounds.TRIFFID_ATTACK, + AntarchyFabricSounds.TRIFFID_GRAB, + AntarchyFabricSounds.TRIFFID_HURT, + AntarchyFabricSounds.TRIFFID_DEATH, + AntarchyFabricSounds.TRIFFID_HISS, + AntarchyFabricSounds.TRIFFID_GROWL, + AntarchyFabricSounds.MANTIS_AMBIENT, + AntarchyFabricSounds.MANTIS_HURT, + AntarchyFabricSounds.MANTIS_ATTACK, + AntarchyFabricSounds.MANTIS_FLY_LOOP, + AntarchyFabricSounds.GRAVITY_GUN_PICKUP, + AntarchyFabricSounds.GRAVITY_GUN_DROP, + AntarchyFabricSounds.GRAVITY_GUN_HOLD_LOOP, + AntarchyFabricSounds.GRAVITY_GUN_LAUNCH, + AntarchyFabricSounds.GRAVITY_GUN_DRYFIRE, + AntarchyFabricSounds.BED_BUG_AMBIENT, + AntarchyFabricSounds.BED_BUG_HURT, + AntarchyFabricSounds.BED_BUG_ATTACK, + AntarchyFabricSounds.WASP_IDLE, + AntarchyFabricSounds.WASP_HURT, + AntarchyFabricSounds.WASP_ATTACK, + AntarchyFabricSounds.WASP_DEATH, + AntarchyFabricSounds.SCORPION_AMBIENT, + AntarchyFabricSounds.SCORPION_HURT, + AntarchyFabricSounds.SCORPION_ATTACK, + AntarchyFabricSounds.EMPEROR_SCORPION_AMBIENT, + AntarchyFabricSounds.EMPEROR_SCORPION_HURT, + AntarchyFabricSounds.EMPEROR_SCORPION_ATTACK, + AntarchyFabricSounds.EMPEROR_SCORPION_ROAR, + AntarchyFabricSounds.MOLEWORM_AMBIENT, + AntarchyFabricSounds.MOLEWORM_HURT, + AntarchyFabricSounds.MOLEWORM_ATTACK, + AntarchyFabricSounds.MOLEWORM_DIG, + AntarchyFabricSounds.MOLEVORE_AMBIENT, + AntarchyFabricSounds.MOLEVORE_HURT, + AntarchyFabricSounds.MOLEVORE_ATTACK, + AntarchyFabricSounds.MOLEVORE_DIG, + AntarchyFabricSounds.BOMBER_WALK, + AntarchyFabricSounds.BOMBER_KNOCK, + AntarchyFabricSounds.BOMBER_EXPLODE, + AntarchyFabricSounds.TORETERROR_IDLE, + AntarchyFabricSounds.TORETERROR_HURT, + AntarchyFabricSounds.TORETERROR_DEATH, + AntarchyFabricSounds.TORETERROR_BOMBER_FIRE, + AntarchyFabricSounds.TORETERROR_SPIN, + AntarchyFabricSounds.TORETERROR_RICOCHET, + AntarchyFabricSounds.WATER_CANNON_FIRE, + AntarchyFabricSounds.TORETERROR_JUMP_UP, + AntarchyFabricSounds.TORETERROR_JUMP_LAND, + AntarchyFabricSounds.STINKY_FLY_SOUND, + AntarchyFabricSounds.STINK_BUG_FART, + AntarchyFabricSounds.STINK_BUG_IDLE, + AntarchyFabricSounds.CAVARYN_HEARTBEAT, + AntarchyFabricSounds.ROLLY_POLLY_IDLE, + AntarchyFabricSounds.CREEPING_HORROR_GROWL, + AntarchyFabricSounds.CREEPING_HORROR_HURT, + AntarchyFabricSounds.CREEPING_HORROR_BITE, + AntarchyFabricSounds.LURKING_TERROR_SNARL, + AntarchyFabricSounds.LURKING_TERROR_HURT, + AntarchyFabricSounds.LURKING_TERROR_BITE, + AntarchyFabricSounds.LURKING_TERROR_FLY_LOOP, + AntarchyFabricSounds.DUCT_TAPE_USE, + AntarchyFabricSounds.HERCULES_BEETLE_IDLE, + AntarchyFabricSounds.HERCULES_BEETLE_HURT, + AntarchyFabricSounds.HERCULES_BEETLE_ATTACK, + AntarchyFabricSounds.HERCULES_BEETLE_CRY, + AntarchyFabricSounds.HERCULES_BEETLE_CHARGE_START, + AntarchyFabricSounds.HERCULES_BEETLE_KNOCKED_DOWN, + AntarchyFabricSounds.JUMPY_BUG_IDLE, + AntarchyFabricSounds.SPIT_BUG_IDLE, + AntarchyFabricSounds.JUMPY_BUG_HURT, + AntarchyFabricSounds.JUMPY_BUG_JUMP, + AntarchyFabricSounds.SPIT_BUG_HURT, + AntarchyFabricSounds.SPIT_BUG_SPIT, + AntarchyFabricSounds.BRUTALFLY_SPIT, + AntarchyFabricSounds.ROLLY_POLLY_WHEEL_MODE, + AntarchyFabricSounds.ROLLY_POLLY_NORMAL_MODE, + AntarchyFabricSounds.ROLLY_POLLY_ROLL, + AntarchyFabricSounds.JERRY_YOUNG_IDLE, + AntarchyFabricSounds.JERRY_YOUNG_HURT, + AntarchyFabricSounds.JERRY_YOUNG_DEATH, + AntarchyFabricSounds.JERRY_YOUNG_ATTACK, + AntarchyFabricSounds.JERRY_ADULT_IDLE, + AntarchyFabricSounds.JERRY_ADULT_HURT, + AntarchyFabricSounds.JERRY_ADULT_DEATH, + AntarchyFabricSounds.JERRY_ADULT_ATTACK + ); + + AntarchyObjects.setOctopusBomb(AntarchyFabricEntities.OCTOPUS_BOMB); + AntarchyObjects.setTentacle(AntarchyFabricEntities.TENTACLE); + AntarchyObjects.setKrakensGraspTrident(AntarchyFabricEntities.KRAKENS_GRASP_TRIDENT); + AntarchyObjects.setLotus(() -> AntarchyFabricBlocks.LOTUS.get()); + AntarchyObjects.setKrakenTentacle(() -> AntarchyFabricItems.KRAKEN_TENTACLE.get()); + AntarchyObjects.setKrakensGrasp(() -> AntarchyFabricItems.KRAKENS_GRASP.get()); + AntarchyObjects.setOuranwoodDeer(AntarchyFabricEntities.OURANWOOD_DEER); + AntarchyObjects.setGlimmer(AntarchyFabricEntities.GLIMMER); + AntarchyObjects.setSpiritApple(() -> AntarchyFabricItems.SPIRIT_APPLE.get()); + AntarchyObjects.setElka(AntarchyFabricEntities.ELKA); + AntarchyObjects.setPeach(() -> AntarchyFabricItems.PEACH.get()); + AntarchyObjects.setCorn(() -> AntarchyFabricItems.CORN.get()); + AntarchyObjects.setCornSeeds(() -> AntarchyFabricItems.CORN_SEEDS.get()); + AntarchyObjects.setWildCorn(() -> AntarchyFabricBlocks.WILD_CORN.get()); + AntarchyObjects.setStarCoralBlock(() -> AntarchyFabricBlocks.STAR_CORAL_BLOCK.get()); + AntarchyObjects.setStarCoral(() -> AntarchyFabricBlocks.STAR_CORAL.get()); + AntarchyObjects.setStarCoralFan(() -> AntarchyFabricBlocks.STAR_CORAL_FAN.get()); + AntarchyObjects.setCookedCorndog(() -> AntarchyFabricItems.COOKED_CORNDOG.get()); + AntarchyObjects.setGlimmerBottle(() -> AntarchyFabricItems.GLIMMER_BOTTLE.get()); + AntarchyObjects.setLumen(() -> AntarchyFabricMisc.LUMEN.get()); + AntarchyObjects.setFlowingLumen(() -> AntarchyFabricMisc.FLOWING_LUMEN.get()); + AntarchyObjects.setLumenBucket(() -> AntarchyFabricItems.LUMEN_BUCKET.get()); + AntarchyObjects.setLumenBlock(() -> AntarchyFabricBlocks.LUMEN_BLOCK.get()); + AntarchyObjects.setLumenFroglight(() -> AntarchyFabricBlocks.LUMEN_FROGLIGHT.get()); + AntarchyObjects.setPeachLeavesParticle(() -> AntarchyFabricMisc.PEACH_LEAVES_PARTICLE.get()); + AntarchyObjects.setLotusPollen(() -> AntarchyFabricMisc.LOTUS_POLLEN.get()); + AntarchyObjects.setDorrieInventoryMenu(AntarchyFabricMisc.DORRIE_INVENTORY_MENU); + AntarchyObjects.setCritterCage(() -> AntarchyFabricItems.CRITTER_CAGE.get()); + AntarchyObjects.setCritterCageBlock(() -> AntarchyFabricBlocks.CRITTER_CAGE_BLOCK.get()); + AntarchyObjects.setCritterCageBlockEntity(() -> AntarchyFabricBlocks.CRITTER_CAGE_BLOCK_ENTITY.get()); + AntarchyObjects.setCritterCageProjectile(() -> AntarchyFabricEntities.CRITTER_CAGE_PROJECTILE.get()); + AntarchyObjects.bind( + AntarchyFabricEntities.EASTER_BUNNY, + AntarchyFabricEntities.FLYING_SQUIRREL, + AntarchyFabricEntities.KRAKEN, + AntarchyFabricEntities.MISSILE_SQUID, + AntarchyFabricEntities.MOLEWORM, + AntarchyFabricEntities.MANTIS, + AntarchyFabricEntities.BED_BUG, + AntarchyFabricEntities.WASP, + AntarchyFabricEntities.BOMBER, + AntarchyFabricEntities.SCORPION, + AntarchyFabricEntities.CATERPILLAR, + AntarchyFabricEntities.BUTTERFLY, + AntarchyFabricEntities.REVERIE, + AntarchyFabricEntities.TRIFFID, + AntarchyFabricEntities.BRUTALFLY, + AntarchyFabricEntities.BRUTALFLY_ORB, + AntarchyFabricEntities.HUSH_PROJECTILE, + AntarchyFabricEntities.TORETERROR, + AntarchyFabricEntities.WATER_BOMB, + AntarchyFabricEntities.CREEPING_HORROR, + AntarchyFabricEntities.LURKING_TERROR, + AntarchyFabricEntities.STINK_BUG, + AntarchyFabricEntities.CHEEP, + AntarchyFabricEntities.DORRIE, + () -> AntarchyFabricBlocks.DUPLICATOR_LOG.get(), + () -> AntarchyFabricBlocks.DUPLICATOR_SAPLING.get(), + () -> AntarchyFabricBlocks.DUCT_TAPE.get(), + () -> AntarchyFabricBlocks.INFESTED_ROOTED_DIRT.get(), + () -> AntarchyFabricBlocks.INFESTED_COARSE_DIRT.get(), + () -> AntarchyFabricBlocks.NYXITE.get(), + () -> AntarchyFabricBlocks.SHELLSTONE.get(), + () -> AntarchyFabricBlocks.POLISHED_SHELLSTONE.get(), + () -> AntarchyFabricBlocks.SHELLSTONE_BRICKS.get(), + () -> AntarchyFabricBlocks.CHISELED_SHELLSTONE.get(), + () -> AntarchyFabricBlocks.MOSSY_SHELLSTONE_BRICKS.get(), + () -> AntarchyFabricBlocks.CRACKED_SHELLSTONE_BRICKS.get(), + () -> AntarchyFabricBlocks.MOSSY_SHELLSTONE_BRICK_STAIRS.get(), + () -> AntarchyFabricBlocks.MOSSY_SHELLSTONE_BRICK_SLAB.get(), + () -> AntarchyFabricBlocks.MOSSY_SHELLSTONE_BRICK_WALL.get(), + () -> AntarchyFabricBlocks.SHELLSTONE_STAIRS.get(), + () -> AntarchyFabricBlocks.SHELLSTONE_SLAB.get(), + () -> AntarchyFabricBlocks.SHELLSTONE_WALL.get(), + () -> AntarchyFabricBlocks.POLISHED_SHELLSTONE_STAIRS.get(), + () -> AntarchyFabricBlocks.POLISHED_SHELLSTONE_SLAB.get(), + () -> AntarchyFabricBlocks.POLISHED_SHELLSTONE_WALL.get(), + () -> AntarchyFabricBlocks.SHELLSTONE_BRICK_STAIRS.get(), + () -> AntarchyFabricBlocks.SHELLSTONE_BRICK_SLAB.get(), + () -> AntarchyFabricBlocks.SHELLSTONE_BRICK_WALL.get(), + () -> AntarchyFabricBlocks.CLOUD_BLOCK.get(), + () -> AntarchyFabricBlocks.TRIFFID_GOO_BLOCK.get(), + () -> AntarchyFabricBlocks.PALE_NYXITE.get(), + () -> AntarchyFabricBlocks.NYXITE_SPIKE.get(), + () -> AntarchyFabricBlocks.CHITEN_BLOCK.get(), + () -> AntarchyFabricBlocks.CHITEN_SPIKE.get(), + () -> AntarchyFabricBlocks.POTENT_NYXITE.get(), + () -> AntarchyFabricBlocks.ANTIMETAL.get(), + () -> AntarchyFabricBlocks.POLISHED_ANTIMETAL.get(), + () -> AntarchyFabricBlocks.BUDDING_BLOOD_CRYSTAL.get(), + () -> AntarchyFabricBlocks.SMALL_BLOOD_CRYSTAL_BUD.get(), + () -> AntarchyFabricBlocks.MEDIUM_BLOOD_CRYSTAL_BUD.get(), + () -> AntarchyFabricBlocks.LARGE_BLOOD_CRYSTAL_BUD.get(), + () -> AntarchyFabricBlocks.BLOOD_CRYSTAL_CRYSTAL.get(), + () -> AntarchyFabricItems.OURANWOOD_ACORN.get(), + AntarchyFabricItems.KRAKEN_TOOTH, + () -> AntarchyFabricItems.MOGGLES.get(), + () -> AntarchyFabricItems.REVERIE_BOTTLE.get(), + () -> AntarchyFabricItems.STINK_BUG_ITEM.get(), + () -> AntarchyFabricMisc.mobEffectHolder(AntarchyFabricMisc.DREAD), + () -> AntarchyFabricMisc.mobEffectHolder(AntarchyFabricMisc.PARALYZED), + () -> AntarchyFabricMisc.mobEffectHolder(AntarchyFabricMisc.INVERTED), + () -> AntarchyFabricMisc.mobEffectHolder(AntarchyFabricMisc.STINKY), + () -> AntarchyFabricBlocks.OURANWOOD_ACORN_BLOCK.get(), + () -> AntarchyFabricBlocks.MOSSY_OURANWOOD_LOG.get(), + () -> AntarchyFabricBlocks.MOSSY_OURANWOOD_WOOD.get(), + () -> AntarchyFabricBlocks.UMBRAL_MOSS_BLOCK.get(), + () -> AntarchyFabricBlocks.UMBRAL_MOSS_CARPET.get(), + () -> AntarchyFabricBlocks.BLUSH_MOSS_BLOCK.get(), + () -> AntarchyFabricBlocks.BLUSH_MOSS_CARPET.get(), + () -> AntarchyFabricBlocks.ORANGE_MILKWEED.get(), + () -> AntarchyFabricBlocks.PINK_MILKWEED.get(), + () -> AntarchyFabricBlocks.BED_BUG_EGG.get(), + () -> AntarchyFabricBlocks.CREEPING_HORROR_EGG.get(), + () -> AntarchyFabricBlocks.LURKING_TERROR_EGG.get(), + () -> AntarchyFabricBlocks.WASP_NEST.get(), + () -> AntarchyFabricBlocks.HUSHWEED.get(), + () -> AntarchyFabricBlocks.OURANWOOD_SQUIRREL_NEST.get(), + () -> AntarchyFabricBlocks.BRUTALFLY_COCOON_SPAWNER.get(), + () -> AntarchyFabricBlocks.GIANT_LILY_PAD.get(), + () -> AntarchyFabricBlocks.SEASHELL.get(), + () -> AntarchyFabricBlocks.ANT_NEST_BLOCK_ENTITY.get(), + () -> AntarchyFabricBlocks.DREAM_CAMPFIRE_BLOCK_ENTITY.get(), + () -> AntarchyFabricBlocks.WASP_NEST_BLOCK_ENTITY.get(), + () -> AntarchyFabricBlocks.HUSHWEED_BLOCK_ENTITY.get(), + () -> AntarchyFabricBlocks.SEASHELL_BLOCK_ENTITY.get(), + () -> AntarchyFabricMisc.STINKY_GAS.get(), + () -> AntarchyFabricMisc.STINKY_FLY.get(), + () -> AntarchyFabricMisc.PEACH_LEAVES_PARTICLE.get(), + () -> AntarchyFabricMisc.attributeHolder(AntarchyFabricMisc.SCALE), + () -> AntarchyFabricMisc.attributeHolder(AntarchyFabricMisc.DOUBLE_DAMAGE_CHANCE), + () -> AntarchyFabricMisc.attributeHolder(AntarchyFabricMisc.BLOODGLASS_MAX_HEARTS), + () -> AntarchyFabricMisc.mobEffectHolder(AntarchyFabricMisc.BLOODGLASS_WARD) + ); + + LucidEyeProjectileEntity.defaultItemSupplier = () -> AntarchyFabricItems.LUCID_PEARL.get(); + LucidEntity.invertedEffectSupplier = () -> AntarchyFabricMisc.mobEffectHolder(AntarchyFabricMisc.INVERTED); + LucidEntity.boltEntityTypeSupplier = () -> AntarchyFabricEntities.LUCID_BOLT.get(); + LucidBoltEntity.invertedEffectSupplier = () -> AntarchyFabricMisc.mobEffectHolder(AntarchyFabricMisc.INVERTED); + LucidEyeProjectileEntity.invertedEffectSupplier = () -> AntarchyFabricMisc.mobEffectHolder(AntarchyFabricMisc.INVERTED); + + ScorpionWhipTetherSync.setSink(AntarchyFabricNetworking::syncScorpionWhipTether); + HerculesBeetleImpactShakeSync.setSink((player, ticks) -> { + com.craisinlord.antarchy.content.network.HerculesBeetleImpactShakePayload payload = new com.craisinlord.antarchy.content.network.HerculesBeetleImpactShakePayload(ticks); + com.craisinlord.antarchy.fabric.network.AntarchyFabricNetworking.sendToPlayer(player, payload, com.craisinlord.antarchy.content.network.HerculesBeetleImpactShakePayload.STREAM_CODEC, com.craisinlord.antarchy.content.network.HerculesBeetleImpactShakePayload.TYPE); + }); + ImpactShakeSync.setSink((player, payload) -> + com.craisinlord.antarchy.fabric.network.AntarchyFabricNetworking.sendToPlayer(player, payload, com.craisinlord.antarchy.content.network.ImpactShakePayload.STREAM_CODEC, com.craisinlord.antarchy.content.network.ImpactShakePayload.TYPE)); + HordeIntensitySync.setSink((player, payload) -> + com.craisinlord.antarchy.fabric.network.AntarchyFabricNetworking.sendToPlayer(player, payload, com.craisinlord.antarchy.content.network.HordeIntensityPayload.STREAM_CODEC, com.craisinlord.antarchy.content.network.HordeIntensityPayload.TYPE)); + BloodCrystalKatanaItem.setTrailCallback(AntarchyFabricNetworking::syncKatanaTrail); + com.craisinlord.antarchy.content.gravity.AntarchyGravityApi.setSyncDispatcher(AntarchyFabricNetworking::syncGravityEntity); + AntarchyFabricEvents.register(); + + if (isSupportedInfinityLoaded()) { + InfinityCompat.bind(new FabricInfinityCompat()); + } + } + + + + private static boolean isSupportedInfinityLoaded() { + if (!FabricInfinityCompat.isAvailableOnClasspath()) { + return false; + } + + try { + String version = FabricLoader.getInstance() + .getModContainer("infinity") + .map(container -> container.getMetadata().getVersion().getFriendlyString()) + .orElse(null); + if (InfinityCompatVersion.isSupported(version)) { + return true; + } + + Antarchy.LOGGER.warn( + "Skipping Infinity integration because version {} is below the supported minimum {}", + version, + InfinityCompatVersion.requiredVersion() + ); + } catch (Throwable throwable) { + Antarchy.LOGGER.warn("Skipping Infinity integration because the installed Infinity version could not be verified", throwable); + } + return false; + } + +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricDispenserBehaviors.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricDispenserBehaviors.java new file mode 100644 index 00000000..69c5a683 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricDispenserBehaviors.java @@ -0,0 +1,69 @@ +package com.craisinlord.antarchy.fabric; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.dispenser.AntimetalMinecartDispenseBehavior; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricItems; +import net.minecraft.core.Direction; +import net.minecraft.core.BlockSource; +import net.minecraft.core.dispenser.DefaultDispenseItemBehavior; +import net.minecraft.core.dispenser.DispenseItemBehavior; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.SpawnEggItem; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.gameevent.GameEvent; + +public final class AntarchyFabricDispenserBehaviors { + private static final DispenseItemBehavior ANTIMETAL_MINECART_BEHAVIOR = new AntimetalMinecartDispenseBehavior(); + private static final DispenseItemBehavior SPAWN_EGG_BEHAVIOR = new DefaultDispenseItemBehavior() { + @Override + public ItemStack execute(BlockSource source, ItemStack stack) { + Direction direction = source.getBlockState().getValue(DispenserBlock.FACING); + EntityType entityType = ((SpawnEggItem) stack.getItem()).getType(stack.getTag()); + + try { + entityType.spawn(source.getLevel(), stack.getTag(), null, source.getPos().relative(direction), MobSpawnType.DISPENSER, direction != Direction.UP, false); + } catch (Exception exception) { + Antarchy.LOGGER.error("Error while dispensing spawn egg from dispenser at {}", source.getPos(), exception); + return ItemStack.EMPTY; + } + + stack.shrink(1); + source.getLevel().gameEvent(null, GameEvent.ENTITY_PLACE, source.getPos()); + return stack; + } + }; + + private AntarchyFabricDispenserBehaviors() { + } + + public static void register() { + registerSpawnEggs(); + registerPotions(); + registerMinecarts(); + } + + private static void registerSpawnEggs() { + for (var holder : AntarchyFabricItems.ITEMS.getEntries()) { + Item item = holder.get(); + if (item instanceof SpawnEggItem) { + DispenserBlock.registerBehavior(item, SPAWN_EGG_BEHAVIOR); + } + } + } + + private static void registerPotions() { + } + + private static void registerMinecarts() { + DispenserBlock.registerBehavior(Items.MINECART, ANTIMETAL_MINECART_BEHAVIOR); + DispenserBlock.registerBehavior(Items.CHEST_MINECART, ANTIMETAL_MINECART_BEHAVIOR); + DispenserBlock.registerBehavior(Items.FURNACE_MINECART, ANTIMETAL_MINECART_BEHAVIOR); + DispenserBlock.registerBehavior(Items.TNT_MINECART, ANTIMETAL_MINECART_BEHAVIOR); + DispenserBlock.registerBehavior(Items.HOPPER_MINECART, ANTIMETAL_MINECART_BEHAVIOR); + DispenserBlock.registerBehavior(Items.COMMAND_BLOCK_MINECART, ANTIMETAL_MINECART_BEHAVIOR); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricEvents.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricEvents.java new file mode 100644 index 00000000..46505c47 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricEvents.java @@ -0,0 +1,289 @@ +package com.craisinlord.antarchy.fabric; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricBlocks; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricItems; + +import com.craisinlord.antarchy.content.entity.ReverieEntity; +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.block.DuctTapeBlock; +import com.craisinlord.antarchy.content.item.AttitudeAdjusterItem; +import com.craisinlord.antarchy.content.item.AttitudeAdjusterSlamManager; +import com.craisinlord.antarchy.content.fluid.AntarchyFluidChecks; +import com.craisinlord.antarchy.content.entity.MissileSquidEntity; +import com.craisinlord.antarchy.content.entity.kraken.KrakenEntity; +import com.craisinlord.antarchy.content.gravity.AntarchyGravityApi; +import com.craisinlord.antarchy.content.gravity.AntarchyGravityDirection; +import com.craisinlord.antarchy.content.gravity.AntarchyGravityTransition; +import com.craisinlord.antarchy.content.horde.CavarynHordeManager; +import com.craisinlord.antarchy.content.portal.PermanentPortalManager; +import com.craisinlord.antarchy.content.command.CavarynCommand; +import com.craisinlord.antarchy.content.command.CaterpillarCommand; +import com.craisinlord.antarchy.content.command.GravityCommand; +import com.craisinlord.antarchy.content.item.MinersDreamExcavationManager; +import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; +import net.fabricmc.fabric.api.entity.event.v1.ServerLivingEntityEvents; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; +import net.fabricmc.fabric.api.object.builder.v1.trade.TradeOfferHelper; +import net.fabricmc.fabric.api.event.player.AttackEntityCallback; +import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents; +import net.minecraft.server.level.ServerPlayer; +import com.craisinlord.antarchy.content.dispenser.SquidzookaDispenseBehavior; +import com.craisinlord.antarchy.content.dispenser.RpoLauncherDispenseBehavior; +import com.craisinlord.antarchy.content.dispenser.SizeRayDispenseBehavior; +import com.craisinlord.antarchy.content.dispenser.WaterCannonDispenseBehavior; +import net.minecraft.world.level.block.ComposterBlock; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.FluidTags; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.npc.VillagerProfession; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.trading.MerchantOffer; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +public final class AntarchyFabricEvents { + private static final AntarchyGravityTransition INVERTED_CLEAR_TRANSITION = new AntarchyGravityTransition(12); + private static final Set invertedPlayers = new HashSet<>(); + + private AntarchyFabricEvents() { + } + + public static void register() { + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { + CavarynCommand.register(dispatcher); + GravityCommand.register(dispatcher); + CaterpillarCommand.register(dispatcher); + }); + + DispenserBlock.registerBehavior(AntarchyFabricItems.SQUIDZOOKA.get(), new SquidzookaDispenseBehavior()); + DispenserBlock.registerBehavior(AntarchyFabricItems.RPO_LAUNCHER.get(), new RpoLauncherDispenseBehavior()); + DispenserBlock.registerBehavior(AntarchyFabricItems.WATER_CANNON.get(), new WaterCannonDispenseBehavior()); + DispenserBlock.registerBehavior(AntarchyFabricItems.SHRINK_RAY.get(), new SizeRayDispenseBehavior()); + DispenserBlock.registerBehavior(AntarchyFabricItems.GROWTH_RAY.get(), new SizeRayDispenseBehavior()); + AntarchyFabricDispenserBehaviors.register(); + registerTrades(); + + ComposterBlock.COMPOSTABLES.put(AntarchyFabricBlocks.UMBRAL_MOSS_BLOCK.get().asItem(), 0.65f); + ComposterBlock.COMPOSTABLES.put(AntarchyFabricBlocks.UMBRAL_MOSS_CARPET.get().asItem(), 0.3f); + ComposterBlock.COMPOSTABLES.put(AntarchyFabricBlocks.BLUSH_MOSS_BLOCK.get().asItem(), 0.65f); + ComposterBlock.COMPOSTABLES.put(AntarchyFabricBlocks.BLUSH_MOSS_CARPET.get().asItem(), 0.3f); + ComposterBlock.COMPOSTABLES.put(AntarchyFabricBlocks.HUSHWEED.get().asItem(), 0.65f); + ComposterBlock.COMPOSTABLES.put(AntarchyFabricItems.CORNEA_EAR.get(), 0.65f); + ComposterBlock.COMPOSTABLES.put(AntarchyFabricBlocks.PEACH_LEAVES.get().asItem(), 0.3f); + ComposterBlock.COMPOSTABLES.put(AntarchyFabricItems.PEACH_SAPLING_ITEM.get(), 0.3f); + ComposterBlock.COMPOSTABLES.put(AntarchyFabricItems.CORN.get(), 0.65f); + ComposterBlock.COMPOSTABLES.put(AntarchyFabricItems.CORN_SEEDS.get(), 0.3f); + ComposterBlock.COMPOSTABLES.put(AntarchyFabricItems.PEACH.get(), 0.65f); + + ServerLivingEntityEvents.AFTER_DEATH.register((entity, damageSource) -> { + if (entity instanceof ServerPlayer sp) { + BloodglassManager.handleDeath(sp); + } + PermanentPortalManager.handleSacrifice(entity); + if (entity.getKillCredit() instanceof ServerPlayer killer) { + CavarynHordeManager.recordMobKill(killer, entity); + } + if (entity instanceof MissileSquidEntity missileSquid) { + if (missileSquid.isSpawnedByKraken()) { + return; + } + } else if (entity.getType() != net.minecraft.world.entity.EntityType.SQUID) { + return; + } + if (!(entity.level() instanceof ServerLevel serverLevel)) { + return; + } + if (!(entity.getKillCredit() instanceof Player killer)) { + return; + } + + boolean requireBadOmen = AntarchySettings.krakenRequireBadOmenToSummon(); + int badOmenLevel = badOmenLevel(killer); + if (requireBadOmen && badOmenLevel <= 0) { + return; + } + + BlockPos deathPos = entity.blockPosition(); + if (AntarchySettings.krakenSquidSpawnEnabled()) { + int chanceDenominator = requireBadOmen ? Math.max(1, 100 / badOmenLevel) : 100; + if (serverLevel.random.nextInt(chanceDenominator) == 0) { + spawnKrakens(serverLevel, deathPos, 1); + } + } + if (AntarchySettings.krakenMassSpawnEnabled() && serverLevel.random.nextInt(500) == 0) { + spawnKrakens(serverLevel, deathPos, 10); + } + }); + + AttackEntityCallback.EVENT.register((player, world, hand, entity, hitResult) -> { + if (!world.isClientSide && player.getItemInHand(hand).getItem() instanceof AttitudeAdjusterItem && player.getAttackStrengthScale(0.5F) >= 0.95F) { + AttitudeAdjusterSlamManager.markSpecialHit(player); + } + return InteractionResult.PASS; + }); + PlayerBlockBreakEvents.AFTER.register((world, player, pos, state, blockEntity) -> { + if (!world.isClientSide && player instanceof ServerPlayer serverPlayer) { + CavarynHordeManager.recordBlockBreak(serverPlayer, state, pos); + } + }); + + ServerTickEvents.END_SERVER_TICK.register(server -> { + Set activeThisTick = new HashSet<>(); + for (ServerLevel level : server.getAllLevels()) { + CavarynHordeManager.tick(level); + tickInvertedPlayers(level, activeThisTick); + tickDuctTapePlayers(level); + tickIchorPlayers(level); + tickBloodglassRecharge(level); + AttitudeAdjusterSlamManager.tick(level); + MinersDreamExcavationManager.tick(level); + } + invertedPlayers.retainAll(activeThisTick); + }); + } + + private static void registerTrades() { + TradeOfferHelper.registerVillagerOffers(VillagerProfession.FARMER, 1, factories -> + factories.add((trader, random) -> new MerchantOffer( + new ItemStack(AntarchyFabricItems.CORN.get(), 20), + new ItemStack(Items.EMERALD), + 16, + 2, + 0.05F + ))); + TradeOfferHelper.registerVillagerOffers(VillagerProfession.BUTCHER, 1, factories -> + factories.add((trader, random) -> new MerchantOffer( + new ItemStack(AntarchyFabricItems.COOKED_CORNDOG.get(), 5), + new ItemStack(Items.EMERALD), + 16, + 2, + 0.05F + ))); + TradeOfferHelper.registerWanderingTraderOffers(0, factories -> + factories.add((trader, random) -> new MerchantOffer( + new ItemStack(Items.EMERALD, 1), + new ItemStack(AntarchyFabricItems.CORN_SEEDS.get(), 3), + 12, + 2, + 0.05F + ))); + } + + private static int badOmenLevel(Player player) { + MobEffectInstance effect = player.getEffect(MobEffects.BAD_OMEN); + return effect != null ? effect.getAmplifier() + 1 : 0; + } + + private static void spawnKrakens(ServerLevel level, BlockPos origin, int count) { + for (int i = 0; i < count; i++) { + BlockPos spawnPos = findKrakenSpawnPos(level, origin); + KrakenEntity kraken = AntarchyObjects.KRAKEN.get().create(level); + if (kraken == null) { + continue; + } + kraken.moveTo(spawnPos.getX() + 0.5D, spawnPos.getY() + 1.0D, spawnPos.getZ() + 0.5D, + level.random.nextFloat() * 360.0F, 0.0F); + kraken.finalizeSpawn(level, level.getCurrentDifficultyAt(spawnPos), MobSpawnType.EVENT, null, null); + level.addFreshEntity(kraken); + } + } + + private static BlockPos findKrakenSpawnPos(ServerLevel level, BlockPos origin) { + for (int attempt = 0; attempt < 20; attempt++) { + BlockPos candidate = origin.offset( + level.random.nextInt(33) - 16, + level.random.nextInt(9) - 4, + level.random.nextInt(33) - 16 + ); + if (level.getFluidState(candidate).is(FluidTags.WATER)) { + return candidate; + } + } + return origin.above(3); + } + + private static void tickInvertedPlayers(ServerLevel level, Set activeThisTick) { + for (Player player : level.players()) { + LivingEntity livingEntity = player; + + if (livingEntity.hasEffect(AntarchyObjects.INVERTED_EFFECT.get())) { + activeThisTick.add(player.getUUID()); + invertedPlayers.add(player.getUUID()); + continue; + } + + if (!invertedPlayers.remove(player.getUUID())) { + continue; + } + + if (AntarchyGravityApi.getGravityDirection(player) == AntarchyGravityDirection.UP + || AntarchyGravityApi.isGravityForced(player)) { + AntarchyGravityApi.setGravityDirection(player, AntarchyGravityDirection.DOWN, INVERTED_CLEAR_TRANSITION); + } + notifyNearbyReveriesOfInversionChange(player); + } + } + + private static void notifyNearbyReveriesOfInversionChange(Player player) { + for (ReverieEntity reverie : player.level().getEntitiesOfClass( + ReverieEntity.class, + player.getBoundingBox().inflate(48.0D) + )) { + reverie.syncFocusInversionState(); + } + } + + private static void tickDuctTapePlayers(ServerLevel level) { + for (Player player : level.players()) { + DuctTapeBlock.tickStuckEntity(player); + } + } + + private static void tickIchorPlayers(ServerLevel level) { + if (!AntarchySettings.ichorWitherEnabled()) { + return; + } + + for (Player player : level.players()) { + if (!antarchy$isInIchor(player)) { + continue; + } + player.addEffect(new MobEffectInstance(MobEffects.WITHER, 40, 0, false, true, true)); + } + } + + private static void tickBloodglassRecharge(ServerLevel level) { + for (Player player : level.players()) { + if (player instanceof ServerPlayer sp) { + BloodglassManager.tickRecharge(sp); + } + } + } + + private static boolean antarchy$isInIchor(LivingEntity entity) { + BlockPos min = BlockPos.containing(entity.getBoundingBox().minX, entity.getBoundingBox().minY, entity.getBoundingBox().minZ); + BlockPos max = BlockPos.containing(entity.getBoundingBox().maxX, entity.getBoundingBox().maxY, entity.getBoundingBox().maxZ); + BlockPos.MutableBlockPos cursor = new BlockPos.MutableBlockPos(); + for (int x = min.getX(); x <= max.getX(); x++) { + for (int y = min.getY(); y <= max.getY(); y++) { + for (int z = min.getZ(); z <= max.getZ(); z++) { + cursor.set(x, y, z); + if (AntarchyFluidChecks.isIchor(entity.level().getFluidState(cursor))) { + return true; + } + } + } + } + return false; + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyWoodTypes.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyWoodTypes.java new file mode 100644 index 00000000..7b807144 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyWoodTypes.java @@ -0,0 +1,18 @@ +package com.craisinlord.antarchy.fabric; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.fabric.mixin.WoodTypeInvoker; +import net.minecraft.world.level.block.state.properties.BlockSetType; +import net.minecraft.world.level.block.state.properties.WoodType; + +public final class AntarchyWoodTypes { + public static final WoodType OURANWOOD = register("ouranwood"); + public static final WoodType PEACH = register("peach"); + + private AntarchyWoodTypes() { + } + + private static WoodType register(String name) { + return WoodTypeInvoker.antarchy$register(new WoodType(Antarchy.MODID + ":" + name, BlockSetType.JUNGLE)); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/BloodglassManager.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/BloodglassManager.java new file mode 100644 index 00000000..04415e7f --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/BloodglassManager.java @@ -0,0 +1,236 @@ +package com.craisinlord.antarchy.fabric; + +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.bloodglass.BloodglassAccess; +import com.craisinlord.antarchy.content.item.BloodCrystalArmorItem; +import com.craisinlord.antarchy.fabric.network.AntarchyFabricNetworking; +import net.fabricmc.fabric.api.entity.event.v1.ServerLivingEntityEvents; +import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; +import net.minecraft.core.particles.DustParticleOptions; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.tags.TagKey; +import net.minecraft.world.damagesource.DamageType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.registries.Registries; +import org.joml.Vector3f; + +public final class BloodglassManager { + private static final TagKey BYPASSES_BLOODGLASS = TagKey.create( + Registries.DAMAGE_TYPE, + new ResourceLocation("antarchy", "bypasses_bloodglass") + ); + + private BloodglassManager() {} + + public static void register() { + ServerLivingEntityEvents.ALLOW_DAMAGE.register((entity, source, amount) -> { + if (!(entity instanceof Player player)) return true; + if (entity.level().isClientSide()) return true; + if (amount <= 1.0f) return true; + if (source.is(BYPASSES_BLOODGLASS)) return true; + + BloodglassAccess access = (BloodglassAccess) player; + if (access.antarchy$getTotalShieldsActive() <= 0) return true; + + if (access.antarchy$getAppleShieldsActive() > 0) { + access.antarchy$setAppleShieldsActive(access.antarchy$getAppleShieldsActive() - 1); + access.antarchy$setAppleShieldLostCount(access.antarchy$getAppleShieldLostCount() + 1); + if (access.antarchy$getAppleRechargeTimer() == 0) { + access.antarchy$setAppleRechargeTimer(AntarchySettings.bloodCrystalAppleShieldRechargeTicks()); + } + } else { + access.antarchy$setArmorShieldsActive(access.antarchy$getArmorShieldsActive() - 1); + access.antarchy$setArmorShieldLostCount(access.antarchy$getArmorShieldLostCount() + 1); + if (access.antarchy$getArmorRechargeTimer() == 0) { + access.antarchy$setArmorRechargeTimer(AntarchySettings.bloodCrystalArmorShieldRechargeTicks()); + } + } + + ServerLevel serverLevel = (ServerLevel) player.level(); + serverLevel.broadcastEntityEvent(player, (byte) 2); + serverLevel.playSound(null, player.blockPosition(), SoundEvents.GLASS_BREAK, SoundSource.PLAYERS, 1.0f, 1.0f); + serverLevel.sendParticles( + new DustParticleOptions(new Vector3f(0.85f, 0.18f, 0.38f), 1.2f), + player.getX(), player.getEyeY(), player.getZ(), + 35, 0.35, 0.55, 0.35, 0.12 + ); + + syncBloodglass((ServerPlayer) player); + return false; + }); + + ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> handleLogin(handler.player)); + } + + public static void syncBloodglass(ServerPlayer player) { + BloodglassAccess access = (BloodglassAccess) player; + AntarchyFabricNetworking.syncBloodglass(player, + access.antarchy$getTotalShieldsActive(), + access.antarchy$getTotalShieldsMax()); + } + + public static void handleArmorEquipChange(Player player, EquipmentSlot slot, ItemStack from, ItemStack to) { + if (player.level().isClientSide()) return; + if (slot != EquipmentSlot.HEAD && slot != EquipmentSlot.CHEST + && slot != EquipmentSlot.LEGS && slot != EquipmentSlot.FEET) return; + + boolean fromIsBC = from.getItem() instanceof BloodCrystalArmorItem; + boolean toIsBC = to.getItem() instanceof BloodCrystalArmorItem; + if (!fromIsBC && !toIsBC) return; + + BloodglassAccess access = (BloodglassAccess) player; + + if (fromIsBC && !toIsBC) { + if (access.antarchy$getArmorShieldsActive() > 0) { + access.antarchy$setArmorShieldsActive(access.antarchy$getArmorShieldsActive() - 1); + } else if (access.antarchy$getArmorShieldLostCount() > 0) { + access.antarchy$setArmorShieldLostCount(access.antarchy$getArmorShieldLostCount() - 1); + if (access.antarchy$getArmorShieldLostCount() == 0) { + access.antarchy$setArmorRechargeTimer(0); + } + } + } else if (!fromIsBC) { + // Count BC pieces: explicitly include the new piece (to) since getItemBySlot(slot) + // may not reflect the new item yet when onEquipItem fires on Fabric. + int bcPieces = 1; // the piece being equipped now + for (EquipmentSlot s : new EquipmentSlot[]{EquipmentSlot.HEAD, EquipmentSlot.CHEST, EquipmentSlot.LEGS, EquipmentSlot.FEET}) { + if (s == slot) continue; + if (player.getItemBySlot(s).getItem() instanceof BloodCrystalArmorItem) bcPieces++; + } + int currentTotal = access.antarchy$getArmorShieldsActive() + access.antarchy$getArmorShieldLostCount(); + if (currentTotal < bcPieces) { + access.antarchy$setArmorShieldLostCount(access.antarchy$getArmorShieldLostCount() + 1); + access.antarchy$setArmorRechargeTimer(AntarchySettings.bloodCrystalArmorShieldRechargeTicks()); + } + } else { + // BC → BC swap: remove old slot, queue new one + if (access.antarchy$getArmorShieldsActive() > 0) { + access.antarchy$setArmorShieldsActive(access.antarchy$getArmorShieldsActive() - 1); + } else if (access.antarchy$getArmorShieldLostCount() > 0) { + access.antarchy$setArmorShieldLostCount(access.antarchy$getArmorShieldLostCount() - 1); + } + access.antarchy$setArmorShieldLostCount(access.antarchy$getArmorShieldLostCount() + 1); + access.antarchy$setArmorRechargeTimer(AntarchySettings.bloodCrystalArmorShieldRechargeTicks()); + } + + if (player instanceof ServerPlayer sp) syncBloodglass(sp); + } + + public static void handleWardApplied(Player player, int amplifier) { + if (player.level().isClientSide()) return; + BloodglassAccess access = (BloodglassAccess) player; + int cap = Math.max(0, AntarchySettings.bloodCrystalHardMaxShields() + - access.antarchy$getArmorShieldsActive() + - access.antarchy$getArmorShieldLostCount()); + int targetCap = Math.min(amplifier + 1, cap); + int currentCap = access.antarchy$getAppleShieldsActive() + access.antarchy$getAppleShieldLostCount(); + // Only grant newly-added capacity (e.g. first application, or a higher amplifier). + // A mere duration refresh of an already-active ward must not reset shields that are + // already lost, nor restart their recharge timer. + if (targetCap > currentCap) { + access.antarchy$setAppleShieldsActive(access.antarchy$getAppleShieldsActive() + (targetCap - currentCap)); + if (player instanceof ServerPlayer sp) syncBloodglass(sp); + } + } + + public static void handleWardRemoved(Player player) { + if (player.level().isClientSide()) return; + BloodglassAccess access = (BloodglassAccess) player; + access.antarchy$setAppleShieldsActive(0); + access.antarchy$setAppleShieldLostCount(0); + access.antarchy$setAppleRechargeTimer(0); + if (player instanceof ServerPlayer sp) syncBloodglass(sp); + } + + public static void tickRecharge(ServerPlayer player) { + BloodglassAccess access = (BloodglassAccess) player; + boolean changed = false; + int hardCap = AntarchySettings.bloodCrystalHardMaxShields(); + + if (access.antarchy$getArmorShieldLostCount() > 0) { + int timer = access.antarchy$getArmorRechargeTimer(); + if (timer > 1) { + access.antarchy$setArmorRechargeTimer(timer - 1); + } else if (timer == 1) { + if (access.antarchy$getTotalShieldsActive() < hardCap) { + access.antarchy$setArmorShieldsActive(access.antarchy$getArmorShieldsActive() + 1); + access.antarchy$setArmorShieldLostCount(access.antarchy$getArmorShieldLostCount() - 1); + changed = true; + } + access.antarchy$setArmorRechargeTimer(access.antarchy$getArmorShieldLostCount() > 0 + ? AntarchySettings.bloodCrystalArmorShieldRechargeTicks() : 0); + } + } + + if (access.antarchy$getAppleShieldLostCount() > 0 && player.hasEffect(AntarchyObjects.BLOODGLASS_WARD.get())) { + int timer = access.antarchy$getAppleRechargeTimer(); + if (timer > 1) { + access.antarchy$setAppleRechargeTimer(timer - 1); + } else if (timer == 1) { + if (access.antarchy$getTotalShieldsActive() < hardCap) { + access.antarchy$setAppleShieldsActive(access.antarchy$getAppleShieldsActive() + 1); + access.antarchy$setAppleShieldLostCount(access.antarchy$getAppleShieldLostCount() - 1); + changed = true; + } + access.antarchy$setAppleRechargeTimer(access.antarchy$getAppleShieldLostCount() > 0 + ? AntarchySettings.bloodCrystalAppleShieldRechargeTicks() : 0); + } + } + + if (changed) { + syncBloodglass(player); + player.playNotifySound(SoundEvents.AMETHYST_BLOCK_CHIME, SoundSource.PLAYERS, 0.6f, 1.6f); + } + } + + public static void handleDeath(ServerPlayer player) { + BloodglassAccess access = (BloodglassAccess) player; + access.antarchy$setArmorShieldsActive(0); + access.antarchy$setArmorShieldLostCount(0); + access.antarchy$setArmorRechargeTimer(0); + access.antarchy$setAppleShieldsActive(0); + access.antarchy$setAppleShieldLostCount(0); + access.antarchy$setAppleRechargeTimer(0); + syncBloodglass(player); + } + + public static void handleRespawn(ServerPlayer player) { + BloodglassAccess access = (BloodglassAccess) player; + int shields = Math.min(countBCArmorPieces(player), AntarchySettings.bloodCrystalHardMaxShields()); + access.antarchy$setArmorShieldsActive(shields); + access.antarchy$setArmorShieldLostCount(0); + access.antarchy$setArmorRechargeTimer(0); + syncBloodglass(player); + } + + private static void handleLogin(ServerPlayer player) { + BloodglassAccess access = (BloodglassAccess) player; + if (player.hasEffect(AntarchyObjects.BLOODGLASS_WARD.get())) { + var effect = player.getEffect(AntarchyObjects.BLOODGLASS_WARD.get()); + if (effect != null) { + int cap = Math.max(0, AntarchySettings.bloodCrystalHardMaxShields() + - access.antarchy$getArmorShieldsActive() + - access.antarchy$getArmorShieldLostCount()); + access.antarchy$setAppleShieldsActive(Math.min(effect.getAmplifier() + 1, cap)); + access.antarchy$setAppleShieldLostCount(0); + access.antarchy$setAppleRechargeTimer(0); + } + } + syncBloodglass(player); + } + + private static int countBCArmorPieces(Player player) { + int count = 0; + for (EquipmentSlot slot : new EquipmentSlot[]{EquipmentSlot.HEAD, EquipmentSlot.CHEST, EquipmentSlot.LEGS, EquipmentSlot.FEET}) { + if (player.getItemBySlot(slot).getItem() instanceof BloodCrystalArmorItem) count++; + } + return count; + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/FabricInfinityCompat.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/FabricInfinityCompat.java new file mode 100644 index 00000000..8c038d39 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/FabricInfinityCompat.java @@ -0,0 +1,47 @@ +package com.craisinlord.antarchy.fabric; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.compat.infinity.InfinityCompatBridge; +import net.lerariemann.infinity.util.InfinityMethods; +import net.lerariemann.infinity.util.teleport.WarpLogic; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.RandomSource; + +public final class FabricInfinityCompat implements InfinityCompatBridge { + public static boolean isAvailableOnClasspath() { + try { + Class.forName("net.lerariemann.infinity.util.InfinityMethods"); + Class.forName("net.lerariemann.infinity.util.teleport.WarpLogic"); + return true; + } catch (Throwable ignored) { + return false; + } + } + + @Override + public boolean isAvailable() { + return true; + } + + @Override + public ResourceLocation getRandomDimensionId(RandomSource random) { + try { + return InfinityMethods.getRandomId(random); + } catch (Throwable throwable) { + Antarchy.LOGGER.error("[Antarchy] Failed to get a random Infinity dimension id", throwable); + return null; + } + } + + @Override + public boolean requestWarp(ServerPlayer player, ResourceLocation dimensionId) { + try { + WarpLogic.requestWarp(player, dimensionId, false); + return true; + } catch (Throwable throwable) { + Antarchy.LOGGER.error("[Antarchy] Failed to request an Infinity warp to {}", dimensionId, throwable); + return false; + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClient.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClient.java new file mode 100644 index 00000000..4570a6e8 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClient.java @@ -0,0 +1,14 @@ +package com.craisinlord.antarchy.fabric.client; + +import com.craisinlord.antarchy.fabric.network.AntarchyFabricClientNetworking; +import net.fabricmc.api.ClientModInitializer; + +public final class AntarchyFabricClient implements ClientModInitializer { + @Override + public void onInitializeClient() { + AntarchyFabricClientNetworking.register(); + AntarchyFabricClientNetworking.bootstrapMultipartClient(); + AntarchyFabricClientBootstrap.register(); + } +} + diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClientBootstrap.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClientBootstrap.java new file mode 100644 index 00000000..49559bf3 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClientBootstrap.java @@ -0,0 +1,507 @@ +package com.craisinlord.antarchy.fabric.client; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricBlocks; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricEntities; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricItems; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricMisc; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.client.CameraShakeClientState; +import com.craisinlord.antarchy.content.client.HerculesBeetleImpactShakeClientState; +import com.craisinlord.antarchy.content.client.HordeClientState; +import com.craisinlord.antarchy.content.client.renderer.*; +import com.craisinlord.antarchy.content.client.particle.*; +import com.craisinlord.antarchy.content.client.renderer.AntiwaterFluidRenderer; +import com.craisinlord.antarchy.fabric.AntarchyFabricContent; +import com.craisinlord.antarchy.fabric.client.renderer.MultipartPartRenderer; +import net.fabricmc.fabric.api.client.rendering.v1.LivingEntityFeatureRendererRegistrationCallback; +import net.minecraft.world.entity.EntityType; +import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry; +import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry; +import net.fabricmc.fabric.api.client.rendering.v1.BlockEntityRendererRegistry; +import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry; +import net.fabricmc.fabric.api.client.rendering.v1.EntityModelLayerRegistry; +import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry; +import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; +import net.minecraft.client.model.BoatModel; +import net.minecraft.client.model.ChestBoatModel; +import net.minecraft.client.gui.screens.MenuScreens; +import net.minecraft.client.renderer.BiomeColors; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.client.renderer.blockentity.CampfireRenderer; +import net.minecraft.client.renderer.entity.ArmorStandRenderer; +import net.minecraft.client.renderer.entity.ThrownItemRenderer; +import net.minecraft.client.renderer.item.ItemProperties; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.item.CrossbowItem; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.FoliageColor; +import net.fabricmc.fabric.api.client.render.fluid.v1.SimpleFluidRenderHandler; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.BlockAndTintGetter; +import com.mojang.blaze3d.vertex.VertexConsumer; +import java.util.function.Function; + +public final class AntarchyFabricClientBootstrap { + private AntarchyFabricClientBootstrap() { + } + + public static void register() { + AntarchyKeyBindings.register(); + MenuScreens.register(AntarchyFabricMisc.DORRIE_INVENTORY_MENU.get(), com.craisinlord.antarchy.content.client.screen.DorrieInventoryScreen::new); + registerRenderers(); + registerEntityLayers(); + registerColors(); + registerParticles(); + registerFluids(); + registerRenderLayers(); + registerItemProperties(); + registerClientCallbacks(); + } + + private static void registerRenderers() { + BlockEntityRendererRegistry.register( + (net.minecraft.world.level.block.entity.BlockEntityType) AntarchyFabricBlocks.DREAM_CAMPFIRE_BLOCK_ENTITY.get(), + (BlockEntityRendererProvider) CampfireRenderer::new + ); + BlockEntityRendererRegistry.register( + (net.minecraft.world.level.block.entity.BlockEntityType) AntarchyFabricBlocks.SEASHELL_BLOCK_ENTITY.get(), + (BlockEntityRendererProvider) SeashellRenderer::new + ); + BlockEntityRendererRegistry.register( + (net.minecraft.world.level.block.entity.BlockEntityType) AntarchyFabricBlocks.CRITTER_CAGE_BLOCK_ENTITY.get(), + (BlockEntityRendererProvider) CritterCageRenderer::new + ); + + EntityRendererRegistry.register(AntarchyFabricEntities.EASTER_BUNNY.get(), EasterBunnyRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.FLYING_SQUIRREL.get(), FlyingSquirrelRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.CATERPILLAR.get(), CaterpillarRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.BUTTERFLY.get(), ButterflyRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.REVERIE.get(), ReverieRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.BRUTALFLY.get(), BrutalflyRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.RED_ANT.get(), AntRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.BROWN_ANT.get(), AntRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.RAINBOW_ANT.get(), AntRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.MOLEWORM.get(), MolewormRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.MANTIS.get(), MantisRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.ALPHA_MANTIS.get(), AlphaMantisRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.MOLEVORE.get(), MolevoreRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.TRIFFID.get(), TriffidRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.OURANWOOD_BOAT_ENTITY.get(), context -> new OuranwoodBoatRenderer<>(context, new ResourceLocation(Antarchy.MODID, "textures/entity/boat/ouranwood.png"), false)); + EntityRendererRegistry.register(AntarchyFabricEntities.OURANWOOD_CHEST_BOAT_ENTITY.get(), context -> new OuranwoodBoatRenderer<>(context, new ResourceLocation(Antarchy.MODID, "textures/entity/chest_boat/ouranwood.png"), true)); + EntityRendererRegistry.register(AntarchyFabricEntities.PEACH_BOAT_ENTITY.get(), context -> new PeachBoatRenderer<>(context, new ResourceLocation(Antarchy.MODID, "textures/entity/boat/peach.png"), false)); + EntityRendererRegistry.register(AntarchyFabricEntities.PEACH_CHEST_BOAT_ENTITY.get(), context -> new PeachBoatRenderer<>(context, new ResourceLocation(Antarchy.MODID, "textures/entity/chest_boat/peach.png"), true)); + EntityRendererRegistry.register(AntarchyFabricEntities.APPLE_COW.get(), AppleCowRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.GOLDEN_APPLE_COW.get(), AppleCowRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.ENCHANTED_GOLDEN_APPLE_COW.get(), AppleCowRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.DIAMOND_MINECART.get(), DiamondMinecartRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.DR_TRAYAURUS.get(), context -> new DrTrayaurusRenderer(context, new ResourceLocation(Antarchy.MODID, "textures/entity/dr_trayaurus.png"))); + EntityRendererRegistry.register(AntarchyFabricEntities.CLOUD_SHARK.get(), CloudSharkRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.KRAKEN.get(), KrakenRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.KRAKEN_PART.get(), MultipartPartRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.TENTACLE.get(), com.craisinlord.antarchy.content.client.renderer.TentacleRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.KRAKENS_GRASP_TRIDENT.get(), com.craisinlord.antarchy.content.client.renderer.KrakensGraspThrownTridentRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.MISSILE_SQUID.get(), MissileSquidRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.OCTOPUS_BOMB.get(), OctopusBombRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.NIGHTMARE.get(), NightmareRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.LUCID.get(), LucidRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.BED_BUG.get(), BedBugRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.WASP.get(), WaspRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.BOMBER.get(), BomberRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.BASILISK.get(), BasiliskRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.SHRINK_RAY_PROJECTILE.get(), SizeRayProjectileRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.GROWTH_RAY_PROJECTILE.get(), SizeRayProjectileRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.LUCID_BOLT.get(), LucidBoltRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.LUCID_PEARL_PROJECTILE.get(), ThrownItemRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.CRITTER_CAGE_PROJECTILE.get(), ThrownItemRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.HUSH_PROJECTILE.get(), HushProjectileRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.BRUTALFLY_ORB.get(), BrutalflyOrbRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.UPWARD_FALLING_BLOCK.get(), UpwardFallingBlockRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.SCORPION.get(), ScorpionRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.EMPEROR_SCORPION.get(), EmperorScorpionRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.TORETERROR.get(), ToreterrorRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.WATER_BOMB.get(), WaterBombRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.CHEEP.get(), com.craisinlord.antarchy.content.client.renderer.CheepRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.DORRIE.get(), com.craisinlord.antarchy.content.client.renderer.DorrieRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.OURANWOOD_DEER.get(), com.craisinlord.antarchy.content.client.renderer.OuranwoodDeerRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.GLIMMER.get(), com.craisinlord.antarchy.content.client.renderer.glimmer.GlimmerRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.ELKA.get(), com.craisinlord.antarchy.content.client.renderer.ElkaRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.ROLLY_POLLY.get(), com.craisinlord.antarchy.content.client.renderer.RollyPollyRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.TERMITE.get(), TermiteRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.CREEPING_HORROR.get(), CreepingHorrorRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.LURKING_TERROR.get(), LurkingTerrorRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.HERCULES_BEETLE.get(), HerculesBeetleRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.JERRY.get(), JerryRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.JUMPY_BUG.get(), JumpyBugRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.SPIT_BUG.get(), SpitBugRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.SPIT_BUG_PROJECTILE.get(), SpitBugProjectileRenderer::new); + EntityRendererRegistry.register(AntarchyFabricEntities.STINK_BUG.get(), StinkBugRenderer::new); + + EntityModelLayerRegistry.registerModelLayer(OuranwoodBoatRenderer.boatLayer(), BoatModel::createBodyModel); + EntityModelLayerRegistry.registerModelLayer(OuranwoodBoatRenderer.chestBoatLayer(), ChestBoatModel::createBodyModel); + EntityModelLayerRegistry.registerModelLayer(PeachBoatRenderer.boatLayer(), BoatModel::createBodyModel); + EntityModelLayerRegistry.registerModelLayer(PeachBoatRenderer.chestBoatLayer(), ChestBoatModel::createBodyModel); + } + + private static void registerColors() { + ColorProviderRegistry.BLOCK.register( + (state, level, pos, tintIndex) -> tintIndex == 0 ? bluestoneWireColor(state.getValue(com.craisinlord.antarchy.content.block.BluestoneWireBlock.POWER)) : -1, + AntarchyFabricBlocks.BLUESTONE_WIRE.get() + ); + ColorProviderRegistry.BLOCK.register( + (state, level, pos, tintIndex) -> level != null && pos != null + ? BiomeColors.getAverageFoliageColor(level, pos) + : FoliageColor.getDefaultColor(), + AntarchyFabricBlocks.OURANWOOD_LEAVES.get() + ); + ColorProviderRegistry.BLOCK.register((state, level, pos, tintIndex) -> 0xFF4A0000, AntarchyFabricBlocks.ANTIWATER_BLOCK.get()); + ColorProviderRegistry.BLOCK.register( + (state, level, pos, tintIndex) -> level != null && pos != null + ? BiomeColors.getAverageGrassColor(level, pos) + : net.minecraft.world.level.GrassColor.getDefaultColor(), + AntarchyFabricBlocks.SPIDER_LILY.get() + ); + ColorProviderRegistry.BLOCK.register( + (state, level, pos, tintIndex) -> level != null && pos != null + ? BiomeColors.getAverageGrassColor(level, pos) + : net.minecraft.world.level.GrassColor.getDefaultColor(), + AntarchyFabricBlocks.POTTED_SPIDER_LILY.get() + ); + ColorProviderRegistry.ITEM.register((stack, tintIndex) -> FoliageColor.getDefaultColor(), AntarchyFabricItems.OURANWOOD_LEAVES_ITEM.get()); + ColorProviderRegistry.ITEM.register( + (stack, tintIndex) -> tintIndex == 0 ? net.minecraft.world.level.GrassColor.getDefaultColor() : -1, + AntarchyFabricItems.SPIDER_LILY_ITEM.get() + ); + ColorProviderRegistry.ITEM.register( + (stack, tintIndex) -> { + if (!(stack.getItem() instanceof com.craisinlord.antarchy.content.item.CritterCageItem cage)) { + return -1; + } + if (cage.getItemState(stack) != 2) { + return -1; + } + if (tintIndex == 1) { + return cage.getPrimaryColor(stack); + } + if (tintIndex == 2) { + return cage.getSecondaryColor(stack); + } + return -1; + }, + AntarchyFabricItems.CRITTER_CAGE.get() + ); + } + + private static void registerFluids() { + FluidRenderHandlerRegistry.INSTANCE.register( + AntarchyFabricMisc.BILE.get(), + AntarchyFabricMisc.FLOWING_BILE.get(), + new SimpleFluidRenderHandler( + new ResourceLocation(Antarchy.MODID, "block/bile/bile_still"), + new ResourceLocation(Antarchy.MODID, "block/bile/bile_flowing"), + new ResourceLocation("block/water_overlay"), + 0xFFFFFFFF + ) + ); + + FluidRenderHandlerRegistry.INSTANCE.register( + AntarchyFabricMisc.ICHOR.get(), + AntarchyFabricMisc.FLOWING_ICHOR.get(), + new SimpleFluidRenderHandler( + new ResourceLocation(Antarchy.MODID, "block/bile/bile_still"), + new ResourceLocation(Antarchy.MODID, "block/bile/bile_flowing"), + new ResourceLocation("block/water_overlay"), + 0xFF3D0408 + ) + ); + + FluidRenderHandlerRegistry.INSTANCE.register( + AntarchyFabricMisc.ANTIWATER.get(), + AntarchyFabricMisc.FLOWING_ANTIWATER.get(), + new SimpleFluidRenderHandler( + new ResourceLocation("block/water_still"), + new ResourceLocation("block/water_flow"), + new ResourceLocation("block/water_overlay"), + 0xFFFF1A1A + ) { + @Override + public void renderFluid(BlockPos pos, BlockAndTintGetter world, VertexConsumer vertexConsumer, BlockState blockState, FluidState fluidState) { + TextureAtlasSprite[] sprites = this.getFluidSprites(world, pos, fluidState); + AntiwaterFluidRenderer.render( + world, + pos, + vertexConsumer, + blockState, + fluidState, + sprites[0], + sprites[1], + sprites.length > 2 ? sprites[2] : null, + this.getFluidColor(world, pos, fluidState) + ); + } + } + ); + + FluidRenderHandlerRegistry.INSTANCE.register( + AntarchyFabricMisc.LUMEN.get(), + AntarchyFabricMisc.FLOWING_LUMEN.get(), + new SimpleFluidRenderHandler( + new ResourceLocation(Antarchy.MODID, "block/lumen_still"), + new ResourceLocation(Antarchy.MODID, "block/lumen_flow"), + new ResourceLocation("block/water_overlay"), + 0xFFFFFFFF + ) + ); + } + + private static void registerParticles() { + ParticleFactoryRegistry registry = ParticleFactoryRegistry.getInstance(); + registry.register(AntarchyFabricMisc.DREAM_FIRE_FLAME.get(), DreamFlameParticle.Provider::new); + registry.register(AntarchyFabricMisc.STINKY_GAS.get(), HypnoticGasParticle.Provider::new); + registry.register(AntarchyFabricMisc.STINKY_FLY.get(), FireflyParticle.Provider::new); + registry.register(AntarchyFabricMisc.PEACH_LEAVES_PARTICLE.get(), PeachLeavesParticle.Provider::new); + registry.register(AntarchyFabricMisc.LOTUS_POLLEN.get(), com.craisinlord.antarchy.content.client.particle.LotusPollenParticle.Provider::new); + registry.register(AntarchyFabricMisc.HYPNOTIC_GAS.get(), HypnoticGasParticle.Provider::new); + registry.register(AntarchyFabricMisc.HYPNOTIC_GAS_DOWN.get(), sprites -> new HypnoticGasParticle.Provider(sprites, true)); + registry.register(AntarchyFabricMisc.HYPNOTIC_GAS_CLOUD.get(), new HypnoticGasCloudParticle.Provider()); + registry.register(AntarchyFabricMisc.HYPNOTIC_GAS_CLOUD_DOWN.get(), new HypnoticGasCloudParticle.Provider(true)); + registry.register(AntarchyFabricMisc.INVERTED_GEYSER_BASE.get(), InvertedGeyserBaseParticle.Provider::new); + registry.register(AntarchyFabricMisc.INVERTED_GEYSER_PLUME.get(), InvertedGeyserPlumeParticle.Provider::new); + registry.register(AntarchyFabricMisc.INVERTED_GEYSER_POOF.get(), InvertedGeyserBaseParticle.Provider::new); + registry.register(AntarchyFabricMisc.INVERTED_GEYSER_ERUPTION.get(), new InvertedGeyserEruptionParticle.Provider()); + registry.register(AntarchyFabricMisc.FIREFLY.get(), FireflyParticle.Provider::new); + registry.register(AntarchyFabricMisc.ORANGE_ASH.get(), OrangeAshParticle.Provider::new); + } + + private static void registerRenderLayers() { + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.ANTIMETAL_RAIL.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.ANTIMETAL_POWERED_RAIL.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.ANTIMETAL_DETECTOR_RAIL.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.ANTIMETAL_ACTIVATOR_RAIL.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.OURANWOOD_LEAVES.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.OURANWOOD_DOOR.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.OURANWOOD_TRAPDOOR.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.OURANWOOD_ACORN_BLOCK.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.POTTED_OURANWOOD_ACORN.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.PEACH_LEAVES.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.PEACH_HANGING_PEACH.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.PEACH_DOOR.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.PEACH_TRAPDOOR.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.PEACH_SAPLING.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.POTTED_PEACH_SAPLING.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.DUPLICATOR_SAPLING.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.ORANGE_MILKWEED.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.PINK_MILKWEED.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.AMBER_LICHEN.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.CREEPVINE.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.CAMELLIA.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.SPIDER_LILY.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.POTTED_SPIDER_LILY.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.LOTUS.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.POTTED_LOTUS.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.GIANT_LILY_PAD.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.HUSHWEED.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.CRITTER_CAGE_BLOCK.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.POTTED_GLOWCAP_MUSHROOM.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.CORNEA_STALK.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.CORN_CROP.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.WILD_CORN.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.FALLEN_KING_CROWN_BLOCK.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.ANTIMETAL_SCAFFOLDING.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.UMBRAL_MOSS_CARPET.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.NYXITE_SPIKE.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.CHITEN_SPIKE.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.STAR_CORAL.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.STAR_CORAL_FAN.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.STAR_CORAL_WALL_FAN.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.DEAD_STAR_CORAL.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.DEAD_STAR_CORAL_FAN.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.DEAD_STAR_CORAL_WALL_FAN.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.SMALL_BLOOD_CRYSTAL_BUD.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.MEDIUM_BLOOD_CRYSTAL_BUD.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.LARGE_BLOOD_CRYSTAL_BUD.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.BLOOD_CRYSTAL_CRYSTAL.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.DREAM_TORCH.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.DREAM_WALL_TORCH.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.DREAM_CEILING_TORCH.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.BLUESTONE_WIRE.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.BLUESTONE_REPEATER.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.BLUESTONE_COMPARATOR.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.BLUESTONE_TORCH.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.DREAM_LANTERN.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.DREAM_CAMPFIRE.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.DREAM_FIRE.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.DREAM_CEILING_FIRE.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.ANTIWATER_BLOCK.get(), RenderType.translucent()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.LUMEN_BLOCK.get(), RenderType.translucent()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.ELYTHIA_PORTAL.get(), RenderType.translucent()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.THORAXIS_PORTAL.get(), RenderType.translucent()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.TRIFFID_GOO_BLOCK.get(), RenderType.translucent()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.URANIUM_DOOR.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.TITANIUM_DOOR.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.URANIUM_TRAPDOOR.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.TITANIUM_TRAPDOOR.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.URANIUM_BARS.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.TITANIUM_BARS.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.CLOUD_BLOCK.get(), RenderType.translucent()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.JUMPY_BUG_EGG.get(), RenderType.translucent()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.SPIT_BUG_EGG.get(), RenderType.translucent()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.JERRY_EGG.get(), RenderType.translucent()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.BIOWART_TENDRILS.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.HANGING_CREEPROOTS.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.MOLTING_VINES.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putBlock(AntarchyFabricBlocks.GLOWCAP_MUSHROOM.get(), RenderType.cutout()); + BlockRenderLayerMap.INSTANCE.putFluids( + RenderType.translucent(), + AntarchyFabricMisc.BILE.get(), + AntarchyFabricMisc.FLOWING_BILE.get(), + AntarchyFabricMisc.ICHOR.get(), + AntarchyFabricMisc.FLOWING_ICHOR.get(), + AntarchyFabricMisc.LUMEN.get(), + AntarchyFabricMisc.FLOWING_LUMEN.get(), + AntarchyFabricMisc.ANTIWATER.get(), + AntarchyFabricMisc.FLOWING_ANTIWATER.get() + ); + } + + private static void registerItemProperties() { + ItemProperties.register( + AntarchyFabricItems.ULTIMATE_BOW.get(), + new ResourceLocation("pull"), + (stack, level, entity, seed) -> entity == null || entity.getUseItem() != stack + ? 0.0F + : (stack.getItem().getUseDuration(stack) - entity.getUseItemRemainingTicks()) / 20.0F + ); + ItemProperties.register( + AntarchyFabricItems.ULTIMATE_BOW.get(), + new ResourceLocation("pulling"), + (stack, level, entity, seed) -> entity != null && entity.isUsingItem() && entity.getUseItem() == stack ? 1.0F : 0.0F + ); + ItemProperties.register( + AntarchyFabricItems.ULTIMATE_CROSSBOW.get(), + new ResourceLocation("pull"), + (stack, level, entity, seed) -> { + if (entity == null || CrossbowItem.isCharged(stack) || entity.getUseItem() != stack) { + return 0.0F; + } + float adjustedChargeDuration = Math.max(1.0F, stack.getItem().getUseDuration(stack) - 3.0F); + return Mth.clamp((stack.getItem().getUseDuration(stack) - entity.getUseItemRemainingTicks()) / adjustedChargeDuration, 0.0F, 1.0F); + } + ); + ItemProperties.register( + AntarchyFabricItems.ULTIMATE_CROSSBOW.get(), + new ResourceLocation("pulling"), + (stack, level, entity, seed) -> entity != null && entity.isUsingItem() && entity.getUseItem() == stack && !CrossbowItem.isCharged(stack) ? 1.0F : 0.0F + ); + ItemProperties.register( + AntarchyFabricItems.ULTIMATE_CROSSBOW.get(), + new ResourceLocation("charged"), + (stack, level, entity, seed) -> CrossbowItem.isCharged(stack) ? 1.0F : 0.0F + ); + ItemProperties.register( + AntarchyFabricItems.ULTIMATE_CROSSBOW.get(), + new ResourceLocation("firework"), + (stack, level, entity, seed) -> CrossbowItem.isCharged(stack) && CrossbowItem.containsChargedProjectile(stack, Items.FIREWORK_ROCKET) ? 1.0F : 0.0F + ); + ItemProperties.register( + AntarchyFabricItems.CRITTER_CAGE.get(), + new ResourceLocation(Antarchy.MODID, "critter_cage_state"), + (stack, level, entity, seed) -> { + if (!(stack.getItem() instanceof com.craisinlord.antarchy.content.item.CritterCageItem cage)) { + return 0.0F; + } + return cage.getItemState(stack); + } + ); + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + private static void registerEntityLayers() { + LivingEntityFeatureRendererRegistrationCallback.EVENT.register((entityType, renderer, registrationHelper, context) -> { + if (entityType == EntityType.PLAYER) { + if (renderer instanceof net.minecraft.client.renderer.entity.player.PlayerRenderer playerRenderer) { + registrationHelper.register(new ParalyzedStonePlayerLayer(playerRenderer)); + registrationHelper.register(new GoopedLivingLayer(playerRenderer)); + registrationHelper.register(new BrutalflyElytraLayer(playerRenderer)); + registrationHelper.register(new FallenKingCrownLayer(playerRenderer)); + } + return; + } + if (entityType == EntityType.ARMOR_STAND && renderer instanceof ArmorStandRenderer armorStandRenderer) { + registrationHelper.register(new FallenKingCrownArmorStandLayer((net.minecraft.client.renderer.entity.RenderLayerParent) armorStandRenderer)); + return; + } + if (software.bernie.geckolib.renderer.GeoEntityRenderer.class.isAssignableFrom(renderer.getClass())) { + software.bernie.geckolib.renderer.GeoEntityRenderer geoRenderer = + (software.bernie.geckolib.renderer.GeoEntityRenderer) (Object) renderer; + geoRenderer.addRenderLayer(new ParalyzedStoneGeoLayer(geoRenderer)); + geoRenderer.addRenderLayer(new GoopedGeoLayer(geoRenderer)); + return; + } + registrationHelper.register(new ParalyzedStoneLivingLayer(renderer)); + registrationHelper.register(new GoopedLivingLayer(renderer)); + }); + } + + private static void registerClientCallbacks() { + ClientTickEvents.END_CLIENT_TICK.register(client -> { + CameraShakeClientState.tick(); + HerculesBeetleImpactShakeClientState.tick(); + HordeClientState.tick(); + if (client.player != null) { + ParalyzedClientHandler.clampPlayerInput(client.player); + } + BrutalflyElytraClientHandler.tick(); + JumpyBootsClientHandler.tick(); + DiamondMinecartClientHandler.tick(); + ParalyzedClientHandler.tick(); + DreadClientHandler.tick(); + BloodCrystalKatanaTrailHandler.tick(); + ScorpionWhipTetherRenderHandler.tick(); + DorrieJumpClientHandler.tick(); + HerculesBeetleClientHandler.tick(); + }); + + BigBerthaClientHandler.register(); + GravityGunClientHandler.register(); + + ElythiaFireflyManager.register(); + LucidSoundHandler.register(); + MogglesClientRenderer.register(); + StinkySoundHandler.register(); + ReverieTrailHandler.register(); + HudRenderCallback.EVENT.register((guiGraphics, partialTick) -> { + DreadHudRenderer.render(guiGraphics); + com.craisinlord.antarchy.content.client.HordeHudRenderer.render(guiGraphics); + com.craisinlord.antarchy.content.client.GoopedHudRenderer.render(guiGraphics); + ParalyzedHudRenderer.render(guiGraphics); + BrutalflyElytraHudRenderer.render(guiGraphics); + JumpyBootsHudRenderer.render(guiGraphics); + TriffidGooHudRenderer.render(guiGraphics); + DorrieJumpHudRenderer.render(guiGraphics); + HerculesBeetleChargeHudRenderer.render(guiGraphics); + }); + + WorldRenderEvents.AFTER_TRANSLUCENT.register(context -> { + BloodCrystalKatanaTrailHandler.render(context); + ScorpionWhipTetherRenderHandler.render(context); + }); + } + + private static int bluestoneWireColor(int power) { + float normalized = power / 15.0F; + int red = (int) (6.0F + normalized * 54.0F); + int green = (int) (22.0F + normalized * 132.0F); + int blue = (int) (64.0F + normalized * 191.0F); + return red << 16 | green << 8 | blue; + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyKeyBindings.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyKeyBindings.java new file mode 100644 index 00000000..955d42cb --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyKeyBindings.java @@ -0,0 +1,65 @@ +package com.craisinlord.antarchy.fabric.client; + +import com.craisinlord.antarchy.Antarchy; +import com.mojang.blaze3d.platform.InputConstants; +import org.lwjgl.glfw.GLFW; +import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; +import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; + +public final class AntarchyKeyBindings { + public static final String CATEGORY = "key.categories.antarchy"; + + public static final KeyMapping BRUTALFLY_FLAP = new KeyMapping( + "key.antarchy.brutalfly_flap", + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_G, + CATEGORY + ); + + public static final KeyMapping DORRIE_CHARGE_JUMP = new KeyMapping( + "key.antarchy.dorrie_charge_jump", + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_LEFT_CONTROL, + CATEGORY + ); + + public static final KeyMapping HERCULES_BEETLE_CHARGE = new KeyMapping( + "key.antarchy.hercules_beetle_charge", + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_LEFT_CONTROL, + CATEGORY + ); + + public static final KeyMapping HERCULES_BEETLE_FLIGHT_TOGGLE = new KeyMapping( + "key.antarchy.hercules_beetle_flight_toggle", + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_R, + CATEGORY + ); + + private AntarchyKeyBindings() {} + + public static void register() { + KeyBindingHelper.registerKeyBinding(BRUTALFLY_FLAP); + KeyBindingHelper.registerKeyBinding(DORRIE_CHARGE_JUMP); + KeyBindingHelper.registerKeyBinding(HERCULES_BEETLE_CHARGE); + KeyBindingHelper.registerKeyBinding(HERCULES_BEETLE_FLIGHT_TOGGLE); + } + + public static boolean isBrutalflyFlapPressed() { + return Minecraft.getInstance().screen == null && BRUTALFLY_FLAP.isDown(); + } + + public static boolean isDorrieChargeJumpPressed() { + return Minecraft.getInstance().screen == null && DORRIE_CHARGE_JUMP.isDown(); + } + + public static boolean isHerculesBeetleChargePressed() { + return Minecraft.getInstance().screen == null && HERCULES_BEETLE_CHARGE.isDown(); + } + + public static boolean isHerculesBeetleFlightTogglePressed() { + return Minecraft.getInstance().screen == null && HERCULES_BEETLE_FLIGHT_TOGGLE.isDown(); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BigBerthaClientHandler.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BigBerthaClientHandler.java new file mode 100644 index 00000000..e8d8e988 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BigBerthaClientHandler.java @@ -0,0 +1,39 @@ +package com.craisinlord.antarchy.fabric.client; + +import com.craisinlord.antarchy.content.item.BigBerthaItem; +import com.craisinlord.antarchy.content.network.BigBerthaModeCyclePayload; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.minecraft.client.Minecraft; + +public final class BigBerthaClientHandler { + private static boolean lastUseDown; + + private BigBerthaClientHandler() { + } + + public static void register() { + ClientTickEvents.END_CLIENT_TICK.register(BigBerthaClientHandler::tick); + } + + private static void tick(Minecraft mc) { + if (mc.player == null || mc.level == null || mc.screen != null) { + lastUseDown = false; + return; + } + + if (!(mc.player.getMainHandItem().getItem() instanceof BigBerthaItem)) { + lastUseDown = false; + return; + } + + boolean useDown = mc.options.keyUse.isDown(); + if (useDown + && !lastUseDown + && mc.player.isShiftKeyDown() + && mc.player.getCooldowns().isOnCooldown(mc.player.getMainHandItem().getItem())) { + com.craisinlord.antarchy.fabric.network.AntarchyFabricClientNetworking.sendToServer(new BigBerthaModeCyclePayload(), BigBerthaModeCyclePayload.STREAM_CODEC, BigBerthaModeCyclePayload.TYPE); + } + lastUseDown = useDown; + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BloodCrystalKatanaTrailClientState.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BloodCrystalKatanaTrailClientState.java new file mode 100644 index 00000000..51cb3969 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BloodCrystalKatanaTrailClientState.java @@ -0,0 +1,42 @@ +package com.craisinlord.antarchy.fabric.client; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +public final class BloodCrystalKatanaTrailClientState { + private static final Map ACTIVE = new HashMap<>(); + + private BloodCrystalKatanaTrailClientState() {} + + public static void trigger(int entityId, int durationTicks) { + if (durationTicks <= 0) { + ACTIVE.remove(entityId); + return; + } + ACTIVE.put(entityId, durationTicks); + } + + public static int getRemainingTicks(int entityId) { + return ACTIVE.getOrDefault(entityId, 0); + } + + public static void tick() { + Iterator> iterator = ACTIVE.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + int remaining = entry.getValue() - 1; + if (remaining <= 0) { + iterator.remove(); + } else { + entry.setValue(remaining); + } + } + } + + public static void clear() { + ACTIVE.clear(); + } +} + + diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BloodCrystalKatanaTrailHandler.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BloodCrystalKatanaTrailHandler.java new file mode 100644 index 00000000..a3af978c --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BloodCrystalKatanaTrailHandler.java @@ -0,0 +1,203 @@ +package com.craisinlord.antarchy.fabric.client; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.Vec3; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; +import org.joml.Matrix4f; + +public final class BloodCrystalKatanaTrailHandler { + private static final int MAX_TRAIL_POINTS = 16; + private static final int POINT_LIFETIME_TICKS = 10; + private static final double MIN_DISTANCE_BETWEEN_POINTS = 0.05D; + private static final float CORE_WIDTH = 0.06F; + private static final float GLOW_WIDTH = 0.16F; + private static final Map> TRAILS = new HashMap<>(); + + private BloodCrystalKatanaTrailHandler() {} + + private static final class TrailPoint { + private final Vec3 position; + private int age; + + private TrailPoint(Vec3 position) { + this.position = position; + } + + private float alpha() { + return 1.0F - ((float) age / POINT_LIFETIME_TICKS); + } + + private boolean expired() { + return age >= POINT_LIFETIME_TICKS || alpha() <= 0.01F; + } + } + + public static void tick() { + Minecraft mc = Minecraft.getInstance(); + if (mc.level == null) { + TRAILS.clear(); + BloodCrystalKatanaTrailClientState.clear(); + return; + } + if (mc.isPaused()) { + return; + } + + BloodCrystalKatanaTrailClientState.tick(); + Set activeIds = new HashSet<>(); + + for (Entity entity : mc.level.entitiesForRendering()) { + int remaining = BloodCrystalKatanaTrailClientState.getRemainingTicks(entity.getId()); + if (remaining <= 0) { + continue; + } + + activeIds.add(entity.getId()); + Vec3 position = entity.position().add(0.0D, entity.getBbHeight() * 0.45D, 0.0D); + ArrayDeque points = TRAILS.computeIfAbsent(entity.getId(), id -> new ArrayDeque<>()); + + if (points.isEmpty() || points.peekFirst().position.distanceToSqr(position) >= MIN_DISTANCE_BETWEEN_POINTS * MIN_DISTANCE_BETWEEN_POINTS) { + points.addFirst(new TrailPoint(position)); + while (points.size() > MAX_TRAIL_POINTS) { + points.pollLast(); + } + } + } + + TRAILS.keySet().removeIf(id -> !activeIds.contains(id)); + for (ArrayDeque points : TRAILS.values()) { + Iterator iterator = points.iterator(); + while (iterator.hasNext()) { + TrailPoint point = iterator.next(); + point.age++; + if (point.expired()) { + iterator.remove(); + } + } + } + TRAILS.values().removeIf(ArrayDeque::isEmpty); + } + + public static void render(WorldRenderContext context) { + if (TRAILS.isEmpty()) { + return; + } + + if (context.world() == null || context.matrixStack() == null) { + return; + } + + Minecraft mc = Minecraft.getInstance(); + if (mc.level == null) { + return; + } + + Camera camera = context.camera(); + Vec3 cameraPos = camera.getPosition(); + Matrix4f matrix = context.matrixStack().last().pose(); + + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.depthMask(false); + RenderSystem.disableCull(); + RenderSystem.setShader(GameRenderer::getPositionColorShader); + + Tesselator tesselator = Tesselator.getInstance(); + List> snapshots = new ArrayList<>(TRAILS.size()); + for (ArrayDeque deque : TRAILS.values()) { + if (deque.size() >= 2) { + snapshots.add(new ArrayList<>(deque)); + } + } + + if (snapshots.isEmpty()) { + RenderSystem.enableCull(); + RenderSystem.depthMask(true); + RenderSystem.disableBlend(); + return; + } + + BufferBuilder glowBuffer = tesselator.getBuilder(); + glowBuffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + for (List points : snapshots) { + buildTrail(glowBuffer, matrix, points, cameraPos, GLOW_WIDTH, 0.95F, 0.14F, 0.18F, 0.38F); + } + BufferUploader.drawWithShader(glowBuffer.end()); + + BufferBuilder coreBuffer = tesselator.getBuilder(); + coreBuffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + for (List points : snapshots) { + buildTrail(coreBuffer, matrix, points, cameraPos, CORE_WIDTH, 1.0F, 0.32F, 0.36F, 0.92F); + } + BufferUploader.drawWithShader(coreBuffer.end()); + + RenderSystem.enableCull(); + RenderSystem.depthMask(true); + RenderSystem.disableBlend(); + } + + private static void buildTrail(BufferBuilder builder, Matrix4f matrix, List points, Vec3 cameraPos, + float width, float red, float green, float blue, float alphaScale) { + for (int i = 0; i < points.size() - 1; i++) { + TrailPoint newer = points.get(i); + TrailPoint older = points.get(i + 1); + Vec3 side = cameraFacingRight(newer.position, older.position, cameraPos); + if (side == null) { + continue; + } + + float nearAlpha = newer.alpha() * alphaScale; + float farAlpha = older.alpha() * alphaScale * 0.85F; + Vec3 nearOffset = side.scale(width); + Vec3 farOffset = side.scale(width); + Vec3 nearPos = newer.position.subtract(cameraPos); + Vec3 farPos = older.position.subtract(cameraPos); + + builder.vertex(matrix, (float) (nearPos.x + nearOffset.x), (float) (nearPos.y + nearOffset.y), (float) (nearPos.z + nearOffset.z)).color(red, green, blue, nearAlpha).endVertex(); + builder.vertex(matrix, (float) (nearPos.x - nearOffset.x), (float) (nearPos.y - nearOffset.y), (float) (nearPos.z - nearOffset.z)).color(red, green, blue, nearAlpha).endVertex(); + builder.vertex(matrix, (float) (farPos.x - farOffset.x), (float) (farPos.y - farOffset.y), (float) (farPos.z - farOffset.z)).color(red, green, blue, farAlpha).endVertex(); + builder.vertex(matrix, (float) (farPos.x + farOffset.x), (float) (farPos.y + farOffset.y), (float) (farPos.z + farOffset.z)).color(red, green, blue, farAlpha).endVertex(); + } + } + + private static Vec3 cameraFacingRight(Vec3 current, Vec3 next, Vec3 cameraPos) { + Vec3 segmentDirection = next.subtract(current); + if (segmentDirection.lengthSqr() < 1.0E-8D) { + return null; + } + segmentDirection = segmentDirection.normalize(); + + Vec3 midpoint = current.add(next).scale(0.5D); + Vec3 cameraDirection = cameraPos.subtract(midpoint); + if (cameraDirection.lengthSqr() < 1.0E-8D) { + return null; + } + cameraDirection = cameraDirection.normalize(); + + Vec3 side = segmentDirection.cross(cameraDirection); + if (side.lengthSqr() < 1.0E-8D) { + side = segmentDirection.cross(new Vec3(0.0D, 1.0D, 0.0D)); + if (side.lengthSqr() < 1.0E-8D) { + return null; + } + } + return side.normalize(); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BloodglassHudRenderer.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BloodglassHudRenderer.java new file mode 100644 index 00000000..e09cf13e --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BloodglassHudRenderer.java @@ -0,0 +1,64 @@ +package com.craisinlord.antarchy.fabric.client; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.client.BloodglassClientState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.player.Player; + +public final class BloodglassHudRenderer { + private static final ResourceLocation HEART_CONTAINER = + new ResourceLocation("textures/gui/sprites/hud/heart/container.png"); + private static final ResourceLocation HEART_FULL = + new ResourceLocation(Antarchy.MODID, "textures/gui/sprites/hud/bloodglass_heart.png"); + private static final ResourceLocation HEART_CRACKED = + new ResourceLocation(Antarchy.MODID, "textures/gui/sprites/hud/bloodglass_heart_cracked.png"); + private static final int HEART_SIZE = 9; + private static final int HEART_PITCH = 8; + + private BloodglassHudRenderer() {} + + public static void render(GuiGraphics gui) { + Minecraft mc = Minecraft.getInstance(); + if (mc.options.hideGui) return; + Player player = mc.player; + if (player == null || player.isDeadOrDying()) return; + // Don't show in creative or spectator — no health bar visible there + if (player.isCreative() || player.isSpectator()) return; + + int total = BloodglassClientState.getShieldsMax(); + if (total <= 0) return; + + int active = BloodglassClientState.getShieldsActive(); + int w = mc.getWindow().getGuiScaledWidth(); + int h = mc.getWindow().getGuiScaledHeight(); + + // Vanilla health bar bottom row is at y = h - 39; each extra row (absorption, extra hearts) is 10px above. + // The armor protection icons sit one row above the bottom health row (h - 49). + // We place bloodglass hearts above both health+absorption stack AND the armor row. + int maxHealth = Mth.ceil(player.getMaxHealth()); + int absorption = Mth.ceil(player.getAbsorptionAmount()); + int healthHearts = Mth.ceil(maxHealth / 2.0f); + int absorptionHearts = Mth.ceil(absorption / 2.0f); + int totalVanillaRows = Mth.ceil((healthHearts + absorptionHearts) / 10.0f); + boolean hasArmor = player.getArmorValue() > 0; + // +1 to clear the armor icon row only when armor is actually equipped + int baseTop = h - 39 - (totalVanillaRows * 10) - (hasArmor ? 10 : 0); + + int left = w / 2 - 91; + + // Wrap across multiple rows if more than 10 bloodglass hearts + for (int i = 0; i < total; i++) { + int row = i / 10; + int col = i % 10; + int x = left + col * HEART_PITCH; + int y = baseTop - row * 10; + ResourceLocation tex = (i < active) ? HEART_FULL : HEART_CRACKED; + gui.blit(HEART_CONTAINER, x, y, 0, 0, HEART_SIZE, HEART_SIZE, HEART_SIZE, HEART_SIZE); + gui.blit(tex, x, y, 0, 0, HEART_SIZE, HEART_SIZE, HEART_SIZE, HEART_SIZE); + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BrutalflyElytraClientHandler.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BrutalflyElytraClientHandler.java new file mode 100644 index 00000000..e08f4296 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BrutalflyElytraClientHandler.java @@ -0,0 +1,73 @@ +package com.craisinlord.antarchy.fabric.client; + +import com.craisinlord.antarchy.content.client.BrutalflyElytraClientState; +import com.craisinlord.antarchy.content.item.BrutalflyElytraFlightHelper; +import com.craisinlord.antarchy.content.item.BrutalflyElytraItem; +import com.craisinlord.antarchy.content.network.BrutalflyElytraFlapPayload; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.minecraft.client.Minecraft; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public final class BrutalflyElytraClientHandler { + private static final Logger LOGGER = LoggerFactory.getLogger("Antarchy/BrutalflyElytra"); + private static boolean lastJumpDown; + private static int chargeTicks; + + static { + BrutalflyElytraItem.FLAP_KEY_NAME = () -> AntarchyKeyBindings.BRUTALFLY_FLAP.getTranslatedKeyMessage(); + } + + private BrutalflyElytraClientHandler() { + } + + public static void tick() { + BrutalflyElytraClientState.tick(); + + Minecraft minecraft = Minecraft.getInstance(); + if (minecraft.player == null || minecraft.level == null || minecraft.screen != null) { + reset(); + return; + } + + if (!BrutalflyElytraItem.isWearingBrutalflyElytra(minecraft.player)) { + reset(); + return; + } + + if (!minecraft.player.isFallFlying()) { + reset(); + return; + } + + boolean sneakDown = AntarchyKeyBindings.isBrutalflyFlapPressed(); + boolean wasSneakDown = lastJumpDown; + lastJumpDown = sneakDown; + + if (sneakDown) { + chargeTicks = Math.min(chargeTicks + 1, BrutalflyElytraFlightHelper.FLAP_CHARGE_TICKS_MAX); + return; + } + + if (wasSneakDown && chargeTicks > 0) { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("[BrutalflyElytra] Sending flap payload chargeTicks={} fallFlying={} deltaMovement={}", chargeTicks, minecraft.player.isFallFlying(), minecraft.player.getDeltaMovement()); + } + com.craisinlord.antarchy.fabric.network.AntarchyFabricClientNetworking.sendToServer(new BrutalflyElytraFlapPayload(chargeTicks), BrutalflyElytraFlapPayload.STREAM_CODEC, BrutalflyElytraFlapPayload.TYPE); + } + chargeTicks = 0; + } + + private static void reset() { + lastJumpDown = false; + chargeTicks = 0; + } + + public static boolean isCharging() { + return chargeTicks > 0 && lastJumpDown; + } + + public static int getChargeTicks() { + return chargeTicks; + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BrutalflyElytraHudRenderer.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BrutalflyElytraHudRenderer.java new file mode 100644 index 00000000..d7506ccb --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BrutalflyElytraHudRenderer.java @@ -0,0 +1,46 @@ +package com.craisinlord.antarchy.fabric.client; + +import com.craisinlord.antarchy.content.item.BrutalflyElytraFlightHelper; +import com.craisinlord.antarchy.content.item.BrutalflyElytraItem; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; + +public final class BrutalflyElytraHudRenderer { + private static final ResourceLocation JUMP_BAR_BACKGROUND = new ResourceLocation("textures/gui/sprites/hud/jump_bar_background.png"); + private static final ResourceLocation JUMP_BAR_PROGRESS = new ResourceLocation("textures/gui/sprites/hud/jump_bar_progress.png"); + private static final int BAR_WIDTH = 182; + private static final int BAR_HEIGHT = 5; + + private BrutalflyElytraHudRenderer() { + } + + public static void render(GuiGraphics guiGraphics) { + Minecraft minecraft = Minecraft.getInstance(); + Player player = minecraft.player; + if (player == null || minecraft.screen != null || player.isDeadOrDying() || minecraft.options.hideGui) { + return; + } + if (!BrutalflyElytraItem.isWearingBrutalflyElytra(player) || !player.isFallFlying()) { + return; + } + + int width = minecraft.getWindow().getGuiScaledWidth(); + int height = minecraft.getWindow().getGuiScaledHeight(); + int x0 = width / 2 - BAR_WIDTH / 2; + int y0 = height - 29; + + guiGraphics.blit(JUMP_BAR_BACKGROUND, x0, y0, 0, 0, BAR_WIDTH, BAR_HEIGHT, BAR_WIDTH, BAR_HEIGHT); + + int chargeTicks = BrutalflyElytraClientHandler.getChargeTicks(); + float chargeRatio = Mth.clamp(chargeTicks / (float) BrutalflyElytraFlightHelper.FLAP_CHARGE_TICKS_MAX, 0.0F, 1.0F); + int filledWidth = Mth.clamp((int) (chargeRatio * BAR_WIDTH), 0, BAR_WIDTH); + if (filledWidth > 0) { + guiGraphics.setColor(1.0F, 1.0F, 1.0F, 0.35F + chargeRatio * 0.65F); + guiGraphics.blit(JUMP_BAR_PROGRESS, x0, y0, 0, 0, filledWidth, BAR_HEIGHT, BAR_WIDTH, BAR_HEIGHT); + guiGraphics.setColor(1.0F, 1.0F, 1.0F, 1.0F); + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BrutalflyElytraModel.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BrutalflyElytraModel.java new file mode 100644 index 00000000..c1e1045b --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/BrutalflyElytraModel.java @@ -0,0 +1,62 @@ +package com.craisinlord.antarchy.fabric.client; + +import com.craisinlord.antarchy.Antarchy; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; + +public final class BrutalflyElytraModel { + public static final ModelLayerLocation LAYER_LOCATION = + new ModelLayerLocation(new ResourceLocation(Antarchy.MODID, "brutalfly_elytra"), "main"); + + private final ModelPart root; + private final ModelPart leftWing; + private final ModelPart rightWing; + + public BrutalflyElytraModel(ModelPart root) { + this.root = root; + this.leftWing = root.getChild("left_wing"); + this.rightWing = root.getChild("right_wing"); + } + + public static LayerDefinition createBodyLayer() { + MeshDefinition meshDefinition = new MeshDefinition(); + PartDefinition root = meshDefinition.getRoot(); + root.addOrReplaceChild( + "left_wing", + CubeListBuilder.create().texOffs(22, 0).addBox(-10.0F, 0.0F, -1.0F, 10.0F, 20.0F, 2.0F), + PartPose.offset(5.0F, 0.0F, -1.5F) + ); + root.addOrReplaceChild( + "right_wing", + CubeListBuilder.create().mirror().texOffs(22, 0).addBox(0.0F, 0.0F, -1.0F, 10.0F, 20.0F, 2.0F), + PartPose.offset(-5.0F, 0.0F, -1.5F) + ); + return LayerDefinition.create(meshDefinition, 64, 32); + } + + public void setupAnimation(float progress, float strength, boolean crouching) { + float wave = Mth.sin(progress * Mth.PI); + float flap = wave * strength; + float basePitch = crouching ? -0.18F : -0.05F; + float wingSpread = 0.55F; + this.leftWing.xRot = basePitch - flap * 1.2F; + this.rightWing.xRot = basePitch - flap * 1.2F; + this.leftWing.yRot = -wingSpread; + this.rightWing.yRot = -wingSpread; + this.leftWing.zRot = -0.35F - flap * 0.7F; + this.rightWing.zRot = -0.35F - flap * 0.7F; + } + + public void renderToBuffer(PoseStack poseStack, VertexConsumer consumer, int packedLight, int overlay) { + this.root.render(poseStack, consumer, packedLight, overlay); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/DiamondMinecartClientHandler.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/DiamondMinecartClientHandler.java new file mode 100644 index 00000000..02686cf1 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/DiamondMinecartClientHandler.java @@ -0,0 +1,42 @@ +package com.craisinlord.antarchy.fabric.client; + +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.entity.DiamondMinecartEntity; +import com.craisinlord.antarchy.content.network.DiamondMinecartInputPayload; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.minecraft.client.Minecraft; + +public final class DiamondMinecartClientHandler { + + private DiamondMinecartClientHandler() { + } + + + private static byte lastFlags = 0; + + public static void tick() { + Minecraft mc = Minecraft.getInstance(); + + if (!AntarchySettings.diamondMinecartEnabled()) return; + if (mc.player == null || mc.level == null) return; + if (!(mc.player.getVehicle() instanceof DiamondMinecartEntity)) return; + if (mc.screen != null) { + if (lastFlags != 0) { + com.craisinlord.antarchy.fabric.network.AntarchyFabricClientNetworking.sendToServer(new DiamondMinecartInputPayload((byte) 0), DiamondMinecartInputPayload.STREAM_CODEC, DiamondMinecartInputPayload.TYPE); + lastFlags = 0; + } + return; + } + + byte flags = 0; + if (mc.options.keyUp.isDown()) flags |= DiamondMinecartInputPayload.FLAG_FORWARD; + if (mc.options.keyDown.isDown()) flags |= DiamondMinecartInputPayload.FLAG_BACK; + if (mc.options.keyLeft.isDown()) flags |= DiamondMinecartInputPayload.FLAG_LEFT; + if (mc.options.keyRight.isDown()) flags |= DiamondMinecartInputPayload.FLAG_RIGHT; + + if (flags != lastFlags) { + com.craisinlord.antarchy.fabric.network.AntarchyFabricClientNetworking.sendToServer(new DiamondMinecartInputPayload(flags), DiamondMinecartInputPayload.STREAM_CODEC, DiamondMinecartInputPayload.TYPE); + lastFlags = flags; + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/DorrieJumpClientHandler.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/DorrieJumpClientHandler.java new file mode 100644 index 00000000..8c1b7707 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/DorrieJumpClientHandler.java @@ -0,0 +1,58 @@ +package com.craisinlord.antarchy.fabric.client; + +import com.craisinlord.antarchy.content.entity.DorrieEntity; +import com.craisinlord.antarchy.content.network.DorrieChargeJumpPayload; +import com.craisinlord.antarchy.content.network.DorrieJumpInputPayload; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; + +public final class DorrieJumpClientHandler { + private static boolean wasPressingJump = false; + private static boolean wasPressingCharge = false; + + private DorrieJumpClientHandler() {} + + public static void tick() { + Minecraft mc = Minecraft.getInstance(); + LocalPlayer player = mc.player; + + if (player == null || mc.screen != null) { + resetAll(); + return; + } + + if (!(player.getVehicle() instanceof DorrieEntity)) { + resetAll(); + return; + } + + // Space bar → upward movement. + boolean pressingJump = mc.options.keyJump.isDown(); + if (pressingJump != wasPressingJump) { + com.craisinlord.antarchy.fabric.network.AntarchyFabricClientNetworking.sendToServer(new DorrieJumpInputPayload(pressingJump), DorrieJumpInputPayload.STREAM_CODEC, DorrieJumpInputPayload.TYPE); + wasPressingJump = pressingJump; + } + + // Left ctrl → charge jump. + boolean pressingCharge = AntarchyKeyBindings.isDorrieChargeJumpPressed(); + if (pressingCharge != wasPressingCharge) { + com.craisinlord.antarchy.fabric.network.AntarchyFabricClientNetworking.sendToServer(new DorrieChargeJumpPayload(pressingCharge), DorrieChargeJumpPayload.STREAM_CODEC, DorrieChargeJumpPayload.TYPE); + if (!pressingCharge && player.getVehicle() instanceof DorrieEntity dorrie) { + dorrie.applyJumpImpulseClient(); + } + wasPressingCharge = pressingCharge; + } + } + + private static void resetAll() { + if (wasPressingJump) { + com.craisinlord.antarchy.fabric.network.AntarchyFabricClientNetworking.sendToServer(new DorrieJumpInputPayload(false), DorrieJumpInputPayload.STREAM_CODEC, DorrieJumpInputPayload.TYPE); + wasPressingJump = false; + } + if (wasPressingCharge) { + com.craisinlord.antarchy.fabric.network.AntarchyFabricClientNetworking.sendToServer(new DorrieChargeJumpPayload(false), DorrieChargeJumpPayload.STREAM_CODEC, DorrieChargeJumpPayload.TYPE); + wasPressingCharge = false; + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/DorrieJumpHudRenderer.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/DorrieJumpHudRenderer.java new file mode 100644 index 00000000..ce4570b8 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/DorrieJumpHudRenderer.java @@ -0,0 +1,45 @@ +package com.craisinlord.antarchy.fabric.client; + +import com.craisinlord.antarchy.content.entity.DorrieEntity; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; + +public final class DorrieJumpHudRenderer { + private static final ResourceLocation JUMP_BAR_BACKGROUND = + new ResourceLocation("textures/gui/sprites/hud/jump_bar_background.png"); + private static final ResourceLocation JUMP_BAR_PROGRESS = + new ResourceLocation("textures/gui/sprites/hud/jump_bar_progress.png"); + private static final int BAR_WIDTH = 182; + private static final int BAR_HEIGHT = 5; + + private DorrieJumpHudRenderer() {} + + public static void render(GuiGraphics guiGraphics) { + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + if (player == null || mc.screen != null || player.isDeadOrDying()) return; + + if (!(player.getVehicle() instanceof DorrieEntity dorrie)) return; + + int charge = dorrie.getJumpCharge(); + if (charge <= 0) return; + + int width = mc.getWindow().getGuiScaledWidth(); + int height = mc.getWindow().getGuiScaledHeight(); + int x0 = width / 2 - BAR_WIDTH / 2; + int y0 = height - 29; + + guiGraphics.blit(JUMP_BAR_BACKGROUND, x0, y0, 0, 0, BAR_WIDTH, BAR_HEIGHT, BAR_WIDTH, BAR_HEIGHT); + + float chargeRatio = Mth.clamp(charge / 100.0F, 0.0F, 1.0F); + int filledWidth = Mth.clamp((int) (chargeRatio * BAR_WIDTH), 0, BAR_WIDTH); + if (filledWidth > 0) { + guiGraphics.setColor(0.2F, 0.8F, 1.0F, 0.4F + chargeRatio * 0.6F); + guiGraphics.blit(JUMP_BAR_PROGRESS, x0, y0, 0, 0, filledWidth, BAR_HEIGHT, BAR_WIDTH, BAR_HEIGHT); + guiGraphics.setColor(1.0F, 1.0F, 1.0F, 1.0F); + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/DreadClientHandler.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/DreadClientHandler.java new file mode 100644 index 00000000..80e1e95a --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/DreadClientHandler.java @@ -0,0 +1,385 @@ +package com.craisinlord.antarchy.fabric.client; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricMisc; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricSounds; + +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.AntarchyTags; +import com.craisinlord.antarchy.fabric.AntarchyFabricContent; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.DeathScreen; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderSet; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.Vec3; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Optional; +import java.util.Random; + +public final class DreadClientHandler { + private static final net.minecraft.world.effect.MobEffect DREAD_EFFECT = AntarchyFabricMisc.DREAD.get(); + private static final int FOOTSTEP_MIN_INTERVAL_TICKS = 10; + private static final int FOOTSTEP_MAX_INTERVAL_TICKS = 22; + private static final int APPARITION_MIN_DURATION_TICKS = 16; + private static final int APPARITION_MAX_DURATION_TICKS = 34; + private static final int LUNGE_MIN_DURATION_TICKS = 10; + private static final int LUNGE_MAX_DURATION_TICKS = 16; + + private static int nextSoundTick = 0; + private static int nextApparitionTick = 0; + private static int nextFootstepTick = 0; + private static final List ACTIVE_APPARITIONS = new ArrayList<>(); + private static final Random RANDOM = new Random(); + + private DreadClientHandler() { + } + + private enum ApparitionType { + PERIPHERAL_SILHOUETTE, + CROSSING_SHADOW, + LUNGE_FLASH + } + + private static final class ApparitionEntry { + private final ApparitionType type; + private final float scale; + private final int lifetime; + private final int baseColor; + private float xNorm; + private float yNorm; + private float xVelocity; + private float yVelocity; + private int age; + + private ApparitionEntry(ApparitionType type, float xNorm, float yNorm, float xVelocity, float yVelocity, float scale, int lifetime, int baseColor) { + this.type = type; + this.xNorm = xNorm; + this.yNorm = yNorm; + this.xVelocity = xVelocity; + this.yVelocity = yVelocity; + this.scale = scale; + this.lifetime = lifetime; + this.baseColor = baseColor; + } + + private void tick() { + this.age++; + this.xNorm += this.xVelocity; + this.yNorm += this.yVelocity; + } + + private boolean expired() { + return this.age >= this.lifetime; + } + + private float alpha() { + float progress = this.lifetime <= 0 ? 1.0F : (float) this.age / (float) this.lifetime; + return Mth.clamp(Mth.sin(progress * (float) Math.PI), 0.0F, 1.0F); + } + } + + public static void tick() { + Minecraft mc = Minecraft.getInstance(); + if (mc.level == null || mc.player == null) { + resetState(); + return; + } + if (mc.isPaused()) { + return; + } + + Player player = mc.player; + if (!player.isAlive() || player.isRemoved() || player.deathTime > 0 || player.isDeadOrDying() || mc.screen instanceof DeathScreen) { + resetState(); + return; + } + + tickApparitions(); + + if (!player.hasEffect(DREAD_EFFECT)) { + resetState(); + return; + } + + if (AntarchySettings.dreadHallucinationSoundsEnabled()) { + nextSoundTick--; + if (nextSoundTick <= 0) { + playHallucinationSound(mc, player); + nextSoundTick = randomIntervalTicks( + AntarchySettings.dreadHallucinationSoundMinInterval(), + AntarchySettings.dreadHallucinationSoundMaxInterval() + ); + } + } else { + nextSoundTick = 0; + } + + nextFootstepTick--; + if (nextFootstepTick <= 0) { + if (player.onGround() && player.getDeltaMovement().horizontalDistanceSqr() > 0.0025D) { + playFootstepSound(mc, player); + nextFootstepTick = randomTickInterval(FOOTSTEP_MIN_INTERVAL_TICKS, FOOTSTEP_MAX_INTERVAL_TICKS); + } else { + nextFootstepTick = 4; + } + } + + if (AntarchySettings.dreadHallucinationMobsEnabled()) { + nextApparitionTick--; + if (nextApparitionTick <= 0) { + spawnApparition(mc, player); + nextApparitionTick = randomIntervalTicks( + AntarchySettings.dreadHallucinationMobMinInterval(), + AntarchySettings.dreadHallucinationMobMaxInterval() + ); + } + } else { + nextApparitionTick = 0; + ACTIVE_APPARITIONS.clear(); + } + } + + public static void render(GuiGraphics guiGraphics) { + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + if (player == null || !player.hasEffect(DREAD_EFFECT) || ACTIVE_APPARITIONS.isEmpty()) { + return; + } + + int width = mc.getWindow().getGuiScaledWidth(); + int height = mc.getWindow().getGuiScaledHeight(); + for (ApparitionEntry entry : ACTIVE_APPARITIONS) { + float alpha = entry.alpha(); + if (alpha <= 0.01F) { + continue; + } + + switch (entry.type) { + case PERIPHERAL_SILHOUETTE -> renderPeripheralSilhouette(guiGraphics, width, height, entry, alpha); + case CROSSING_SHADOW -> renderCrossingShadow(guiGraphics, width, height, entry, alpha); + case LUNGE_FLASH -> renderLungeFlash(guiGraphics, width, height, entry, alpha); + } + } + } + + private static void tickApparitions() { + Iterator iterator = ACTIVE_APPARITIONS.iterator(); + while (iterator.hasNext()) { + ApparitionEntry entry = iterator.next(); + entry.tick(); + if (entry.expired()) { + iterator.remove(); + } + } + } + + private static void playHallucinationSound(Minecraft mc, Player player) { + Optional> tagOpt = + BuiltInRegistries.SOUND_EVENT.getTag(AntarchyTags.SoundEvents.DREAD_HALLUCINATION_SOUNDS); + if (tagOpt.isEmpty()) { + return; + } + + List> sounds = tagOpt.get().stream().toList(); + if (sounds.isEmpty()) { + return; + } + + SoundEvent soundEvent = sounds.get(RANDOM.nextInt(sounds.size())).value(); + + Vec3 look = player.getLookAngle(); + double baseAngle = Math.atan2(-look.x, -look.z); + double spread = (RANDOM.nextDouble() - 0.5D) * Math.PI; + double angle = baseAngle + spread; + double distance = 10.0D + RANDOM.nextDouble() * 15.0D; + + double soundX = player.getX() + Math.sin(angle) * distance; + double soundY = player.getY() + RANDOM.nextDouble() * 4.0D - 1.0D; + double soundZ = player.getZ() + Math.cos(angle) * distance; + + mc.level.playLocalSound( + soundX, + soundY, + soundZ, + soundEvent, + SoundSource.HOSTILE, + 1.0F, + 0.85F + RANDOM.nextFloat() * 0.3F, + false + ); + } + + private static void spawnApparition(Minecraft mc, Player player) { + double roll = RANDOM.nextDouble(); + if (roll < 0.5D) { + spawnPeripheralSilhouette(); + return; + } + if (roll < 0.82D) { + spawnCrossingShadow(); + return; + } + spawnLungeFlash(mc, player); + } + + private static void spawnPeripheralSilhouette() { + boolean leftSide = RANDOM.nextBoolean(); + float xNorm = leftSide ? 0.08F + RANDOM.nextFloat() * 0.08F : 0.84F + RANDOM.nextFloat() * 0.08F; + float yNorm = 0.48F + (RANDOM.nextFloat() - 0.5F) * 0.26F; + float scale = 0.85F + RANDOM.nextFloat() * 0.4F; + int lifetime = randomTickInterval(APPARITION_MIN_DURATION_TICKS, APPARITION_MAX_DURATION_TICKS); + ACTIVE_APPARITIONS.add(new ApparitionEntry( + ApparitionType.PERIPHERAL_SILHOUETTE, + xNorm, + yNorm, + leftSide ? -0.0015F : 0.0015F, + 0.0F, + scale, + lifetime, + 0x160000 + )); + } + + private static void spawnCrossingShadow() { + boolean leftToRight = RANDOM.nextBoolean(); + float xNorm = leftToRight ? -0.18F : 1.18F; + float yNorm = 0.38F + RANDOM.nextFloat() * 0.36F; + float velocity = leftToRight ? 0.04F + RANDOM.nextFloat() * 0.015F : -(0.04F + RANDOM.nextFloat() * 0.015F); + float scale = 0.9F + RANDOM.nextFloat() * 0.45F; + int lifetime = randomTickInterval(APPARITION_MIN_DURATION_TICKS, APPARITION_MAX_DURATION_TICKS); + ACTIVE_APPARITIONS.add(new ApparitionEntry( + ApparitionType.CROSSING_SHADOW, + xNorm, + yNorm, + velocity, + 0.0F, + scale, + lifetime, + 0x1A0000 + )); + } + + private static void spawnLungeFlash(Minecraft mc, Player player) { + float xNorm = 0.5F + (RANDOM.nextBoolean() ? -1.0F : 1.0F) * (0.12F + RANDOM.nextFloat() * 0.12F); + float yNorm = 0.58F + (RANDOM.nextFloat() - 0.5F) * 0.12F; + float scale = 0.95F + RANDOM.nextFloat() * 0.35F; + int lifetime = randomTickInterval(LUNGE_MIN_DURATION_TICKS, LUNGE_MAX_DURATION_TICKS); + ACTIVE_APPARITIONS.add(new ApparitionEntry( + ApparitionType.LUNGE_FLASH, + xNorm, + yNorm, + 0.0F, + -0.002F, + scale, + lifetime, + 0x2A0000 + )); + mc.level.playLocalSound( + player.getX(), + player.getY() + 1.0D, + player.getZ(), + AntarchyFabricSounds.NIGHTMARE_BITE.get(), + SoundSource.HOSTILE, + 0.4F, + 0.88F + RANDOM.nextFloat() * 0.12F, + false + ); + } + + private static void playFootstepSound(Minecraft mc, Player player) { + double soundX = player.getX() + (RANDOM.nextDouble() - 0.5D) * 1.2D; + double soundY = player.getY() - 0.95D; + double soundZ = player.getZ() + (RANDOM.nextDouble() - 0.5D) * 1.2D; + + mc.level.playLocalSound( + soundX, + soundY, + soundZ, + SoundEvents.SILVERFISH_STEP, + SoundSource.HOSTILE, + 0.45F, + 0.85F + RANDOM.nextFloat() * 0.25F, + false + ); + } + + private static void renderPeripheralSilhouette(GuiGraphics guiGraphics, int width, int height, ApparitionEntry entry, float alpha) { + int centerX = Math.round(entry.xNorm * width); + int baseY = Math.round(entry.yNorm * height); + int bodyWidth = Math.round(width * 0.045F * entry.scale); + int bodyHeight = Math.round(height * 0.24F * entry.scale); + int headSize = Math.round(bodyWidth * 0.78F); + int x0 = centerX - bodyWidth / 2; + int y0 = baseY - bodyHeight / 2; + + int outerColor = alphaColor(entry.baseColor, alpha * 0.8F); + int innerColor = alphaColor(0x5A0000, alpha * 0.22F); + + guiGraphics.fill(x0, y0, x0 + bodyWidth, y0 + bodyHeight, outerColor); + guiGraphics.fill(x0 - headSize / 2 + bodyWidth / 2, y0 - headSize / 2, x0 + bodyWidth / 2 + headSize / 2, y0 + headSize / 2, outerColor); + guiGraphics.fill(x0 + bodyWidth / 6, y0 + bodyHeight / 6, x0 + bodyWidth - bodyWidth / 6, y0 + bodyHeight - bodyHeight / 7, innerColor); + } + + private static void renderCrossingShadow(GuiGraphics guiGraphics, int width, int height, ApparitionEntry entry, float alpha) { + int centerX = Math.round(entry.xNorm * width); + int centerY = Math.round(entry.yNorm * height); + int shadowWidth = Math.round(width * 0.22F * entry.scale); + int shadowHeight = Math.round(height * 0.035F * entry.scale); + + int outerColor = alphaColor(entry.baseColor, alpha * 0.65F); + int innerColor = alphaColor(0x340000, alpha * 0.28F); + + guiGraphics.fill(centerX - shadowWidth / 2, centerY - shadowHeight / 2, centerX + shadowWidth / 2, centerY + shadowHeight / 2, outerColor); + guiGraphics.fill(centerX - shadowWidth / 3, centerY - shadowHeight, centerX + shadowWidth / 3, centerY + shadowHeight, innerColor); + } + + private static void renderLungeFlash(GuiGraphics guiGraphics, int width, int height, ApparitionEntry entry, float alpha) { + int centerX = Math.round(entry.xNorm * width); + int centerY = Math.round(entry.yNorm * height); + int faceWidth = Math.round(width * 0.11F * entry.scale); + int faceHeight = Math.round(height * 0.12F * entry.scale); + + int shadowColor = alphaColor(entry.baseColor, alpha * 0.82F); + int glowColor = alphaColor(0x4A0000, alpha * 0.25F); + int eyeColor = alphaColor(0xB02020, alpha * 0.8F); + + guiGraphics.fill(centerX - faceWidth / 2, centerY - faceHeight / 2, centerX + faceWidth / 2, centerY + faceHeight / 2, shadowColor); + guiGraphics.fill(centerX - faceWidth, centerY - faceHeight / 3, centerX + faceWidth, centerY + faceHeight, glowColor); + + int eyeWidth = Math.max(2, faceWidth / 7); + int eyeHeight = Math.max(2, faceHeight / 12); + int eyeY = centerY - faceHeight / 8; + int eyeOffset = faceWidth / 4; + guiGraphics.fill(centerX - eyeOffset - eyeWidth, eyeY, centerX - eyeOffset + eyeWidth, eyeY + eyeHeight, eyeColor); + guiGraphics.fill(centerX + eyeOffset - eyeWidth, eyeY, centerX + eyeOffset + eyeWidth, eyeY + eyeHeight, eyeColor); + } + + private static void resetState() { + ACTIVE_APPARITIONS.clear(); + nextSoundTick = 0; + nextApparitionTick = 0; + nextFootstepTick = 0; + } + + private static int randomIntervalTicks(double minSeconds, double maxSeconds) { + double seconds = minSeconds + RANDOM.nextDouble() * Math.max(0.0D, maxSeconds - minSeconds); + return Math.max(1, (int) (seconds * 20.0D)); + } + + private static int randomTickInterval(int minTicks, int maxTicks) { + return minTicks + RANDOM.nextInt(Math.max(1, maxTicks - minTicks + 1)); + } + + private static int alphaColor(int rgb, float alpha) { + int alphaByte = Mth.clamp((int) (alpha * 255.0F), 0, 255); + return (alphaByte << 24) | rgb; + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/DreadHudRenderer.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/DreadHudRenderer.java new file mode 100644 index 00000000..98268ef1 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/DreadHudRenderer.java @@ -0,0 +1,34 @@ +package com.craisinlord.antarchy.fabric.client; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricMisc; + +import com.craisinlord.antarchy.fabric.AntarchyFabricContent; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.util.Mth; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.entity.player.Player; + +public final class DreadHudRenderer { + private static final MobEffect DREAD_EFFECT = AntarchyFabricMisc.DREAD.get(); + + private DreadHudRenderer() { + } + + public static void render(GuiGraphics guiGraphics) { + Minecraft minecraft = Minecraft.getInstance(); + Player player = minecraft.player; + if (player == null || minecraft.screen != null || player.isDeadOrDying() || !player.hasEffect(DREAD_EFFECT)) { + return; + } + + float pulse = Math.max(0.0F, Mth.sin(player.tickCount * ((float) Math.PI * 2.0F / 80.0F))); + int alpha = Mth.clamp(18 + Mth.floor(pulse * 64.0F), 0, 255); + int color = (alpha << 24) | 0x120000; + int width = minecraft.getWindow().getGuiScaledWidth(); + int height = minecraft.getWindow().getGuiScaledHeight(); + guiGraphics.fill(0, 0, width, height, color); + DreadClientHandler.render(guiGraphics); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/ElythiaFireflyManager.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/ElythiaFireflyManager.java new file mode 100644 index 00000000..ca92f8d8 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/ElythiaFireflyManager.java @@ -0,0 +1,85 @@ +package com.craisinlord.antarchy.fabric.client; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricMisc; + +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.AntarchyTags; +import com.craisinlord.antarchy.content.AntarchySoundEvents; +import com.craisinlord.antarchy.content.client.renderer.ElythiaSkyRenderer; +import com.craisinlord.antarchy.fabric.AntarchyFabricContent; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.player.Player; + +public final class ElythiaFireflyManager { + private static final long NIGHT_START = 13000L; + private static final long NIGHT_END = 23000L; + private static final int SPAWN_INTERVAL = 3; + private static final int SPAWN_RADIUS_H = 20; + private static final int SPAWN_Y_MIN = -2; + private static final int SPAWN_Y_MAX = 10; + private static final int SOUND_INTERVAL_MIN = 250; + private static final int SOUND_INTERVAL_MAX = 450; + + private static int nextSoundTick = SOUND_INTERVAL_MIN; + + private ElythiaFireflyManager() {} + + public static void register() { + ClientTickEvents.END_CLIENT_TICK.register(client -> { + ClientLevel level = client.level; + if (level == null || client.player == null) return; + if (client.isPaused()) return; + if (!ElythiaSkyRenderer.shouldRender(level)) return; + + long dayTime = level.getDayTime() % 24000L; + if (dayTime < NIGHT_START || dayTime > NIGHT_END) return; + + long gameTime = level.getGameTime(); + boolean fireflyBiome = level.getBiome(client.player.blockPosition()).is(AntarchyTags.Biomes.ELYTHIA_FIREFLY_PARTICLE_BIOMES); + + if (AntarchySettings.elythiaFireflyParticlesEnabled() && fireflyBiome) { + if (gameTime % SPAWN_INTERVAL == 0) { + Player player = client.player; + int px = (int) player.getX(); + int py = (int) player.getY(); + int pz = (int) player.getZ(); + + int attempts = 1 + level.random.nextInt(3); + for (int i = 0; i < attempts; i++) { + int ox = level.random.nextInt(SPAWN_RADIUS_H * 2 + 1) - SPAWN_RADIUS_H; + int oy = SPAWN_Y_MIN + level.random.nextInt(SPAWN_Y_MAX - SPAWN_Y_MIN + 1); + int oz = level.random.nextInt(SPAWN_RADIUS_H * 2 + 1) - SPAWN_RADIUS_H; + + BlockPos candidate = new BlockPos(px + ox, py + oy, pz + oz); + if (!level.getBlockState(candidate).isAir()) continue; + + level.addParticle( + AntarchyFabricMisc.FIREFLY.get(), + candidate.getX() + level.random.nextDouble(), + candidate.getY() + level.random.nextDouble(), + candidate.getZ() + level.random.nextDouble(), + 0.0, 0.0, 0.0 + ); + } + } + } + + nextSoundTick--; + if (nextSoundTick <= 0) { + nextSoundTick = SOUND_INTERVAL_MIN + level.random.nextInt(SOUND_INTERVAL_MAX - SOUND_INTERVAL_MIN + 1); + Player player = client.player; + level.playLocalSound( + player.getX(), player.getY(), player.getZ(), + AntarchySoundEvents.ELYTHIA_FIREFLY_AMBIENT.get(), + SoundSource.AMBIENT, + 0.6f + level.random.nextFloat() * 0.3f, + 0.9f + level.random.nextFloat() * 0.2f, + false + ); + } + }); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/FallenKingCrownArmorStandLayer.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/FallenKingCrownArmorStandLayer.java new file mode 100644 index 00000000..e55147a6 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/FallenKingCrownArmorStandLayer.java @@ -0,0 +1,47 @@ +package com.craisinlord.antarchy.fabric.client; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricBlocks; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricItems; + +import com.craisinlord.antarchy.fabric.AntarchyFabricContent; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.ArmorStandModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.world.entity.decoration.ArmorStand; +import net.minecraft.world.item.ItemStack; + +public final class FallenKingCrownArmorStandLayer extends RenderLayer { + private final BlockRenderDispatcher blockRenderer; + + public FallenKingCrownArmorStandLayer(RenderLayerParent renderer) { + super(renderer); + this.blockRenderer = Minecraft.getInstance().getBlockRenderer(); + } + + @Override + public void render(PoseStack poseStack, MultiBufferSource buffer, int packedLight, ArmorStand armorStand, float limbSwing, float limbSwingAmount, float partialTick, float ageInTicks, float netHeadYaw, float headPitch) { + ItemStack headStack = armorStand.getItemBySlot(net.minecraft.world.entity.EquipmentSlot.HEAD); + if (!headStack.is(AntarchyFabricItems.FALLEN_KING_CROWN.get()) || armorStand.isInvisible()) { + return; + } + + poseStack.pushPose(); + this.getParentModel().head.translateAndRotate(poseStack); + poseStack.translate(0.5D, -0.125D, -0.5D); + poseStack.mulPose(Axis.XP.rotationDegrees(180.0F)); + poseStack.mulPose(Axis.YP.rotationDegrees(180.0F)); + this.blockRenderer.renderSingleBlock( + AntarchyFabricBlocks.FALLEN_KING_CROWN_BLOCK.get().defaultBlockState(), + poseStack, + buffer, + packedLight, + LivingEntityRenderer.getOverlayCoords(armorStand, 0.0F) + ); + poseStack.popPose(); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/FallenKingCrownLayer.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/FallenKingCrownLayer.java new file mode 100644 index 00000000..4d9ae620 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/FallenKingCrownLayer.java @@ -0,0 +1,59 @@ +package com.craisinlord.antarchy.fabric.client; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricBlocks; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricItems; + +import com.craisinlord.antarchy.fabric.AntarchyFabricContent; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ItemStack; + +public final class FallenKingCrownLayer extends RenderLayer> { + private final BlockRenderDispatcher blockRenderer; + + public FallenKingCrownLayer(RenderLayerParent> renderer) { + super(renderer); + this.blockRenderer = Minecraft.getInstance().getBlockRenderer(); + } + + @Override + public void render( + PoseStack poseStack, + MultiBufferSource buffer, + int packedLight, + AbstractClientPlayer player, + float limbSwing, + float limbSwingAmount, + float partialTick, + float ageInTicks, + float netHeadYaw, + float headPitch + ) { + ItemStack headStack = player.getItemBySlot(EquipmentSlot.HEAD); + if (!headStack.is(AntarchyFabricItems.FALLEN_KING_CROWN.get()) || player.isInvisible()) { + return; + } + + poseStack.pushPose(); + this.getParentModel().head.translateAndRotate(poseStack); + poseStack.translate(0.5D, -0.125D, -0.5D); + poseStack.mulPose(Axis.XP.rotationDegrees(180.0F)); + poseStack.mulPose(Axis.YP.rotationDegrees(180.0F)); + this.blockRenderer.renderSingleBlock( + AntarchyFabricBlocks.FALLEN_KING_CROWN_BLOCK.get().defaultBlockState(), + poseStack, + buffer, + packedLight, + LivingEntityRenderer.getOverlayCoords(player, 0.0F) + ); + poseStack.popPose(); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/GravityGunClientHandler.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/GravityGunClientHandler.java new file mode 100644 index 00000000..f7ab85ad --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/GravityGunClientHandler.java @@ -0,0 +1,61 @@ +package com.craisinlord.antarchy.fabric.client; + +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.item.GravityGunItem; +import com.craisinlord.antarchy.content.network.GravityGunPrimaryPayload; +import com.craisinlord.antarchy.content.network.GravityGunScrollPayload; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.util.Mth; + +public final class GravityGunClientHandler { + private static final double SCROLL_STEP_DISTANCE = 0.75D; + private static boolean lastAttackDown; + private static double scrollAccumulator; + + private GravityGunClientHandler() { + } + + public static void register() { + ClientTickEvents.END_CLIENT_TICK.register(client -> tickMouse(client)); + } + + private static void tickMouse(Minecraft mc) { + if (mc.player == null || mc.level == null || mc.screen != null || !AntarchySettings.gravityGunEnabled()) { + lastAttackDown = false; + return; + } + + if (!(mc.player.getMainHandItem().getItem() instanceof GravityGunItem)) { + lastAttackDown = false; + return; + } + + boolean attackDown = mc.options.keyAttack.isDown(); + if (attackDown && !lastAttackDown) { + com.craisinlord.antarchy.fabric.network.AntarchyFabricClientNetworking.sendToServer(new GravityGunPrimaryPayload(), GravityGunPrimaryPayload.STREAM_CODEC, GravityGunPrimaryPayload.TYPE); + } + lastAttackDown = attackDown; + } + + public static boolean onScroll(double verticalAmount) { + Minecraft mc = Minecraft.getInstance(); + if (mc.player == null || mc.level == null || mc.screen != null || !Screen.hasControlDown() || !AntarchySettings.gravityGunEnabled()) { + return false; + } + + if (!(mc.player.getMainHandItem().getItem() instanceof GravityGunItem) || !GravityGunItem.hasHeldTarget(mc.player.getMainHandItem())) { + return false; + } + + double scrollAmount = Mth.clamp(verticalAmount, -1.0D, 1.0D); + if (Math.abs(scrollAmount) < 1.0E-4D) { + return false; + } + + com.craisinlord.antarchy.fabric.network.AntarchyFabricClientNetworking.sendToServer(new GravityGunScrollPayload(scrollAmount * SCROLL_STEP_DISTANCE), GravityGunScrollPayload.STREAM_CODEC, GravityGunScrollPayload.TYPE); + return true; + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/HerculesBeetleChargeHudRenderer.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/HerculesBeetleChargeHudRenderer.java new file mode 100644 index 00000000..1126d4e4 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/HerculesBeetleChargeHudRenderer.java @@ -0,0 +1,50 @@ +package com.craisinlord.antarchy.fabric.client; + +import com.craisinlord.antarchy.content.entity.HerculesBeetleEntity; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; + +public final class HerculesBeetleChargeHudRenderer { + private static final ResourceLocation CHARGE_BAR_BACKGROUND = + new ResourceLocation("textures/gui/sprites/hud/jump_bar_background.png"); + private static final ResourceLocation CHARGE_BAR_PROGRESS = + new ResourceLocation("textures/gui/sprites/hud/jump_bar_progress.png"); + private static final int BAR_WIDTH = 182; + private static final int BAR_HEIGHT = 5; + + private HerculesBeetleChargeHudRenderer() { + } + + public static void render(GuiGraphics guiGraphics) { + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + if (player == null || mc.screen != null || player.isDeadOrDying()) { + return; + } + if (!(player.getVehicle() instanceof HerculesBeetleEntity beetle)) { + return; + } + + int charge = beetle.getMountedCharge(); + if (charge <= 0) { + return; + } + + int width = mc.getWindow().getGuiScaledWidth(); + int height = mc.getWindow().getGuiScaledHeight(); + int x0 = width / 2 - BAR_WIDTH / 2; + int y0 = height - 29; + float chargeRatio = Mth.clamp(charge / 100.0F, 0.0F, 1.0F); + int filledWidth = Mth.clamp((int) (chargeRatio * BAR_WIDTH), 0, BAR_WIDTH); + + guiGraphics.blit(CHARGE_BAR_BACKGROUND, x0, y0, 0, 0, BAR_WIDTH, BAR_HEIGHT, BAR_WIDTH, BAR_HEIGHT); + if (filledWidth > 0) { + guiGraphics.setColor(1.0F, 0.78F, 0.2F, 0.45F + chargeRatio * 0.55F); + guiGraphics.blit(CHARGE_BAR_PROGRESS, x0, y0, 0, 0, filledWidth, BAR_HEIGHT, BAR_WIDTH, BAR_HEIGHT); + guiGraphics.setColor(1.0F, 1.0F, 1.0F, 1.0F); + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/HerculesBeetleClientHandler.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/HerculesBeetleClientHandler.java new file mode 100644 index 00000000..6233a342 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/HerculesBeetleClientHandler.java @@ -0,0 +1,68 @@ +package com.craisinlord.antarchy.fabric.client; + +import com.craisinlord.antarchy.content.entity.HerculesBeetleEntity; +import com.craisinlord.antarchy.content.network.HerculesBeetleFlightTogglePayload; +import com.craisinlord.antarchy.content.network.HerculesBeetleJumpInputPayload; +import com.craisinlord.antarchy.content.network.HerculesBeetleMountedAttackPayload; +import com.craisinlord.antarchy.content.network.HerculesBeetleMountedChargePayload; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; + +public final class HerculesBeetleClientHandler { + private static boolean wasPressingJump; + private static boolean wasPressingAttack; + private static boolean wasCharging; + private static boolean wasPressingFlightToggle; + + private HerculesBeetleClientHandler() { + } + + public static void tick() { + Minecraft mc = Minecraft.getInstance(); + LocalPlayer player = mc.player; + if (player == null || mc.screen != null) { + resetAll(); + return; + } + + if (!(player.getVehicle() instanceof HerculesBeetleEntity)) { + resetAll(); + return; + } + + boolean pressingJump = mc.options.keyJump.isDown(); + if (pressingJump != wasPressingJump) { + com.craisinlord.antarchy.fabric.network.AntarchyFabricClientNetworking.sendToServer(new HerculesBeetleJumpInputPayload(pressingJump), HerculesBeetleJumpInputPayload.STREAM_CODEC, HerculesBeetleJumpInputPayload.TYPE); + wasPressingJump = pressingJump; + } + + boolean pressingAttack = mc.options.keyAttack.isDown(); + if (pressingAttack && !wasPressingAttack) { + com.craisinlord.antarchy.fabric.network.AntarchyFabricClientNetworking.sendToServer(new HerculesBeetleMountedAttackPayload(), HerculesBeetleMountedAttackPayload.STREAM_CODEC, HerculesBeetleMountedAttackPayload.TYPE); + } + wasPressingAttack = pressingAttack; + + boolean charging = AntarchyKeyBindings.isHerculesBeetleChargePressed(); + if (charging != wasCharging) { + com.craisinlord.antarchy.fabric.network.AntarchyFabricClientNetworking.sendToServer(new HerculesBeetleMountedChargePayload(charging), HerculesBeetleMountedChargePayload.STREAM_CODEC, HerculesBeetleMountedChargePayload.TYPE); + } + wasCharging = charging; + + boolean pressingFlightToggle = AntarchyKeyBindings.isHerculesBeetleFlightTogglePressed(); + if (pressingFlightToggle && !wasPressingFlightToggle) { + com.craisinlord.antarchy.fabric.network.AntarchyFabricClientNetworking.sendToServer(new HerculesBeetleFlightTogglePayload(), HerculesBeetleFlightTogglePayload.STREAM_CODEC, HerculesBeetleFlightTogglePayload.TYPE); + } + wasPressingFlightToggle = pressingFlightToggle; + } + + private static void resetAll() { + if (wasPressingJump) { + com.craisinlord.antarchy.fabric.network.AntarchyFabricClientNetworking.sendToServer(new HerculesBeetleJumpInputPayload(false), HerculesBeetleJumpInputPayload.STREAM_CODEC, HerculesBeetleJumpInputPayload.TYPE); + wasPressingJump = false; + } + wasPressingAttack = false; + wasCharging = false; + wasPressingFlightToggle = false; + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/InvertedGeyserEruptionParticle.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/InvertedGeyserEruptionParticle.java new file mode 100644 index 00000000..edabc2e6 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/InvertedGeyserEruptionParticle.java @@ -0,0 +1,79 @@ +package com.craisinlord.antarchy.fabric.client; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricMisc; + +import com.craisinlord.antarchy.content.client.particle.InvertedGeyserBaseParticleOptions; +import com.craisinlord.antarchy.content.client.particle.InvertedGeyserParticleOptions; +import com.craisinlord.antarchy.fabric.AntarchyFabricContent; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.NoRenderParticle; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleProvider; + +public final class InvertedGeyserEruptionParticle extends NoRenderParticle { + private final int fluidBlocks; + private final double motionX; + private final double motionY; + private final double motionZ; + private final InvertedGeyserParticleOptions plumeParticle; + private final InvertedGeyserBaseParticleOptions baseParticle; + private final InvertedGeyserBaseParticleOptions poofParticle; + + protected InvertedGeyserEruptionParticle( + ClientLevel level, + double x, + double y, + double z, + double xd, + double yd, + double zd, + InvertedGeyserParticleOptions options + ) { + super(level, x, y, z); + this.motionX = xd; + this.motionY = yd; + this.motionZ = zd; + this.fluidBlocks = options.fluidBlocks(); + this.lifetime = 20; + this.plumeParticle = new InvertedGeyserParticleOptions(AntarchyFabricMisc.INVERTED_GEYSER_PLUME.get(), this.fluidBlocks, options.direction()); + this.baseParticle = new InvertedGeyserBaseParticleOptions(AntarchyFabricMisc.INVERTED_GEYSER_BASE.get(), this.fluidBlocks, 1.5F, options.direction()); + this.poofParticle = new InvertedGeyserBaseParticleOptions(AntarchyFabricMisc.INVERTED_GEYSER_POOF.get(), this.fluidBlocks, 2.0F, options.direction()); + } + + @Override + public void tick() { + super.tick(); + + if (this.age % 2 == 0) { + for (int i = 0; i < 2; i++) { + this.level.addParticle(this.baseParticle, this.x, this.y, this.z, this.motionX, this.motionY, this.motionZ); + } + } + + for (int i = 0; i < this.fluidBlocks + 2; i++) { + this.level.addParticle(this.plumeParticle, this.x, this.y, this.z, this.motionX, this.motionY, this.motionZ); + } + + if (this.age % 10 == 0) { + for (int i = 0; i < 20; i++) { + this.level.addParticle(this.poofParticle, this.x, this.y, this.z, this.motionX, this.motionY, this.motionZ); + } + } + } + + public static final class Provider implements ParticleProvider { + @Override + public Particle createParticle( + InvertedGeyserParticleOptions options, + ClientLevel level, + double x, + double y, + double z, + double xd, + double yd, + double zd + ) { + return new InvertedGeyserEruptionParticle(level, x, y, z, xd, yd, zd, options); + } + } +} + diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/JumpyBootsClientHandler.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/JumpyBootsClientHandler.java new file mode 100644 index 00000000..048307c1 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/JumpyBootsClientHandler.java @@ -0,0 +1,95 @@ +package com.craisinlord.antarchy.fabric.client; + +import com.craisinlord.antarchy.content.item.JumpyBootsHelper; +import com.craisinlord.antarchy.content.item.JumpyBootsItem; +import com.craisinlord.antarchy.content.network.JumpyBootsLaunchPayload; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; + +public final class JumpyBootsClientHandler { + private static int chargeTicks = 0; + private static boolean wasCharging = false; + private static int primeWindowTicks = 0; + private static int storedChargeTicks = 0; + + private JumpyBootsClientHandler() { + } + + public static void tick() { + Minecraft mc = Minecraft.getInstance(); + LocalPlayer player = mc.player; + + if (player == null || mc.level == null || mc.screen != null) { + reset(); + return; + } + + if (!JumpyBootsItem.isWearingJumpyBoots(player)) { + reset(); + return; + } + + boolean onGround = player.onGround(); + boolean sneaking = player.input.shiftKeyDown; + boolean jumpPressed = mc.options.keyJump.consumeClick(); + + if (primeWindowTicks > 0) { + primeWindowTicks--; + if (jumpPressed) { + com.craisinlord.antarchy.fabric.network.AntarchyFabricClientNetworking.sendToServer(new JumpyBootsLaunchPayload(storedChargeTicks, player.isSprinting()), JumpyBootsLaunchPayload.STREAM_CODEC, JumpyBootsLaunchPayload.TYPE); + reset(); + return; + } + if (primeWindowTicks <= 0) { + reset(); + } + return; + } + + if (!onGround) { + chargeTicks = 0; + wasCharging = false; + return; + } + + if (jumpPressed && wasCharging && chargeTicks > 0) { + com.craisinlord.antarchy.fabric.network.AntarchyFabricClientNetworking.sendToServer(new JumpyBootsLaunchPayload(chargeTicks, player.isSprinting()), JumpyBootsLaunchPayload.STREAM_CODEC, JumpyBootsLaunchPayload.TYPE); + reset(); + return; + } + + if (sneaking) { + chargeTicks = Math.min(chargeTicks + 1, JumpyBootsHelper.CHARGE_TICKS_MAX); + wasCharging = true; + } else if (wasCharging && chargeTicks > 0) { + storedChargeTicks = chargeTicks; + if (jumpPressed) { + com.craisinlord.antarchy.fabric.network.AntarchyFabricClientNetworking.sendToServer(new JumpyBootsLaunchPayload(storedChargeTicks, player.isSprinting()), JumpyBootsLaunchPayload.STREAM_CODEC, JumpyBootsLaunchPayload.TYPE); + reset(); + return; + } + primeWindowTicks = JumpyBootsHelper.PRIME_WINDOW_TICKS; + chargeTicks = 0; + wasCharging = false; + } else { + chargeTicks = 0; + wasCharging = false; + } + } + + private static void reset() { + chargeTicks = 0; + wasCharging = false; + primeWindowTicks = 0; + storedChargeTicks = 0; + } + + public static boolean isCharging() { + return chargeTicks > 0; + } + + public static int getChargeTicks() { + return chargeTicks; + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/JumpyBootsHudRenderer.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/JumpyBootsHudRenderer.java new file mode 100644 index 00000000..45747f31 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/JumpyBootsHudRenderer.java @@ -0,0 +1,49 @@ +package com.craisinlord.antarchy.fabric.client; + +import com.craisinlord.antarchy.content.item.JumpyBootsHelper; +import com.craisinlord.antarchy.content.item.JumpyBootsItem; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; + +public final class JumpyBootsHudRenderer { + private static final ResourceLocation JUMP_BAR_BACKGROUND = new ResourceLocation("textures/gui/sprites/hud/jump_bar_background.png"); + private static final ResourceLocation JUMP_BAR_PROGRESS = new ResourceLocation("textures/gui/sprites/hud/jump_bar_progress.png"); + private static final int BAR_WIDTH = 182; + private static final int BAR_HEIGHT = 5; + + private JumpyBootsHudRenderer() { + } + + public static void render(GuiGraphics guiGraphics) { + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + if (player == null || mc.screen != null || player.isDeadOrDying()) { + return; + } + if (!JumpyBootsItem.isWearingJumpyBoots(player)) { + return; + } + if (!JumpyBootsClientHandler.isCharging()) { + return; + } + + int width = mc.getWindow().getGuiScaledWidth(); + int height = mc.getWindow().getGuiScaledHeight(); + int x0 = width / 2 - BAR_WIDTH / 2; + int y0 = height - 29; + + guiGraphics.blit(JUMP_BAR_BACKGROUND, x0, y0, 0, 0, BAR_WIDTH, BAR_HEIGHT, BAR_WIDTH, BAR_HEIGHT); + + int chargeTicks = JumpyBootsClientHandler.getChargeTicks(); + float chargeRatio = Mth.clamp(chargeTicks / (float) JumpyBootsHelper.CHARGE_TICKS_MAX, 0.0F, 1.0F); + int filledWidth = Mth.clamp((int) (chargeRatio * BAR_WIDTH), 0, BAR_WIDTH); + if (filledWidth > 0) { + guiGraphics.setColor(1.0F, 1.0F, 1.0F, 0.35F + chargeRatio * 0.65F); + guiGraphics.blit(JUMP_BAR_PROGRESS, x0, y0, 0, 0, filledWidth, BAR_HEIGHT, BAR_WIDTH, BAR_HEIGHT); + guiGraphics.setColor(1.0F, 1.0F, 1.0F, 1.0F); + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/KeybindingConflictFixStore.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/KeybindingConflictFixStore.java new file mode 100644 index 00000000..ee5e3766 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/KeybindingConflictFixStore.java @@ -0,0 +1,40 @@ +package com.craisinlord.antarchy.fabric.client; + +import com.mojang.blaze3d.platform.InputConstants; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import net.minecraft.client.KeyMapping; + +public final class KeybindingConflictFixStore { + private static final Map> MAPPINGS = new HashMap<>(); + + private KeybindingConflictFixStore() { + } + + public static void add(InputConstants.Key key, KeyMapping mapping) { + List mappings = MAPPINGS.computeIfAbsent(key, ignored -> new ArrayList<>()); + if (!mappings.contains(mapping)) { + mappings.add(mapping); + } + } + + public static void clear() { + MAPPINGS.clear(); + } + + public static List others(InputConstants.Key key, KeyMapping active) { + List mappings = MAPPINGS.get(key); + if (mappings == null || mappings.size() < 2) { + return List.of(); + } + List others = new ArrayList<>(mappings.size() - 1); + for (KeyMapping mapping : mappings) { + if (mapping != active) { + others.add(mapping); + } + } + return others; + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/LucidSoundHandler.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/LucidSoundHandler.java new file mode 100644 index 00000000..03112f6e --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/LucidSoundHandler.java @@ -0,0 +1,227 @@ +package com.craisinlord.antarchy.fabric.client; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricSounds; + +import com.craisinlord.antarchy.content.entity.lucid.LucidEntity; +import com.craisinlord.antarchy.fabric.AntarchyFabricContent; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.DeathScreen; +import net.minecraft.client.resources.sounds.AbstractTickableSoundInstance; +import net.minecraft.client.resources.sounds.SoundInstance; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public final class LucidSoundHandler { + private static final double START_SCAN_RADIUS = 96.0D; + private static final int ANIM_ATTACK = 2; + private static final int ANIM_DEATH = 3; + private static final Map ACTIVE_LOOPS = new HashMap<>(); + + private LucidSoundHandler() { + } + + public static void register() { + ClientTickEvents.END_CLIENT_TICK.register(client -> { + if (client.level == null || client.player == null || client.isPaused()) { + resetAll(client); + return; + } + + if (!client.player.isAlive() || client.player.isRemoved() || client.player.isDeadOrDying() + || client.screen instanceof DeathScreen) { + resetAll(client); + return; + } + + pruneStaleLoops(client); + refreshNearbyLucids(client); + }); + } + + private static void refreshNearbyLucids(Minecraft mc) { + List lucids = mc.level.getEntitiesOfClass( + LucidEntity.class, + mc.player.getBoundingBox().inflate(START_SCAN_RADIUS) + ); + + for (LucidEntity lucid : lucids) { + if (!lucid.shouldPlayAmbientLoop()) continue; + + LucidLoopSet set = ACTIVE_LOOPS.get(lucid.getUUID()); + if (set == null) { + set = new LucidLoopSet(lucid); + ACTIVE_LOOPS.put(lucid.getUUID(), set); + set.start(mc); + } else { + set.refresh(mc, lucid); + } + } + } + + private static void pruneStaleLoops(Minecraft mc) { + Iterator> iterator = ACTIVE_LOOPS.entrySet().iterator(); + while (iterator.hasNext()) { + LucidLoopSet set = iterator.next().getValue(); + if (!set.isValid()) { + set.stop(mc); + iterator.remove(); + } else if (!set.entity.shouldPlayAmbientLoop()) { + set.stop(mc); + iterator.remove(); + } + } + } + + private static void resetAll(Minecraft mc) { + for (LucidLoopSet set : ACTIVE_LOOPS.values()) { + set.stop(mc); + } + ACTIVE_LOOPS.clear(); + } + + private static final class LucidLoopSet { + private LucidEntity entity; + @Nullable private LucidLoopSound ambient; + @Nullable private LucidLoopSound flying; + private int lastAnimationState = -1; + + private LucidLoopSet(LucidEntity entity) { + this.entity = entity; + } + + private boolean isValid() { + return entity != null && entity.isAlive() && !entity.isRemoved(); + } + + private void start(Minecraft mc) { + playAttackSoundIfNeeded(mc, entity); + + if (ambient == null || !mc.getSoundManager().isActive(ambient)) { + ambient = new LucidLoopSound(entity, AntarchyFabricSounds.LUCID_AMBIENT.get(), + SoundSource.HOSTILE, 0.14F, 0.97F, true); + mc.getSoundManager().play(ambient); + } + + if (entity.shouldPlayFlyingLoop() && (flying == null || !mc.getSoundManager().isActive(flying))) { + flying = new LucidLoopSound(entity, AntarchyFabricSounds.LUCID_FLYING.get(), + SoundSource.HOSTILE, 0.18F, 1.0F, false); + mc.getSoundManager().play(flying); + } + } + + private void refresh(Minecraft mc, LucidEntity entity) { + this.entity = entity; + playAttackSoundIfNeeded(mc, entity); + + if (ambient == null || !mc.getSoundManager().isActive(ambient)) { + ambient = new LucidLoopSound(entity, AntarchyFabricSounds.LUCID_AMBIENT.get(), + SoundSource.HOSTILE, 0.14F, 0.97F, true); + mc.getSoundManager().play(ambient); + } else { + ambient.setEntity(entity); + } + + if (entity.shouldPlayFlyingLoop()) { + if (flying == null || !mc.getSoundManager().isActive(flying)) { + flying = new LucidLoopSound(entity, AntarchyFabricSounds.LUCID_FLYING.get(), + SoundSource.HOSTILE, 0.18F, 1.0F, false); + mc.getSoundManager().play(flying); + } else { + flying.setEntity(entity); + } + } else if (flying != null) { + mc.getSoundManager().stop(flying); + flying = null; + } + } + + private void stop(Minecraft mc) { + if (ambient != null) { mc.getSoundManager().stop(ambient); ambient = null; } + if (flying != null) { mc.getSoundManager().stop(flying); flying = null; } + lastAnimationState = -1; + } + + private void playAttackSoundIfNeeded(Minecraft mc, LucidEntity entity) { + int currentState = entity.getAnimationState(); + if (currentState == ANIM_ATTACK && lastAnimationState != ANIM_ATTACK) { + mc.getSoundManager().play(new LucidOneShotSound(entity, AntarchyFabricSounds.LUCID_ATTACK.get(), + SoundSource.HOSTILE, 1.0F, 1.02F + entity.getRandom().nextFloat() * 0.08F)); + } + lastAnimationState = currentState; + } + } + + private static final class LucidLoopSound extends AbstractTickableSoundInstance { + private LucidEntity entity; + private final boolean ambient; + + private LucidLoopSound(LucidEntity entity, SoundEvent soundEvent, SoundSource source, + float volume, float pitch, boolean ambient) { + super(soundEvent, source, RandomSource.create()); + this.entity = entity; + this.ambient = ambient; + this.looping = true; + this.delay = 0; + this.relative = false; + this.attenuation = SoundInstance.Attenuation.LINEAR; + this.volume = volume; + this.pitch = pitch; + this.x = entity.getX(); + this.y = entity.getY(); + this.z = entity.getZ(); + } + + private void setEntity(LucidEntity entity) { this.entity = entity; } + + @Override + public void tick() { + if (entity == null || entity.isRemoved() || entity.isDeadOrDying() + || entity.getAnimationState() == ANIM_DEATH || !entity.shouldPlayAmbientLoop()) { + stop(); + return; + } + if (!ambient && !entity.shouldPlayFlyingLoop()) { stop(); return; } + x = entity.getX(); y = entity.getY(); z = entity.getZ(); + } + + @Override + public boolean canStartSilent() { return true; } + } + + private static final class LucidOneShotSound extends AbstractTickableSoundInstance { + private final LucidEntity entity; + + private LucidOneShotSound(LucidEntity entity, SoundEvent soundEvent, SoundSource source, + float volume, float pitch) { + super(soundEvent, source, RandomSource.create()); + this.entity = entity; + this.looping = false; + this.delay = 0; + this.relative = false; + this.attenuation = SoundInstance.Attenuation.LINEAR; + this.volume = volume; + this.pitch = pitch; + this.x = entity.getX(); + this.y = entity.getY(); + this.z = entity.getZ(); + } + + @Override + public void tick() { + if (entity == null || entity.isRemoved() || entity.isDeadOrDying() + || entity.getAnimationState() == ANIM_DEATH) { + stop(); + return; + } + x = entity.getX(); y = entity.getY(); z = entity.getZ(); + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/MogglesClientRenderer.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/MogglesClientRenderer.java new file mode 100644 index 00000000..bd17d646 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/MogglesClientRenderer.java @@ -0,0 +1,54 @@ +package com.craisinlord.antarchy.fabric.client; + +import com.craisinlord.antarchy.content.item.MogglesCaveDetector; +import com.craisinlord.antarchy.content.item.MogglesLogic; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; + +public final class MogglesClientRenderer { + private MogglesClientRenderer() {} + + public static void register() { + ClientTickEvents.END_CLIENT_TICK.register(client -> { + Player player = client.player; + Level level = client.level; + if (player == null || level == null) return; + + if (!MogglesLogic.isWearingMoggles(player) || level.canSeeSky(player.blockPosition())) { + MogglesCaveDetector.clear(); + return; + } + + MogglesCaveDetector.tick(player, level); + + BlockPos target = MogglesCaveDetector.getCaveTarget(); + if (target == null) return; + + if (level.getGameTime() % 2 != 0) return; + + Vec3 eye = player.getEyePosition(); + Vec3 end = Vec3.atCenterOf(target); + double totalDist = eye.distanceTo(end); + if (totalDist < 1.5) return; + + Vec3 dir = end.subtract(eye).normalize(); + + int steps = Math.min(5, (int) (totalDist / 1.5)); + double spacing = (totalDist - 1.5) / Math.max(steps, 1); + + for (int i = 0; i < steps; i++) { + double t = 1.5 + i * spacing; + Vec3 p = eye.add(dir.scale(t)); + Vec3 vel = dir.scale(0.04); + level.addParticle(ParticleTypes.END_ROD, + p.x, p.y, p.z, + vel.x, vel.y, vel.z); + } + }); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/ParalyzedClientHandler.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/ParalyzedClientHandler.java new file mode 100644 index 00000000..21d3bc86 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/ParalyzedClientHandler.java @@ -0,0 +1,89 @@ +package com.craisinlord.antarchy.fabric.client; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricMisc; + +import com.craisinlord.antarchy.fabric.AntarchyFabricContent; +import net.minecraft.core.Holder; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; + +public final class ParalyzedClientHandler { + private static final net.minecraft.world.effect.MobEffect PARALYZED_EFFECT = AntarchyFabricMisc.PARALYZED.get(); + + + private static final int PARTICLE_INTERVAL = 3; + + private static final int PARTICLES_PER_ENTITY = 4; + + private static final double PARTICLE_RADIUS = 24.0; + + private ParalyzedClientHandler() { + } + + + public static void clampPlayerInput(LocalPlayer player) { + if (!player.hasEffect(PARALYZED_EFFECT)) { + return; + } + + var input = player.input; + input.left = false; + input.right = false; + input.up = false; + input.down = false; + input.leftImpulse = 0.0F; + input.forwardImpulse = 0.0F; + input.jumping = false; + } + + public static void tick() { + Minecraft mc = Minecraft.getInstance(); + if (mc.player == null || mc.level == null) { + return; + } + + LocalPlayer player = mc.player; + if (player.hasEffect(PARALYZED_EFFECT)) { + while (mc.options.keyAttack.consumeClick()) { } + while (mc.options.keyUse.consumeClick()) { } + } + if (player.tickCount % PARTICLE_INTERVAL != 0) { + return; + } + + ClientLevel level = mc.level; + level.getEntitiesOfClass( + LivingEntity.class, + player.getBoundingBox().inflate(PARTICLE_RADIUS), + entity -> entity != player + && entity.isAlive() + && entity.hasEffect(PARALYZED_EFFECT) + ).forEach(entity -> spawnStoneParticles(level, entity)); + } + + private static void spawnStoneParticles(ClientLevel level, LivingEntity entity) { + BlockState stone = Blocks.STONE.defaultBlockState(); + BlockParticleOption particle = new BlockParticleOption(ParticleTypes.BLOCK, stone); + + float w = entity.getBbWidth(); + float h = entity.getBbHeight(); + + for (int i = 0; i < PARTICLES_PER_ENTITY; i++) { + double px = entity.getX() + (Math.random() - 0.5) * w; + double py = entity.getY() + Math.random() * h; + double pz = entity.getZ() + (Math.random() - 0.5) * w; + + double vx = (Math.random() - 0.5) * 0.08; + double vy = Math.random() * 0.06; + double vz = (Math.random() - 0.5) * 0.08; + + level.addParticle(particle, px, py, pz, vx, vy, vz); + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/ParalyzedHudRenderer.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/ParalyzedHudRenderer.java new file mode 100644 index 00000000..3011b3b0 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/ParalyzedHudRenderer.java @@ -0,0 +1,49 @@ +package com.craisinlord.antarchy.fabric.client; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricMisc; + +import com.craisinlord.antarchy.fabric.AntarchyFabricContent; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.util.Mth; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.player.Player; + +public final class ParalyzedHudRenderer { + private static final MobEffect PARALYZED_EFFECT = AntarchyFabricMisc.PARALYZED.get(); + + private ParalyzedHudRenderer() { + } + + public static void render(GuiGraphics guiGraphics) { + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + if (player == null || player.isDeadOrDying()) { + return; + } + + MobEffectInstance effect = player.getEffect(PARALYZED_EFFECT); + if (effect == null) { + return; + } + + int duration = effect.getDuration(); + float fade = effect.isInfiniteDuration() + ? 1.0F + : Math.min(1.0F, Math.max(duration, 20) / 20.0F); + float pulse = 0.85F + 0.15F * Mth.sin(player.tickCount * ((float) Math.PI * 2.0F / 120.0F)); + + int alpha = Mth.clamp((int) (fade * pulse * 0xC0), 0, 0xFF); + + int width = mc.getWindow().getGuiScaledWidth(); + int height = mc.getWindow().getGuiScaledHeight(); + int color = (alpha << 24) | 0x303030; + guiGraphics.fill(0, 0, width, height, color); + int innerAlpha = Mth.clamp(alpha / 3, 0, 0xFF); + int innerColor = (innerAlpha << 24) | 0x606060; + int margin = Math.min(width, height) / 6; + guiGraphics.fill(margin, margin, width - margin, height - margin, innerColor); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/ReverieTrailHandler.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/ReverieTrailHandler.java new file mode 100644 index 00000000..15a53557 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/ReverieTrailHandler.java @@ -0,0 +1,253 @@ +package com.craisinlord.antarchy.fabric.client; + +import com.craisinlord.antarchy.content.entity.ReverieEntity; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.Vec3; +import org.joml.Matrix4f; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public final class ReverieTrailHandler { + + private static final int MAX_TRAIL_POINTS = 20; + private static final int IDLE_LIFETIME_TICKS = 8; + private static final int NORMAL_LIFETIME_TICKS = 14; + private static final int DASH_LIFETIME_TICKS = 22; + private static final float CORE_LINE_WIDTH = 0.035f; + private static final float GLOW_LINE_WIDTH = 0.10f; + private static final double MIN_DISTANCE_BETWEEN_POINTS = 0.05; + private static final double DASH_DISTANCE_THRESHOLD = 0.35; + + private static final Map> TRAILS = new HashMap<>(); + + private ReverieTrailHandler() {} + + private static final class TrailPoint { + final Vec3 pos; + final ReverieEntity.Mood mood; + int age; + final int lifetime; + + TrailPoint(Vec3 pos, ReverieEntity.Mood mood, int lifetime) { + this.pos = pos; + this.mood = mood; + this.age = 0; + this.lifetime = lifetime; + } + + float progress() { return lifetime <= 0 ? 1f : (float) age / (float) lifetime; } + boolean expired() { return age >= lifetime; } + } + + public static void register() { + ClientTickEvents.END_CLIENT_TICK.register(client -> { + if (client.level == null) { TRAILS.clear(); return; } + if (client.isPaused()) return; + + Set activeIds = new HashSet<>(); + + for (Entity entity : client.level.entitiesForRendering()) { + if (!(entity instanceof ReverieEntity reverie)) continue; + + int id = reverie.getId(); + activeIds.add(id); + ReverieEntity.Mood mood = reverie.getMood(); + Vec3 pos = reverie.position().add(0.0, reverie.getBbHeight() * 0.5, 0.0); + + ArrayDeque points = TRAILS.computeIfAbsent(id, k -> new ArrayDeque<>()); + + if (points.isEmpty()) { + points.addFirst(new TrailPoint(pos, mood, lifetimeFor(mood, false))); + } else { + Vec3 lastPos = points.peekFirst().pos; + double distSq = pos.distanceToSqr(lastPos); + if (distSq >= MIN_DISTANCE_BETWEEN_POINTS * MIN_DISTANCE_BETWEEN_POINTS) { + boolean isDash = distSq >= DASH_DISTANCE_THRESHOLD * DASH_DISTANCE_THRESHOLD; + points.addFirst(new TrailPoint(pos, mood, lifetimeFor(mood, isDash))); + while (points.size() > MAX_TRAIL_POINTS) points.pollLast(); + } + } + + Iterator it = points.iterator(); + while (it.hasNext()) { + TrailPoint p = it.next(); + p.age++; + if (p.expired()) it.remove(); + } + } + + TRAILS.keySet().removeIf(id -> !activeIds.contains(id)); + }); + + WorldRenderEvents.AFTER_TRANSLUCENT.register(context -> { + if (TRAILS.isEmpty()) return; + + Minecraft mc = Minecraft.getInstance(); + if (mc.level == null) return; + + Camera camera = context.camera(); + Vec3 camPos = camera.getPosition(); + Matrix4f mat = context.matrixStack().last().pose(); + + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.depthMask(false); + RenderSystem.disableCull(); + RenderSystem.setShader(GameRenderer::getPositionColorShader); + + Tesselator tesselator = Tesselator.getInstance(); + + List> snapshots = new ArrayList<>(TRAILS.size()); + for (ArrayDeque deque : TRAILS.values()) { + if (deque.size() >= 2) snapshots.add(new ArrayList<>(deque)); + } + + if (!snapshots.isEmpty()) { + BufferBuilder glowBuf = tesselator.getBuilder(); + glowBuf.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + for (List points : snapshots) buildPass(glowBuf, mat, points, camPos, true); + BufferUploader.drawWithShader(glowBuf.end()); + + BufferBuilder coreBuf = tesselator.getBuilder(); + coreBuf.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + for (List points : snapshots) buildPass(coreBuf, mat, points, camPos, false); + BufferUploader.drawWithShader(coreBuf.end()); + } + + RenderSystem.enableCull(); + RenderSystem.depthMask(true); + RenderSystem.disableBlend(); + }); + } + + private static int lifetimeFor(ReverieEntity.Mood mood, boolean isDash) { + if (isDash || mood == ReverieEntity.Mood.PURPLE) return DASH_LIFETIME_TICKS; + if (mood == ReverieEntity.Mood.WHITE) return IDLE_LIFETIME_TICKS; + return NORMAL_LIFETIME_TICKS; + } + + private static void buildPass(BufferBuilder buf, Matrix4f mat, List points, Vec3 camPos, boolean glow) { + int n = points.size(); + for (int i = 0; i < n - 1; i++) { + TrailPoint newer = points.get(i); + TrailPoint older = points.get(i + 1); + + float alphaNearer = (glow ? glowAlpha(newer.mood) : coreAlpha(newer.mood)) * indexAlpha(i, n) * (1f - newer.progress()); + float alphaFarther = (glow ? glowAlpha(older.mood) : coreAlpha(older.mood)) * indexAlpha(i + 1, n) * (1f - older.progress()); + if (alphaNearer < 0.005f && alphaFarther < 0.005f) continue; + + Vec3 right = cameraFacingRight(newer.pos, older.pos, camPos); + if (right == null) continue; + + float halfWidth = glow ? glowHalfWidth(newer.mood) : coreHalfWidth(newer.mood); + right = right.scale(halfWidth); + + float[] cn = color(newer.mood); + float[] co = color(older.mood); + Vec3 na = newer.pos.subtract(camPos); + Vec3 nb = older.pos.subtract(camPos); + + buf.vertex(mat, (float)(na.x + right.x), (float)(na.y + right.y), (float)(na.z + right.z)).color(cn[0], cn[1], cn[2], alphaNearer).endVertex(); + buf.vertex(mat, (float)(na.x - right.x), (float)(na.y - right.y), (float)(na.z - right.z)).color(cn[0], cn[1], cn[2], alphaNearer).endVertex(); + buf.vertex(mat, (float)(nb.x - right.x), (float)(nb.y - right.y), (float)(nb.z - right.z)).color(co[0], co[1], co[2], alphaFarther).endVertex(); + buf.vertex(mat, (float)(nb.x + right.x), (float)(nb.y + right.y), (float)(nb.z + right.z)).color(co[0], co[1], co[2], alphaFarther).endVertex(); + } + } + + private static Vec3 cameraFacingRight(Vec3 a, Vec3 b, Vec3 camPos) { + Vec3 segDir = b.subtract(a); + if (segDir.lengthSqr() < 1e-12) return null; + segDir = segDir.normalize(); + Vec3 mid = a.add(b).scale(0.5); + Vec3 toCamera = camPos.subtract(mid); + if (toCamera.lengthSqr() < 1e-12) return null; + toCamera = toCamera.normalize(); + Vec3 right = segDir.cross(toCamera); + if (right.lengthSqr() < 1e-10) { + right = segDir.cross(new Vec3(0.0, 1.0, 0.0)); + if (right.lengthSqr() < 1e-10) return null; + } + return right.normalize(); + } + + private static float indexAlpha(int i, int n) { + if (n <= 1) return 1f; + return 1f - (float) i / (float) (n - 1); + } + + private static final float[] COLOR_WHITE = { 1.0f, 1.0f, 1.0f }; + private static final float[] COLOR_YELLOW = { 1.0f, 0.85f, 0.1f }; + private static final float[] COLOR_RED = { 1.0f, 0.1f, 0.05f }; + private static final float[] COLOR_PURPLE = { 0.7f, 0.1f, 1.0f }; + private static final float[] COLOR_BLUE = { 0.1f, 0.5f, 1.0f }; + + private static float[] color(ReverieEntity.Mood mood) { + return switch (mood) { + case WHITE -> COLOR_WHITE; + case YELLOW -> COLOR_YELLOW; + case RED -> COLOR_RED; + case PURPLE -> COLOR_PURPLE; + case BLUE -> COLOR_BLUE; + }; + } + + private static float glowAlpha(ReverieEntity.Mood mood) { + return switch (mood) { + case WHITE -> 0.15f; + case YELLOW -> 0.30f; + case RED -> 0.55f; + case PURPLE -> 0.65f; + case BLUE -> 0.35f; + }; + } + + private static float coreAlpha(ReverieEntity.Mood mood) { + return switch (mood) { + case WHITE -> 0.35f; + case YELLOW -> 0.55f; + case RED -> 0.85f; + case PURPLE -> 0.95f; + case BLUE -> 0.60f; + }; + } + + private static float glowHalfWidth(ReverieEntity.Mood mood) { + float base = GLOW_LINE_WIDTH * 0.5f; + return switch (mood) { + case WHITE -> base * 0.60f; + case YELLOW -> base * 0.80f; + case RED -> base * 1.00f; + case PURPLE -> base * 1.25f; + case BLUE -> base * 0.90f; + }; + } + + private static float coreHalfWidth(ReverieEntity.Mood mood) { + float base = CORE_LINE_WIDTH * 0.5f; + return switch (mood) { + case WHITE -> base * 0.60f; + case YELLOW -> base * 0.80f; + case RED -> base * 1.20f; + case PURPLE -> base * 1.50f; + case BLUE -> base * 1.00f; + }; + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/ScorpionWhipTetherRenderHandler.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/ScorpionWhipTetherRenderHandler.java new file mode 100644 index 00000000..fbf050b1 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/ScorpionWhipTetherRenderHandler.java @@ -0,0 +1,141 @@ +package com.craisinlord.antarchy.fabric.client; + +import com.craisinlord.antarchy.content.client.ScorpionWhipTetherClientState; +import com.craisinlord.antarchy.content.item.ScorpionWhipItem; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import java.util.Map; +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.HumanoidArm; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.Vec3; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; +import org.joml.Matrix4f; + +public final class ScorpionWhipTetherRenderHandler { + private ScorpionWhipTetherRenderHandler() { + } + + public static void tick() { + Minecraft minecraft = Minecraft.getInstance(); + if (minecraft.level == null) { + ScorpionWhipTetherClientState.clear(); + } + } + + public static void render(WorldRenderContext context) { + if (context.world() == null || context.matrixStack() == null) { + return; + } + + Minecraft minecraft = Minecraft.getInstance(); + if (minecraft.level == null) { + return; + } + + Map tethers = ScorpionWhipTetherClientState.snapshot(); + if (tethers.isEmpty()) { + return; + } + + Camera camera = context.camera(); + Vec3 cameraPos = camera.getPosition(); + Matrix4f pose = context.matrixStack().last().pose(); + + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.depthMask(false); + RenderSystem.disableCull(); + RenderSystem.setShader(GameRenderer::getPositionColorShader); + + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + for (Map.Entry entry : tethers.entrySet()) { + Entity source = minecraft.level.getEntity(entry.getKey()); + Entity target = minecraft.level.getEntity(entry.getValue()); + if (!(source instanceof Player player) || target == null || target.isRemoved()) { + continue; + } + + buildTether( + buffer, + pose, + tetherStart(player, context.tickDelta()), + target.position().add(0.0D, target.getBbHeight() * 0.5D, 0.0D), + cameraPos + ); + } + + BufferUploader.drawWithShader(buffer.end()); + + RenderSystem.enableCull(); + RenderSystem.depthMask(true); + RenderSystem.disableBlend(); + } + + private static Vec3 tetherStart(Player player, float partialTick) { + Vec3 start = player.getEyePosition(partialTick).add(0.0D, -0.45D, 0.0D); + boolean mainHandWhip = player.getMainHandItem().getItem() instanceof ScorpionWhipItem; + boolean offHandWhip = player.getOffhandItem().getItem() instanceof ScorpionWhipItem; + if (!mainHandWhip && !offHandWhip) { + return start; + } + + boolean useMainHand = mainHandWhip || !offHandWhip; + HumanoidArm arm = useMainHand ? player.getMainArm() : player.getMainArm().getOpposite(); + float bodyYaw = Mth.rotLerp(partialTick, player.yBodyRotO, player.yBodyRot); + double radians = Math.toRadians(bodyYaw + 90.0F); + double side = arm == HumanoidArm.RIGHT ? -0.28D : 0.28D; + return start.add(Math.cos(radians) * side, -0.12D, Math.sin(radians) * side); + } + + private static void buildTether(BufferBuilder buffer, Matrix4f pose, Vec3 start, Vec3 end, Vec3 cameraPos) { + Vec3 delta = end.subtract(start); + double length = delta.length(); + if (length < 0.001D) { + return; + } + + Vec3 forward = delta.scale(1.0D / length); + Vec3 right = forward.cross(new Vec3(0.0D, 1.0D, 0.0D)); + if (right.lengthSqr() < 1.0E-6D) { + right = forward.cross(new Vec3(1.0D, 0.0D, 0.0D)); + } + right = right.normalize(); + + int segments = Math.max(16, Mth.ceil(length * 8.0D)); + for (int i = 0; i < segments; i++) { + double t0 = (double) i / (double) segments; + double t1 = (double) (i + 1) / (double) segments; + Vec3 p0 = ropePoint(start, delta, t0, length); + Vec3 p1 = ropePoint(start, delta, t1, length); + float width = 0.045F; + Vec3 offset = right.scale(width); + + Vec3 a = p0.subtract(cameraPos); + Vec3 b = p1.subtract(cameraPos); + float shade = i % 2 == 0 ? 0.82F : 0.62F; + float red = 0.36F * shade; + float green = 0.20F * shade; + float blue = 0.11F * shade; + + buffer.vertex(pose, (float) (a.x + offset.x), (float) (a.y + offset.y), (float) (a.z + offset.z)).color(red, green, blue, 1.0F).endVertex(); + buffer.vertex(pose, (float) (a.x - offset.x), (float) (a.y - offset.y), (float) (a.z - offset.z)).color(red, green, blue, 1.0F).endVertex(); + buffer.vertex(pose, (float) (b.x - offset.x), (float) (b.y - offset.y), (float) (b.z - offset.z)).color(red, green, blue, 1.0F).endVertex(); + buffer.vertex(pose, (float) (b.x + offset.x), (float) (b.y + offset.y), (float) (b.z + offset.z)).color(red, green, blue, 1.0F).endVertex(); + } + } + + private static Vec3 ropePoint(Vec3 start, Vec3 delta, double t, double length) { + double sag = Math.sin(t * Math.PI) * Math.min(0.45D, length * 0.07D); + return start.add(delta.scale(t)).add(0.0D, -sag, 0.0D); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/StinkySoundHandler.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/StinkySoundHandler.java new file mode 100644 index 00000000..e84dfb6b --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/StinkySoundHandler.java @@ -0,0 +1,50 @@ +package com.craisinlord.antarchy.fabric.client; + +import com.craisinlord.antarchy.content.AntarchySoundEvents; +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.fabric.AntarchyFabricContent; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.minecraft.client.Minecraft; +import net.minecraft.sounds.SoundSource; + +public final class StinkySoundHandler { + private static final int FIRST_SOUND_DELAY = 20; + private static final int MIN_INTERVAL = 60; + private static final int MAX_INTERVAL = 120; + + private static int nextSoundTick = FIRST_SOUND_DELAY; + + private StinkySoundHandler() { + } + + public static void register() { + ClientTickEvents.END_CLIENT_TICK.register(client -> { + if (client.level == null || client.player == null || client.isPaused()) { + nextSoundTick = FIRST_SOUND_DELAY; + return; + } + + if (!client.player.hasEffect(AntarchyObjects.STINKY_EFFECT.get())) { + nextSoundTick = FIRST_SOUND_DELAY; + return; + } + + nextSoundTick--; + if (nextSoundTick > 0) { + return; + } + + client.level.playLocalSound( + client.player.getX(), + client.player.getY(), + client.player.getZ(), + AntarchySoundEvents.STINKY_FLY.get(), + SoundSource.AMBIENT, + 0.14F + client.level.random.nextFloat() * 0.06F, + 0.92F + client.level.random.nextFloat() * 0.16F, + false + ); + nextSoundTick = MIN_INTERVAL + client.level.random.nextInt(MAX_INTERVAL - MIN_INTERVAL + 1); + }); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/TriffidGooHudRenderer.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/TriffidGooHudRenderer.java new file mode 100644 index 00000000..c2c59d05 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/TriffidGooHudRenderer.java @@ -0,0 +1,47 @@ +package com.craisinlord.antarchy.fabric.client; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricBlocks; + +import com.craisinlord.antarchy.fabric.AntarchyFabricContent; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.Block; + +public final class TriffidGooHudRenderer { + private TriffidGooHudRenderer() { + } + + private static float fadeProgress = 0f; + private static final float FADE_SPEED = 0.05f; + private static final int MAX_ALPHA = 0x55; + + public static void render(GuiGraphics guiGraphics) { + Minecraft minecraft = Minecraft.getInstance(); + Player player = minecraft.player; + if (player == null || player.isDeadOrDying()) { + fadeProgress = Math.max(0f, fadeProgress - FADE_SPEED); + if (fadeProgress <= 0f) return; + } else { + Block goo = AntarchyFabricBlocks.TRIFFID_GOO_BLOCK.get(); + BlockPos feet = player.blockPosition(); + boolean inGoo = player.level().getBlockState(feet).is(goo) + || player.level().getBlockState(feet.above()).is(goo); + + if (inGoo) { + fadeProgress = Math.min(1f, fadeProgress + FADE_SPEED); + } else { + fadeProgress = Math.max(0f, fadeProgress - FADE_SPEED); + } + + if (fadeProgress <= 0f || minecraft.screen != null) return; + } + + int alpha = Mth.floor(MAX_ALPHA * fadeProgress); + int color = (alpha << 24) | 0x003300; + int width = minecraft.getWindow().getGuiScaledWidth(); + int height = minecraft.getWindow().getGuiScaledHeight(); + guiGraphics.fill(0, 0, width, height, color); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/multipart/MultipartClientPartLevelRegistry.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/multipart/MultipartClientPartLevelRegistry.java new file mode 100644 index 00000000..e81af3e7 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/multipart/MultipartClientPartLevelRegistry.java @@ -0,0 +1,37 @@ +package com.craisinlord.antarchy.fabric.client.multipart; + +import com.craisinlord.antarchy.content.entity.multipart.MultipartEntityOwner; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.world.entity.Entity; + +public final class MultipartClientPartLevelRegistry { + private MultipartClientPartLevelRegistry() { + } + + public static void register(MultipartEntityOwner owner) { + Entity[] parts = owner.antarchy$getMultipartParts(); + if (parts == null) { + return; + } + + ClientLevel clientLevel = (ClientLevel) ((Entity) owner).level(); + for (Entity part : parts) { + if (part != null && clientLevel.getEntity(part.getId()) != part) { + clientLevel.putNonPlayerEntity(part.getId(), part); + } + } + } + + public static void unregister(MultipartEntityOwner owner) { + Entity[] parts = owner.antarchy$getMultipartParts(); + if (parts == null) { + return; + } + + for (Entity part : parts) { + if (part != null && !part.isRemoved()) { + part.discard(); + } + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/renderer/MultipartPartRenderer.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/renderer/MultipartPartRenderer.java new file mode 100644 index 00000000..0a0737e8 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/client/renderer/MultipartPartRenderer.java @@ -0,0 +1,26 @@ +package com.craisinlord.antarchy.fabric.client.renderer; + +import com.craisinlord.antarchy.fabric.entity.multipart.MultipartPartEntity; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.resources.ResourceLocation; + +public class MultipartPartRenderer extends EntityRenderer { + private static final ResourceLocation TEXTURE = new ResourceLocation("textures/misc/white.png"); + + public MultipartPartRenderer(EntityRendererProvider.Context context) { + super(context); + this.shadowRadius = 0.0F; + } + + @Override + public void render(MultipartPartEntity entity, float entityYaw, float partialTick, PoseStack poseStack, MultiBufferSource buffer, int packedLight) { + } + + @Override + public ResourceLocation getTextureLocation(MultipartPartEntity entity) { + return TEXTURE; + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/content/fluid/AntiwaterFluid.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/content/fluid/AntiwaterFluid.java new file mode 100644 index 00000000..9b32a774 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/content/fluid/AntiwaterFluid.java @@ -0,0 +1,445 @@ +package com.craisinlord.antarchy.fabric.content.fluid; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricBlocks; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricItems; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricMisc; + +import com.craisinlord.antarchy.fabric.AntarchyFabricContent; +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.LiquidBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FlowingFluid; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.tags.FluidTags; +import net.minecraft.world.phys.Vec3; + +public abstract class AntiwaterFluid extends FlowingFluid { + private static final int MAX_HORIZONTAL_SPREAD_AMOUNT = 5; + private static final int MAX_VERTICAL_FLOW_AMOUNT = 7; + + @Override + public Fluid getFlowing() { + return AntarchyFabricMisc.FLOWING_ANTIWATER.get(); + } + + @Override + public Fluid getSource() { + return AntarchyFabricMisc.ANTIWATER.get(); + } + + @Override + public Item getBucket() { + return AntarchyFabricItems.ANTIWATER_BUCKET.get(); + } + + @Override + public boolean isSame(Fluid fluid) { + return fluid == AntarchyFabricMisc.ANTIWATER.get() || fluid == AntarchyFabricMisc.FLOWING_ANTIWATER.get(); + } + + @Override + protected boolean canConvertToSource(Level level) { + return false; + } + + @Override + protected void beforeDestroyingBlock(LevelAccessor level, BlockPos pos, BlockState state) { + net.minecraft.world.level.block.Block.dropResources(state, level, pos, state.hasBlockEntity() ? level.getBlockEntity(pos) : null); + } + + @Override + protected int getSlopeFindDistance(LevelReader level) { + return 4; + } + + @Override + protected int getDropOff(LevelReader level) { + return 1; + } + + @Override + public int getTickDelay(LevelReader level) { + return 5; + } + + @Override + protected float getExplosionResistance() { + return 100.0F; + } + + @Override + protected BlockState createLegacyBlock(FluidState state) { + return AntarchyFabricBlocks.ANTIWATER_BLOCK.get() + .defaultBlockState() + .setValue(LiquidBlock.LEVEL, getLegacyLevel(state)); + } + + @Override + protected boolean canBeReplacedWith(FluidState state, BlockGetter level, BlockPos pos, Fluid fluid, Direction direction) { + return direction != Direction.DOWN && !this.isSame(fluid); + } + + @Override + protected boolean canSpreadTo( + BlockGetter level, + BlockPos fromPos, + BlockState fromState, + Direction direction, + BlockPos toPos, + BlockState toState, + FluidState toFluidState, + Fluid fluid + ) { + if (direction == Direction.DOWN) { + return false; + } + + return super.canSpreadTo(level, fromPos, fromState, direction, toPos, toState, toFluidState, fluid); + } + + @Override + public Optional getPickupSound() { + return Optional.of(SoundEvents.BUCKET_FILL); + } + + @Override + protected int getSpreadDelay(Level level, BlockPos pos, FluidState currentState, FluidState newState) { + return this.getTickDelay(level); + } + + @Override + public Vec3 getFlow(BlockGetter level, BlockPos pos, FluidState state) { + double flowX = 0.0D; + double flowZ = 0.0D; + + for (Direction direction : Direction.Plane.HORIZONTAL) { + BlockPos neighborPos = pos.relative(direction); + FluidState neighborFluid = level.getFluidState(neighborPos); + int neighborAmount = this.isSame(neighborFluid.getType()) ? neighborFluid.getAmount() : 0; + int currentAmount = state.getAmount(); + int delta = neighborAmount - currentAmount; + if (delta != 0) { + flowX += direction.getStepX() * delta; + flowZ += direction.getStepZ() * delta; + } + } + + Vec3 flow = new Vec3(flowX, 1.0D, flowZ); + return flow.lengthSqr() < 1.0E-6D ? new Vec3(0.0D, 1.0D, 0.0D) : flow.normalize(); + } + + @Override + protected FluidState getNewLiquid(Level level, BlockPos pos, BlockState blockState) { + FluidState currentState = blockState.getFluidState(); + if (!currentState.isSource() && !this.isFlowingStateValid(level, pos, currentState)) { + return Fluids.EMPTY.defaultFluidState(); + } + + if (this.canCreateSourceAt(level, pos)) { + return this.getSource(false); + } + + if (this.isValidVerticalSupport(level, pos)) { + return this.getFlowing(MAX_VERTICAL_FLOW_AMOUNT, false); + } + + int bestNeighborAmount = this.getBestHorizontalNeighborAmount(level, pos); + if (bestNeighborAmount > 1) { + return this.getFlowing(bestNeighborAmount - 1, false); + } + + return Fluids.EMPTY.defaultFluidState(); + } + + @Override + protected void spread(Level level, BlockPos pos, FluidState state) { + if (state.isEmpty()) { + return; + } + + if (!state.isSource() && !this.isFlowingStateValid(level, pos, state)) { + level.setBlockAndUpdate(pos, net.minecraft.world.level.block.Blocks.AIR.defaultBlockState()); + this.scheduleCleanup(level, pos); + return; + } + + BlockState blockState = level.getBlockState(pos); + this.spreadUpward(level, pos, state, blockState); + + if (!this.canHangAt(level, pos)) { + return; + } + + int nextAmount = state.getAmount() - 1; + if (nextAmount <= 0) { + return; + } + + this.spreadHorizontally(level, pos, blockState, nextAmount); + } + + @Override + public void tick(Level level, BlockPos pos, FluidState state) { + if (!state.isSource() && !this.isFlowingStateValid(level, pos, state)) { + level.setBlockAndUpdate(pos, net.minecraft.world.level.block.Blocks.AIR.defaultBlockState()); + this.scheduleDependentCleanup(level, pos); + return; + } + + super.tick(level, pos, state); + } + + public static final class Source extends AntiwaterFluid { + @Override + public int getAmount(FluidState state) { + return 8; + } + + @Override + public boolean isSource(FluidState state) { + return true; + } + } + + public static final class Flowing extends AntiwaterFluid { + public Flowing() { + this.registerDefaultState(this.getStateDefinition().any().setValue(LEVEL, 7)); + } + + @Override + protected void createFluidStateDefinition(net.minecraft.world.level.block.state.StateDefinition.Builder builder) { + super.createFluidStateDefinition(builder); + builder.add(LEVEL); + } + + @Override + public int getAmount(FluidState state) { + return state.getValue(LEVEL); + } + + @Override + public boolean isSource(FluidState state) { + return false; + } + } + + private boolean hasCeiling(Level level, BlockPos pos) { + return level.getBlockState(pos.above()).isSolid(); + } + + private boolean canHangAt(Level level, BlockPos pos) { + return this.hasCeiling(level, pos); + } + + private boolean hasHorizontalSupport(Level level, BlockPos pos) { + FluidState state = level.getFluidState(pos); + if (!this.isAntiwater(state)) { + return false; + } + + int currentAmount = state.getAmount(); + for (Direction direction : Direction.Plane.HORIZONTAL) { + FluidState neighbor = level.getFluidState(pos.relative(direction)); + if (!this.isAntiwater(neighbor)) { + continue; + } + + if (this.getHorizontalSpreadAmount(neighbor) > currentAmount) { + return true; + } + } + + return false; + } + + private boolean canSpreadHorizontallyInto(Level level, BlockPos pos) { + return true; + } + + private int getBestHorizontalNeighborAmount(Level level, BlockPos pos) { + int bestAmount = 0; + for (Direction direction : Direction.Plane.HORIZONTAL) { + BlockPos neighborPos = pos.relative(direction); + FluidState neighborFluid = level.getFluidState(neighborPos); + if (neighborFluid.isEmpty() || !neighborFluid.getType().isSame(this)) { + continue; + } + + if (!this.hasSourceConnection(level, neighborPos, neighborFluid, new HashSet<>())) { + continue; + } + + bestAmount = Math.max(bestAmount, this.getHorizontalSpreadAmount(neighborFluid)); + } + + return bestAmount; + } + + private int getHorizontalSpreadAmount(FluidState state) { + if (state.isSource() || this.isValidVerticalSupportState(state)) { + return MAX_HORIZONTAL_SPREAD_AMOUNT + 1; + } + + return state.getAmount(); + } + + private boolean isValidVerticalSupportState(FluidState state) { + return this.isAntiwater(state) && !state.isSource() && state.getAmount() >= MAX_VERTICAL_FLOW_AMOUNT; + } + + private boolean isFlowingStateValid(Level level, BlockPos pos, FluidState state) { + return state.isSource() + || this.hasImmediateVerticalSupport(level, pos) + || this.hasHorizontalSupport(level, pos); + } + + private boolean canCreateSourceAt(Level level, BlockPos pos) { + if (!this.canHangAt(level, pos)) { + return false; + } + + int sourceNeighbors = 0; + for (Direction direction : Direction.Plane.HORIZONTAL) { + FluidState neighbor = level.getFluidState(pos.relative(direction)); + if (this.isAntiwater(neighbor) && neighbor.isSource()) { + sourceNeighbors++; + if (sourceNeighbors >= 2) { + return true; + } + } + } + + return false; + } + + private boolean isValidVerticalSupport(Level level, BlockPos pos) { + return this.hasImmediateVerticalSupport(level, pos); + } + + private boolean isAntiwater(FluidState state) { + return !state.isEmpty() && state.getType().isSame(this); + } + + private boolean hasImmediateVerticalSupport(Level level, BlockPos pos) { + FluidState below = level.getFluidState(pos.below()); + return this.isAntiwater(below); + } + + private void spreadUpward(Level level, BlockPos pos, FluidState state, BlockState blockState) { + BlockPos abovePos = pos.above(); + BlockState aboveState = level.getBlockState(abovePos); + FluidState aboveFluid = level.getFluidState(abovePos); + + if (aboveFluid.is(FluidTags.WATER)) { + BlockState result = state.isSource() + ? AntarchyFabricBlocks.ANTIMETAL.get().defaultBlockState() + : AntarchyFabricBlocks.NYXITE.get().defaultBlockState(); + level.setBlockAndUpdate(pos, result); + level.levelEvent(1501, pos, 0); + return; + } + + FluidState upwardState = this.getFlowing(MAX_VERTICAL_FLOW_AMOUNT, false); + if (!this.canSpreadTo(level, pos, blockState, Direction.UP, abovePos, aboveState, aboveFluid, upwardState.getType())) { + return; + } + + if (aboveFluid.getType().isSame(this) && aboveFluid.getAmount() >= upwardState.getAmount()) { + return; + } + + this.spreadTo(level, abovePos, aboveState, Direction.UP, upwardState); + } + + private void spreadHorizontally(Level level, BlockPos pos, BlockState blockState, int nextAmount) { + FluidState horizontalState = this.getFlowing(Math.min(nextAmount, MAX_HORIZONTAL_SPREAD_AMOUNT), false); + + for (Direction direction : Direction.Plane.HORIZONTAL) { + BlockPos targetPos = pos.relative(direction); + BlockState targetState = level.getBlockState(targetPos); + FluidState targetFluid = targetState.getFluidState(); + + if (!this.canSpreadHorizontallyInto(level, targetPos)) { + continue; + } + + if (targetFluid.getType().isSame(this) && targetFluid.getAmount() >= horizontalState.getAmount()) { + continue; + } + + if (!this.canSpreadTo(level, pos, blockState, direction, targetPos, targetState, targetFluid, horizontalState.getType())) { + continue; + } + + this.spreadTo(level, targetPos, targetState, direction, horizontalState); + } + } + + private boolean hasSourceConnection(Level level, BlockPos pos, FluidState state, Set visited) { + if (!this.isAntiwater(state)) { + return false; + } + + if (state.isSource()) { + return true; + } + + if (!visited.add(pos)) { + return false; + } + + FluidState below = level.getFluidState(pos.below()); + if (this.hasSourceConnection(level, pos.below(), below, visited)) { + return true; + } + + int currentAmount = state.getAmount(); + for (Direction direction : Direction.Plane.HORIZONTAL) { + BlockPos neighborPos = pos.relative(direction); + FluidState neighbor = level.getFluidState(neighborPos); + if (!this.isAntiwater(neighbor)) { + continue; + } + + if (this.getHorizontalSpreadAmount(neighbor) <= currentAmount) { + continue; + } + + if (this.hasSourceConnection(level, neighborPos, neighbor, visited)) { + return true; + } + } + + return false; + } + + private void scheduleCleanup(Level level, BlockPos pos) { + int tickDelay = this.getTickDelay(level); + level.scheduleTick(pos, this, tickDelay); + level.scheduleTick(pos.above(), this, tickDelay); + level.scheduleTick(pos.below(), this, tickDelay); + for (Direction direction : Direction.Plane.HORIZONTAL) { + level.scheduleTick(pos.relative(direction), this, tickDelay); + } + } + + private void scheduleDependentCleanup(Level level, BlockPos pos) { + int tickDelay = this.getTickDelay(level); + level.scheduleTick(pos.above(), this, tickDelay); + for (Direction direction : Direction.Plane.HORIZONTAL) { + level.scheduleTick(pos.relative(direction), this, tickDelay); + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/content/fluid/AntiwaterLiquidBlock.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/content/fluid/AntiwaterLiquidBlock.java new file mode 100644 index 00000000..634317a1 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/content/fluid/AntiwaterLiquidBlock.java @@ -0,0 +1,61 @@ +package com.craisinlord.antarchy.fabric.content.fluid; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.LiquidBlock; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FlowingFluid; + +public class AntiwaterLiquidBlock extends LiquidBlock { + public AntiwaterLiquidBlock(FlowingFluid fluid, BlockBehaviour.Properties properties) { + super(fluid, properties); + } + + @Override + public void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean movedByPiston) { + super.onPlace(state, level, pos, oldState, movedByPiston); + scheduleCurrentAntiwaterTick(level, pos); + } + + @Override + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, BlockPos neighborPos, boolean movedByPiston) { + super.neighborChanged(state, level, pos, neighborBlock, neighborPos, movedByPiston); + scheduleCurrentAntiwaterTick(level, pos); + } + + @Override + public BlockState updateShape( + BlockState state, + Direction direction, + BlockState neighborState, + LevelAccessor level, + BlockPos pos, + BlockPos neighborPos + ) { + scheduleCurrentAntiwaterTick(level, pos); + return super.updateShape(state, direction, neighborState, level, pos, neighborPos); + } + + @Override + public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) { + if (!state.is(newState.getBlock())) { + scheduleDependentAntiwaterTicks(level, pos); + } + super.onRemove(state, level, pos, newState, movedByPiston); + } + + private void scheduleCurrentAntiwaterTick(LevelAccessor level, BlockPos pos) { + level.scheduleTick(pos, this.fluid, this.fluid.getTickDelay(level)); + } + + private void scheduleDependentAntiwaterTicks(LevelAccessor level, BlockPos pos) { + level.scheduleTick(pos.above(), this.fluid, this.fluid.getTickDelay(level)); + for (Direction direction : Direction.Plane.HORIZONTAL) { + level.scheduleTick(pos.relative(direction), this.fluid, this.fluid.getTickDelay(level)); + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/content/fluid/SimpleFluid.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/content/fluid/SimpleFluid.java new file mode 100644 index 00000000..606c99de --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/content/fluid/SimpleFluid.java @@ -0,0 +1,171 @@ +package com.craisinlord.antarchy.fabric.content.fluid; + +import java.util.Optional; +import java.util.function.Supplier; +import com.craisinlord.antarchy.Antarchy; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.LiquidBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.Direction; +import net.minecraft.world.level.material.FlowingFluid; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; + +public abstract class SimpleFluid extends FlowingFluid { + private final Supplier source; + private final Supplier flowing; + private final Supplier bucket; + private final String blockId; + private final int slopeFindDistance; + private final int dropOff; + private final int tickDelay; + + protected SimpleFluid( + Supplier source, + Supplier flowing, + Supplier bucket, + String blockId, + int slopeFindDistance, + int dropOff, + int tickDelay + ) { + this.source = source; + this.flowing = flowing; + this.bucket = bucket; + this.blockId = blockId; + this.slopeFindDistance = slopeFindDistance; + this.dropOff = dropOff; + this.tickDelay = tickDelay; + } + + @Override + public Fluid getFlowing() { + return this.flowing.get(); + } + + @Override + public Fluid getSource() { + return this.source.get(); + } + + @Override + public Item getBucket() { + return this.bucket.get(); + } + + @Override + protected boolean canConvertToSource(Level level) { + return false; + } + + @Override + protected void beforeDestroyingBlock(LevelAccessor level, BlockPos pos, BlockState state) { + BlockEntity blockEntity = state.hasBlockEntity() ? level.getBlockEntity(pos) : null; + net.minecraft.world.level.block.Block.dropResources(state, level, pos, blockEntity); + } + + @Override + protected int getSlopeFindDistance(LevelReader level) { + return this.slopeFindDistance; + } + + @Override + protected int getDropOff(LevelReader level) { + return this.dropOff; + } + + @Override + public int getTickDelay(LevelReader level) { + return this.tickDelay; + } + + @Override + protected float getExplosionResistance() { + return 100.0F; + } + + @Override + public boolean isSame(Fluid fluid) { + return fluid == this.source.get() || fluid == this.flowing.get(); + } + + @Override + protected BlockState createLegacyBlock(FluidState state) { + LiquidBlock block = (LiquidBlock) BuiltInRegistries.BLOCK.get(new ResourceLocation(Antarchy.MODID, this.blockId)); + return block.defaultBlockState().setValue(LiquidBlock.LEVEL, getLegacyLevel(state)); + } + + @Override + public Optional getPickupSound() { + return Optional.of(SoundEvents.BUCKET_FILL); + } + + @Override + protected boolean canBeReplacedWith(FluidState state, BlockGetter level, BlockPos pos, Fluid fluid, Direction direction) { + return false; + } + + public static final class Flowing extends SimpleFluid { + public Flowing( + Supplier source, + Supplier flowing, + Supplier bucket, + String blockId, + int slopeFindDistance, + int dropOff, + int tickDelay + ) { + super(source, flowing, bucket, blockId, slopeFindDistance, dropOff, tickDelay); + } + + @Override + protected void createFluidStateDefinition(net.minecraft.world.level.block.state.StateDefinition.Builder builder) { + super.createFluidStateDefinition(builder); + builder.add(LEVEL); + } + + @Override + public int getAmount(FluidState state) { + return state.getValue(LEVEL); + } + + @Override + public boolean isSource(FluidState state) { + return false; + } + } + + public static final class Source extends SimpleFluid { + public Source( + Supplier source, + Supplier flowing, + Supplier bucket, + String blockId, + int slopeFindDistance, + int dropOff, + int tickDelay + ) { + super(source, flowing, bucket, blockId, slopeFindDistance, dropOff, tickDelay); + } + + @Override + public int getAmount(FluidState state) { + return 8; + } + + @Override + public boolean isSource(FluidState state) { + return true; + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/entity/multipart/FabricKrakenMultipartLayout.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/entity/multipart/FabricKrakenMultipartLayout.java new file mode 100644 index 00000000..de51b887 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/entity/multipart/FabricKrakenMultipartLayout.java @@ -0,0 +1,65 @@ +package com.craisinlord.antarchy.fabric.entity.multipart; + +import com.craisinlord.antarchy.content.entity.multipart.MultipartPartDefinition; + +public final class FabricKrakenMultipartLayout { + private static final MultipartPartDefinition[] PARTS = { + new MultipartPartDefinition( + "tentacle_mass", + 14.0F, + 18.0F, + 0.90F, + 12.0D, + 13.5D, + 0.00D, + true + ), + new MultipartPartDefinition( + "head", + 15.0F, + 11.5F, + 1.00F, + 26.0D, + 19.0D, + 0.00D, + true + ), + new MultipartPartDefinition( + "back_head", + 13.0F, + 11.0F, + 1.10F, + 38.0D, + 20.5D, + 0.00D, + true + ), + new MultipartPartDefinition( + "mantle", + 16.0F, + 14.0F, + 1.00F, + 51.0D, + 23.0D, + 0.00D, + true + ), + new MultipartPartDefinition( + "crest", + 12.0F, + 10.0F, + 1.10F, + 63.0D, + 28.0D, + 0.00D, + true + ) + }; + + private FabricKrakenMultipartLayout() { + } + + public static MultipartPartDefinition part(int partIndex) { + return PARTS[partIndex]; + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/entity/multipart/MultipartPartEntity.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/entity/multipart/MultipartPartEntity.java new file mode 100644 index 00000000..2b91ea0f --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/entity/multipart/MultipartPartEntity.java @@ -0,0 +1,199 @@ +package com.craisinlord.antarchy.fabric.entity.multipart; + +import com.craisinlord.antarchy.content.entity.multipart.MultipartEntityOwner; +import com.craisinlord.antarchy.content.entity.multipart.MultipartFramework; +import com.craisinlord.antarchy.content.entity.multipart.MultipartPartAccess; +import com.craisinlord.antarchy.content.entity.multipart.MultipartPartDefinition; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; + +public class MultipartPartEntity extends Entity implements MultipartPartAccess { + @Nullable + private MultipartEntityOwner owner; + private int partIndex; + @Nullable + private MultipartPartDefinition definition; + + public MultipartPartEntity(EntityType entityType, Level level) { + super(entityType, level); + this.setNoGravity(true); + } + + public MultipartPartEntity antarchy$configure(MultipartEntityOwner owner, int partIndex, MultipartPartDefinition definition) { + this.owner = owner; + this.partIndex = partIndex; + this.definition = definition; + this.refreshDimensions(); + this.antarchy$syncFromParent(); + return this; + } + + @Nullable + public Entity antarchy$getMultipartParent() { + return this.owner == null ? null : (Entity) this.owner; + } + + public int getPartIndex() { + return this.partIndex; + } + + public String getPartName() { + return this.definition == null ? "" : this.definition.name(); + } + + public float getDamageMultiplier() { + return this.definition == null ? 1.0F : this.definition.damageMultiplier(); + } + + @Override + public void antarchy$syncFromParent() { + Entity parent = this.antarchy$getMultipartParent(); + MultipartPartDefinition definition = this.definition; + if (parent == null || definition == null || parent.isRemoved()) { + return; + } + + double oldX = this.getX(); + double oldY = this.getY(); + double oldZ = this.getZ(); + double yawRadians = Math.toRadians(parent.getYRot()); + Vec3 forward = new Vec3(-Math.sin(yawRadians), 0.0D, Math.cos(yawRadians)); + Vec3 right = new Vec3(forward.z, 0.0D, -forward.x); + Vec3 position = new Vec3( + parent.getX() + forward.x * definition.forwardOffset() + right.x * definition.lateralOffset(), + parent.getY() + definition.yOffset(), + parent.getZ() + forward.z * definition.forwardOffset() + right.z * definition.lateralOffset() + ); + this.setPos(position.x, position.y, position.z); + this.setYRot(parent.getYRot()); + this.setXRot(parent.getXRot()); + this.xo = oldX; + this.yo = oldY; + this.zo = oldZ; + this.xOld = oldX; + this.yOld = oldY; + this.zOld = oldZ; + } + + @Override + public boolean is(Entity entity) { + return entity == this || entity == this.antarchy$getMultipartParent(); + } + + @Override + public boolean isPickable() { + return true; + } + + @Override + public boolean isAttackable() { + return true; + } + + @Override + public boolean isPushable() { + return false; + } + + @Override + public boolean canBeCollidedWith() { + return !this.isRemoved(); + } + + @Override + public boolean canCollideWith(Entity entity) { + MultipartPartDefinition definition = this.definition; + if (definition == null || !definition.collisionEnabled()) { + return false; + } + + Entity parent = this.antarchy$getMultipartParent(); + if (entity == parent) { + return false; + } + + if (entity instanceof MultipartPartEntity otherPart && otherPart.antarchy$getMultipartParent() == parent) { + return false; + } + + return entity.canBeCollidedWith() && !this.isPassengerOfSameVehicle(entity); + } + + @Override + public boolean shouldBeSaved() { + return false; + } + + @Override + public ItemStack getPickResult() { + Entity parent = this.antarchy$getMultipartParent(); + return parent == null ? ItemStack.EMPTY : parent.getPickResult(); + } + + @Override + public boolean hurt(DamageSource source, float amount) { + Entity parent = this.antarchy$getMultipartParent(); + MultipartPartDefinition definition = this.definition; + if (parent == null || definition == null || parent.isRemoved()) { + return false; + } + + if (this.level().isClientSide()) { + if (source.getEntity() instanceof Player) { + MultipartFramework.sendMultipartAttack(parent.getUUID(), this.partIndex, amount * definition.damageMultiplier()); + } + return true; + } + + return this.owner != null && this.owner.antarchy$hurtMultipartPart(this, source, amount * definition.damageMultiplier()); + } + + @Override + public boolean isInvulnerableTo(DamageSource source) { + return false; + } + + @Override + public InteractionResult interactAt(Player player, Vec3 vec, InteractionHand hand) { + Entity parent = this.antarchy$getMultipartParent(); + if (parent == null || parent.isRemoved()) { + return InteractionResult.PASS; + } + + if (this.level().isClientSide()) { + MultipartFramework.sendMultipartInteract(parent.getUUID(), this.partIndex, hand.ordinal()); + return InteractionResult.SUCCESS; + } + + return this.owner == null ? InteractionResult.PASS : this.owner.antarchy$interactMultipartPart(this, player, vec, hand); + } + + @Override + public EntityDimensions getDimensions(Pose pose) { + MultipartPartDefinition definition = this.definition; + return definition == null ? super.getDimensions(pose) : EntityDimensions.scalable(definition.width(), definition.height()); + } + + @Override + protected void defineSynchedData() { + } + + @Override + protected void readAdditionalSaveData(CompoundTag tag) { + } + + @Override + protected void addAdditionalSaveData(CompoundTag tag) { + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/entity/multipart/MultipartServerPartLevelRegistry.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/entity/multipart/MultipartServerPartLevelRegistry.java new file mode 100644 index 00000000..b2b711ba --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/entity/multipart/MultipartServerPartLevelRegistry.java @@ -0,0 +1,37 @@ +package com.craisinlord.antarchy.fabric.entity.multipart; + +import com.craisinlord.antarchy.content.entity.multipart.MultipartEntityOwner; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; + +public final class MultipartServerPartLevelRegistry { + private MultipartServerPartLevelRegistry() { + } + + public static void register(MultipartEntityOwner owner) { + Entity[] parts = owner.antarchy$getMultipartParts(); + if (parts == null) { + return; + } + + ServerLevel serverLevel = (ServerLevel) ((Entity) owner).level(); + for (Entity part : parts) { + if (part != null && serverLevel.getEntity(part.getId()) != part) { + serverLevel.addFreshEntity(part); + } + } + } + + public static void unregister(MultipartEntityOwner owner) { + Entity[] parts = owner.antarchy$getMultipartParts(); + if (parts == null) { + return; + } + + for (Entity part : parts) { + if (part != null && !part.isRemoved()) { + part.discard(); + } + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/item/DeferredSpawnEggItem.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/item/DeferredSpawnEggItem.java new file mode 100644 index 00000000..97d82efe --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/item/DeferredSpawnEggItem.java @@ -0,0 +1,13 @@ +package com.craisinlord.antarchy.fabric.item; + +import java.util.function.Supplier; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.SpawnEggItem; + +public final class DeferredSpawnEggItem extends SpawnEggItem { + public DeferredSpawnEggItem(Supplier> typeSupplier, int backgroundColor, int highlightColor, Item.Properties properties) { + super(typeSupplier.get(), backgroundColor, highlightColor, properties); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/AntimetalInversionMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/AntimetalInversionMixin.java new file mode 100644 index 00000000..2cfe4aea --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/AntimetalInversionMixin.java @@ -0,0 +1,81 @@ +package com.craisinlord.antarchy.fabric.mixin; + +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.gravity.AntarchyGravityApi; +import com.craisinlord.antarchy.content.gravity.AntarchyGravityDirection; +import com.craisinlord.antarchy.content.gravity.AntarchyGravityTransition; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.DustParticleOptions; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.AABB; +import org.joml.Vector3f; +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(LivingEntity.class) +public abstract class AntimetalInversionMixin { + + private static final int ANTIMETAL_INVERTED_REFRESH_TICKS = 20; + + @Inject(method = "tick", at = @At("TAIL")) + private void antarchy$tickOverheadInversion(CallbackInfo ci) { + LivingEntity entity = (LivingEntity) (Object) this; + if (entity.level().isClientSide()) return; + if (entity instanceof Player player && player.isSpectator()) return; + if (!antarchy$isDirectlyBelowAntimetal(entity)) return; + + MobEffectInstance existing = entity.getEffect(AntarchyObjects.INVERTED_EFFECT.get()); + if (existing == null || existing.getDuration() <= 5) { + entity.addEffect(new MobEffectInstance(AntarchyObjects.INVERTED_EFFECT.get(), ANTIMETAL_INVERTED_REFRESH_TICKS, 0, false, false, false)); + antarchy$spawnInversionParticles(entity); + } + } + + private static boolean antarchy$isDirectlyBelowAntimetal(LivingEntity entity) { + AABB bounds = entity.getBoundingBox().deflate(1.0E-3D); + int minX = Mth.floor(bounds.minX); + int maxX = Mth.floor(bounds.maxX); + int minY = Mth.floor(bounds.minY); + int maxY = Mth.floor(bounds.maxY); + int minZ = Mth.floor(bounds.minZ); + int maxZ = Mth.floor(bounds.maxZ); + + for (int x = minX; x <= maxX; x++) { + for (int y = minY; y <= maxY; y++) { + for (int z = minZ; z <= maxZ; z++) { + BlockPos above = new BlockPos(x, y + 1, z); + if (entity.level().getBlockState(above).is(AntarchyObjects.ANTIMETAL.get()) + || entity.level().getBlockState(above).is(AntarchyObjects.POLISHED_ANTIMETAL.get())) { + return true; + } + } + } + } + return false; + } + + @Inject(method = "onEffectRemoved", at = @At("HEAD")) + private void antarchy$onInvertedRemoved(MobEffectInstance effectInstance, CallbackInfo ci) { + LivingEntity entity = (LivingEntity) (Object) this; + if (entity.level().isClientSide()) return; + if (effectInstance.getEffect() != AntarchyObjects.INVERTED_EFFECT.get()) return; + AntarchyGravityApi.setGravityDirection(entity, AntarchyGravityDirection.DOWN, new AntarchyGravityTransition(12)); + } + + private static void antarchy$spawnInversionParticles(LivingEntity entity) { + if (!(entity.level() instanceof ServerLevel serverLevel)) return; + double x = entity.getX(); + double y = entity.getBoundingBox().maxY + 0.1D; + double z = entity.getZ(); + serverLevel.sendParticles( + new DustParticleOptions(new Vector3f(1.0F, 0.1F, 0.1F), 1.0F), + x, y, z, 6, 0.2D, 0.05D, 0.2D, 0.0D + ); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/AntiwaterItemEntityMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/AntiwaterItemEntityMixin.java new file mode 100644 index 00000000..44148469 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/AntiwaterItemEntityMixin.java @@ -0,0 +1,50 @@ +package com.craisinlord.antarchy.fabric.mixin; + +import com.craisinlord.antarchy.content.fluid.AntarchyFluidChecks; +import com.craisinlord.antarchy.fabric.util.CustomFluidPhysicsChecks; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.phys.Vec3; +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(ItemEntity.class) +public abstract class AntiwaterItemEntityMixin { + @Inject(method = "tick", at = @At("TAIL")) + private void antarchy$applyAntiwaterItemMovement(CallbackInfo ci) { + ItemEntity entity = (ItemEntity) (Object) this; + if (!antarchy$isTouchingAntiwater(entity)) { + return; + } + + Vec3 motion = entity.getDeltaMovement(); + Vec3 antiwaterFlow = CustomFluidPhysicsChecks.getAntiwaterFlow(entity); + Vec3 push = antiwaterFlow.lengthSqr() > 1.0E-6D ? antiwaterFlow.normalize().scale(0.02D) : Vec3.ZERO; + entity.setDeltaMovement( + motion.x * 0.99D + push.x, + motion.y * 0.8D + 0.025D + push.y, + motion.z * 0.99D + push.z + ); + } + + private boolean antarchy$isTouchingAntiwater(ItemEntity entity) { + BlockPos min = BlockPos.containing(entity.getBoundingBox().minX, entity.getBoundingBox().minY, entity.getBoundingBox().minZ); + BlockPos max = BlockPos.containing(entity.getBoundingBox().maxX, entity.getBoundingBox().maxY, entity.getBoundingBox().maxZ); + BlockPos.MutableBlockPos cursor = new BlockPos.MutableBlockPos(); + for (int x = min.getX(); x <= max.getX(); x++) { + for (int y = min.getY(); y <= max.getY(); y++) { + for (int z = min.getZ(); z <= max.getZ(); z++) { + cursor.set(x, y, z); + FluidState fluidState = entity.level().getFluidState(cursor); + if (AntarchyFluidChecks.isAntiwater(fluidState)) { + return true; + } + } + } + } + return false; + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/AntiwaterLivingEntityMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/AntiwaterLivingEntityMixin.java new file mode 100644 index 00000000..b5229227 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/AntiwaterLivingEntityMixin.java @@ -0,0 +1,110 @@ +package com.craisinlord.antarchy.fabric.mixin; + +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.fluid.AntarchyFluidChecks; +import com.craisinlord.antarchy.content.gravity.AntarchyGravityApi; +import com.craisinlord.antarchy.content.gravity.AntarchyGravityDirection; +import com.craisinlord.antarchy.content.gravity.AntarchyGravityRotationUtil; +import com.craisinlord.antarchy.fabric.util.CustomFluidPhysicsChecks; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MoverType; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +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(LivingEntity.class) +public abstract class AntiwaterLivingEntityMixin { + @Inject(method = "travel", at = @At("HEAD"), cancellable = true) + private void antarchy$moveInAntiwater(Vec3 travelVector, CallbackInfo ci) { + LivingEntity entity = (LivingEntity) (Object) this; + if (!antarchy$isTouchingAntiwaterLocal(entity)) { + return; + } + + double prevY = entity.getY(); + float swimSpeed = entity.isSprinting() ? 0.026F : 0.02F; + entity.moveRelative(swimSpeed, travelVector); + entity.move(MoverType.SELF, entity.getDeltaMovement()); + + Vec3 motion = entity.getDeltaMovement(); + double verticalInput = travelVector.y; + if (verticalInput == 0.0D && entity instanceof Player player) { + verticalInput = player.isShiftKeyDown() ? -1.0D : ((LivingEntityJumpingAccessor) entity).antarchy$isJumping() ? 1.0D : 0.0D; + } + + if (entity.horizontalCollision && entity.onClimbable()) { + motion = new Vec3(motion.x, 0.2D, motion.z); + } + + AntarchyGravityDirection gravityDirection = antarchy$getEffectiveGravityDirection(entity); + Vec3 worldMotion = gravityDirection.isInverted() + ? AntarchyGravityRotationUtil.vecPlayerToWorld(motion, gravityDirection) + : motion; + + double drag = entity.isSwimming() ? 0.9D : 0.8D; + worldMotion = worldMotion.scale(drag); + Vec3 antiwaterFlow = CustomFluidPhysicsChecks.getAntiwaterFlow(entity); + if (antiwaterFlow.lengthSqr() > 1.0E-6D) { + worldMotion = worldMotion.add(antiwaterFlow.normalize().scale(0.02D)); + } + boolean flying = entity instanceof Player player && player.getAbilities().flying; + if (!flying) { + worldMotion = worldMotion.add(0.0D, 0.005D + verticalInput * 0.04D, 0.0D); + } + + entity.setDeltaMovement( + gravityDirection.isInverted() + ? AntarchyGravityRotationUtil.vecWorldToPlayer(worldMotion, gravityDirection) + : worldMotion + ); + + if (entity.horizontalCollision && entity.isFree( + worldMotion.x, + worldMotion.y + 0.6D - entity.getY() + prevY, + worldMotion.z + )) { + Vec3 boostedWorldMotion = new Vec3(worldMotion.x, 0.3D, worldMotion.z); + entity.setDeltaMovement( + gravityDirection.isInverted() + ? AntarchyGravityRotationUtil.vecWorldToPlayer(boostedWorldMotion, gravityDirection) + : boostedWorldMotion + ); + } + + ci.cancel(); + } + + private AntarchyGravityDirection antarchy$getEffectiveGravityDirection(LivingEntity entity) { + AntarchyGravityDirection gravityDirection = AntarchyGravityApi.getGravityDirection(entity); + if (gravityDirection.isInverted() || !entity.hasEffect(AntarchyObjects.INVERTED_EFFECT.get())) { + return gravityDirection; + } + + return AntarchyGravityDirection.UP; + } + + private boolean antarchy$isTouchingAntiwaterLocal(LivingEntity entity) { + AABB box = entity.getBoundingBox().inflate(0.05D); + BlockPos min = BlockPos.containing(box.minX, box.minY, box.minZ); + BlockPos max = BlockPos.containing(box.maxX, box.maxY, box.maxZ); + BlockPos.MutableBlockPos cursor = new BlockPos.MutableBlockPos(); + for (int x = min.getX(); x <= max.getX(); x++) { + for (int y = min.getY(); y <= max.getY(); y++) { + for (int z = min.getZ(); z <= max.getZ(); z++) { + cursor.set(x, y, z); + FluidState fluidState = entity.level().getFluidState(cursor); + if (AntarchyFluidChecks.isAntiwater(fluidState)) { + return true; + } + } + } + } + return false; + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/BloodglassEffectMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/BloodglassEffectMixin.java new file mode 100644 index 00000000..5ff4f9ca --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/BloodglassEffectMixin.java @@ -0,0 +1,33 @@ +package com.craisinlord.antarchy.fabric.mixin; + +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.fabric.BloodglassManager; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import org.jetbrains.annotations.Nullable; +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(LivingEntity.class) +public abstract class BloodglassEffectMixin { + + @Inject(method = "onEffectAdded", at = @At("TAIL")) + private void antarchy$onBloodglassWardAdded(MobEffectInstance effectInstance, @Nullable Entity source, CallbackInfo ci) { + LivingEntity entity = (LivingEntity) (Object) this; + if (effectInstance.getEffect() != AntarchyObjects.BLOODGLASS_WARD.get()) return; + if (!(entity instanceof Player player)) return; + BloodglassManager.handleWardApplied(player, effectInstance.getAmplifier()); + } + + @Inject(method = "onEffectRemoved", at = @At("HEAD")) + private void antarchy$onBloodglassWardRemoved(MobEffectInstance effectInstance, CallbackInfo ci) { + LivingEntity entity = (LivingEntity) (Object) this; + if (effectInstance.getEffect() != AntarchyObjects.BLOODGLASS_WARD.get()) return; + if (!(entity instanceof Player player)) return; + BloodglassManager.handleWardRemoved(player); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/BloodglassEquipMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/BloodglassEquipMixin.java new file mode 100644 index 00000000..1557dbca --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/BloodglassEquipMixin.java @@ -0,0 +1,23 @@ +package com.craisinlord.antarchy.fabric.mixin; + +import com.craisinlord.antarchy.fabric.BloodglassManager; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +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(LivingEntity.class) +public abstract class BloodglassEquipMixin { + + @Inject(method = "onEquipItem", at = @At("TAIL")) + private void antarchy$onBloodglassEquip(EquipmentSlot slot, ItemStack from, ItemStack to, CallbackInfo ci) { + LivingEntity entity = (LivingEntity) (Object) this; + if (entity instanceof Player player) { + BloodglassManager.handleArmorEquipChange(player, slot, from, to); + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/BloodglassRespawnMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/BloodglassRespawnMixin.java new file mode 100644 index 00000000..ab8de3bd --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/BloodglassRespawnMixin.java @@ -0,0 +1,17 @@ +package com.craisinlord.antarchy.fabric.mixin; + +import com.craisinlord.antarchy.fabric.BloodglassManager; +import net.minecraft.server.level.ServerPlayer; +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(ServerPlayer.class) +public abstract class BloodglassRespawnMixin { + + @Inject(method = "restoreFrom", at = @At("TAIL")) + private void antarchy$onRespawn(ServerPlayer oldPlayer, boolean keepEverything, CallbackInfo ci) { + BloodglassManager.handleRespawn((ServerPlayer) (Object) this); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/DreamCampfireBlockEntityMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/DreamCampfireBlockEntityMixin.java new file mode 100644 index 00000000..103d3547 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/DreamCampfireBlockEntityMixin.java @@ -0,0 +1,29 @@ +package com.craisinlord.antarchy.fabric.mixin; + +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.block.entity.DreamCampfireBlockEntity; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.entity.CampfireBlockEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +@Mixin(CampfireBlockEntity.class) +public abstract class DreamCampfireBlockEntityMixin { + @ModifyArg( + method = "", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/level/block/entity/BlockEntity;(Lnet/minecraft/world/level/block/entity/BlockEntityType;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)V" + ), + index = 0 + ) + private static BlockEntityType antarchy$useDreamCampfireType( + BlockEntityType original + ) { + return DreamCampfireBlockEntity.isConstructingDreamCampfire() + ? AntarchyObjects.DREAM_CAMPFIRE_BLOCK_ENTITY.get() + : original; + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/DreamSandMovementMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/DreamSandMovementMixin.java new file mode 100644 index 00000000..17c6896a --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/DreamSandMovementMixin.java @@ -0,0 +1,113 @@ +package com.craisinlord.antarchy.fabric.mixin; + +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.AntarchyTags; +import com.craisinlord.antarchy.content.movement.DreamSandLowGravityAccess; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricBlocks; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.LivingEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(LivingEntity.class) +public abstract class DreamSandMovementMixin { + @Inject(method = "jumpFromGround", at = @At("TAIL")) + private void antarchy$handleDreamSandJump(CallbackInfo ci) { + LivingEntity self = (LivingEntity) (Object) this; + if (self.level().isClientSide()) return; + + DreamSandLowGravityAccess access = (DreamSandLowGravityAccess) self; + if (!AntarchySettings.dreamSandEnabled() || antarchy$isDreamSandLowGravityBlacklisted(self)) { + access.antarchy$clearDreamSandLowGravity(); + } else if (antarchy$isStandingOnDreamSand(self)) { + antarchy$startDreamSandLowGravity(self, access); + } + } + + @Inject(method = "tick", at = @At("TAIL")) + private void antarchy$tickDreamSandLowGravity(CallbackInfo ci) { + LivingEntity self = (LivingEntity) (Object) this; + if (self.level().isClientSide()) return; + + DreamSandLowGravityAccess access = (DreamSandLowGravityAccess) self; + int landingGraceTicks = access.antarchy$getDreamSandLandingGraceTicks(); + if (landingGraceTicks > 0) { + access.antarchy$setDreamSandLandingGraceTicks(landingGraceTicks - 1); + } + + if (!AntarchySettings.dreamSandEnabled() || antarchy$isDreamSandLowGravityBlacklisted(self)) { + return; + } + + if (!access.antarchy$isDreamSandLowGravityActive() + && !self.onGround() + && antarchy$isStandingOnDreamSand(self)) { + antarchy$startDreamSandLowGravity(self, access); + } + + if (!access.antarchy$isDreamSandLowGravityActive()) { + return; + } + + int remainingTicks = access.antarchy$getDreamSandLowGravityTicksRemaining(); + if (remainingTicks > 0) { + access.antarchy$setDreamSandLowGravityTicksRemaining(remainingTicks - 1); + } + if (access.antarchy$getDreamSandLowGravityTicksRemaining() <= 0) { + access.antarchy$clearDreamSandLowGravity(); + return; + } + + if (antarchy$isOnSolidGround(self)) { + access.antarchy$setDreamSandLowGravityActive(false); + access.antarchy$setDreamSandLowGravityTicksRemaining(0); + access.antarchy$setDreamSandLandingGraceTicks(2); + } else if (!self.onGround() && self.getDeltaMovement().y < 0.0D) { + self.setDeltaMovement( + self.getDeltaMovement().x, + self.getDeltaMovement().y * AntarchySettings.dreamSandGravityMultiplier(), + self.getDeltaMovement().z + ); + } + } + + @Inject(method = "causeFallDamage", at = @At("HEAD"), cancellable = true) + private void antarchy$handleDreamSandFall(float fallDistance, float multiplier, DamageSource source, CallbackInfoReturnable cir) { + LivingEntity self = (LivingEntity) (Object) this; + DreamSandLowGravityAccess access = (DreamSandLowGravityAccess) self; + if (!AntarchySettings.dreamSandEnabled() + || antarchy$isDreamSandLowGravityBlacklisted(self) + || (!access.antarchy$isDreamSandLowGravityActive() && access.antarchy$getDreamSandLandingGraceTicks() <= 0)) { + return; + } + + self.resetFallDistance(); + cir.setReturnValue(false); + } + + private static boolean antarchy$isOnSolidGround(LivingEntity livingEntity) { + return livingEntity.onGround() && livingEntity.getBlockStateOn().blocksMotion(); + } + + private static boolean antarchy$isStandingOnDreamSand(LivingEntity livingEntity) { + return livingEntity.getBlockStateOn().is(AntarchyFabricBlocks.DREAM_SAND.get()); + } + + private static void antarchy$startDreamSandLowGravity(LivingEntity self, DreamSandLowGravityAccess access) { + self.setDeltaMovement( + self.getDeltaMovement().x, + self.getDeltaMovement().y * AntarchySettings.dreamSandJumpVelocityMultiplier(), + self.getDeltaMovement().z + ); + access.antarchy$setDreamSandLowGravityActive(true); + access.antarchy$setDreamSandLowGravityTicksRemaining((int) Math.max(1L, Math.round(AntarchySettings.dreamSandEffectDurationSeconds() * 20.0D))); + access.antarchy$setDreamSandLandingGraceTicks(0); + } + + private static boolean antarchy$isDreamSandLowGravityBlacklisted(LivingEntity livingEntity) { + return livingEntity.getType().is(AntarchyTags.Entities.DREAM_SAND_LOW_GRAVITY_BLACKLIST); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/ElytraFallFlyingMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/ElytraFallFlyingMixin.java new file mode 100644 index 00000000..5239a901 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/ElytraFallFlyingMixin.java @@ -0,0 +1,27 @@ +package com.craisinlord.antarchy.fabric.mixin; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ElytraItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(LivingEntity.class) +public abstract class ElytraFallFlyingMixin { + + /** + * Redirect to allow any ElytraItem subclass to sustain fall flying. + */ + @Redirect( + method = "updateFallFlying", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/item/ItemStack;is(Lnet/minecraft/world/item/Item;)Z" + ) + ) + private boolean antarchy$allowCustomElytraFallFlying(ItemStack itemStack, Item item) { + return itemStack.getItem() instanceof ElytraItem; + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/ElytraStartFlyingMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/ElytraStartFlyingMixin.java new file mode 100644 index 00000000..25421931 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/ElytraStartFlyingMixin.java @@ -0,0 +1,32 @@ +package com.craisinlord.antarchy.fabric.mixin; + +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ElytraItem; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(Player.class) +public abstract class ElytraStartFlyingMixin { + + @Shadow + public abstract void startFallFlying(); + + @Inject(method = "tryToStartFallFlying()Z", at = @At("RETURN"), cancellable = true) + private void antarchy$allowCustomElytra(CallbackInfoReturnable cir) { + if (cir.getReturnValue()) return; + Player player = (Player) (Object) this; + if (!player.onGround() && !player.isFallFlying() && !player.isInWater() + && !player.hasEffect(net.minecraft.world.effect.MobEffects.LEVITATION)) { + ItemStack chest = player.getItemBySlot(EquipmentSlot.CHEST); + if (chest.getItem() instanceof ElytraItem && ElytraItem.isFlyEnabled(chest)) { + this.startFallFlying(); + cir.setReturnValue(true); + } + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/JumpyBootsFallDamageMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/JumpyBootsFallDamageMixin.java new file mode 100644 index 00000000..3d4fbfcf --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/JumpyBootsFallDamageMixin.java @@ -0,0 +1,46 @@ +package com.craisinlord.antarchy.fabric.mixin; + +import com.craisinlord.antarchy.content.gravity.AntarchyGravityApi; +import com.craisinlord.antarchy.content.item.BloodCrystalArmorItem; +import com.craisinlord.antarchy.content.item.JumpyBootsItem; +import com.craisinlord.antarchy.fabric.util.JumpyBootsFabricHelper; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +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.ModifyVariable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(LivingEntity.class) +public abstract class JumpyBootsFallDamageMixin { + @Inject(method = "causeFallDamage", at = @At("HEAD"), cancellable = true) + private void antarchy$cancelBloodCrystalBootsInvertedFallDamage(float fallDistance, float multiplier, DamageSource source, CallbackInfoReturnable cir) { + LivingEntity self = (LivingEntity) (Object) this; + if (!(self instanceof Player player)) { + return; + } + if (!AntarchyGravityApi.isGravityInverted(player)) { + return; + } + if (!(player.getItemBySlot(EquipmentSlot.FEET).getItem() instanceof BloodCrystalArmorItem)) { + return; + } + + player.fallDistance = 0.0F; + cir.setReturnValue(false); + } + + @ModifyVariable(method = "causeFallDamage", at = @At("HEAD"), ordinal = 0, argsOnly = true) + private float antarchy$reduceJumpyBootsFallDamage(float fallDistance) { + LivingEntity self = (LivingEntity) (Object) this; + if (!JumpyBootsItem.isWearingJumpyBoots(self)) return fallDistance; + long protectionUntil = JumpyBootsFabricHelper.getProtectionUntil(self); + if (self.level().getGameTime() < protectionUntil) { + return fallDistance * 0.25F; + } + return fallDistance; + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/LivingEntityJumpingAccessor.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/LivingEntityJumpingAccessor.java new file mode 100644 index 00000000..0414928c --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/LivingEntityJumpingAccessor.java @@ -0,0 +1,11 @@ +package com.craisinlord.antarchy.fabric.mixin; + +import net.minecraft.world.entity.LivingEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(LivingEntity.class) +public interface LivingEntityJumpingAccessor { + @Accessor("jumping") + boolean antarchy$isJumping(); +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/WaterlikeFluidItemEntityMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/WaterlikeFluidItemEntityMixin.java new file mode 100644 index 00000000..ef635f22 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/WaterlikeFluidItemEntityMixin.java @@ -0,0 +1,29 @@ +package com.craisinlord.antarchy.fabric.mixin; + +import com.craisinlord.antarchy.fabric.util.CustomFluidPhysicsChecks; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.phys.Vec3; +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(value = ItemEntity.class, priority = 900) +public abstract class WaterlikeFluidItemEntityMixin { + @Inject(method = "tick", at = @At("TAIL")) + private void antarchy$applyWaterlikeFluidItemMovement(CallbackInfo ci) { + ItemEntity entity = (ItemEntity) (Object) this; + if (CustomFluidPhysicsChecks.isTouchingAntiwater(entity) || !CustomFluidPhysicsChecks.isTouchingWaterlikeFluid(entity)) { + return; + } + + Vec3 motion = entity.getDeltaMovement(); + Vec3 fluidFlow = CustomFluidPhysicsChecks.getWaterlikeFlow(entity); + Vec3 push = fluidFlow.lengthSqr() > 1.0E-6D ? fluidFlow.normalize().scale(0.03D) : Vec3.ZERO; + entity.setDeltaMovement( + motion.x * 0.99D + push.x, + motion.y + (motion.y < 0.06D ? 5.0E-4D : 0.0D) + push.y, + motion.z * 0.99D + push.z + ); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/WaterlikeFluidLivingEntityMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/WaterlikeFluidLivingEntityMixin.java new file mode 100644 index 00000000..c87a514a --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/WaterlikeFluidLivingEntityMixin.java @@ -0,0 +1,64 @@ +package com.craisinlord.antarchy.fabric.mixin; + +import com.craisinlord.antarchy.fabric.util.CustomFluidPhysicsChecks; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MoverType; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.Vec3; +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(value = LivingEntity.class, priority = 900) +public abstract class WaterlikeFluidLivingEntityMixin { + @Inject(method = "travel", at = @At("HEAD"), cancellable = true) + private void antarchy$moveInCustomWaterlikeFluid(Vec3 travelVector, CallbackInfo ci) { + LivingEntity entity = (LivingEntity) (Object) this; + if (CustomFluidPhysicsChecks.isTouchingAntiwater(entity) || !CustomFluidPhysicsChecks.isTouchingWaterlikeFluid(entity)) { + return; + } + + double prevY = entity.getY(); + float swimSpeed = entity.isSprinting() ? 0.024F : 0.02F; + entity.moveRelative(swimSpeed, travelVector); + entity.move(MoverType.SELF, entity.getDeltaMovement()); + + Vec3 motion = entity.getDeltaMovement(); + double verticalInput = travelVector.y; + if (verticalInput == 0.0D && entity instanceof Player player) { + verticalInput = player.isShiftKeyDown() ? -1.0D : ((LivingEntityJumpingAccessor) entity).antarchy$isJumping() ? 1.0D : 0.0D; + } + + if (entity.horizontalCollision && entity.onClimbable()) { + motion = new Vec3(motion.x, 0.2D, motion.z); + } + + boolean flying = entity instanceof Player player && player.getAbilities().flying; + double verticalDrift = verticalInput * 0.04D; + if (!flying) { + verticalDrift -= 0.004D; + } + + Vec3 nextMotion = new Vec3( + motion.x * 0.8D, + motion.y * 0.8D + verticalDrift, + motion.z * 0.8D + ); + Vec3 fluidFlow = CustomFluidPhysicsChecks.getWaterlikeFlow(entity); + if (fluidFlow.lengthSqr() > 1.0E-6D) { + nextMotion = nextMotion.add(fluidFlow.normalize().scale(0.014D)); + } + entity.setDeltaMovement(nextMotion); + + if (entity.horizontalCollision && entity.isFree( + nextMotion.x, + nextMotion.y + 0.6D - entity.getY() + prevY, + nextMotion.z + )) { + entity.setDeltaMovement(nextMotion.x, 0.3D, nextMotion.z); + } + + ci.cancel(); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/WoodTypeInvoker.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/WoodTypeInvoker.java new file mode 100644 index 00000000..9b7ff6c3 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/WoodTypeInvoker.java @@ -0,0 +1,13 @@ +package com.craisinlord.antarchy.fabric.mixin; + +import net.minecraft.world.level.block.state.properties.WoodType; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(WoodType.class) +public interface WoodTypeInvoker { + @Invoker("register") + static WoodType antarchy$register(WoodType woodType) { + throw new AssertionError(); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/BloodglassChatOrderMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/BloodglassChatOrderMixin.java new file mode 100644 index 00000000..9d3ffecc --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/BloodglassChatOrderMixin.java @@ -0,0 +1,17 @@ +package com.craisinlord.antarchy.fabric.mixin.client; + +import com.craisinlord.antarchy.fabric.client.BloodglassHudRenderer; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.GuiGraphics; +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(Gui.class) +public abstract class BloodglassChatOrderMixin { + @Inject(method = "render", at = @At("HEAD")) + private void antarchy$renderBloodglassBeforeChat(GuiGraphics guiGraphics, float partialTick, CallbackInfo ci) { + BloodglassHudRenderer.render(guiGraphics); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/BrutalflyElytraExperienceBarMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/BrutalflyElytraExperienceBarMixin.java new file mode 100644 index 00000000..e052c9bd --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/BrutalflyElytraExperienceBarMixin.java @@ -0,0 +1,21 @@ +package com.craisinlord.antarchy.fabric.mixin.client; + +import com.craisinlord.antarchy.content.item.BrutalflyElytraItem; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.player.LocalPlayer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(Gui.class) +public abstract class BrutalflyElytraExperienceBarMixin { + @Inject(method = "isExperienceBarVisible", at = @At("RETURN"), cancellable = true) + private void antarchy$hideExperienceBarForBrutalfly(CallbackInfoReturnable cir) { + LocalPlayer player = Minecraft.getInstance().player; + if (player != null && BrutalflyElytraItem.isWearingBrutalflyElytra(player) && player.isFallFlying()) { + cir.setReturnValue(false); + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/CameraShakeMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/CameraShakeMixin.java new file mode 100644 index 00000000..212cc276 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/CameraShakeMixin.java @@ -0,0 +1,50 @@ +package com.craisinlord.antarchy.fabric.mixin.client; + +import com.craisinlord.antarchy.content.client.CameraShakeClientState; +import com.craisinlord.antarchy.content.client.HerculesBeetleImpactShakeClientState; +import com.craisinlord.antarchy.content.item.BigBerthaItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.Minecraft; +import net.minecraft.util.Mth; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.client.renderer.GameRenderer; + +@Mixin(GameRenderer.class) +public abstract class CameraShakeMixin { + private static final int TORETERROR_SHAKE_TICKS = 25; + + @Shadow @Final private Minecraft minecraft; + + @Inject(method = "bobView", at = @At("TAIL")) + private void applyCameraShake(PoseStack poseStack, float partialTick, CallbackInfo ci) { + if (minecraft.level == null || minecraft.player == null) { + CameraShakeClientState.clear(); + return; + } + + float shakeStrength = CameraShakeClientState.getStrength(minecraft.gameRenderer.getMainCamera().getPosition()); + + int beetleShakeTicks = HerculesBeetleImpactShakeClientState.getTicks(); + if (beetleShakeTicks > 0) { + shakeStrength += (float) beetleShakeTicks / TORETERROR_SHAKE_TICKS * 2.0F; + } + + int bigBerthaShakeTicks = BigBerthaItem.clientShakeTicks; + if (bigBerthaShakeTicks > 0) { + shakeStrength += (float) bigBerthaShakeTicks / TORETERROR_SHAKE_TICKS * 2.0F; + } + + if (shakeStrength <= 0.0F) return; + + float time = (float) (minecraft.player.tickCount + partialTick); + poseStack.mulPose(Axis.YP.rotationDegrees(Mth.sin(time * 1.5F) * shakeStrength * 2.5F)); + poseStack.mulPose(Axis.XP.rotationDegrees(Mth.cos(time * 1.8F) * shakeStrength * 2.0F)); + poseStack.mulPose(Axis.ZP.rotationDegrees(Mth.sin(time * 2.2F) * shakeStrength * 1.5F)); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/CrossbowArmPoseMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/CrossbowArmPoseMixin.java new file mode 100644 index 00000000..573165a4 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/CrossbowArmPoseMixin.java @@ -0,0 +1,37 @@ +package com.craisinlord.antarchy.fabric.mixin.client; + +import com.craisinlord.antarchy.content.item.GravityGunItem; +import com.craisinlord.antarchy.content.item.RpoLauncherItem; +import com.craisinlord.antarchy.content.item.SizeRayItem; +import com.craisinlord.antarchy.content.item.SquidzookaItem; +import com.craisinlord.antarchy.content.item.WaterCannonItem; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(PlayerRenderer.class) +public class CrossbowArmPoseMixin { + + @Inject(method = "getArmPose", at = @At("RETURN"), cancellable = true) + private static void antarchy$customArmPose( + AbstractClientPlayer player, InteractionHand hand, + CallbackInfoReturnable cir) { + ItemStack stack = player.getItemInHand(hand); + Item item = stack.getItem(); + + if (item instanceof GravityGunItem || item instanceof SquidzookaItem || item instanceof RpoLauncherItem || item instanceof WaterCannonItem) { + cir.setReturnValue(HumanoidModel.ArmPose.CROSSBOW_HOLD); + } else if (item instanceof SizeRayItem) { + if (player.isUsingItem() && player.getUsedItemHand() == hand) { + cir.setReturnValue(HumanoidModel.ArmPose.CROSSBOW_HOLD); + } + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/DuctTapeInputMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/DuctTapeInputMixin.java new file mode 100644 index 00000000..5aa823ad --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/DuctTapeInputMixin.java @@ -0,0 +1,30 @@ +package com.craisinlord.antarchy.fabric.mixin.client; + +import com.craisinlord.antarchy.content.block.DuctTapeBlock; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.Input; +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(Input.class) +public abstract class DuctTapeInputMixin { + + @Inject(method = "tick", at = @At("RETURN")) + private void blockInputInDuctTape(boolean isSneaking, float slowFactor, CallbackInfo ci) { + Minecraft mc = Minecraft.getInstance(); + if (mc.player == null || mc.level == null) return; + if (!mc.player.isNoGravity() && !DuctTapeBlock.isTouchingTape(mc.level, mc.player)) return; + + Input self = (Input) (Object) this; + self.left = false; + self.right = false; + self.up = false; + self.down = false; + self.leftImpulse = 0.0F; + self.forwardImpulse = 0.0F; + self.jumping = false; + self.shiftKeyDown = false; + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/GravityGunMouseScrollMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/GravityGunMouseScrollMixin.java new file mode 100644 index 00000000..4415c1b1 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/GravityGunMouseScrollMixin.java @@ -0,0 +1,18 @@ +package com.craisinlord.antarchy.fabric.mixin.client; + +import com.craisinlord.antarchy.fabric.client.GravityGunClientHandler; +import net.minecraft.client.MouseHandler; +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(MouseHandler.class) +public abstract class GravityGunMouseScrollMixin { + @Inject(method = "onScroll", at = @At("HEAD"), cancellable = true) + private void antarchy$handleGravityGunScroll(long window, double horizontalAmount, double verticalAmount, CallbackInfo ci) { + if (GravityGunClientHandler.onScroll(verticalAmount)) { + ci.cancel(); + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/KeybindingConflictFixMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/KeybindingConflictFixMixin.java new file mode 100644 index 00000000..c9e59b6f --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/KeybindingConflictFixMixin.java @@ -0,0 +1,68 @@ +package com.craisinlord.antarchy.fabric.mixin.client; + +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.fabric.client.KeybindingConflictFixStore; +import com.mojang.blaze3d.platform.InputConstants; +import java.util.Map; +import net.minecraft.client.KeyMapping; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(KeyMapping.class) +public abstract class KeybindingConflictFixMixin { + @Shadow @Final private static Map MAP; + @Shadow @Final private static Map ALL; + @Shadow private InputConstants.Key key; + @Shadow private boolean isDown; + @Shadow private int clickCount; + + @Inject(method = "(Ljava/lang/String;Lcom/mojang/blaze3d/platform/InputConstants$Type;ILjava/lang/String;)V", at = @At("TAIL")) + private void antarchy$addInitialMapping(String name, InputConstants.Type type, int key, String category, CallbackInfo ci) { + KeybindingConflictFixStore.add(this.key, (KeyMapping) (Object) this); + } + + @Inject(method = "resetMapping", at = @At("TAIL")) + private static void antarchy$rebuildMappings(CallbackInfo ci) { + KeybindingConflictFixStore.clear(); + for (KeyMapping mapping : ALL.values()) { + KeybindingConflictFixStore.add(((KeybindingConflictFixMixin) (Object) mapping).key, mapping); + } + } + + @Inject(method = "click", at = @At("TAIL")) + private static void antarchy$clickConflicts(InputConstants.Key key, CallbackInfo ci) { + if (!AntarchySettings.fabricKeybindingConflictFixEnabled()) { + return; + } + KeyMapping active = MAP.get(key); + for (KeyMapping mapping : KeybindingConflictFixStore.others(key, active)) { + ((KeybindingConflictFixMixin) (Object) mapping).antarchy$click(); + } + } + + @Inject(method = "set", at = @At("TAIL")) + private static void antarchy$setConflicts(InputConstants.Key key, boolean down, CallbackInfo ci) { + if (!AntarchySettings.fabricKeybindingConflictFixEnabled()) { + return; + } + KeyMapping active = MAP.get(key); + for (KeyMapping mapping : KeybindingConflictFixStore.others(key, active)) { + ((KeybindingConflictFixMixin) (Object) mapping).antarchy$setDown(down); + } + } + + @Unique + private void antarchy$click() { + this.clickCount++; + } + + @Unique + private void antarchy$setDown(boolean down) { + this.isDown = down; + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/LiquidFogMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/LiquidFogMixin.java new file mode 100644 index 00000000..7080bafd --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/LiquidFogMixin.java @@ -0,0 +1,89 @@ +package com.craisinlord.antarchy.fabric.mixin.client; + +import com.craisinlord.antarchy.content.fluid.BileLiquidBlock; +import com.craisinlord.antarchy.content.fluid.AntarchyFluidChecks; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.shaders.FogShape; +import net.minecraft.client.Camera; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.FogRenderer; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.material.FluidState; +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(FogRenderer.class) +public abstract class LiquidFogMixin { + private static final int FLUID_NONE = 0; + private static final int FLUID_BILE = 1; + private static final int FLUID_ANTIWATER = 2; + private static final int FLUID_ICHOR = 3; + private static final int FLUID_LUMEN = 4; + + @Inject(method = "setupColor", at = @At("TAIL")) + private static void antarchy$overrideBileColor(Camera camera, float partialTick, ClientLevel level, int renderDistance, float darkenWorldAmount, CallbackInfo ci) { + int fluidKind = antarchy$getFluidKind(camera); + if (fluidKind == FLUID_NONE) { + return; + } + + if (fluidKind == FLUID_BILE) { + RenderSystem.clearColor(0.52F, 0.58F, 0.08F, 0.0F); + } else if (fluidKind == FLUID_ANTIWATER) { + RenderSystem.clearColor(0.48F, 0.06F, 0.06F, 0.0F); + } else if (fluidKind == FLUID_ICHOR) { + RenderSystem.clearColor(0.18F, 0.01F, 0.02F, 0.0F); + } else if (fluidKind == FLUID_LUMEN) { + RenderSystem.clearColor(0.42F, 0.82F, 1.0F, 0.0F); + } + } + + @Inject(method = "setupFog", at = @At("TAIL")) + private static void antarchy$overrideBileFog(Camera camera, FogRenderer.FogMode mode, float renderDistance, boolean thickFog, float partialTick, CallbackInfo ci) { + int fluidKind = antarchy$getFluidKind(camera); + if (fluidKind == FLUID_NONE) { + return; + } + + if (fluidKind == FLUID_BILE) { + RenderSystem.setShaderFogStart(0.2F); + RenderSystem.setShaderFogEnd(Math.min(renderDistance, 4.5F)); + } else if (fluidKind == FLUID_ANTIWATER) { + RenderSystem.setShaderFogStart(0.18F); + RenderSystem.setShaderFogEnd(Math.min(renderDistance, 3.5F)); + } else if (fluidKind == FLUID_ICHOR) { + RenderSystem.setShaderFogStart(0.08F); + RenderSystem.setShaderFogEnd(Math.min(renderDistance, 2.25F)); + } else if (fluidKind == FLUID_LUMEN) { + RenderSystem.setShaderFogStart(0.3F); + RenderSystem.setShaderFogEnd(Math.min(renderDistance, 6.0F)); + } + RenderSystem.setShaderFogShape(FogShape.CYLINDER); + } + + private static int antarchy$getFluidKind(Camera camera) { + Entity entity = camera.getEntity(); + if (entity == null || entity.level() == null) { + return FLUID_NONE; + } + + BlockPos pos = BlockPos.containing(camera.getPosition()); + FluidState fluidState = entity.level().getFluidState(pos); + if (BileLiquidBlock.isBile(fluidState)) { + return FLUID_BILE; + } + if (AntarchyFluidChecks.isAntiwater(fluidState)) { + return FLUID_ANTIWATER; + } + if (AntarchyFluidChecks.isIchor(fluidState)) { + return FLUID_ICHOR; + } + if (AntarchyFluidChecks.isLumen(fluidState)) { + return FLUID_LUMEN; + } + return FLUID_NONE; + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/MultipartClientSpawnMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/MultipartClientSpawnMixin.java new file mode 100644 index 00000000..e39b6ea7 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/MultipartClientSpawnMixin.java @@ -0,0 +1,20 @@ +package com.craisinlord.antarchy.fabric.mixin.client; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricEntities; + +import com.craisinlord.antarchy.fabric.AntarchyFabricContent; +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +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(ClientPacketListener.class) +public abstract class MultipartClientSpawnMixin { + @Inject(method = "handleAddEntity", at = @At("HEAD"), cancellable = true) + private void antarchy$skipTrackedMultipartPlaceholders(ClientboundAddEntityPacket packet, CallbackInfo ci) { + if (packet.getType() == AntarchyFabricEntities.KRAKEN_PART.get()) { + ci.cancel(); + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/MultipartEntityLevelRegistryMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/MultipartEntityLevelRegistryMixin.java new file mode 100644 index 00000000..1dc6ceaa --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/MultipartEntityLevelRegistryMixin.java @@ -0,0 +1,34 @@ +package com.craisinlord.antarchy.fabric.mixin.client; + +import com.craisinlord.antarchy.content.entity.multipart.MultipartEntityOwner; +import com.craisinlord.antarchy.fabric.client.multipart.MultipartClientPartLevelRegistry; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.entity.EntityInLevelCallback; +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(Entity.class) +public abstract class MultipartEntityLevelRegistryMixin { + @Inject(method = "setLevelCallback", at = @At("TAIL")) + private void antarchy$registerMultipartParts(EntityInLevelCallback entityInLevelCallback, CallbackInfo ci) { + Entity self = (Entity) (Object) this; + if (self instanceof MultipartEntityOwner owner + && entityInLevelCallback != EntityInLevelCallback.NULL + && self.level().isClientSide()) { + if (owner.antarchy$getMultipartParts() == null) { + owner.antarchy$spawnMultipartParts(); + } + MultipartClientPartLevelRegistry.register(owner); + } + } + + @Inject(method = "setRemoved", at = @At("HEAD")) + private void antarchy$unregisterMultipartParts(Entity.RemovalReason removalReason, CallbackInfo ci) { + Entity self = (Entity) (Object) this; + if (self instanceof MultipartEntityOwner owner && self.level().isClientSide()) { + MultipartClientPartLevelRegistry.unregister(owner); + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/entity/MultipartEntityLevelRegistryMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/entity/MultipartEntityLevelRegistryMixin.java new file mode 100644 index 00000000..a2f3c9dc --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/entity/MultipartEntityLevelRegistryMixin.java @@ -0,0 +1,37 @@ +package com.craisinlord.antarchy.fabric.mixin.entity; + +import com.craisinlord.antarchy.content.entity.multipart.MultipartEntityOwner; +import com.craisinlord.antarchy.fabric.entity.multipart.MultipartServerPartLevelRegistry; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.entity.EntityInLevelCallback; +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(Entity.class) +/* + * Keeps multipart child entities registered in Fabric levels. + */ +public abstract class MultipartEntityLevelRegistryMixin { + @Inject(method = "setLevelCallback", at = @At("TAIL")) + private void antarchy$registerMultipartParts(EntityInLevelCallback entityInLevelCallback, CallbackInfo ci) { + Entity self = (Entity) (Object) this; + if (self instanceof MultipartEntityOwner owner + && entityInLevelCallback != EntityInLevelCallback.NULL + && !self.level().isClientSide()) { + if (owner.antarchy$getMultipartParts() == null) { + owner.antarchy$spawnMultipartParts(); + } + MultipartServerPartLevelRegistry.register(owner); + } + } + + @Inject(method = "setRemoved", at = @At("HEAD")) + private void antarchy$unregisterMultipartParts(Entity.RemovalReason removalReason, CallbackInfo ci) { + Entity self = (Entity) (Object) this; + if (self instanceof MultipartEntityOwner owner && !self.level().isClientSide()) { + MultipartServerPartLevelRegistry.unregister(owner); + } + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/infinity/PortalCreatorMixin.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/infinity/PortalCreatorMixin.java new file mode 100644 index 00000000..65f0b82f --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/infinity/PortalCreatorMixin.java @@ -0,0 +1,39 @@ +package com.craisinlord.antarchy.fabric.mixin.infinity; + +import com.craisinlord.antarchy.config.AntarchySettings; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.lerariemann.infinity.util.teleport.PortalCreator; +import net.minecraft.server.level.ServerLevel; + +@Mixin(PortalCreator.class) +public interface PortalCreatorMixin { + @Inject( + method = "tryCreatePortalFromItem(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/entity/item/ItemEntity;)V", + at = @At("HEAD"), + cancellable = true + ) + private static void antarchy$blockInfinityBookActivation(ServerLevel level, BlockPos pos, ItemEntity itemEntity, CallbackInfo ci) { + if (!AntarchySettings.disableInfinityBookPortalCreation()) { + return; + } + + if (itemEntity.isRemoved()) { + return; + } + + ItemStack stack = itemEntity.getItem(); + if (!stack.is(Items.WRITABLE_BOOK) && !stack.is(Items.WRITTEN_BOOK)) { + return; + } + + ci.cancel(); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricClientNetworking.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricClientNetworking.java new file mode 100644 index 00000000..fc340d0a --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricClientNetworking.java @@ -0,0 +1,88 @@ +package com.craisinlord.antarchy.fabric.network; + +import com.craisinlord.antarchy.content.client.BloodglassClientState; +import com.craisinlord.antarchy.content.client.BrutalflyElytraClientState; +import com.craisinlord.antarchy.content.client.HordeClientState; +import com.craisinlord.antarchy.content.client.ScorpionWhipTetherClientState; +import com.craisinlord.antarchy.content.client.ThoraxisWeatherClientState; +import com.craisinlord.antarchy.content.entity.multipart.MultipartFramework; +import com.craisinlord.antarchy.content.entity.multipart.network.MultipartAttackPayload; +import com.craisinlord.antarchy.content.entity.multipart.network.MultipartInteractPayload; +import com.craisinlord.antarchy.content.network.*; +import com.craisinlord.antarchy.content.weather.ThoraxisWeatherKind; +import com.craisinlord.antarchy.fabric.client.BloodCrystalKatanaTrailClientState; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; +import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; + +public final class AntarchyFabricClientNetworking { + private AntarchyFabricClientNetworking() { + } + + public static void bootstrapMultipartClient() { + MultipartFramework.bootstrap( + AntarchyFabricNetworking::createMultipartPart, + new MultipartFramework.NetworkBridge() { + @Override + public void sendAttack(java.util.UUID parentId, int partIndex, float damage) { + sendToServer(new MultipartAttackPayload(parentId, partIndex, damage), MultipartAttackPayload.STREAM_CODEC, MultipartAttackPayload.TYPE); + } + + @Override + public void sendInteract(java.util.UUID parentId, int partIndex, int handId) { + sendToServer(new MultipartInteractPayload(parentId, partIndex, handId), MultipartInteractPayload.STREAM_CODEC, MultipartInteractPayload.TYPE); + } + } + ); + } + + public static void sendToServer( + T payload, + com.craisinlord.antarchy.compat.network.StreamCodec streamCodec, + com.craisinlord.antarchy.compat.network.CustomPacketPayload.Type type + ) { + FriendlyByteBuf buf = PacketByteBufs.create(); + streamCodec.encode(buf, payload); + ClientPlayNetworking.send(type.id(), buf); + } + + private static void registerReceiver( + com.craisinlord.antarchy.compat.network.CustomPacketPayload.Type type, + com.craisinlord.antarchy.compat.network.StreamCodec streamCodec, + java.util.function.Consumer handler + ) { + ClientPlayNetworking.registerGlobalReceiver(type.id(), (client, handlerConn, buf, sender) -> { + T payload = streamCodec.decode(buf); + client.execute(() -> handler.accept(payload)); + }); + } + + public static void register() { + registerReceiver(GravityStatePayload.TYPE, GravityStatePayload.STREAM_CODEC, payload -> + AntarchyFabricNetworking.handleGravityState(Minecraft.getInstance().player, payload)); + registerReceiver(BloodglassStatePayload.TYPE, BloodglassStatePayload.STREAM_CODEC, payload -> + BloodglassClientState.update(payload.shieldsActive(), payload.shieldsMax())); + registerReceiver(BloodCrystalKatanaTrailPayload.TYPE, BloodCrystalKatanaTrailPayload.STREAM_CODEC, payload -> + BloodCrystalKatanaTrailClientState.trigger(payload.entityId(), payload.durationTicks())); + registerReceiver(ScorpionWhipTetherPayload.TYPE, ScorpionWhipTetherPayload.STREAM_CODEC, payload -> + ScorpionWhipTetherClientState.update(payload.playerId(), payload.targetId())); + registerReceiver(BrutalflyElytraAnimationPayload.TYPE, BrutalflyElytraAnimationPayload.STREAM_CODEC, payload -> + BrutalflyElytraClientState.trigger(payload.entityId(), payload.durationTicks(), payload.strength())); + registerReceiver(ThoraxisWeatherPayload.TYPE, ThoraxisWeatherPayload.STREAM_CODEC, payload -> + ThoraxisWeatherClientState.apply( + new ResourceLocation(payload.dimensionId()), + ThoraxisWeatherKind.byId(payload.weatherId()), + payload.expiresAt(), + payload.anchorX(), + payload.anchorY(), + payload.anchorZ() + )); + registerReceiver(HerculesBeetleImpactShakePayload.TYPE, HerculesBeetleImpactShakePayload.STREAM_CODEC, payload -> + AntarchyFabricNetworking.triggerHerculesBeetleImpactShake(payload.durationTicks())); + registerReceiver(ImpactShakePayload.TYPE, ImpactShakePayload.STREAM_CODEC, AntarchyFabricNetworking::triggerImpactShake); + registerReceiver(HordeIntensityPayload.TYPE, HordeIntensityPayload.STREAM_CODEC, payload -> + HordeClientState.update(payload.intensity())); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricNetworking.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricNetworking.java new file mode 100644 index 00000000..0fc452b5 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricNetworking.java @@ -0,0 +1,405 @@ +package com.craisinlord.antarchy.fabric.network; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricEntities; + +import com.craisinlord.antarchy.content.entity.DiamondMinecartEntity; +import com.craisinlord.antarchy.content.client.CameraShakeClientState; +import com.craisinlord.antarchy.content.client.HerculesBeetleImpactShakeClientState; +import com.craisinlord.antarchy.content.entity.multipart.MultipartEntityOwner; +import com.craisinlord.antarchy.content.entity.multipart.MultipartFramework; +import com.craisinlord.antarchy.content.entity.multipart.network.MultipartAttackPayload; +import com.craisinlord.antarchy.content.entity.multipart.network.MultipartInteractPayload; +import com.craisinlord.antarchy.content.gravity.AntarchyGravityApi; +import com.craisinlord.antarchy.content.entity.HerculesBeetleEntity; +import com.craisinlord.antarchy.content.item.BrutalflyElytraFlightHelper; +import com.craisinlord.antarchy.content.item.BrutalflyElytraItem; +import com.craisinlord.antarchy.content.item.BigBerthaItem; +import com.craisinlord.antarchy.content.item.JumpyBootsHelper; +import com.craisinlord.antarchy.fabric.util.JumpyBootsFabricHelper; +import com.craisinlord.antarchy.content.item.JumpyBootsItem; +import com.craisinlord.antarchy.content.item.GravityGunItem; +import com.craisinlord.antarchy.content.network.*; +import com.craisinlord.antarchy.content.entity.DorrieEntity; +import com.craisinlord.antarchy.content.network.DorrieJumpInputPayload; +import com.craisinlord.antarchy.content.network.JumpyBootsLaunchPayload; +import com.craisinlord.antarchy.content.weather.ThoraxisWeatherSnapshot; +import com.craisinlord.antarchy.fabric.AntarchyFabricContent; +import com.craisinlord.antarchy.fabric.entity.multipart.MultipartPartEntity; +import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; +import net.fabricmc.fabric.api.networking.v1.PlayerLookup; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.protocol.game.ClientboundSetEntityMotionPacket; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.Vec3; + +public final class AntarchyFabricNetworking { + private AntarchyFabricNetworking() { + } + + public static void register() { + registerServerReceivers(); + } + + public static void sendToPlayer( + ServerPlayer player, + T payload, + com.craisinlord.antarchy.compat.network.StreamCodec streamCodec, + com.craisinlord.antarchy.compat.network.CustomPacketPayload.Type type + ) { + FriendlyByteBuf buf = PacketByteBufs.create(); + streamCodec.encode(buf, payload); + ServerPlayNetworking.send(player, type.id(), buf); + } + + private static void registerC2SReceiver( + com.craisinlord.antarchy.compat.network.CustomPacketPayload.Type type, + com.craisinlord.antarchy.compat.network.StreamCodec streamCodec, + java.util.function.BiConsumer handler + ) { + ServerPlayNetworking.registerGlobalReceiver(type.id(), (server, player, handlerConn, buf, sender) -> { + T payload = streamCodec.decode(buf); + server.execute(() -> handler.accept(player, payload)); + }); + } + + public static void bootstrapMultipartCommon() { + MultipartFramework.bootstrap( + AntarchyFabricNetworking::createMultipartPart, + new MultipartFramework.NetworkBridge() { + @Override + public void sendAttack(java.util.UUID parentId, int partIndex, float damage) { + } + + @Override + public void sendInteract(java.util.UUID parentId, int partIndex, int handId) { + } + } + ); + } + + public static MultipartPartEntity createMultipartPart(MultipartEntityOwner owner, int partIndex, com.craisinlord.antarchy.content.entity.multipart.MultipartPartDefinition spec) { + return new MultipartPartEntity(AntarchyFabricEntities.KRAKEN_PART.get(), ((Entity) owner).level()) + .antarchy$configure(owner, partIndex, spec); + } + + private static void registerServerReceivers() { + registerC2SReceiver(GravityGunPrimaryPayload.TYPE, GravityGunPrimaryPayload.STREAM_CODEC, AntarchyFabricNetworking::handleGravityGunPrimary); + registerC2SReceiver(GravityGunScrollPayload.TYPE, GravityGunScrollPayload.STREAM_CODEC, AntarchyFabricNetworking::handleGravityGunScroll); + registerC2SReceiver(BigBerthaModeCyclePayload.TYPE, BigBerthaModeCyclePayload.STREAM_CODEC, AntarchyFabricNetworking::handleBigBerthaModeCycle); + registerC2SReceiver(DiamondMinecartInputPayload.TYPE, DiamondMinecartInputPayload.STREAM_CODEC, AntarchyFabricNetworking::handleDiamondMinecartInput); + registerC2SReceiver(BrutalflyElytraFlapPayload.TYPE, BrutalflyElytraFlapPayload.STREAM_CODEC, AntarchyFabricNetworking::handleBrutalflyFlap); + registerC2SReceiver(JumpyBootsLaunchPayload.TYPE, JumpyBootsLaunchPayload.STREAM_CODEC, AntarchyFabricNetworking::handleJumpyBootsLaunch); + registerC2SReceiver(DorrieJumpInputPayload.TYPE, DorrieJumpInputPayload.STREAM_CODEC, AntarchyFabricNetworking::handleDorrieJumpInput); + registerC2SReceiver(com.craisinlord.antarchy.content.network.DorrieChargeJumpPayload.TYPE, com.craisinlord.antarchy.content.network.DorrieChargeJumpPayload.STREAM_CODEC, AntarchyFabricNetworking::handleDorrieChargeJumpInput); + registerC2SReceiver(HerculesBeetleJumpInputPayload.TYPE, HerculesBeetleJumpInputPayload.STREAM_CODEC, AntarchyFabricNetworking::handleHerculesBeetleJumpInput); + registerC2SReceiver(HerculesBeetleFlightTogglePayload.TYPE, HerculesBeetleFlightTogglePayload.STREAM_CODEC, AntarchyFabricNetworking::handleHerculesBeetleFlightToggle); + registerC2SReceiver(HerculesBeetleMountedAttackPayload.TYPE, HerculesBeetleMountedAttackPayload.STREAM_CODEC, AntarchyFabricNetworking::handleHerculesBeetleMountedAttack); + registerC2SReceiver(HerculesBeetleMountedChargePayload.TYPE, HerculesBeetleMountedChargePayload.STREAM_CODEC, AntarchyFabricNetworking::handleHerculesBeetleMountedCharge); + registerC2SReceiver(MultipartAttackPayload.TYPE, MultipartAttackPayload.STREAM_CODEC, AntarchyFabricNetworking::handleMultipartAttack); + registerC2SReceiver(MultipartInteractPayload.TYPE, MultipartInteractPayload.STREAM_CODEC, AntarchyFabricNetworking::handleMultipartInteract); + } + + public static void syncGravityToPlayer(ServerPlayer target, Entity entity) { + GravityStatePayload payload = new GravityStatePayload( + entity.getId(), + AntarchyGravityApi.getGravityDirection(entity), + AntarchyGravityApi.getPrevGravityDirection(entity), + AntarchyGravityApi.isGravityForced(entity), + AntarchyGravityApi.getTransitionDuration(entity), + AntarchyGravityApi.getTransitionRemaining(entity) + ); + sendToPlayer(target, payload, GravityStatePayload.STREAM_CODEC, GravityStatePayload.TYPE); + } + + public static void syncGravityEntity(Entity entity) { + GravityStatePayload payload = new GravityStatePayload( + entity.getId(), + AntarchyGravityApi.getGravityDirection(entity), + AntarchyGravityApi.getPrevGravityDirection(entity), + AntarchyGravityApi.isGravityForced(entity), + AntarchyGravityApi.getTransitionDuration(entity), + AntarchyGravityApi.getTransitionRemaining(entity) + ); + + for (ServerPlayer player : PlayerLookup.tracking(entity)) { + sendToPlayer(player, payload, GravityStatePayload.STREAM_CODEC, GravityStatePayload.TYPE); + } + if (entity instanceof ServerPlayer player) { + sendToPlayer(player, payload, GravityStatePayload.STREAM_CODEC, GravityStatePayload.TYPE); + } + } + + public static void syncBloodglass(ServerPlayer player, int shieldsActive, int shieldsMax) { + sendToPlayer(player, new BloodglassStatePayload(shieldsActive, shieldsMax), BloodglassStatePayload.STREAM_CODEC, BloodglassStatePayload.TYPE); + } + + public static void syncKatanaTrail(Entity entity, int durationTicks) { + BloodCrystalKatanaTrailPayload payload = new BloodCrystalKatanaTrailPayload(entity.getId(), durationTicks); + for (ServerPlayer player : PlayerLookup.tracking(entity)) { + sendToPlayer(player, payload, BloodCrystalKatanaTrailPayload.STREAM_CODEC, BloodCrystalKatanaTrailPayload.TYPE); + } + if (entity instanceof ServerPlayer serverPlayer) { + sendToPlayer(serverPlayer, payload, BloodCrystalKatanaTrailPayload.STREAM_CODEC, BloodCrystalKatanaTrailPayload.TYPE); + } + } + + public static void syncScorpionWhipTether(ServerPlayer player, int targetId) { + ScorpionWhipTetherPayload payload = new ScorpionWhipTetherPayload(player.getId(), targetId); + for (ServerPlayer tracking : PlayerLookup.tracking(player)) { + sendToPlayer(tracking, payload, ScorpionWhipTetherPayload.STREAM_CODEC, ScorpionWhipTetherPayload.TYPE); + } + sendToPlayer(player, payload, ScorpionWhipTetherPayload.STREAM_CODEC, ScorpionWhipTetherPayload.TYPE); + } + + public static void syncThoraxisWeather(ServerLevel level, ThoraxisWeatherSnapshot snapshot) { + ThoraxisWeatherPayload payload = new ThoraxisWeatherPayload( + snapshot.dimension(), + snapshot.kind(), + snapshot.expiresAt(), + snapshot.anchor().getX(), + snapshot.anchor().getY(), + snapshot.anchor().getZ() + ); + for (ServerPlayer player : level.players()) { + sendToPlayer(player, payload, ThoraxisWeatherPayload.STREAM_CODEC, ThoraxisWeatherPayload.TYPE); + } + } + + public static void handleGravityState(Entity contextPlayer, GravityStatePayload payload) { + Entity entity = contextPlayer.level().getEntity(payload.entityId()); + if (entity == null && contextPlayer.getId() == payload.entityId()) { + entity = contextPlayer; + } + if (entity == null) { + return; + } + AntarchyGravityApi.applySyncedState( + entity, + payload.direction(), + payload.previousDirection(), + payload.forced(), + payload.transitionDuration(), + payload.transitionRemaining() + ); + } + + private static void handleGravityGunPrimary(ServerPlayer player, GravityGunPrimaryPayload payload) { + if (!(player.getMainHandItem().getItem() instanceof GravityGunItem gravityGunItem)) { + return; + } + gravityGunItem.firePrimary(player.serverLevel(), player, player.getMainHandItem()); + } + + private static void handleGravityGunScroll(ServerPlayer player, GravityGunScrollPayload payload) { + if (!(player.getMainHandItem().getItem() instanceof GravityGunItem)) { + return; + } + GravityGunItem.adjustHeldDistance(player.getMainHandItem(), payload.distanceDelta()); + } + + private static void handleBigBerthaModeCycle(ServerPlayer player, BigBerthaModeCyclePayload payload) { + if (!(player.getMainHandItem().getItem() instanceof BigBerthaItem bigBerthaItem)) { + return; + } + bigBerthaItem.tryCycleModeWhileCoolingDown(player.serverLevel(), player, player.getMainHandItem()); + } + + private static void handleDiamondMinecartInput(ServerPlayer player, DiamondMinecartInputPayload payload) { + if (player.getVehicle() instanceof DiamondMinecartEntity cart) { + cart.onInputReceived(payload.inputFlags()); + } + } + + private static void handleBrutalflyFlap(ServerPlayer player, BrutalflyElytraFlapPayload payload) { + ItemStack chestStack = player.getItemBySlot(EquipmentSlot.CHEST); + if (!(chestStack.getItem() instanceof BrutalflyElytraItem)) { + return; + } + if (player.isSpectator() || !player.isFallFlying() || player.isPassenger()) { + return; + } + if (player.getCooldowns().isOnCooldown(chestStack.getItem())) { + return; + } + + BrutalflyElytraFlightHelper.FlapTier tier = BrutalflyElytraFlightHelper.resolveFlapTier(payload.chargeTicks()); + if (tier == BrutalflyElytraFlightHelper.FlapTier.FAIL) { + return; + } + + float lift = BrutalflyElytraFlightHelper.liftFor(tier); + float forwardBoost = BrutalflyElytraFlightHelper.forwardBoostFor(tier); + Vec3 look = player.getLookAngle(); + Vec3 boost = new Vec3(look.x * forwardBoost, lift, look.z * forwardBoost); + player.setDeltaMovement(player.getDeltaMovement().add(boost)); + player.hasImpulse = true; + player.hurtMarked = true; + player.resetFallDistance(); + player.connection.send(new ClientboundSetEntityMotionPacket(player)); + chestStack.hurtAndBreak(1, player, p -> p.broadcastBreakEvent(EquipmentSlot.CHEST)); + player.getCooldowns().addCooldown(chestStack.getItem(), BrutalflyElytraFlightHelper.FLAP_COOLDOWN_TICKS); + player.level().playSound(null, player.blockPosition(), SoundEvents.PHANTOM_FLAP, SoundSource.PLAYERS, 0.9F, + tier == BrutalflyElytraFlightHelper.FlapTier.PERFECT ? 0.8F : tier == BrutalflyElytraFlightHelper.FlapTier.GOOD ? 0.95F : 1.1F); + + BrutalflyElytraAnimationPayload animationPayload = new BrutalflyElytraAnimationPayload( + player.getId(), + BrutalflyElytraFlightHelper.animationTicksFor(tier), + lift + ); + for (ServerPlayer tracking : PlayerLookup.tracking(player)) { + sendToPlayer(tracking, animationPayload, BrutalflyElytraAnimationPayload.STREAM_CODEC, BrutalflyElytraAnimationPayload.TYPE); + } + sendToPlayer(player, animationPayload, BrutalflyElytraAnimationPayload.STREAM_CODEC, BrutalflyElytraAnimationPayload.TYPE); + } + + private static void handleMultipartAttack(ServerPlayer serverPlayer, MultipartAttackPayload payload) { + Entity entity = serverPlayer.serverLevel().getEntity(payload.parentId()); + if (!(entity instanceof MultipartEntityOwner owner)) { + return; + } + + Entity[] parts = owner.antarchy$getMultipartParts(); + if (parts == null) { + parts = owner.antarchy$createMultipartParts(); + owner.antarchy$setMultipartParts(parts); + owner.antarchy$syncMultipartParts(); + } + if (payload.partIndex() < 0 || payload.partIndex() >= parts.length) { + return; + } + + Entity part = parts[payload.partIndex()]; + if (part == null || part.isRemoved()) { + return; + } + if (serverPlayer.distanceToSqr(part) > 10000.0D) { + return; + } + + serverPlayer.attack(part); + } + + private static void handleMultipartInteract(ServerPlayer serverPlayer, MultipartInteractPayload payload) { + Entity entity = serverPlayer.serverLevel().getEntity(payload.parentId()); + if (!(entity instanceof MultipartEntityOwner owner)) { + return; + } + + Entity[] parts = owner.antarchy$getMultipartParts(); + if (parts == null) { + parts = owner.antarchy$createMultipartParts(); + owner.antarchy$setMultipartParts(parts); + owner.antarchy$syncMultipartParts(); + } + if (payload.partIndex() < 0 || payload.partIndex() >= parts.length) { + return; + } + + Entity part = parts[payload.partIndex()]; + if (part == null || part.isRemoved()) { + return; + } + + InteractionHand hand = payload.handId() == 0 ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND; + owner.antarchy$interactMultipartPart(part, serverPlayer, part.position(), hand); + } + + private static void handleJumpyBootsLaunch(ServerPlayer player, JumpyBootsLaunchPayload payload) { + if (!JumpyBootsItem.isWearingJumpyBoots(player)) return; + if (player.isSpectator() || player.isPassenger()) return; + + ItemStack boots = player.getItemBySlot(EquipmentSlot.FEET); + if (player.getCooldowns().isOnCooldown(boots.getItem())) return; + + int clampedCharge = Math.min(payload.chargeTicks(), JumpyBootsHelper.CHARGE_TICKS_MAX); + if (clampedCharge <= 0) return; + + float verticalBoost = JumpyBootsHelper.verticalBoostFor(clampedCharge); + Vec3 current = player.getDeltaMovement(); + double newX = current.x; + double newZ = current.z; + + if (payload.sprinting()) { + Vec3 look = player.getLookAngle(); + newX += look.x * JumpyBootsHelper.SPRINT_FORWARD_BOOST; + newZ += look.z * JumpyBootsHelper.SPRINT_FORWARD_BOOST; + } + + player.setDeltaMovement(newX, verticalBoost, newZ); + player.setPos(player.getX(), player.getY() + 0.001, player.getZ()); + player.hasImpulse = true; + player.hurtMarked = true; + player.resetFallDistance(); + player.connection.send(new ClientboundSetEntityMotionPacket(player)); + + player.level().playSound(null, player.blockPosition(), SoundEvents.SLIME_JUMP, SoundSource.PLAYERS, + 1.0F, 0.6F + (clampedCharge / (float) JumpyBootsHelper.CHARGE_TICKS_MAX) * 0.6F); + + JumpyBootsFabricHelper.setProtectionUntil(player, + player.level().getGameTime() + JumpyBootsHelper.FALL_PROTECTION_TICKS); + + player.getCooldowns().addCooldown(boots.getItem(), JumpyBootsHelper.COOLDOWN_TICKS); + } + + private static void handleDorrieJumpInput(ServerPlayer player, DorrieJumpInputPayload payload) { + if (!(player.getVehicle() instanceof DorrieEntity dorrie)) return; + dorrie.setPressingJump(payload.pressing()); + } + + private static void handleDorrieChargeJumpInput(ServerPlayer player, com.craisinlord.antarchy.content.network.DorrieChargeJumpPayload payload) { + if (!(player.getVehicle() instanceof DorrieEntity dorrie)) return; + if (payload.pressing()) { + dorrie.startJumpCharge(); + } else { + dorrie.releaseJump(); + } + } + + private static void handleHerculesBeetleJumpInput(ServerPlayer player, HerculesBeetleJumpInputPayload payload) { + if (player.getVehicle() instanceof HerculesBeetleEntity beetle) { + beetle.setRiderJumpPressed(payload.pressing()); + } + } + + private static void handleHerculesBeetleMountedAttack(ServerPlayer player, HerculesBeetleMountedAttackPayload payload) { + if (player.getVehicle() instanceof HerculesBeetleEntity beetle) { + beetle.handleMountedRegularAttack(player); + } + } + + private static void handleHerculesBeetleFlightToggle(ServerPlayer player, HerculesBeetleFlightTogglePayload payload) { + if (player.getVehicle() instanceof HerculesBeetleEntity beetle) { + beetle.toggleMountedFlight(player); + } + } + + private static void handleHerculesBeetleMountedCharge(ServerPlayer player, HerculesBeetleMountedChargePayload payload) { + if (player.getVehicle() instanceof HerculesBeetleEntity beetle) { + if (payload.pressing()) { + beetle.startMountedCharge(player); + } else { + beetle.releaseMountedCharge(player); + } + } + } + + public static void triggerHerculesBeetleImpactShake(int durationTicks) { + HerculesBeetleImpactShakeClientState.trigger(durationTicks); + } + + public static void triggerImpactShake(ImpactShakePayload payload) { + CameraShakeClientState.triggerImpact( + new Vec3(payload.x(), payload.y(), payload.z()), + payload.intensity(), + payload.durationTicks(), + payload.radius() + ); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricBlocks.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricBlocks.java new file mode 100644 index 00000000..4b8fa807 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricBlocks.java @@ -0,0 +1,1192 @@ +package com.craisinlord.antarchy.fabric.registry; + +import com.craisinlord.antarchy.fabric.AntarchyWoodTypes; +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.block.*; +import com.craisinlord.antarchy.content.block.entity.AntNestBlockEntity; +import com.craisinlord.antarchy.content.block.entity.CritterCageBlockEntity; +import com.craisinlord.antarchy.content.block.entity.DreamCampfireBlockEntity; +import com.craisinlord.antarchy.content.block.entity.HushweedBlockEntity; +import com.craisinlord.antarchy.content.block.entity.PotentNyxiteBlockEntity; +import com.craisinlord.antarchy.content.block.entity.SeashellBlockEntity; +import com.craisinlord.antarchy.content.block.entity.WaspNestBlockEntity; +import com.craisinlord.antarchy.content.fluid.BileLiquidBlock; +import com.craisinlord.antarchy.content.fluid.LumenLiquidBlock; +import com.craisinlord.antarchy.fabric.content.fluid.AntiwaterLiquidBlock; +import com.craisinlord.antarchy.content.portal.PermanentPortalType; +import com.mojang.serialization.MapCodec; +import net.minecraft.core.registries.Registries; +import net.minecraft.core.Direction; +import net.minecraft.util.valueproviders.UniformInt; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.AmethystClusterBlock; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DropExperienceBlock; +import net.minecraft.world.level.block.GlowLichenBlock; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.LiquidBlock; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.SlabBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.StairBlock; +import net.minecraft.world.level.block.WallBlock; +import net.minecraft.world.level.block.VineBlock; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.MapColor; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; + +public final class AntarchyFabricBlocks { + + public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(Antarchy.MODID); + + + public static final DeferredRegister> BLOCK_ENTITY_TYPES = DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, Antarchy.MODID); + + + public static final DeferredBlock DUPLICATOR_LOG = BLOCKS.register("duplicator_log", + () -> new DuplicatorLogBlock(BlockBehaviour.Properties.copy(Blocks.OAK_LOG).randomTicks())); + + + public static final DeferredBlock OURANWOOD_LOG = BLOCKS.register("ouranwood_log", + () -> new OuranwoodLogBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_LOG))); + + + public static final DeferredBlock OURANWOOD_WOOD = BLOCKS.register("ouranwood_wood", + () -> new OuranwoodLogBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_WOOD))); + + + public static final DeferredBlock MOSSY_OURANWOOD_LOG = BLOCKS.register("mossy_ouranwood_log", + () -> new OuranwoodLogBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_LOG))); + + + public static final DeferredBlock MOSSY_OURANWOOD_WOOD = BLOCKS.register("mossy_ouranwood_wood", + () -> new OuranwoodLogBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_WOOD))); + + + public static final DeferredBlock STRIPPED_OURANWOOD_LOG = BLOCKS.register("stripped_ouranwood_log", + () -> new OuranwoodLogBlock(BlockBehaviour.Properties.copy(Blocks.STRIPPED_JUNGLE_LOG))); + + + public static final DeferredBlock STRIPPED_OURANWOOD_WOOD = BLOCKS.register("stripped_ouranwood_wood", + () -> new OuranwoodLogBlock(BlockBehaviour.Properties.copy(Blocks.STRIPPED_JUNGLE_WOOD))); + + + public static final DeferredBlock OURANWOOD_PLANKS = BLOCKS.register("ouranwood_planks", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.JUNGLE_PLANKS))); + + + public static final DeferredBlock OURANWOOD_STAIRS = BLOCKS.register("ouranwood_stairs", + () -> new net.minecraft.world.level.block.StairBlock(OURANWOOD_PLANKS.get().defaultBlockState(), BlockBehaviour.Properties.copy(Blocks.JUNGLE_STAIRS))); + + + public static final DeferredBlock OURANWOOD_SLAB = BLOCKS.register("ouranwood_slab", + () -> new net.minecraft.world.level.block.SlabBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_SLAB))); + + + public static final DeferredBlock OURANWOOD_FENCE = BLOCKS.register("ouranwood_fence", + () -> new net.minecraft.world.level.block.FenceBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_FENCE))); + + + public static final DeferredBlock OURANWOOD_FENCE_GATE = BLOCKS.register("ouranwood_fence_gate", + () -> new net.minecraft.world.level.block.FenceGateBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_FENCE_GATE), net.minecraft.world.level.block.state.properties.WoodType.JUNGLE)); + + + public static final DeferredBlock OURANWOOD_DOOR = BLOCKS.register("ouranwood_door", + () -> new net.minecraft.world.level.block.DoorBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_DOOR), net.minecraft.world.level.block.state.properties.BlockSetType.JUNGLE)); + + + public static final DeferredBlock OURANWOOD_TRAPDOOR = BLOCKS.register("ouranwood_trapdoor", + () -> new net.minecraft.world.level.block.TrapDoorBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_TRAPDOOR), net.minecraft.world.level.block.state.properties.BlockSetType.JUNGLE)); + + + public static final DeferredBlock OURANWOOD_PRESSURE_PLATE = BLOCKS.register("ouranwood_pressure_plate", + () -> new net.minecraft.world.level.block.PressurePlateBlock(net.minecraft.world.level.block.PressurePlateBlock.Sensitivity.EVERYTHING, BlockBehaviour.Properties.copy(Blocks.JUNGLE_PRESSURE_PLATE), net.minecraft.world.level.block.state.properties.BlockSetType.JUNGLE)); + + + public static final DeferredBlock OURANWOOD_BUTTON = BLOCKS.register("ouranwood_button", + () -> new net.minecraft.world.level.block.ButtonBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_BUTTON), net.minecraft.world.level.block.state.properties.BlockSetType.JUNGLE, 30, false)); + + + public static final DeferredBlock OURANWOOD_LEAVES = BLOCKS.register("ouranwood_leaves", + () -> new OuranwoodLeavesBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_LEAVES).randomTicks())); + + + public static final DeferredBlock OURANWOOD_ACORN_BLOCK = BLOCKS.register("ouranwood_acorn", + () -> new OuranwoodAcornBlock(BlockBehaviour.Properties.copy(Blocks.OAK_SAPLING).randomTicks().noCollission())); + public static final DeferredBlock POTTED_OURANWOOD_ACORN = BLOCKS.register("potted_ouranwood_acorn", + () -> new net.minecraft.world.level.block.FlowerPotBlock(OURANWOOD_ACORN_BLOCK.get(), BlockBehaviour.Properties.copy(Blocks.POTTED_DANDELION))); + + + public static final DeferredBlock ORANGE_MILKWEED = BLOCKS.register("orange_milkweed", + () -> new MilkweedBlock(BlockBehaviour.Properties.copy(Blocks.PEONY))); + + + public static final DeferredBlock PINK_MILKWEED = BLOCKS.register("pink_milkweed", + () -> new MilkweedBlock(BlockBehaviour.Properties.copy(Blocks.PEONY))); + + + public static final DeferredBlock CAMELLIA = BLOCKS.register("camellia", + () -> new com.craisinlord.antarchy.content.block.CamelliaBlock(BlockBehaviour.Properties.copy(Blocks.PEONY))); + + + public static final DeferredBlock SPIDER_LILY = BLOCKS.register("spider_lily", + () -> new com.craisinlord.antarchy.content.block.SpiderLilyBlock(BlockBehaviour.Properties.copy(Blocks.POPPY))); + public static final DeferredBlock POTTED_SPIDER_LILY = BLOCKS.register("potted_spider_lily", + () -> new net.minecraft.world.level.block.FlowerPotBlock(SPIDER_LILY.get(), BlockBehaviour.Properties.copy(Blocks.POTTED_DANDELION))); + + + public static final DeferredBlock GIANT_LILY_PAD = BLOCKS.register("giant_lily_pad", + () -> new GiantLilyPadBlock(BlockBehaviour.Properties.copy(Blocks.LILY_PAD))); + public static final DeferredBlock LOTUS = BLOCKS.register("lotus", + () -> new com.craisinlord.antarchy.content.block.LotusBlock(BlockBehaviour.Properties.copy(Blocks.SPORE_BLOSSOM))); + public static final DeferredBlock POTTED_LOTUS = BLOCKS.register("potted_lotus", + () -> new net.minecraft.world.level.block.FlowerPotBlock(LOTUS.get(), BlockBehaviour.Properties.copy(Blocks.POTTED_DANDELION))); + public static final DeferredBlock SEASHELL = BLOCKS.register("seashell", + () -> new SeashellBlock(BlockBehaviour.Properties.copy(Blocks.TURTLE_EGG).noOcclusion())); + public static final DeferredBlock CRITTER_CAGE_BLOCK = BLOCKS.register("critter_cage_block", + () -> new CritterCageBlock(BlockBehaviour.Properties.of().strength(5.0F, 6.0F).sound(net.minecraft.world.level.block.SoundType.METAL).noOcclusion())); + + + public static final DeferredBlock OURANWOOD_SIGN = BLOCKS.register("ouranwood_sign", + () -> new net.minecraft.world.level.block.StandingSignBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_SIGN), AntarchyWoodTypes.OURANWOOD)); + + + public static final DeferredBlock OURANWOOD_WALL_SIGN = BLOCKS.register("ouranwood_wall_sign", + () -> new net.minecraft.world.level.block.WallSignBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_WALL_SIGN), AntarchyWoodTypes.OURANWOOD)); + + + public static final DeferredBlock OURANWOOD_HANGING_SIGN = BLOCKS.register("ouranwood_hanging_sign", + () -> new net.minecraft.world.level.block.CeilingHangingSignBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_HANGING_SIGN), AntarchyWoodTypes.OURANWOOD)); + + + public static final DeferredBlock OURANWOOD_WALL_HANGING_SIGN = BLOCKS.register("ouranwood_wall_hanging_sign", + () -> new net.minecraft.world.level.block.WallHangingSignBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_WALL_HANGING_SIGN), AntarchyWoodTypes.OURANWOOD)); + + + public static final DeferredBlock PEACH_LOG = BLOCKS.register("peach_log", + () -> new RotatedPillarBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_LOG))); + + + public static final DeferredBlock PEACH_WOOD = BLOCKS.register("peach_wood", + () -> new RotatedPillarBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_WOOD))); + + + public static final DeferredBlock STRIPPED_PEACH_LOG = BLOCKS.register("stripped_peach_log", + () -> new RotatedPillarBlock(BlockBehaviour.Properties.copy(Blocks.STRIPPED_JUNGLE_LOG))); + + + public static final DeferredBlock STRIPPED_PEACH_WOOD = BLOCKS.register("stripped_peach_wood", + () -> new RotatedPillarBlock(BlockBehaviour.Properties.copy(Blocks.STRIPPED_JUNGLE_WOOD))); + + + public static final DeferredBlock PEACH_PLANKS = BLOCKS.register("peach_planks", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.JUNGLE_PLANKS))); + + + public static final DeferredBlock PEACH_STAIRS = BLOCKS.register("peach_stairs", + () -> new net.minecraft.world.level.block.StairBlock(PEACH_PLANKS.get().defaultBlockState(), BlockBehaviour.Properties.copy(Blocks.JUNGLE_STAIRS))); + + + public static final DeferredBlock PEACH_SLAB = BLOCKS.register("peach_slab", + () -> new net.minecraft.world.level.block.SlabBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_SLAB))); + + + public static final DeferredBlock PEACH_FENCE = BLOCKS.register("peach_fence", + () -> new net.minecraft.world.level.block.FenceBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_FENCE))); + + + public static final DeferredBlock PEACH_FENCE_GATE = BLOCKS.register("peach_fence_gate", + () -> new net.minecraft.world.level.block.FenceGateBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_FENCE_GATE), net.minecraft.world.level.block.state.properties.WoodType.JUNGLE)); + + + public static final DeferredBlock PEACH_DOOR = BLOCKS.register("peach_door", + () -> new net.minecraft.world.level.block.DoorBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_DOOR), net.minecraft.world.level.block.state.properties.BlockSetType.JUNGLE)); + + + public static final DeferredBlock PEACH_TRAPDOOR = BLOCKS.register("peach_trapdoor", + () -> new net.minecraft.world.level.block.TrapDoorBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_TRAPDOOR), net.minecraft.world.level.block.state.properties.BlockSetType.JUNGLE)); + + + public static final DeferredBlock PEACH_PRESSURE_PLATE = BLOCKS.register("peach_pressure_plate", + () -> new net.minecraft.world.level.block.PressurePlateBlock(net.minecraft.world.level.block.PressurePlateBlock.Sensitivity.EVERYTHING, BlockBehaviour.Properties.copy(Blocks.JUNGLE_PRESSURE_PLATE), net.minecraft.world.level.block.state.properties.BlockSetType.JUNGLE)); + + + public static final DeferredBlock PEACH_BUTTON = BLOCKS.register("peach_button", + () -> new net.minecraft.world.level.block.ButtonBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_BUTTON), net.minecraft.world.level.block.state.properties.BlockSetType.JUNGLE, 30, false)); + + + public static final DeferredBlock PEACH_LEAVES = BLOCKS.register("peach_leaves", + () -> new com.craisinlord.antarchy.content.block.PeachLeavesBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_LEAVES).randomTicks())); + + + public static final DeferredBlock PEACH_HANGING_PEACH = BLOCKS.register("hanging_peach", + () -> new com.craisinlord.antarchy.content.block.HangingPeachBlock(BlockBehaviour.Properties.of().noOcclusion().instabreak())); + + + public static final DeferredBlock PEACH_SAPLING = BLOCKS.register("peach_sapling", + () -> new com.craisinlord.antarchy.content.block.PeachSaplingBlock(BlockBehaviour.Properties.copy(Blocks.OAK_SAPLING).randomTicks().noCollission())); + public static final DeferredBlock POTTED_PEACH_SAPLING = BLOCKS.register("potted_peach_sapling", + () -> new net.minecraft.world.level.block.FlowerPotBlock(PEACH_SAPLING.get(), BlockBehaviour.Properties.copy(Blocks.POTTED_DANDELION))); + + + public static final DeferredBlock PEACH_SIGN = BLOCKS.register("peach_sign", + () -> new net.minecraft.world.level.block.StandingSignBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_SIGN), AntarchyWoodTypes.PEACH)); + + + public static final DeferredBlock PEACH_WALL_SIGN = BLOCKS.register("peach_wall_sign", + () -> new net.minecraft.world.level.block.WallSignBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_WALL_SIGN), AntarchyWoodTypes.PEACH)); + + + public static final DeferredBlock PEACH_HANGING_SIGN = BLOCKS.register("peach_hanging_sign", + () -> new net.minecraft.world.level.block.CeilingHangingSignBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_HANGING_SIGN), AntarchyWoodTypes.PEACH)); + + + public static final DeferredBlock PEACH_WALL_HANGING_SIGN = BLOCKS.register("peach_wall_hanging_sign", + () -> new net.minecraft.world.level.block.WallHangingSignBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_WALL_HANGING_SIGN), AntarchyWoodTypes.PEACH)); + + + public static final DeferredBlock DUPLICATOR_SAPLING = BLOCKS.register("duplicator_sapling", + () -> new DuplicatorSaplingBlock(BlockBehaviour.Properties.copy(Blocks.OAK_SAPLING).randomTicks().noCollission())); + + + public static final DeferredBlock DUCT_TAPE = BLOCKS.register("duct_tape", + () -> new DuctTapeBlock(BlockBehaviour.Properties.of() + .strength(0.2F) + .sound(SoundType.WOOL) + .noOcclusion() + .replaceable())); + + + public static final DeferredBlock INFESTED_ROOTED_DIRT = BLOCKS.register("infested_rooted_dirt", + () -> new InfestedRootedDirtBlock(BlockBehaviour.Properties.copy(Blocks.ROOTED_DIRT).randomTicks())); + + + public static final DeferredBlock INFESTED_COARSE_DIRT = BLOCKS.register("infested_coarse_dirt", + () -> new InfestedCoarseDirtBlock(BlockBehaviour.Properties.copy(Blocks.COARSE_DIRT).randomTicks())); + + + public static final DeferredBlock NYXITE = BLOCKS.register("nyxite", + () -> new Block(nyxiteProperties())); + + + public static final DeferredBlock POLISHED_NYXITE = BLOCKS.register("polished_nyxite", + () -> new Block(nyxiteProperties())); + + + public static final DeferredBlock CHISELED_NYXITE = BLOCKS.register("chiseled_nyxite", + () -> new Block(nyxiteProperties())); + + + public static final DeferredBlock NYXITE_BRICKS = BLOCKS.register("nyxite_bricks", + () -> new Block(nyxiteProperties())); + + + public static final DeferredBlock NYXITE_STAIRS = BLOCKS.register("nyxite_stairs", + () -> new net.minecraft.world.level.block.StairBlock(NYXITE.get().defaultBlockState(), nyxiteProperties())); + + + public static final DeferredBlock NYXITE_SLAB = BLOCKS.register("nyxite_slab", + () -> new net.minecraft.world.level.block.SlabBlock(nyxiteProperties())); + + + public static final DeferredBlock NYXITE_WALL = BLOCKS.register("nyxite_wall", + () -> new net.minecraft.world.level.block.WallBlock(nyxiteProperties())); + + + public static final DeferredBlock POLISHED_NYXITE_STAIRS = BLOCKS.register("polished_nyxite_stairs", + () -> new net.minecraft.world.level.block.StairBlock(POLISHED_NYXITE.get().defaultBlockState(), nyxiteProperties())); + + + public static final DeferredBlock POLISHED_NYXITE_SLAB = BLOCKS.register("polished_nyxite_slab", + () -> new net.minecraft.world.level.block.SlabBlock(nyxiteProperties())); + + + public static final DeferredBlock POLISHED_NYXITE_WALL = BLOCKS.register("polished_nyxite_wall", + () -> new net.minecraft.world.level.block.WallBlock(nyxiteProperties())); + + public static final DeferredBlock POLISHED_NYXITE_PRESSURE_PLATE = BLOCKS.register("polished_nyxite_pressure_plate", + () -> new com.craisinlord.antarchy.content.block.PolishedNyxitePressurePlateBlock(net.minecraft.world.level.block.state.properties.BlockSetType.STONE, BlockBehaviour.Properties.copy(Blocks.STONE_PRESSURE_PLATE))); + public static final DeferredBlock POLISHED_NYXITE_BUTTON = BLOCKS.register("polished_nyxite_button", + () -> new net.minecraft.world.level.block.ButtonBlock(BlockBehaviour.Properties.copy(Blocks.STONE_BUTTON), net.minecraft.world.level.block.state.properties.BlockSetType.STONE, 20, false)); + + + public static final DeferredBlock NYXITE_BRICK_STAIRS = BLOCKS.register("nyxite_brick_stairs", + () -> new net.minecraft.world.level.block.StairBlock(NYXITE_BRICKS.get().defaultBlockState(), nyxiteProperties())); + + + public static final DeferredBlock NYXITE_BRICK_SLAB = BLOCKS.register("nyxite_brick_slab", + () -> new net.minecraft.world.level.block.SlabBlock(nyxiteProperties())); + + + public static final DeferredBlock NYXITE_BRICK_WALL = BLOCKS.register("nyxite_brick_wall", + () -> new net.minecraft.world.level.block.WallBlock(nyxiteProperties())); + + + public static final DeferredBlock SHELLSTONE = BLOCKS.register("shellstone", + () -> new Block(AntarchyObjects.shellstoneProperties())); + + + public static final DeferredBlock POLISHED_SHELLSTONE = BLOCKS.register("polished_shellstone", + () -> new Block(AntarchyObjects.shellstoneProperties())); + + + public static final DeferredBlock SHELLSTONE_BRICKS = BLOCKS.register("shellstone_bricks", + () -> new Block(AntarchyObjects.shellstoneProperties())); + + + public static final DeferredBlock CHISELED_SHELLSTONE = BLOCKS.register("chiseled_shellstone", + () -> new Block(AntarchyObjects.shellstoneProperties())); + + + public static final DeferredBlock MOSSY_SHELLSTONE_BRICKS = BLOCKS.register("mossy_shellstone_bricks", + () -> new Block(AntarchyObjects.shellstoneProperties())); + + + public static final DeferredBlock CRACKED_SHELLSTONE_BRICKS = BLOCKS.register("cracked_shellstone_bricks", + () -> new Block(AntarchyObjects.shellstoneProperties())); + + + public static final DeferredBlock MOSSY_SHELLSTONE_BRICK_STAIRS = BLOCKS.register("mossy_shellstone_brick_stairs", + () -> new net.minecraft.world.level.block.StairBlock(MOSSY_SHELLSTONE_BRICKS.get().defaultBlockState(), AntarchyObjects.shellstoneProperties())); + + + public static final DeferredBlock MOSSY_SHELLSTONE_BRICK_SLAB = BLOCKS.register("mossy_shellstone_brick_slab", + () -> new net.minecraft.world.level.block.SlabBlock(AntarchyObjects.shellstoneProperties())); + + + public static final DeferredBlock MOSSY_SHELLSTONE_BRICK_WALL = BLOCKS.register("mossy_shellstone_brick_wall", + () -> new net.minecraft.world.level.block.WallBlock(AntarchyObjects.shellstoneProperties())); + + + public static final DeferredBlock SHELLSTONE_STAIRS = BLOCKS.register("shellstone_stairs", + () -> new net.minecraft.world.level.block.StairBlock(SHELLSTONE.get().defaultBlockState(), AntarchyObjects.shellstoneProperties())); + + + public static final DeferredBlock SHELLSTONE_SLAB = BLOCKS.register("shellstone_slab", + () -> new net.minecraft.world.level.block.SlabBlock(AntarchyObjects.shellstoneProperties())); + + + public static final DeferredBlock SHELLSTONE_WALL = BLOCKS.register("shellstone_wall", + () -> new net.minecraft.world.level.block.WallBlock(AntarchyObjects.shellstoneProperties())); + + + public static final DeferredBlock POLISHED_SHELLSTONE_STAIRS = BLOCKS.register("polished_shellstone_stairs", + () -> new net.minecraft.world.level.block.StairBlock(POLISHED_SHELLSTONE.get().defaultBlockState(), AntarchyObjects.shellstoneProperties())); + + + public static final DeferredBlock POLISHED_SHELLSTONE_SLAB = BLOCKS.register("polished_shellstone_slab", + () -> new net.minecraft.world.level.block.SlabBlock(AntarchyObjects.shellstoneProperties())); + + + public static final DeferredBlock POLISHED_SHELLSTONE_WALL = BLOCKS.register("polished_shellstone_wall", + () -> new net.minecraft.world.level.block.WallBlock(AntarchyObjects.shellstoneProperties())); + + + public static final DeferredBlock SHELLSTONE_BRICK_STAIRS = BLOCKS.register("shellstone_brick_stairs", + () -> new net.minecraft.world.level.block.StairBlock(SHELLSTONE_BRICKS.get().defaultBlockState(), AntarchyObjects.shellstoneProperties())); + + + public static final DeferredBlock SHELLSTONE_BRICK_SLAB = BLOCKS.register("shellstone_brick_slab", + () -> new net.minecraft.world.level.block.SlabBlock(AntarchyObjects.shellstoneProperties())); + + + public static final DeferredBlock SHELLSTONE_BRICK_WALL = BLOCKS.register("shellstone_brick_wall", + () -> new net.minecraft.world.level.block.WallBlock(AntarchyObjects.shellstoneProperties())); + + + public static final DeferredBlock TRIFFID_GOO_BLOCK = BLOCKS.register("triffid_goo_block", + () -> new com.craisinlord.antarchy.content.block.TriffidGooBlock(BlockBehaviour.Properties.copy(Blocks.SLIME_BLOCK).noOcclusion().isViewBlocking((s, l, p) -> false).isSuffocating((s, l, p) -> false))); + + + public static final DeferredBlock CLOUD_BLOCK = BLOCKS.register("cloud_block", + () -> new com.craisinlord.antarchy.content.block.CloudBlock( + AntarchyFabricItems::cloudBucketItem, + BlockBehaviour.Properties.copy(Blocks.POWDER_SNOW).noLootTable().noOcclusion() + )); + + + public static final DeferredBlock ELYTHIA_PORTAL = BLOCKS.register("elythia_portal", + () -> new AntDimensionPortalBlock(PermanentPortalType.ELYTHIA, portalProperties())); + + + public static final DeferredBlock THORAXIS_PORTAL = BLOCKS.register("thoraxis_portal", + () -> new AntDimensionPortalBlock(PermanentPortalType.THORAXIS, portalProperties())); + + + public static final DeferredBlock CAVARYN_PORTAL = BLOCKS.register("cavaryn_portal", + () -> new AntDimensionPortalBlock(PermanentPortalType.CAVARYN, portalProperties())); + + + public static final DeferredBlock PALE_NYXITE = BLOCKS.register("pale_nyxite", + () -> new Block(nyxiteProperties())); + + + public static final DeferredBlock NYXITE_SPIKE = BLOCKS.register("nyxite_spike", + () -> new NyxiteSpikeBlock(BlockBehaviour.Properties.copy(Blocks.POINTED_DRIPSTONE))); + + + public static final DeferredBlock CHITEN_SPIKE = BLOCKS.register("chiten_spike", + () -> new ChitenSpikeBlock(BlockBehaviour.Properties.copy(Blocks.POINTED_DRIPSTONE))); + + + public static final DeferredBlock POTENT_NYXITE = BLOCKS.register("potent_nyxite", + () -> new PotentNyxiteBlock( + AntarchyFabricBlocks::potentNyxiteBlockEntityType, + BlockBehaviour.Properties.copy(Blocks.NETHERRACK).lightLevel(state -> 3) + )); + + + public static final DeferredBlock MYRMITE = BLOCKS.register("myrmite", + () -> new Block(nyxiteProperties())); + + + public static final DeferredBlock BIOMITE = BLOCKS.register("biomite", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.NETHERRACK))); + + + public static final DeferredBlock BIOMITE_TURF = BLOCKS.register("biomite_turf", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.NETHERRACK).lightLevel(state -> 2))); + + + public static final DeferredBlock BIOWART = BLOCKS.register("biowart", + () -> new BiowartBlock(BlockBehaviour.Properties.copy(Blocks.MOSS_BLOCK).lightLevel(state -> 2))); + + + public static final DeferredBlock BIOWART_TENDRILS = BLOCKS.register("biowart_tendrils", + () -> new BiowartTendrilsBlock(BlockBehaviour.Properties.copy(Blocks.MOSS_CARPET).lightLevel(state -> 2).noCollission().noOcclusion())); + + + public static final DeferredBlock MYRMITE_COAL_ORE = BLOCKS.register("myrmite_coal_ore", + () -> createOre(Blocks.COAL_ORE, 0, 2, MapColor.COLOR_GRAY)); + + + public static final DeferredBlock BROODSTONE = BLOCKS.register("broodstone", + () -> new Block(broodstoneProperties())); + + + public static final DeferredBlock POLISHED_BROODSTONE = BLOCKS.register("polished_broodstone", + () -> new Block(broodstoneProperties())); + + + public static final DeferredBlock CHISELED_BROODSTONE = BLOCKS.register("chiseled_broodstone", + () -> new Block(broodstoneProperties())); + + + public static final DeferredBlock BROODSTONE_BRICKS = BLOCKS.register("broodstone_bricks", + () -> new Block(broodstoneProperties())); + + + public static final DeferredBlock BROODSTONE_STAIRS = BLOCKS.register("broodstone_stairs", + () -> new StairBlock(BROODSTONE.get().defaultBlockState(), broodstoneProperties())); + + + public static final DeferredBlock BROODSTONE_SLAB = BLOCKS.register("broodstone_slab", + () -> new SlabBlock(broodstoneProperties())); + + + public static final DeferredBlock BROODSTONE_WALL = BLOCKS.register("broodstone_wall", + () -> new WallBlock(broodstoneProperties())); + + + public static final DeferredBlock POLISHED_BROODSTONE_STAIRS = BLOCKS.register("polished_broodstone_stairs", + () -> new StairBlock(POLISHED_BROODSTONE.get().defaultBlockState(), broodstoneProperties())); + + + public static final DeferredBlock POLISHED_BROODSTONE_SLAB = BLOCKS.register("polished_broodstone_slab", + () -> new SlabBlock(broodstoneProperties())); + + + public static final DeferredBlock POLISHED_BROODSTONE_WALL = BLOCKS.register("polished_broodstone_wall", + () -> new WallBlock(broodstoneProperties())); + + + public static final DeferredBlock BROODSTONE_BRICK_STAIRS = BLOCKS.register("broodstone_brick_stairs", + () -> new StairBlock(BROODSTONE_BRICKS.get().defaultBlockState(), broodstoneProperties())); + + + public static final DeferredBlock BROODSTONE_BRICK_SLAB = BLOCKS.register("broodstone_brick_slab", + () -> new SlabBlock(broodstoneProperties())); + + + public static final DeferredBlock BROODSTONE_BRICK_WALL = BLOCKS.register("broodstone_brick_wall", + () -> new WallBlock(broodstoneProperties())); + + + public static final DeferredBlock BROODSTONE_URANIUM_ORE = BLOCKS.register("broodstone_uranium_ore", + () -> createOre(Blocks.DEEPSLATE_EMERALD_ORE, 4, 8, MapColor.COLOR_YELLOW)); + + + public static final DeferredBlock BROODSTONE_TITANIUM_ORE = BLOCKS.register("broodstone_titanium_ore", + () -> createOre(Blocks.DEEPSLATE_DIAMOND_ORE, 4, 8, MapColor.COLOR_LIGHT_BLUE)); + + + public static final DeferredBlock CHITEN_BLOCK = BLOCKS.register("chiten_block", + () -> new RotatedPillarBlock(BlockBehaviour.Properties.copy(Blocks.BONE_BLOCK).requiresCorrectToolForDrops())); + + + public static final DeferredBlock UMBRAL_MOSS_BLOCK = BLOCKS.register("umbral_moss_block", + () -> new UmbralMossBlock(BlockBehaviour.Properties.copy(Blocks.MOSS_BLOCK))); + + + public static final DeferredBlock UMBRAL_MOSS_CARPET = BLOCKS.register("umbral_moss_carpet", + () -> new UmbralMossCarpetBlock(BlockBehaviour.Properties.copy(Blocks.MOSS_CARPET).noOcclusion())); + + + public static final DeferredBlock AMBER_MOSS_BLOCK = BLOCKS.register("amber_moss_block", + () -> new AmberMossBlock(BlockBehaviour.Properties.copy(Blocks.MOSS_BLOCK))); + + + public static final DeferredBlock AMBER_MOSS_CARPET = BLOCKS.register("amber_moss_carpet", + () -> new UmbralMossCarpetBlock(BlockBehaviour.Properties.copy(Blocks.MOSS_CARPET).noOcclusion())); + + + public static final DeferredBlock AMBER_LICHEN = BLOCKS.register("amber_lichen", + () -> new AmberLichenBlock(BlockBehaviour.Properties.copy(Blocks.GLOW_LICHEN).lightLevel(state -> 4))); + + + public static final DeferredBlock BILE_VEIN = BLOCKS.register("bile_vein", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.NETHERRACK).lightLevel(state -> 2))); + + + public static final DeferredBlock CREEPVINE = BLOCKS.register("creepvine", + () -> new CreepvineBlock(BlockBehaviour.Properties.copy(Blocks.VINE))); + + + public static final DeferredBlock BLUSH_MOSS_BLOCK = BLOCKS.register("blush_moss_block", + () -> new BlushMossBlock(BlockBehaviour.Properties.copy(Blocks.MOSS_BLOCK))); + + + public static final DeferredBlock BLUSH_MOSS_CARPET = BLOCKS.register("blush_moss_carpet", + () -> new BlushMossCarpetBlock(BlockBehaviour.Properties.copy(Blocks.MOSS_CARPET).noOcclusion())); + + + public static final DeferredBlock DREAM_TORCH = BLOCKS.register("dream_torch", + () -> new DreamTorchBlock(BlockBehaviour.Properties.copy(Blocks.SOUL_TORCH))); + + + public static final DeferredBlock DREAM_WALL_TORCH = BLOCKS.register("dream_wall_torch", + () -> new DreamWallTorchBlock(BlockBehaviour.Properties.copy(Blocks.SOUL_WALL_TORCH))); + public static final DeferredBlock DREAM_CEILING_TORCH = BLOCKS.register("dream_ceiling_torch", + () -> new com.craisinlord.antarchy.content.block.DreamCeilingTorchBlock(BlockBehaviour.Properties.copy(Blocks.SOUL_TORCH))); + + + public static final DeferredBlock DREAM_LANTERN = BLOCKS.register("dream_lantern", + () -> new net.minecraft.world.level.block.LanternBlock(BlockBehaviour.Properties.copy(Blocks.SOUL_LANTERN))); + + + public static final DeferredBlock DREAM_CAMPFIRE = BLOCKS.register("dream_campfire", + () -> new DreamCampfireBlock(BlockBehaviour.Properties.copy(Blocks.SOUL_CAMPFIRE))); + + + public static final DeferredBlock DREAM_FIRE = BLOCKS.register("dream_fire", + () -> new DreamFireBlock(BlockBehaviour.Properties.copy(Blocks.SOUL_FIRE))); + + + public static final DeferredBlock DREAM_CEILING_FIRE = BLOCKS.register("dream_fire_ceiling", + () -> new DreamCeilingFireBlock(BlockBehaviour.Properties.copy(Blocks.SOUL_FIRE))); + + + public static final DeferredBlock BED_BUG_EGG = BLOCKS.register("bed_bug_egg", + () -> new BedBugEggBlock(BlockBehaviour.Properties.of() + .strength(0.15F) + .sound(SoundType.METAL) + .randomTicks() + .noOcclusion() + .noCollission() + .replaceable())); + + + public static final DeferredBlock CREEPING_HORROR_EGG = BLOCKS.register("creeping_horror_egg", + () -> new CreepingHorrorEggBlock(BlockBehaviour.Properties.copy(Blocks.TURTLE_EGG))); + + + public static final DeferredBlock JUMPY_BUG_EGG = BLOCKS.register("jumpy_bug_egg", + () -> new JumpyBugEggBlock(BlockBehaviour.Properties.copy(Blocks.TURTLE_EGG))); + + + public static final DeferredBlock SPIT_BUG_EGG = BLOCKS.register("spit_bug_egg", + () -> new SpitBugEggBlock(BlockBehaviour.Properties.copy(Blocks.TURTLE_EGG))); + + + public static final DeferredBlock JERRY_EGG = BLOCKS.register("jerry_egg", + () -> new JerryEggBlock(BlockBehaviour.Properties.copy(Blocks.TURTLE_EGG).randomTicks())); + + + public static final DeferredBlock LURKING_TERROR_EGG = BLOCKS.register("lurking_terror_egg", + () -> new LurkingTerrorEggBlock(BlockBehaviour.Properties.copy(Blocks.TURTLE_EGG))); + + + static { + BiowartBlock.bindTendrils(BIOWART_TENDRILS); + } + + + public static final DeferredBlock WASP_NEST = BLOCKS.register("wasp_nest", + () -> new WaspNestBlock(AntarchyFabricBlocks::waspNestBlockEntityType, BlockBehaviour.Properties.copy(Blocks.BEE_NEST))); + + + public static final DeferredBlock OURANWOOD_SQUIRREL_NEST = BLOCKS.register("ouranwood_squirrel_nest", + () -> new com.craisinlord.antarchy.content.block.OuranwoodSquirrelNestBlock(BlockBehaviour.Properties.copy(Blocks.COARSE_DIRT).noLootTable())); + + + public static final DeferredBlock BRUTALFLY_COCOON_SPAWNER = BLOCKS.register("brutalfly_cocoon_spawner", + () -> new com.craisinlord.antarchy.content.block.BrutalflyCocoonSpawnerBlock(BlockBehaviour.Properties.of().noCollission().instabreak().noLootTable())); + + + public static final DeferredBlock HUSHWEED = BLOCKS.register("hushweed", + () -> new HushweedBlock(BlockBehaviour.Properties.copy(Blocks.AZALEA).noCollission().noOcclusion())); + + + public static final DeferredBlock HANGING_CREEPROOTS = BLOCKS.register("hanging_creeproots", + () -> new HangingCreeprootsBlock(BlockBehaviour.Properties.copy(Blocks.HANGING_ROOTS))); + + + public static final DeferredBlock MOLTING_VINES = BLOCKS.register("molting_vines", + () -> new MoltingVinesBlock(BlockBehaviour.Properties.copy(Blocks.WEEPING_VINES))); + + + public static final DeferredBlock BILE_BLOCK = BLOCKS.register("bile", + () -> new BileLiquidBlock((net.minecraft.world.level.material.FlowingFluid) AntarchyFabricMisc.BILE.get(), BlockBehaviour.Properties.copy(Blocks.WATER).lightLevel(state -> 5).noLootTable())); + + + public static final DeferredBlock ICHOR_BLOCK = BLOCKS.register("ichor", + () -> new LiquidBlock((net.minecraft.world.level.material.FlowingFluid) AntarchyFabricMisc.ICHOR.get(), BlockBehaviour.Properties.copy(Blocks.WATER).noLootTable())); + + + public static final DeferredBlock ANTIWATER_BLOCK = BLOCKS.register("antiwater", + () -> new AntiwaterLiquidBlock((net.minecraft.world.level.material.FlowingFluid) AntarchyFabricMisc.ANTIWATER.get(), + BlockBehaviour.Properties.copy(Blocks.WATER).noLootTable())); + + + public static final DeferredBlock LUMEN_BLOCK = BLOCKS.register("lumen", + () -> new LumenLiquidBlock((net.minecraft.world.level.material.FlowingFluid) AntarchyFabricMisc.LUMEN.get(), + BlockBehaviour.Properties.copy(Blocks.WATER).lightLevel(state -> 9).noLootTable())); + + + public static final DeferredBlock LUMEN_FROGLIGHT = BLOCKS.register("lumen_froglight", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.OCHRE_FROGLIGHT))); + + + public static final DeferredBlock ROSEATE_FROGLIGHT = BLOCKS.register("roseate_froglight", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.OCHRE_FROGLIGHT))); + + + public static final DeferredBlock RED_ANT_NEST = BLOCKS.register("red_ant_nest", + () -> new AntNestBlock( + AntarchyFabricEntities.RED_ANT, + AntarchyFabricBlocks::antNestBlockEntityType, + true, + BlockBehaviour.Properties.copy(Blocks.MAGMA_BLOCK).lightLevel(state -> 3).noLootTable() + )); + + + public static final DeferredBlock BROWN_ANT_NEST = BLOCKS.register("brown_ant_nest", + () -> new AntNestBlock(AntarchyFabricEntities.BROWN_ANT, AntarchyFabricBlocks::antNestBlockEntityType, BlockBehaviour.Properties.copy(Blocks.DIRT).noLootTable())); + + + public static final DeferredBlock RAINBOW_ANT_NEST = BLOCKS.register("rainbow_ant_nest", + () -> new AntNestBlock(AntarchyFabricEntities.RAINBOW_ANT, AntarchyFabricBlocks::antNestBlockEntityType, BlockBehaviour.Properties.copy(Blocks.DIRT).noLootTable())); + + + public static final DeferredBlock TERMITE_NEST = BLOCKS.register("termite_nest", + () -> new AntNestBlock(AntarchyFabricEntities.TERMITE, AntarchyFabricBlocks::antNestBlockEntityType, BlockBehaviour.Properties.copy(Blocks.DIRT).noLootTable())); + + + public static final DeferredBlock URANIUM_ORE = BLOCKS.register("uranium_ore", + () -> createOre(Blocks.EMERALD_ORE, 4, 8, MapColor.COLOR_YELLOW)); + + + public static final DeferredBlock DEEPSLATE_URANIUM_ORE = BLOCKS.register("deepslate_uranium_ore", + () -> createOre(Blocks.DEEPSLATE_EMERALD_ORE, 4, 8, MapColor.COLOR_YELLOW)); + + + public static final DeferredBlock TITANIUM_ORE = BLOCKS.register("titanium_ore", + () -> createOre(Blocks.DIAMOND_ORE, 4, 8, MapColor.COLOR_LIGHT_BLUE)); + + + public static final DeferredBlock DEEPSLATE_TITANIUM_ORE = BLOCKS.register("deepslate_titanium_ore", + () -> createOre(Blocks.DEEPSLATE_DIAMOND_ORE, 4, 8, MapColor.COLOR_LIGHT_BLUE)); + + + public static final DeferredBlock BLUESTONE_ORE = BLOCKS.register("bluestone_ore", + () -> new BluestoneOreBlock(BlockBehaviour.Properties.copy(Blocks.REDSTONE_ORE).mapColor(MapColor.COLOR_BLUE))); + + + public static final DeferredBlock BLUESTONE_WIRE = BLOCKS.register("bluestone_wire", + () -> new BluestoneWireBlock(BlockBehaviour.Properties.copy(Blocks.REDSTONE_WIRE).mapColor(MapColor.COLOR_BLUE).noCollission().instabreak())); + + + public static final DeferredBlock BLUESTONE_BLOCK = BLOCKS.register("bluestone_block", + () -> new BluestoneBlock(BlockBehaviour.Properties.copy(Blocks.REDSTONE_BLOCK).mapColor(MapColor.COLOR_BLUE))); + public static final DeferredBlock BLUESTONE_REPEATER = BLOCKS.register("bluestone_repeater", + () -> new BluestoneRepeaterBlock(BlockBehaviour.Properties.copy(Blocks.REPEATER).mapColor(MapColor.COLOR_BLUE).noCollission())); + public static final DeferredBlock BLUESTONE_COMPARATOR = BLOCKS.register("bluestone_comparator", + () -> new BluestoneComparatorBlock(BlockBehaviour.Properties.copy(Blocks.COMPARATOR).mapColor(MapColor.COLOR_BLUE).noCollission(), AntarchyFabricBlocks::bluestoneComparatorBlockEntityType)); + public static final DeferredBlock BLUESTONE_TORCH = BLOCKS.register("bluestone_torch", + () -> new BluestoneTorchBlock(BlockBehaviour.Properties.copy(Blocks.REDSTONE_TORCH).mapColor(MapColor.COLOR_BLUE).lightLevel(state -> state.getValue(BluestoneTorchBlock.LIT) ? 7 : 0).noCollission().instabreak())); + + + public static final DeferredBlock URANIUM_BLOCK = BLOCKS.register("uranium_block", + () -> createStorageBlock(Blocks.EMERALD_BLOCK, MapColor.COLOR_YELLOW)); + + + public static final DeferredBlock TITANIUM_BLOCK = BLOCKS.register("titanium_block", + () -> createStorageBlock(Blocks.DIAMOND_BLOCK, MapColor.COLOR_LIGHT_BLUE)); + + + public static final DeferredBlock RAW_URANIUM_BLOCK = BLOCKS.register("raw_uranium_block", + () -> createRawStorageBlock(Blocks.EMERALD_ORE, MapColor.COLOR_YELLOW)); + + + public static final DeferredBlock RAW_TITANIUM_BLOCK = BLOCKS.register("raw_titanium_block", + () -> createRawStorageBlock(Blocks.DIAMOND_ORE, MapColor.COLOR_LIGHT_BLUE)); + + + public static final DeferredBlock CUT_URANIUM = BLOCKS.register("cut_uranium", + () -> createHorizontalFacingStorageBlock(Blocks.CUT_COPPER, MapColor.COLOR_YELLOW)); + + + public static final DeferredBlock CUT_TITANIUM = BLOCKS.register("cut_titanium", + () -> createHorizontalFacingStorageBlock(Blocks.CUT_COPPER, MapColor.COLOR_LIGHT_BLUE)); + + + public static final DeferredBlock CUT_URANIUM_SLAB = BLOCKS.register("cut_uranium_slab", + () -> new net.minecraft.world.level.block.SlabBlock(BlockBehaviour.Properties.copy(Blocks.CUT_COPPER_SLAB).mapColor(MapColor.COLOR_YELLOW))); + + + public static final DeferredBlock CUT_TITANIUM_SLAB = BLOCKS.register("cut_titanium_slab", + () -> new net.minecraft.world.level.block.SlabBlock(BlockBehaviour.Properties.copy(Blocks.CUT_COPPER_SLAB).mapColor(MapColor.COLOR_LIGHT_BLUE))); + + + public static final DeferredBlock CUT_URANIUM_STAIRS = BLOCKS.register("cut_uranium_stairs", + () -> new net.minecraft.world.level.block.StairBlock(CUT_URANIUM.get().defaultBlockState(), BlockBehaviour.Properties.copy(Blocks.CUT_COPPER_STAIRS).mapColor(MapColor.COLOR_YELLOW))); + + + public static final DeferredBlock CUT_TITANIUM_STAIRS = BLOCKS.register("cut_titanium_stairs", + () -> new net.minecraft.world.level.block.StairBlock(CUT_TITANIUM.get().defaultBlockState(), BlockBehaviour.Properties.copy(Blocks.CUT_COPPER_STAIRS).mapColor(MapColor.COLOR_LIGHT_BLUE))); + + + public static final DeferredBlock CHISELED_URANIUM = BLOCKS.register("chiseled_uranium", + () -> createHorizontalFacingStorageBlock(Blocks.CHISELED_STONE_BRICKS, MapColor.COLOR_YELLOW)); + + + public static final DeferredBlock CHISELED_TITANIUM = BLOCKS.register("chiseled_titanium", + () -> createHorizontalFacingStorageBlock(Blocks.CHISELED_STONE_BRICKS, MapColor.COLOR_LIGHT_BLUE)); + + + public static final DeferredBlock URANIUM_BULB = BLOCKS.register("uranium_bulb", + () -> new SignalSavingBulbBlock(BlockBehaviour.Properties.copy(Blocks.REDSTONE_LAMP).mapColor(MapColor.COLOR_YELLOW))); + + + public static final DeferredBlock TITANIUM_BULB = BLOCKS.register("titanium_bulb", + () -> new SignalSavingBulbBlock(BlockBehaviour.Properties.copy(Blocks.REDSTONE_LAMP).mapColor(MapColor.COLOR_LIGHT_BLUE))); + + + public static final DeferredBlock URANIUM_DOOR = BLOCKS.register("uranium_door", + () -> new net.minecraft.world.level.block.DoorBlock(BlockBehaviour.Properties.copy(Blocks.IRON_DOOR).mapColor(MapColor.COLOR_YELLOW), net.minecraft.world.level.block.state.properties.BlockSetType.IRON)); + + + public static final DeferredBlock TITANIUM_DOOR = BLOCKS.register("titanium_door", + () -> new net.minecraft.world.level.block.DoorBlock(BlockBehaviour.Properties.copy(Blocks.IRON_DOOR).mapColor(MapColor.COLOR_LIGHT_BLUE), net.minecraft.world.level.block.state.properties.BlockSetType.IRON)); + + + public static final DeferredBlock URANIUM_TRAPDOOR = BLOCKS.register("uranium_trapdoor", + () -> new net.minecraft.world.level.block.TrapDoorBlock(BlockBehaviour.Properties.copy(Blocks.IRON_TRAPDOOR).mapColor(MapColor.COLOR_YELLOW), net.minecraft.world.level.block.state.properties.BlockSetType.IRON)); + + + public static final DeferredBlock TITANIUM_TRAPDOOR = BLOCKS.register("titanium_trapdoor", + () -> new net.minecraft.world.level.block.TrapDoorBlock(BlockBehaviour.Properties.copy(Blocks.IRON_TRAPDOOR).mapColor(MapColor.COLOR_LIGHT_BLUE), net.minecraft.world.level.block.state.properties.BlockSetType.IRON)); + + + public static final DeferredBlock URANIUM_BARS = BLOCKS.register("uranium_bars", + () -> new net.minecraft.world.level.block.IronBarsBlock(BlockBehaviour.Properties.copy(Blocks.IRON_BARS).mapColor(MapColor.COLOR_YELLOW))); + + + public static final DeferredBlock TITANIUM_BARS = BLOCKS.register("titanium_bars", + () -> new net.minecraft.world.level.block.IronBarsBlock(BlockBehaviour.Properties.copy(Blocks.IRON_BARS).mapColor(MapColor.COLOR_LIGHT_BLUE))); + + + public static final DeferredBlock ANTIMETAL = BLOCKS.register("antimetal", + () -> new net.minecraft.world.level.block.RotatedPillarBlock(BlockBehaviour.Properties.copy(Blocks.BASALT))); + + + public static final DeferredBlock POLISHED_ANTIMETAL = BLOCKS.register("polished_antimetal", + () -> new net.minecraft.world.level.block.RotatedPillarBlock(BlockBehaviour.Properties.copy(Blocks.POLISHED_BASALT))); + + + public static final DeferredBlock ANTIMETAL_SCAFFOLDING = BLOCKS.register("antimetal_scaffolding", + () -> new com.craisinlord.antarchy.content.block.AntimetalScaffoldingBlock(BlockBehaviour.Properties.copy(Blocks.SCAFFOLDING))); + + + public static final DeferredBlock ANTIMETAL_RAIL = BLOCKS.register("antimetal_rail", + () -> new com.craisinlord.antarchy.content.block.AntimetalRailBlock(BlockBehaviour.Properties.copy(Blocks.RAIL))); + + + public static final DeferredBlock ANTIMETAL_POWERED_RAIL = BLOCKS.register("antimetal_powered_rail", + () -> new com.craisinlord.antarchy.content.block.AntimetalPoweredRailBlock(BlockBehaviour.Properties.copy(Blocks.POWERED_RAIL))); + + + public static final DeferredBlock ANTIMETAL_DETECTOR_RAIL = BLOCKS.register("antimetal_detector_rail", + () -> new com.craisinlord.antarchy.content.block.AntimetalDetectorRailBlock(BlockBehaviour.Properties.copy(Blocks.DETECTOR_RAIL))); + + + public static final DeferredBlock ANTIMETAL_ACTIVATOR_RAIL = BLOCKS.register("antimetal_activator_rail", + () -> new com.craisinlord.antarchy.content.block.AntimetalActivatorRailBlock(BlockBehaviour.Properties.copy(Blocks.ACTIVATOR_RAIL))); + + + public static final DeferredBlock CORNEA_STALK = BLOCKS.register("cornea_stalk", + () -> new CorneaStalkBlock(BlockBehaviour.Properties.copy(Blocks.SWEET_BERRY_BUSH).randomTicks())); + + + public static final DeferredBlock GLOWCAP_MUSHROOM = BLOCKS.register("glowcap_mushroom", + () -> new com.craisinlord.antarchy.content.block.GlowcapMushroomBlock(BlockBehaviour.Properties.copy(Blocks.RED_MUSHROOM).lightLevel(state -> 12).randomTicks())); + public static final DeferredBlock POTTED_GLOWCAP_MUSHROOM = BLOCKS.register("potted_glowcap_mushroom", + () -> new net.minecraft.world.level.block.FlowerPotBlock(GLOWCAP_MUSHROOM.get(), BlockBehaviour.Properties.copy(Blocks.POTTED_DANDELION).lightLevel(state -> 12))); + + + public static final DeferredBlock GLOWCAP_MUSHROOM_BLOCK = BLOCKS.register("glowcap_mushroom_block", + () -> new net.minecraft.world.level.block.HugeMushroomBlock(BlockBehaviour.Properties.copy(Blocks.RED_MUSHROOM_BLOCK).lightLevel(state -> 13))); + + + public static final DeferredBlock CORN_CROP = BLOCKS.register("corn_crop", + () -> new CornCropBlock(BlockBehaviour.Properties.copy(Blocks.WHEAT).randomTicks().noCollission().noOcclusion())); + + + public static final DeferredBlock WILD_CORN = BLOCKS.register("wild_corn", + () -> new WildCornBlock(BlockBehaviour.Properties.copy(Blocks.WHEAT).noCollission().noOcclusion())); + + + public static final DeferredBlock FALLEN_KING_CROWN_BLOCK = BLOCKS.register("fallen_king_crown", + () -> new Block(BlockBehaviour.Properties.of() + .strength(0.2F) + .sound(SoundType.METAL) + .noOcclusion() + .isSuffocating((state, level, pos) -> false) + .isViewBlocking((state, level, pos) -> false))); + + + public static final DeferredBlock SMALL_BLOOD_CRYSTAL_BUD = BLOCKS.register("small_blood_crystal_bud", + () -> new AmethystClusterBlock(3, 4, BlockBehaviour.Properties.copy(Blocks.SMALL_AMETHYST_BUD))); + + + public static final DeferredBlock MEDIUM_BLOOD_CRYSTAL_BUD = BLOCKS.register("medium_blood_crystal_bud", + () -> new AmethystClusterBlock(4, 3, BlockBehaviour.Properties.copy(Blocks.MEDIUM_AMETHYST_BUD))); + + + public static final DeferredBlock LARGE_BLOOD_CRYSTAL_BUD = BLOCKS.register("large_blood_crystal_bud", + () -> new AmethystClusterBlock(5, 3, BlockBehaviour.Properties.copy(Blocks.LARGE_AMETHYST_BUD))); + + + public static final DeferredBlock BUDDING_BLOOD_CRYSTAL = BLOCKS.register("budding_blood_crystal", + () -> new BuddingBloodCrystalBlock( + BlockBehaviour.Properties.copy(Blocks.BUDDING_AMETHYST), + AntarchyFabricBlocks::smallBloodCrystalBudBlock, + AntarchyFabricBlocks::mediumBloodCrystalBudBlock, + AntarchyFabricBlocks::largeBloodCrystalBudBlock, + AntarchyFabricBlocks::bloodCrystalCrystalBlock + )); + + + public static final DeferredBlock BLOOD_CRYSTAL = BLOCKS.register("blood_crystal_block", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.AMETHYST_BLOCK))); + + + public static final DeferredBlock BLOOD_CRYSTAL_CRYSTAL = BLOCKS.register("blood_crystal_cluster", + () -> new AmethystClusterBlock(7, 3, BlockBehaviour.Properties.copy(Blocks.AMETHYST_CLUSTER))); + + + public static final DeferredBlock DREAM_SAND = BLOCKS.register("dream_sand", + () -> new DreamSandBlock(BlockBehaviour.Properties.copy(Blocks.SAND))); + + + public static final DeferredBlock DREAM_SANDSTONE = BLOCKS.register("dream_sandstone", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.SANDSTONE))); + + + public static final DeferredBlock CHISELED_DREAM_SANDSTONE = BLOCKS.register("chiseled_dream_sandstone", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.CHISELED_SANDSTONE))); + + + public static final DeferredBlock CUT_DREAM_SANDSTONE = BLOCKS.register("cut_dream_sandstone", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.CUT_SANDSTONE))); + + + public static final DeferredBlock SMOOTH_DREAM_SANDSTONE = BLOCKS.register("smooth_dream_sandstone", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.SMOOTH_SANDSTONE))); + + + public static final DeferredBlock DREAM_SANDSTONE_STAIRS = BLOCKS.register("dream_sandstone_stairs", + () -> new net.minecraft.world.level.block.StairBlock(DREAM_SANDSTONE.get().defaultBlockState(), BlockBehaviour.Properties.copy(Blocks.SANDSTONE_STAIRS))); + + + public static final DeferredBlock DREAM_SANDSTONE_SLAB = BLOCKS.register("dream_sandstone_slab", + () -> new net.minecraft.world.level.block.SlabBlock(BlockBehaviour.Properties.copy(Blocks.SANDSTONE_SLAB))); + + + public static final DeferredBlock DREAM_SANDSTONE_WALL = BLOCKS.register("dream_sandstone_wall", + () -> new net.minecraft.world.level.block.WallBlock(BlockBehaviour.Properties.copy(Blocks.SANDSTONE_WALL))); + + + public static final DeferredBlock SMOOTH_DREAM_SANDSTONE_STAIRS = BLOCKS.register("smooth_dream_sandstone_stairs", + () -> new net.minecraft.world.level.block.StairBlock(SMOOTH_DREAM_SANDSTONE.get().defaultBlockState(), BlockBehaviour.Properties.copy(Blocks.SMOOTH_SANDSTONE_STAIRS))); + + + public static final DeferredBlock SMOOTH_DREAM_SANDSTONE_SLAB = BLOCKS.register("smooth_dream_sandstone_slab", + () -> new net.minecraft.world.level.block.SlabBlock(BlockBehaviour.Properties.copy(Blocks.SMOOTH_SANDSTONE_SLAB))); + + + public static final DeferredBlock CUT_DREAM_SANDSTONE_SLAB = BLOCKS.register("cut_dream_sandstone_slab", + () -> new net.minecraft.world.level.block.SlabBlock(BlockBehaviour.Properties.copy(Blocks.CUT_SANDSTONE_SLAB))); + + + public static final DeferredBlock DEAD_STAR_CORAL_BLOCK = BLOCKS.register("dead_star_coral_block", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.TUBE_CORAL_BLOCK))); + + + public static final DeferredBlock DEAD_STAR_CORAL = BLOCKS.register("dead_star_coral", + () -> new net.minecraft.world.level.block.BaseCoralPlantBlock(BlockBehaviour.Properties.copy(Blocks.TUBE_CORAL))); + + + public static final DeferredBlock DEAD_STAR_CORAL_FAN = BLOCKS.register("dead_star_coral_fan", + () -> new net.minecraft.world.level.block.BaseCoralFanBlock(BlockBehaviour.Properties.copy(Blocks.TUBE_CORAL_FAN))); + + + public static final DeferredBlock DEAD_STAR_CORAL_WALL_FAN = BLOCKS.register("dead_star_coral_wall_fan", + () -> new net.minecraft.world.level.block.BaseCoralWallFanBlock(BlockBehaviour.Properties.copy(Blocks.TUBE_CORAL_WALL_FAN))); + + + public static final DeferredBlock STAR_CORAL_BLOCK = BLOCKS.register("star_coral_block", + () -> new StarCoralBlock(DEAD_STAR_CORAL_BLOCK.get(), BlockBehaviour.Properties.copy(Blocks.TUBE_CORAL_BLOCK).lightLevel(state -> 8))); + + + public static final DeferredBlock STAR_CORAL = BLOCKS.register("star_coral", + () -> new StarCoralPlantBlock(DEAD_STAR_CORAL.get(), BlockBehaviour.Properties.copy(Blocks.TUBE_CORAL).lightLevel(state -> 8))); + + + public static final DeferredBlock STAR_CORAL_FAN = BLOCKS.register("star_coral_fan", + () -> new StarCoralFanBlock(DEAD_STAR_CORAL_FAN.get(), BlockBehaviour.Properties.copy(Blocks.TUBE_CORAL_FAN).lightLevel(state -> 8))); + + + public static final DeferredBlock STAR_CORAL_WALL_FAN = BLOCKS.register("star_coral_wall_fan", + () -> new StarCoralWallFanBlock(DEAD_STAR_CORAL_WALL_FAN.get(), BlockBehaviour.Properties.copy(Blocks.TUBE_CORAL_WALL_FAN).lightLevel(state -> 8))); + + + public static final DeferredHolder, BlockEntityType> ANT_NEST_BLOCK_ENTITY = BLOCK_ENTITY_TYPES.register("ant_nest", + () -> BlockEntityType.Builder.of( + AntNestBlockEntity::new, + RED_ANT_NEST.get(), + BROWN_ANT_NEST.get(), + RAINBOW_ANT_NEST.get(), + TERMITE_NEST.get() + ).build(null)); + + + public static final DeferredHolder, BlockEntityType> DREAM_CAMPFIRE_BLOCK_ENTITY = BLOCK_ENTITY_TYPES.register("dream_campfire", + () -> BlockEntityType.Builder.of( + DreamCampfireBlockEntity::new, + DREAM_CAMPFIRE.get() + ).build(null)); + + + public static final DeferredHolder, BlockEntityType> WASP_NEST_BLOCK_ENTITY = BLOCK_ENTITY_TYPES.register("wasp_nest", + () -> BlockEntityType.Builder.of( + WaspNestBlockEntity::new, + WASP_NEST.get() + ).build(null)); + + + public static final DeferredHolder, BlockEntityType> HUSHWEED_BLOCK_ENTITY = BLOCK_ENTITY_TYPES.register("hushweed", + () -> BlockEntityType.Builder.of( + HushweedBlockEntity::new, + HUSHWEED.get() + ).build(null)); + + + public static final DeferredHolder, BlockEntityType> POTENT_NYXITE_BLOCK_ENTITY = BLOCK_ENTITY_TYPES.register("potent_nyxite", + () -> BlockEntityType.Builder.of( + (pos, state) -> new PotentNyxiteBlockEntity(pos, state, AntarchyFabricBlocks::potentNyxiteBlockEntityType), + POTENT_NYXITE.get() + ).build(null)); + public static final DeferredHolder, BlockEntityType> SEASHELL_BLOCK_ENTITY = BLOCK_ENTITY_TYPES.register("seashell", + () -> BlockEntityType.Builder.of( + SeashellBlockEntity::new, + SEASHELL.get() + ).build(null)); + public static final DeferredHolder, BlockEntityType> CRITTER_CAGE_BLOCK_ENTITY = BLOCK_ENTITY_TYPES.register("critter_cage_block", + () -> BlockEntityType.Builder.of( + CritterCageBlockEntity::new, + CRITTER_CAGE_BLOCK.get() + ).build(null)); + public static final DeferredHolder, BlockEntityType> BLUESTONE_COMPARATOR_BLOCK_ENTITY = BLOCK_ENTITY_TYPES.register("bluestone_comparator", + () -> BlockEntityType.Builder.of( + (pos, state) -> new com.craisinlord.antarchy.content.block.entity.BluestoneComparatorBlockEntity(pos, state, AntarchyFabricBlocks::bluestoneComparatorBlockEntityType), + BLUESTONE_COMPARATOR.get() + ).build(null)); + + + + private static BlockEntityType antNestBlockEntityType() { + return ANT_NEST_BLOCK_ENTITY.get(); + } + + + + private static BlockEntityType waspNestBlockEntityType() { + return WASP_NEST_BLOCK_ENTITY.get(); + } + + + + private static BlockEntityType potentNyxiteBlockEntityType() { + return POTENT_NYXITE_BLOCK_ENTITY.get(); + } + + private static BlockEntityType seashellBlockEntityType() { + return SEASHELL_BLOCK_ENTITY.get(); + } + + private static BlockEntityType bluestoneComparatorBlockEntityType() { + return BLUESTONE_COMPARATOR_BLOCK_ENTITY.get(); + } + + + + private static Block smallBloodCrystalBudBlock() { + return SMALL_BLOOD_CRYSTAL_BUD.get(); + } + + + + private static Block mediumBloodCrystalBudBlock() { + return MEDIUM_BLOOD_CRYSTAL_BUD.get(); + } + + + + private static Block largeBloodCrystalBudBlock() { + return LARGE_BLOOD_CRYSTAL_BUD.get(); + } + + + + private static Block bloodCrystalCrystalBlock() { + return BLOOD_CRYSTAL_CRYSTAL.get(); + } + + + + + private static Block createDirtOre(Block copyFrom) { + return new Block(dirtOreProperties()); + } + + + + private static Block createDirtOre(Block copyFrom, int minExperience, int maxExperience) { + return new DropExperienceBlock(dirtOreProperties(), UniformInt.of(minExperience, maxExperience)); + } + + + + private static BlockBehaviour.Properties dirtOreProperties() { + return BlockBehaviour.Properties.copy(Blocks.DIRT) + .sound(SoundType.ROOTED_DIRT) + .strength(0.65F, 0.8F) + .requiresCorrectToolForDrops(); + } + + + + private static BlockBehaviour.Properties nyxiteProperties() { + return BlockBehaviour.Properties.copy(Blocks.NETHERRACK); + } + + private static BlockBehaviour.Properties broodstoneProperties() { + return BlockBehaviour.Properties.copy(Blocks.DEEPSLATE).requiresCorrectToolForDrops(); + } + + + + private static BlockBehaviour.Properties portalProperties() { + return BlockBehaviour.Properties.of() + .strength(-1.0F) + .noCollission() + .noOcclusion() + .lightLevel(state -> 11) + .noLootTable() + .isSuffocating((state, level, pos) -> false) + .isViewBlocking((state, level, pos) -> false); + } + + + + private static Block createOre(Block copyFrom, MapColor mapColor) { + return new Block(BlockBehaviour.Properties.copy(copyFrom).mapColor(mapColor).requiresCorrectToolForDrops()); + } + + + + private static Block createOre(Block copyFrom, int minExperience, int maxExperience, MapColor mapColor) { + return new DropExperienceBlock(BlockBehaviour.Properties.copy(copyFrom).mapColor(mapColor).requiresCorrectToolForDrops(), UniformInt.of(minExperience, maxExperience)); + } + + + + private static Block createStorageBlock(Block copyFrom, MapColor mapColor) { + return new Block(BlockBehaviour.Properties.copy(copyFrom).mapColor(mapColor).requiresCorrectToolForDrops()); + } + + + + private static Block createHorizontalFacingStorageBlock(Block copyFrom, MapColor mapColor) { + return new SimpleHorizontalFacingBlock(BlockBehaviour.Properties.copy(copyFrom).mapColor(mapColor).requiresCorrectToolForDrops()); + } + + + + private static final class SimpleHorizontalFacingBlock extends HorizontalDirectionalBlock { + private SimpleHorizontalFacingBlock(BlockBehaviour.Properties properties) { + super(properties); + registerDefaultState(stateDefinition.any().setValue(FACING, Direction.NORTH)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()); + } + + @Override + public BlockState rotate(BlockState state, Rotation rotation) { + return state.setValue(FACING, rotation.rotate(state.getValue(FACING))); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return state.rotate(mirror.getRotation(state.getValue(FACING))); + } + } + + + + private static Block createRawStorageBlock(Block copyFrom, MapColor mapColor) { + return new Block(BlockBehaviour.Properties.copy(copyFrom).mapColor(mapColor).requiresCorrectToolForDrops()); + } + + + public static void register() { + BLOCKS.register(); + BLOCK_ENTITY_TYPES.register(); + } + +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricCreativeModeTabs.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricCreativeModeTabs.java new file mode 100644 index 00000000..334b7524 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricCreativeModeTabs.java @@ -0,0 +1,53 @@ +package com.craisinlord.antarchy.fabric.registry; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.creative.CreativeTabContents; +import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.ItemStack; + +public final class AntarchyFabricCreativeModeTabs { + + public static final DeferredRegister CREATIVE_MODE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, Antarchy.MODID); + + + + public static final DeferredHolder ANTARCHY_TAB = CREATIVE_MODE_TABS.register("antarchy", + () -> CreativeModeTab.builder(CreativeModeTab.Row.TOP, 0) + .title(net.minecraft.network.chat.Component.translatable("itemGroup.antarchy.antarchy")) + .icon(() -> new ItemStack(AntarchyFabricItems.GRAVITY_GUN.get())) + .displayItems((parameters, output) -> populateCreativeTab(output)) + .build()); + private static void populateCreativeTab(CreativeModeTab.Output output) { + CreativeTabContents.populateAntarchyTab(new CreativeTabContents.AntarchyTabOutput() { + @Override + public void accept(net.minecraft.world.level.ItemLike item) { + output.accept(item); + } + + @Override + public void accept(ItemStack stack) { + output.accept(stack); + } + }); + } + + + public static void register() { + CREATIVE_MODE_TABS.register(); + ItemGroupEvents.modifyEntriesEvent(net.minecraft.world.item.CreativeModeTabs.REDSTONE_BLOCKS).register(entries -> { + entries.accept(AntarchyFabricItems.BLUESTONE_DUST.get()); + entries.accept(AntarchyFabricItems.BLUESTONE_BLOCK_ITEM.get()); + entries.accept(AntarchyFabricItems.BLUESTONE_TORCH_ITEM.get()); + entries.accept(AntarchyFabricItems.BLUESTONE_REPEATER_ITEM.get()); + entries.accept(AntarchyFabricItems.BLUESTONE_COMPARATOR_ITEM.get()); + entries.accept(AntarchyFabricItems.BLUESTONE_ORE_ITEM.get()); + entries.accept(AntarchyFabricItems.ANTIMETAL_RAIL_ITEM.get()); + entries.accept(AntarchyFabricItems.ANTIMETAL_POWERED_RAIL_ITEM.get()); + entries.accept(AntarchyFabricItems.ANTIMETAL_DETECTOR_RAIL_ITEM.get()); + entries.accept(AntarchyFabricItems.ANTIMETAL_ACTIVATOR_RAIL_ITEM.get()); + }); + } + +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricEntities.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricEntities.java new file mode 100644 index 00000000..d9100353 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricEntities.java @@ -0,0 +1,523 @@ +package com.craisinlord.antarchy.fabric.registry; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.entity.AppleCowEntityVariants.AppleCow; +import com.craisinlord.antarchy.content.entity.AppleCowEntityVariants.EnchantedGoldenAppleCow; +import com.craisinlord.antarchy.content.entity.AppleCowEntityVariants.GoldenAppleCow; +import com.craisinlord.antarchy.content.entity.cloud_shark.CloudSharkEntity; +import com.craisinlord.antarchy.content.entity.BedBugEntity; +import com.craisinlord.antarchy.content.entity.ButterflyEntity; +import com.craisinlord.antarchy.content.entity.CaterpillarEntity; +import com.craisinlord.antarchy.content.entity.DiamondMinecartEntity; +import com.craisinlord.antarchy.content.entity.DrTrayaurusEntity; +import com.craisinlord.antarchy.content.entity.brutalfly.BrutalflyEntity; +import com.craisinlord.antarchy.content.entity.brutalfly.BrutalflyOrbEntity; +import com.craisinlord.antarchy.content.entity.EasterBunnyEntity; +import com.craisinlord.antarchy.content.entity.flying_squirrel.FlyingSquirrelEntity; +import com.craisinlord.antarchy.content.entity.ReverieEntity; +import com.craisinlord.antarchy.content.entity.MissileSquidEntity; +import com.craisinlord.antarchy.content.entity.lucid.LucidEntity; +import com.craisinlord.antarchy.content.entity.lucid.LucidBoltEntity; +import com.craisinlord.antarchy.content.entity.lucid.LucidEyeProjectileEntity; +import com.craisinlord.antarchy.content.entity.HushProjectileEntity; +import com.craisinlord.antarchy.content.entity.CritterCageProjectileEntity; +import com.craisinlord.antarchy.content.entity.JumpyBugEntity; +import com.craisinlord.antarchy.content.entity.StinkBugEntity; +import com.craisinlord.antarchy.content.entity.OuranwoodBoatEntity; +import com.craisinlord.antarchy.content.entity.OuranwoodChestBoatEntity; +import com.craisinlord.antarchy.content.entity.AlphaMantisEntity; +import com.craisinlord.antarchy.content.entity.MantisEntity; +import com.craisinlord.antarchy.content.entity.RollyPollyEntity; +import com.craisinlord.antarchy.content.entity.basilisk.BasiliskEntity; +import com.craisinlord.antarchy.content.entity.EmperorScorpionEntity; +import com.craisinlord.antarchy.content.entity.ScorpionEntity; +import com.craisinlord.antarchy.content.entity.nightmare.NightmareEntity; +import com.craisinlord.antarchy.content.entity.ToreterrorEntity; +import com.craisinlord.antarchy.content.entity.WaterBombEntity; +import com.craisinlord.antarchy.content.entity.kraken.KrakenEntity; +import com.craisinlord.antarchy.content.entity.kraken.KrakensGraspThrownTrident; +import com.craisinlord.antarchy.content.entity.kraken.TentacleEntity; +import com.craisinlord.antarchy.content.entity.OctopusBombEntity; +import com.craisinlord.antarchy.content.entity.MolevoreEntity; +import com.craisinlord.antarchy.content.entity.MolewormEntity; +import com.craisinlord.antarchy.content.entity.BomberEntity; +import com.craisinlord.antarchy.content.entity.SizeRayProjectileEntity; +import com.craisinlord.antarchy.content.entity.TriffidEntity; +import com.craisinlord.antarchy.content.entity.WaspEntity; +import com.craisinlord.antarchy.content.entity.ant.BaseAntEntity; +import com.craisinlord.antarchy.content.entity.ant.BrownAntEntity; +import com.craisinlord.antarchy.content.entity.ant.RainbowAntEntity; +import com.craisinlord.antarchy.content.entity.ant.RedAntEntity; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.entity.animal.Cow; + +public final class AntarchyFabricEntities { + + public static final DeferredRegister> ENTITY_TYPES = DeferredRegister.create(Registries.ENTITY_TYPE, Antarchy.MODID); + + + public static final DeferredHolder, EntityType> RED_ANT = ENTITY_TYPES.register("red_ant", + () -> buildAntType(RedAntEntity::new, MobCategory.CREATURE, "red_ant")); + + + public static final DeferredHolder, EntityType> BROWN_ANT = ENTITY_TYPES.register("brown_ant", + () -> buildAntType(BrownAntEntity::new, MobCategory.CREATURE, "brown_ant")); + + + public static final DeferredHolder, EntityType> RAINBOW_ANT = ENTITY_TYPES.register("rainbow_ant", + () -> buildAntType(RainbowAntEntity::new, MobCategory.CREATURE, "rainbow_ant")); + + + public static final DeferredHolder, EntityType> TERMITE = ENTITY_TYPES.register("termite", + () -> buildAntType(com.craisinlord.antarchy.content.entity.ant.TermiteEntity::new, MobCategory.CREATURE, "termite")); + + + public static final DeferredHolder, EntityType> ROLLY_POLLY = ENTITY_TYPES.register("rolly_polly", + () -> EntityType.Builder.of(RollyPollyEntity::new, MobCategory.CREATURE) + .sized(0.95F, 0.85F) + .clientTrackingRange(10) + .build("rolly_polly")); + + + public static final DeferredHolder, EntityType> MOLEWORM = ENTITY_TYPES.register("moleworm", + () -> EntityType.Builder.of(MolewormEntity::new, MobCategory.MONSTER) + .sized(0.4F, 0.3F) + .clientTrackingRange(8) + .build("moleworm")); + + + public static final DeferredHolder, EntityType> MANTIS = ENTITY_TYPES.register("mantis", + () -> EntityType.Builder.of(MantisEntity::new, MobCategory.MONSTER) + .sized(3.125F, 2.5F) + .clientTrackingRange(8) + .build("mantis")); + + + public static final DeferredHolder, EntityType> ALPHA_MANTIS = ENTITY_TYPES.register("alpha_mantis", + () -> EntityType.Builder.of(AlphaMantisEntity::new, MobCategory.MONSTER) + .sized(4.25F, 3.35F) + .clientTrackingRange(10) + .build("alpha_mantis")); + + + public static final DeferredHolder, EntityType> OURANWOOD_BOAT_ENTITY = ENTITY_TYPES.register("ouranwood_boat", + () -> EntityType.Builder.of(OuranwoodBoatEntity::new, MobCategory.MISC) + .sized(1.375F, 0.5625F) + .clientTrackingRange(10) + .updateInterval(10) + .build("ouranwood_boat")); + + + public static final DeferredHolder, EntityType> OURANWOOD_CHEST_BOAT_ENTITY = ENTITY_TYPES.register("ouranwood_chest_boat", + () -> EntityType.Builder.of(OuranwoodChestBoatEntity::new, MobCategory.MISC) + .sized(1.375F, 0.5625F) + .clientTrackingRange(10) + .updateInterval(10) + .build("ouranwood_chest_boat")); + + + public static final DeferredHolder, EntityType> PEACH_BOAT_ENTITY = ENTITY_TYPES.register("peach_boat", + () -> EntityType.Builder.of(com.craisinlord.antarchy.content.entity.PeachBoatEntity::new, MobCategory.MISC) + .sized(1.375F, 0.5625F) + .clientTrackingRange(10) + .updateInterval(10) + .build("peach_boat")); + + + public static final DeferredHolder, EntityType> PEACH_CHEST_BOAT_ENTITY = ENTITY_TYPES.register("peach_chest_boat", + () -> EntityType.Builder.of(com.craisinlord.antarchy.content.entity.PeachChestBoatEntity::new, MobCategory.MISC) + .sized(1.375F, 0.5625F) + .clientTrackingRange(10) + .updateInterval(10) + .build("peach_chest_boat")); + + + public static final DeferredHolder, EntityType> MOLEVORE = ENTITY_TYPES.register("molevore", + () -> EntityType.Builder.of(MolevoreEntity::new, MobCategory.MONSTER) + .sized(1.95F, 1.1F) + .clientTrackingRange(10) + .build("molevore")); + + + public static final DeferredHolder, EntityType> TRIFFID = ENTITY_TYPES.register("triffid", + () -> EntityType.Builder.of(TriffidEntity::new, MobCategory.MONSTER) + .sized(2.0F, 5.0F) + .clientTrackingRange(10) + .build("triffid")); + + + public static final DeferredHolder, EntityType> BED_BUG = ENTITY_TYPES.register("bed_bug", + () -> EntityType.Builder.of(BedBugEntity::new, MobCategory.CREATURE) + .sized(1.15F, 0.8F) + .clientTrackingRange(8) + .build("bed_bug")); + + + public static final DeferredHolder, EntityType> STINK_BUG = ENTITY_TYPES.register("stink_bug", + () -> EntityType.Builder.of(StinkBugEntity::new, MobCategory.CREATURE) + .sized(0.35F, 0.2F) + .clientTrackingRange(8) + .build("stink_bug")); + + + public static final DeferredHolder, EntityType> WASP = ENTITY_TYPES.register("wasp", + () -> EntityType.Builder.of(WaspEntity::new, MobCategory.MONSTER) + .sized(0.8625F, 1.365F) + .clientTrackingRange(8) + .build("wasp")); + + + public static final DeferredHolder, EntityType> BOMBER = ENTITY_TYPES.register("bomber", + () -> EntityType.Builder.of(BomberEntity::new, MobCategory.MONSTER) + .sized(0.55F, 0.75F) + .clientTrackingRange(8) + .build("bomber")); + + + public static final DeferredHolder, EntityType> JUMPY_BUG = ENTITY_TYPES.register("jumpy_bug", + () -> EntityType.Builder.of(JumpyBugEntity::new, MobCategory.MONSTER) + .sized(3.0F, 6.0F) + .clientTrackingRange(8) + .build("jumpy_bug")); + + + public static final DeferredHolder, EntityType> SPIT_BUG = ENTITY_TYPES.register("spit_bug", + () -> EntityType.Builder.of(com.craisinlord.antarchy.content.entity.SpitBugEntity::new, MobCategory.MONSTER) + .sized(2.5F, 3.0F) + .clientTrackingRange(10) + .build("spit_bug")); + + + public static final DeferredHolder, EntityType> SPIT_BUG_PROJECTILE = ENTITY_TYPES.register("spit_bug_projectile", + () -> EntityType.Builder.of(com.craisinlord.antarchy.content.entity.SpitBugProjectileEntity::new, MobCategory.MISC) + .sized(0.5F, 0.5F) + .clientTrackingRange(8) + .updateInterval(1) + .build("spit_bug_projectile")); + + + public static final DeferredHolder, EntityType> SHRINK_RAY_PROJECTILE = ENTITY_TYPES.register("shrink_ray_projectile", + () -> EntityType.Builder.of(SizeRayProjectileEntity::createShrink, MobCategory.MISC) + .sized(0.5F, 0.5F) + .clientTrackingRange(8) + .updateInterval(1) + .build("shrink_ray_projectile")); + + + public static final DeferredHolder, EntityType> GROWTH_RAY_PROJECTILE = ENTITY_TYPES.register("growth_ray_projectile", + () -> EntityType.Builder.of(SizeRayProjectileEntity::createGrowth, MobCategory.MISC) + .sized(0.5F, 0.5F) + .clientTrackingRange(8) + .updateInterval(1) + .build("growth_ray_projectile")); + + + public static final DeferredHolder, EntityType> DIAMOND_MINECART = ENTITY_TYPES.register("diamond_minecart", + () -> EntityType.Builder.of((entityType, level) -> new DiamondMinecartEntity(entityType, level, AntarchyFabricItems.diamondMinecartItem()), MobCategory.MISC) + .sized(0.98F, 0.7F) + .clientTrackingRange(8) + .build("diamond_minecart")); + + + + public static final DeferredHolder, EntityType> EASTER_BUNNY = ENTITY_TYPES.register("easter_bunny", + () -> EntityType.Builder.of(EasterBunnyEntity::new, MobCategory.CREATURE) + .sized(0.5F, 1.0F) + .clientTrackingRange(8) + .build("easter_bunny")); + + + public static final DeferredHolder, EntityType> FLYING_SQUIRREL = ENTITY_TYPES.register("flying_squirrel", + () -> EntityType.Builder.of(FlyingSquirrelEntity::new, MobCategory.CREATURE) + .sized(0.6F, 0.7F) + .clientTrackingRange(8) + .build("flying_squirrel")); + + + public static final DeferredHolder, EntityType> CATERPILLAR = ENTITY_TYPES.register("caterpillar", + () -> EntityType.Builder.of(CaterpillarEntity::new, MobCategory.CREATURE) + .sized(0.8775F, 0.585F) + .clientTrackingRange(8) + .build("caterpillar")); + + + public static final DeferredHolder, EntityType> BUTTERFLY = ENTITY_TYPES.register("butterfly", + () -> EntityType.Builder.of(ButterflyEntity::new, MobCategory.AMBIENT) + .sized(1.125F, 0.6875F) + .clientTrackingRange(8) + .build("butterfly")); + + + public static final DeferredHolder, EntityType> REVERIE = ENTITY_TYPES.register("reverie", + () -> EntityType.Builder.of(ReverieEntity::new, MobCategory.AMBIENT) + .sized(0.7F, 0.7F) + .clientTrackingRange(8) + .build("reverie")); + + + public static final DeferredHolder, EntityType> BRUTALFLY = ENTITY_TYPES.register("brutalfly", + () -> EntityType.Builder.of(BrutalflyEntity::new, MobCategory.MONSTER) + .sized(2.4F, 2.1F) + .clientTrackingRange(12) + .build("brutalfly")); + + + public static final DeferredHolder, EntityType> APPLE_COW = ENTITY_TYPES.register("apple_cow", + () -> buildCowType(AppleCow::new, "apple_cow")); + + + public static final DeferredHolder, EntityType> GOLDEN_APPLE_COW = ENTITY_TYPES.register("golden_apple_cow", + () -> buildCowType(GoldenAppleCow::new, "golden_apple_cow")); + + + public static final DeferredHolder, EntityType> ENCHANTED_GOLDEN_APPLE_COW = ENTITY_TYPES.register("enchanted_golden_apple_cow", + () -> buildCowType(EnchantedGoldenAppleCow::new, "enchanted_golden_apple_cow")); + + + public static final DeferredHolder, EntityType> DR_TRAYAURUS = ENTITY_TYPES.register("dr_trayaurus", + () -> EntityType.Builder.of(DrTrayaurusEntity::new, MobCategory.MISC) + .sized(0.6F, 1.95F) + .clientTrackingRange(10) + .build("dr_trayaurus")); + + + public static final DeferredHolder, EntityType> CLOUD_SHARK = ENTITY_TYPES.register("cloud_shark", + () -> EntityType.Builder.of(CloudSharkEntity::new, MobCategory.MONSTER) + .sized(2.4F, 0.9F) + .clientTrackingRange(10) + .build("cloud_shark")); + + + public static final DeferredHolder, EntityType> KRAKEN = ENTITY_TYPES.register("kraken", + () -> EntityType.Builder.of(KrakenEntity::new, MobCategory.MONSTER) + .sized(11.4F, 39.0F) + .clientTrackingRange(12) + .build("kraken")); + + + public static final DeferredHolder, EntityType> KRAKEN_PART = ENTITY_TYPES.register("kraken_part", + () -> EntityType.Builder.of( + com.craisinlord.antarchy.fabric.entity.multipart.MultipartPartEntity::new, + MobCategory.MISC + ) + .sized(1.0F, 1.0F) + .clientTrackingRange(12) + .updateInterval(1) + .build("kraken_part")); + + + public static final DeferredHolder, EntityType> MISSILE_SQUID = ENTITY_TYPES.register("missile_squid", + () -> EntityType.Builder.of(MissileSquidEntity::new, MobCategory.MONSTER) + .sized(1.62F, 3.18F) + .clientTrackingRange(10) + .build("missile_squid")); + + + public static final DeferredHolder, EntityType> OCTOPUS_BOMB = ENTITY_TYPES.register("octopus_bomb", + () -> EntityType.Builder.of(OctopusBombEntity::new, MobCategory.WATER_CREATURE) + .sized(2.4F, 2.9F) + .clientTrackingRange(10) + .build("octopus_bomb")); + + + public static final DeferredHolder, EntityType> NIGHTMARE = ENTITY_TYPES.register("nightmare", + () -> EntityType.Builder.of(NightmareEntity::new, MobCategory.MONSTER) + .sized(3.2F, 3.8F) + .clientTrackingRange(12) + .build("nightmare")); + + + public static final DeferredHolder, EntityType> LUCID = ENTITY_TYPES.register("lucid", + () -> EntityType.Builder.of(LucidEntity::new, MobCategory.MONSTER) + .sized(2.0F, 2.0F) + .clientTrackingRange(10) + .build("lucid")); + + + public static final DeferredHolder, EntityType> LUCID_BOLT = ENTITY_TYPES.register("lucid_bolt", + () -> EntityType.Builder.of(LucidBoltEntity::new, MobCategory.MISC) + .sized(0.3F, 0.3F) + .clientTrackingRange(8) + .updateInterval(1) + .build("lucid_bolt")); + + public static final DeferredHolder, EntityType> KRAKENS_GRASP_TRIDENT = ENTITY_TYPES.register("krakens_grasp_trident", + () -> EntityType.Builder.of(KrakensGraspThrownTrident::new, MobCategory.MISC) + .sized(0.5F, 0.5F) + .clientTrackingRange(8) + .updateInterval(1) + .fireImmune() + .build("krakens_grasp_trident")); + + public static final DeferredHolder, EntityType> TENTACLE = ENTITY_TYPES.register("tentacle", + () -> EntityType.Builder.of(TentacleEntity::new, MobCategory.MISC) + .sized(1.2F, 4.5F) + .clientTrackingRange(10) + .build("tentacle")); + + + public static final DeferredHolder, EntityType> SCORPION = ENTITY_TYPES.register("scorpion", + () -> EntityType.Builder.of(ScorpionEntity::new, MobCategory.MONSTER) + .sized(1.5F, 1.0F) + .clientTrackingRange(8) + .build("scorpion")); + + + public static final DeferredHolder, EntityType> BASILISK = ENTITY_TYPES.register("basilisk", + () -> EntityType.Builder.of(BasiliskEntity::new, MobCategory.MONSTER) + .sized(3.0F, 3.5F) + .clientTrackingRange(14) + .build("basilisk")); + + + public static final DeferredHolder, EntityType> EMPEROR_SCORPION = ENTITY_TYPES.register("emperor_scorpion", + () -> EntityType.Builder.of(EmperorScorpionEntity::new, MobCategory.MONSTER) + .sized(6.0F, 3.0F) + .clientTrackingRange(12) + .build("emperor_scorpion")); + + + public static final DeferredHolder, EntityType> LUCID_PEARL_PROJECTILE = ENTITY_TYPES.register("lucid_pearl_projectile", + () -> EntityType.Builder.of(LucidEyeProjectileEntity::new, MobCategory.MISC) + .sized(0.25F, 0.25F) + .clientTrackingRange(8) + .updateInterval(1) + .build("lucid_pearl_projectile")); + public static final DeferredHolder, EntityType> CRITTER_CAGE_PROJECTILE = ENTITY_TYPES.register("critter_cage_projectile", + () -> EntityType.Builder.of(CritterCageProjectileEntity::new, MobCategory.MISC) + .sized(0.25F, 0.25F) + .clientTrackingRange(8) + .updateInterval(1) + .build("critter_cage_projectile")); + + + public static final DeferredHolder, EntityType> HUSH_PROJECTILE = ENTITY_TYPES.register("hush_projectile", + () -> EntityType.Builder.of(HushProjectileEntity::new, MobCategory.MISC) + .sized(0.35F, 0.35F) + .clientTrackingRange(8) + .updateInterval(1) + .build("hush_projectile")); + + + public static final DeferredHolder, EntityType> BRUTALFLY_ORB = ENTITY_TYPES.register("brutalfly_orb", + () -> EntityType.Builder.of(BrutalflyOrbEntity::new, MobCategory.MISC) + .sized(0.75F, 0.75F) + .clientTrackingRange(10) + .updateInterval(1) + .build("brutalfly_orb")); + + + public static final DeferredHolder, EntityType> UPWARD_FALLING_BLOCK = ENTITY_TYPES.register("upward_falling_block", + () -> EntityType.Builder.of( + com.craisinlord.antarchy.content.entity.UpwardFallingBlockEntity::new, MobCategory.MISC) + .sized(0.98F, 0.98F) + .clientTrackingRange(10) + .updateInterval(1) + .build("upward_falling_block")); + + + public static final DeferredHolder, EntityType> TORETERROR = ENTITY_TYPES.register("toreterror", + () -> EntityType.Builder.of(ToreterrorEntity::new, MobCategory.MONSTER) + .sized(2.0F, 3.0F) + .clientTrackingRange(14) + .build("toreterror")); + + + public static final DeferredHolder, EntityType> WATER_BOMB = ENTITY_TYPES.register("water_bomb", + () -> EntityType.Builder.of(WaterBombEntity::new, MobCategory.MISC) + .sized(0.4F, 0.4F) + .clientTrackingRange(8) + .updateInterval(1) + .build("water_bomb")); + + + + public static final DeferredHolder, EntityType> CREEPING_HORROR = ENTITY_TYPES.register("creeping_horror", + () -> EntityType.Builder.of(com.craisinlord.antarchy.content.entity.CreepingHorrorEntity::new, MobCategory.MONSTER) + .sized(1.3F, 1.5F) + .clientTrackingRange(10) + .build("creeping_horror")); + + + public static final DeferredHolder, EntityType> LURKING_TERROR = ENTITY_TYPES.register("lurking_terror", + () -> EntityType.Builder.of(com.craisinlord.antarchy.content.entity.LurkingTerrorEntity::new, MobCategory.MONSTER) + .sized(1.3F, 1.5F) + .clientTrackingRange(10) + .build("lurking_terror")); + + + public static final DeferredHolder, EntityType> JERRY = ENTITY_TYPES.register("jerry", + () -> EntityType.Builder.of(com.craisinlord.antarchy.content.entity.JerryEntity::new, MobCategory.MONSTER) + .sized(1.4F, 1.4F) + .clientTrackingRange(10) + .build("jerry")); + + + public static final DeferredHolder, EntityType> CHEEP = ENTITY_TYPES.register("cheep", + () -> EntityType.Builder.of(com.craisinlord.antarchy.content.entity.CheepEntity::new, MobCategory.WATER_AMBIENT) + .sized(1.0F, 1.2F) + .clientTrackingRange(8) + .build("cheep")); + + + + public static final DeferredHolder, EntityType> DORRIE = ENTITY_TYPES.register("dorrie", + () -> EntityType.Builder.of(com.craisinlord.antarchy.content.entity.DorrieEntity::new, MobCategory.CREATURE) + .sized(1.6F, 1.4F) + .clientTrackingRange(10) + .build("dorrie")); + + + public static final DeferredHolder, EntityType> HERCULES_BEETLE = ENTITY_TYPES.register("hercules_beetle", + () -> EntityType.Builder.of(com.craisinlord.antarchy.content.entity.HerculesBeetleEntity::new, MobCategory.MONSTER) + .sized(3.0F, 4.0F) + .clientTrackingRange(12) + .build("hercules_beetle")); + + + public static final DeferredHolder, EntityType> OURANWOOD_DEER = ENTITY_TYPES.register("ouranwood_deer", + () -> EntityType.Builder.of(com.craisinlord.antarchy.content.entity.OuranwoodDeerEntity::new, MobCategory.CREATURE) + .sized(1.125F, 1.75F) + .clientTrackingRange(8) + .build("ouranwood_deer")); + + + public static final DeferredHolder, EntityType> GLIMMER = ENTITY_TYPES.register("glimmer", + () -> EntityType.Builder.of(com.craisinlord.antarchy.content.entity.glimmer.GlimmerEntity::new, MobCategory.CREATURE) + .sized(0.9F, 1.4F) + .clientTrackingRange(8) + .build("glimmer")); + + + public static final DeferredHolder, EntityType> ELKA = ENTITY_TYPES.register("elka", + () -> EntityType.Builder.of(com.craisinlord.antarchy.content.entity.ElkaEntity::new, MobCategory.CREATURE) + .sized(2.2F, 3.5F) + .clientTrackingRange(10) + .build("elka")); + + + + private static EntityType buildCowType(EntityType.EntityFactory factory, String name) { + return EntityType.Builder.of(factory, MobCategory.CREATURE) + .sized(0.9F, 1.4F) + .clientTrackingRange(10) + .build(name); + } + + + + private static EntityType buildAntType(EntityType.EntityFactory factory, MobCategory category, String name) { + return EntityType.Builder.of(factory, category) + .sized(0.6375F, 0.2125F) + .clientTrackingRange(8) + .build(name); + } + + + public static void register() { + ENTITY_TYPES.register(); + } + +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricEntityAttributes.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricEntityAttributes.java new file mode 100644 index 00000000..b70ade7e --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricEntityAttributes.java @@ -0,0 +1,128 @@ +package com.craisinlord.antarchy.fabric.registry; + +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.entity.cloud_shark.CloudSharkEntity; +import com.craisinlord.antarchy.content.entity.BedBugEntity; +import com.craisinlord.antarchy.content.entity.ButterflyEntity; +import com.craisinlord.antarchy.content.entity.CaterpillarEntity; +import com.craisinlord.antarchy.content.entity.brutalfly.BrutalflyEntity; +import com.craisinlord.antarchy.content.entity.flying_squirrel.FlyingSquirrelEntity; +import com.craisinlord.antarchy.content.entity.ReverieEntity; +import com.craisinlord.antarchy.content.entity.MissileSquidEntity; +import com.craisinlord.antarchy.content.entity.lucid.LucidEntity; +import com.craisinlord.antarchy.content.entity.JumpyBugEntity; +import com.craisinlord.antarchy.content.entity.StinkBugEntity; +import com.craisinlord.antarchy.content.entity.AlphaMantisEntity; +import com.craisinlord.antarchy.content.entity.MantisEntity; +import com.craisinlord.antarchy.content.entity.RollyPollyEntity; +import com.craisinlord.antarchy.content.entity.basilisk.BasiliskEntity; +import com.craisinlord.antarchy.content.entity.EmperorScorpionEntity; +import com.craisinlord.antarchy.content.entity.ScorpionEntity; +import com.craisinlord.antarchy.content.entity.nightmare.NightmareEntity; +import com.craisinlord.antarchy.content.entity.ToreterrorEntity; +import com.craisinlord.antarchy.content.entity.kraken.KrakenEntity; +import com.craisinlord.antarchy.content.entity.kraken.TentacleEntity; +import com.craisinlord.antarchy.content.entity.OctopusBombEntity; +import com.craisinlord.antarchy.content.entity.MolevoreEntity; +import com.craisinlord.antarchy.content.entity.MolewormEntity; +import com.craisinlord.antarchy.content.entity.BomberEntity; +import com.craisinlord.antarchy.content.entity.TriffidEntity; +import com.craisinlord.antarchy.content.entity.WaspEntity; +import net.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRegistry; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.animal.Cow; +import net.minecraft.world.entity.animal.Rabbit; +import net.minecraft.world.entity.npc.Villager; + +public final class AntarchyFabricEntityAttributes { + + + private static AttributeSupplier.Builder buildAntAttributes(double health, double speed, double attackDamage) { + return net.minecraft.world.entity.Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, health) + .add(Attributes.MOVEMENT_SPEED, speed) + .add(Attributes.ATTACK_DAMAGE, attackDamage); + } + + + + public static void register() { + FabricDefaultAttributeRegistry.register( + net.minecraft.world.entity.EntityType.PLAYER, + net.minecraft.world.entity.player.Player.createAttributes() + .add(AntarchyFabricMisc.SCALE.get()) + .add(AntarchyFabricMisc.DOUBLE_DAMAGE_CHANCE.get()) + .add(AntarchyFabricMisc.BLOODGLASS_MAX_HEARTS.get()) + .build() + ); + + AttributeSupplier rabbitAttributes = Rabbit.createAttributes().build(); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.EASTER_BUNNY.get(), rabbitAttributes); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.FLYING_SQUIRREL.get(), FlyingSquirrelEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.CATERPILLAR.get(), CaterpillarEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.BUTTERFLY.get(), ButterflyEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.REVERIE.get(), ReverieEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.BRUTALFLY.get(), BrutalflyEntity.createAttributes().build()); + + AttributeSupplier cowAttributes = Cow.createAttributes().build(); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.APPLE_COW.get(), cowAttributes); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.GOLDEN_APPLE_COW.get(), cowAttributes); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.ENCHANTED_GOLDEN_APPLE_COW.get(), cowAttributes); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.DR_TRAYAURUS.get(), Villager.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.CLOUD_SHARK.get(), CloudSharkEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.KRAKEN.get(), KrakenEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.MISSILE_SQUID.get(), MissileSquidEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.OCTOPUS_BOMB.get(), OctopusBombEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.TENTACLE.get(), TentacleEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.NIGHTMARE.get(), NightmareEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.BED_BUG.get(), BedBugEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.STINK_BUG.get(), StinkBugEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.WASP.get(), WaspEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.BOMBER.get(), BomberEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.JUMPY_BUG.get(), JumpyBugEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.SPIT_BUG.get(), com.craisinlord.antarchy.content.entity.SpitBugEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.MANTIS.get(), MantisEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.ALPHA_MANTIS.get(), AlphaMantisEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.ROLLY_POLLY.get(), RollyPollyEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.TRIFFID.get(), TriffidEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.LUCID.get(), LucidEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.SCORPION.get(), ScorpionEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.BASILISK.get(), BasiliskEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.EMPEROR_SCORPION.get(), EmperorScorpionEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.TORETERROR.get(), ToreterrorEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.CREEPING_HORROR.get(), com.craisinlord.antarchy.content.entity.CreepingHorrorEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.LURKING_TERROR.get(), com.craisinlord.antarchy.content.entity.LurkingTerrorEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.JERRY.get(), com.craisinlord.antarchy.content.entity.JerryEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.CHEEP.get(), com.craisinlord.antarchy.content.entity.CheepEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.DORRIE.get(), com.craisinlord.antarchy.content.entity.DorrieEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.HERCULES_BEETLE.get(), com.craisinlord.antarchy.content.entity.HerculesBeetleEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.OURANWOOD_DEER.get(), com.craisinlord.antarchy.content.entity.OuranwoodDeerEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.GLIMMER.get(), com.craisinlord.antarchy.content.entity.glimmer.GlimmerEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.ELKA.get(), com.craisinlord.antarchy.content.entity.ElkaEntity.createAttributes().build()); + + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.RED_ANT.get(), buildAntAttributes( + AntarchySettings.redAntHealth(), + AntarchySettings.redAntMovementSpeed(), + AntarchySettings.redAntAttackDamage() + ).build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.BROWN_ANT.get(), buildAntAttributes( + AntarchySettings.brownAntHealth(), + AntarchySettings.brownAntMovementSpeed(), + AntarchySettings.brownAntAttackDamage() + ).build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.RAINBOW_ANT.get(), buildAntAttributes( + AntarchySettings.rainbowAntHealth(), + AntarchySettings.rainbowAntMovementSpeed(), + AntarchySettings.rainbowAntAttackDamage() + ).build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.TERMITE.get(), buildAntAttributes( + AntarchySettings.termiteHealth(), + AntarchySettings.termiteMovementSpeed(), + AntarchySettings.termiteAttackDamage() + ).build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.MOLEWORM.get(), MolewormEntity.createAttributes().build()); + FabricDefaultAttributeRegistry.register(AntarchyFabricEntities.MOLEVORE.get(), MolevoreEntity.createAttributes().build()); + } + +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricItems.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricItems.java new file mode 100644 index 00000000..4e0f1604 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricItems.java @@ -0,0 +1,1500 @@ +package com.craisinlord.antarchy.fabric.registry; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.item.BloodCrystalArmorItem; +import com.craisinlord.antarchy.content.item.BloodCrystalAppleItem; +import com.craisinlord.antarchy.content.item.BloodCrystalKatanaItem; +import com.craisinlord.antarchy.content.item.CritterCageItem; +import com.craisinlord.antarchy.fabric.item.DeferredSpawnEggItem; +import com.craisinlord.antarchy.content.item.LucidEyeItem; +import com.craisinlord.antarchy.content.item.LucidPearlItem; +import com.craisinlord.antarchy.content.item.PrimordialArmorItem; +import com.craisinlord.antarchy.content.item.WaterCannonItem; +import com.craisinlord.antarchy.content.entity.SizeRayProjectileEntity; +import com.craisinlord.antarchy.content.item.BattleAxeItem; +import com.craisinlord.antarchy.content.item.AttitudeAdjusterItem; +import com.craisinlord.antarchy.content.item.BasiliskDaggerItem; +import com.craisinlord.antarchy.content.item.BigBerthaItem; +import com.craisinlord.antarchy.content.item.KrakensGraspItem; +import com.craisinlord.antarchy.content.item.AntimetalBlockItem; +import com.craisinlord.antarchy.content.item.AntimetalScaffoldingItem; +import com.craisinlord.antarchy.content.item.CloudSharkFinSoupItem; +import com.craisinlord.antarchy.content.item.CorneaEarItem; +import com.craisinlord.antarchy.content.item.GravityGunItem; +import com.craisinlord.antarchy.content.item.MantisClawItem; +import com.craisinlord.antarchy.content.item.DuctTapeBlockItem; +import com.craisinlord.antarchy.content.item.BrutalflyElytraItem; +import com.craisinlord.antarchy.content.item.BluestoneDustItem; +import com.craisinlord.antarchy.content.item.CeilingPlacementTooltipBlockItem; +import com.craisinlord.antarchy.content.item.CeilingPlacementTooltipItem; +import com.craisinlord.antarchy.content.item.MobComingSoonTooltipItem; +import com.craisinlord.antarchy.content.item.MogglesItem; +import com.craisinlord.antarchy.content.item.ultimate.UltimateAxeItem; +import com.craisinlord.antarchy.content.item.ultimate.UltimateHoeItem; +import com.craisinlord.antarchy.content.item.ultimate.UltimatePickaxeItem; +import com.craisinlord.antarchy.content.item.ultimate.UtlimateShovelItem; +import com.craisinlord.antarchy.content.item.ultimate.UltimateSwordItem; +import com.craisinlord.antarchy.content.item.DiamondMinecartItem; +import com.craisinlord.antarchy.content.item.ReverieBottleItem; +import com.craisinlord.antarchy.content.item.ScorpionWhipItem; +import com.craisinlord.antarchy.content.item.SizeRayItem; +import com.craisinlord.antarchy.content.item.SquidzookaItem; +import com.craisinlord.antarchy.content.item.RpoLauncherItem; +import com.craisinlord.antarchy.content.item.SimpleToolTier; +import com.craisinlord.antarchy.content.item.ultimate.UltimateArmorItem; +import com.craisinlord.antarchy.content.item.ultimate.UltimateBowItem; +import com.craisinlord.antarchy.content.item.ultimate.UltimateCrossbowItem; +import com.craisinlord.antarchy.content.item.NightmareArmorItem; +import com.craisinlord.antarchy.content.item.NightmareSwordItem; +import com.craisinlord.antarchy.content.item.OuranwoodBoatOnlyItem; +import com.craisinlord.antarchy.content.item.OuranwoodChestBoatItem; +import com.craisinlord.antarchy.content.item.RainbowSugarItem; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.BucketItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.item.StandingAndWallBlockItem; +import net.minecraft.world.food.FoodProperties; +import net.minecraft.world.item.Tier; +import net.minecraft.world.item.Tiers; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.core.Direction; + +public final class AntarchyFabricItems { + + public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(Antarchy.MODID); + + + private static final Tier ULTIMATE_TIER = new SimpleToolTier( + 3072, + 10.5F, + 0.0F, + Tiers.NETHERITE.getLevel(), + 25, + AntarchyFabricItems::ultimateRepairIngredient + ); + + + private static final Tier BLOOD_CRYSTAL_KATANA_TIER = new SimpleToolTier( + 1200, + 8.0F, + 0.0F, + Tiers.DIAMOND.getLevel(), + 18, + AntarchyFabricItems::bloodCrystalRepairIngredient + ); + private static final Tier ATTITUDE_ADJUSTER_TIER = new SimpleToolTier( + 3072, + 7.0F, + 0.0F, + Tiers.NETHERITE.getLevel(), + 18, + () -> Ingredient.of(AntarchyFabricItems.HERCULES_HORN.get()) + ); + + + public static final DeferredItem NIGHTMARE_SCALE = ITEMS.registerSimpleItem("nightmare_scale", new Item.Properties().rarity(Rarity.RARE).fireResistant()); + + + public static final DeferredItem PRIMORDIAL_SCUTE = ITEMS.registerSimpleItem("primordial_scute", + new Item.Properties().rarity(Rarity.UNCOMMON)); + + + + public static final DeferredItem DUPLICATOR_LOG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.DUPLICATOR_LOG); + + + public static final DeferredItem OURANWOOD_LOG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.OURANWOOD_LOG); + + + public static final DeferredItem OURANWOOD_WOOD_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.OURANWOOD_WOOD); + + + public static final DeferredItem MOSSY_OURANWOOD_LOG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.MOSSY_OURANWOOD_LOG); + + + public static final DeferredItem MOSSY_OURANWOOD_WOOD_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.MOSSY_OURANWOOD_WOOD); + + + public static final DeferredItem STRIPPED_OURANWOOD_LOG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.STRIPPED_OURANWOOD_LOG); + + + public static final DeferredItem STRIPPED_OURANWOOD_WOOD_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.STRIPPED_OURANWOOD_WOOD); + + + public static final DeferredItem OURANWOOD_PLANKS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.OURANWOOD_PLANKS); + + + public static final DeferredItem OURANWOOD_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.OURANWOOD_STAIRS); + + + public static final DeferredItem OURANWOOD_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.OURANWOOD_SLAB); + + + public static final DeferredItem OURANWOOD_FENCE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.OURANWOOD_FENCE); + + + public static final DeferredItem OURANWOOD_FENCE_GATE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.OURANWOOD_FENCE_GATE); + + + public static final DeferredItem OURANWOOD_DOOR_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.OURANWOOD_DOOR); + + + public static final DeferredItem OURANWOOD_TRAPDOOR_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.OURANWOOD_TRAPDOOR); + + + public static final DeferredItem OURANWOOD_PRESSURE_PLATE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.OURANWOOD_PRESSURE_PLATE); + + + public static final DeferredItem OURANWOOD_BUTTON_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.OURANWOOD_BUTTON); + + + public static final DeferredItem OURANWOOD_LEAVES_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.OURANWOOD_LEAVES); + + + public static final DeferredItem OURANWOOD_ACORN = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.OURANWOOD_ACORN_BLOCK); + + + public static final DeferredItem PEACH_LOG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.PEACH_LOG); + + + public static final DeferredItem PEACH_WOOD_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.PEACH_WOOD); + + + public static final DeferredItem STRIPPED_PEACH_LOG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.STRIPPED_PEACH_LOG); + + + public static final DeferredItem STRIPPED_PEACH_WOOD_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.STRIPPED_PEACH_WOOD); + + + public static final DeferredItem PEACH_PLANKS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.PEACH_PLANKS); + + + public static final DeferredItem PEACH_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.PEACH_STAIRS); + + + public static final DeferredItem PEACH_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.PEACH_SLAB); + + + public static final DeferredItem PEACH_FENCE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.PEACH_FENCE); + + + public static final DeferredItem PEACH_FENCE_GATE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.PEACH_FENCE_GATE); + + + public static final DeferredItem PEACH_DOOR_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.PEACH_DOOR); + + + public static final DeferredItem PEACH_TRAPDOOR_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.PEACH_TRAPDOOR); + + + public static final DeferredItem PEACH_PRESSURE_PLATE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.PEACH_PRESSURE_PLATE); + + + public static final DeferredItem PEACH_BUTTON_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.PEACH_BUTTON); + + + public static final DeferredItem PEACH_LEAVES_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.PEACH_LEAVES); + + + public static final DeferredItem PEACH_SAPLING_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.PEACH_SAPLING); + + + public static final DeferredItem ORANGE_MILKWEED_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.ORANGE_MILKWEED); + + + public static final DeferredItem PINK_MILKWEED_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.PINK_MILKWEED); + + + public static final DeferredItem CAMELLIA_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.CAMELLIA); + + + public static final DeferredItem SPIDER_LILY_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.SPIDER_LILY); + + + public static final DeferredItem GIANT_LILY_PAD_ITEM = ITEMS.register("giant_lily_pad", + () -> new com.craisinlord.antarchy.content.item.GiantLilyPadItem(AntarchyFabricBlocks.GIANT_LILY_PAD.get(), new Item.Properties())); + public static final DeferredItem SEASHELL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.SEASHELL); + public static final DeferredItem LOTUS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.LOTUS); + + + public static final DeferredItem OURANWOOD_SIGN_ITEM = ITEMS.register("ouranwood_sign", + () -> new net.minecraft.world.item.SignItem(new Item.Properties().stacksTo(16), AntarchyFabricBlocks.OURANWOOD_SIGN.get(), AntarchyFabricBlocks.OURANWOOD_WALL_SIGN.get())); + + + public static final DeferredItem OURANWOOD_HANGING_SIGN_ITEM = ITEMS.register("ouranwood_hanging_sign", + () -> new net.minecraft.world.item.HangingSignItem(AntarchyFabricBlocks.OURANWOOD_HANGING_SIGN.get(), AntarchyFabricBlocks.OURANWOOD_WALL_HANGING_SIGN.get(), new Item.Properties().stacksTo(16))); + + + public static final DeferredItem OURANWOOD_BOAT = ITEMS.register("ouranwood_boat", + () -> new OuranwoodBoatOnlyItem(AntarchyFabricEntities.OURANWOOD_BOAT_ENTITY, new Item.Properties().stacksTo(1))); + + + public static final DeferredItem OURANWOOD_CHEST_BOAT = ITEMS.register("ouranwood_chest_boat", + () -> new OuranwoodChestBoatItem(AntarchyFabricEntities.OURANWOOD_CHEST_BOAT_ENTITY, new Item.Properties().stacksTo(1))); + + + public static final DeferredItem PEACH_SIGN_ITEM = ITEMS.register("peach_sign", + () -> new net.minecraft.world.item.SignItem(new Item.Properties().stacksTo(16), AntarchyFabricBlocks.PEACH_SIGN.get(), AntarchyFabricBlocks.PEACH_WALL_SIGN.get())); + + + public static final DeferredItem PEACH_HANGING_SIGN_ITEM = ITEMS.register("peach_hanging_sign", + () -> new net.minecraft.world.item.HangingSignItem(AntarchyFabricBlocks.PEACH_HANGING_SIGN.get(), AntarchyFabricBlocks.PEACH_WALL_HANGING_SIGN.get(), new Item.Properties().stacksTo(16))); + + + public static final DeferredItem PEACH_BOAT = ITEMS.register("peach_boat", + () -> new com.craisinlord.antarchy.content.item.PeachBoatOnlyItem(AntarchyFabricEntities.PEACH_BOAT_ENTITY, new Item.Properties().stacksTo(1))); + + + public static final DeferredItem PEACH_CHEST_BOAT = ITEMS.register("peach_chest_boat", + () -> new com.craisinlord.antarchy.content.item.PeachChestBoatItem(AntarchyFabricEntities.PEACH_CHEST_BOAT_ENTITY, new Item.Properties().stacksTo(1))); + + + public static final DeferredItem CRITTER_CAGE = ITEMS.register("critter_cage", + () -> new CritterCageItem(new Item.Properties().stacksTo(16))); + + + public static final DeferredItem DUPLICATOR_SAPLING_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.DUPLICATOR_SAPLING); + + + public static final DeferredItem RED_ANT_NEST_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.RED_ANT_NEST); + + + public static final DeferredItem BROWN_ANT_NEST_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.BROWN_ANT_NEST); + + + public static final DeferredItem RAINBOW_ANT_NEST_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.RAINBOW_ANT_NEST); + public static final DeferredItem TERMITE_NEST_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.TERMITE_NEST); + + + public static final DeferredItem URANIUM_ORE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.URANIUM_ORE, new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem DEEPSLATE_URANIUM_ORE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.DEEPSLATE_URANIUM_ORE, new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem TITANIUM_ORE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.TITANIUM_ORE, new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem DEEPSLATE_TITANIUM_ORE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.DEEPSLATE_TITANIUM_ORE, new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem BLUESTONE_DUST = ITEMS.register("bluestone", + () -> new BluestoneDustItem(AntarchyFabricBlocks.BLUESTONE_WIRE.get(), new Item.Properties())); + public static final DeferredItem BLUESTONE_ORE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.BLUESTONE_ORE); + public static final DeferredItem BLUESTONE_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.BLUESTONE_BLOCK); + public static final DeferredItem BLUESTONE_REPEATER_ITEM = ITEMS.register("bluestone_repeater", + () -> new CeilingPlacementTooltipBlockItem(AntarchyFabricBlocks.BLUESTONE_REPEATER.get(), new Item.Properties())); + public static final DeferredItem BLUESTONE_COMPARATOR_ITEM = ITEMS.register("bluestone_comparator", + () -> new CeilingPlacementTooltipBlockItem(AntarchyFabricBlocks.BLUESTONE_COMPARATOR.get(), new Item.Properties())); + public static final DeferredItem BLUESTONE_TORCH_ITEM = ITEMS.register("bluestone_torch", + () -> new CeilingPlacementTooltipBlockItem(AntarchyFabricBlocks.BLUESTONE_TORCH.get(), new Item.Properties())); + + + public static final DeferredItem URANIUM_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.URANIUM_BLOCK, new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem TITANIUM_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.TITANIUM_BLOCK, new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem RAW_URANIUM_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.RAW_URANIUM_BLOCK, new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem RAW_TITANIUM_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.RAW_TITANIUM_BLOCK, new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem CUT_URANIUM_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.CUT_URANIUM, new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem CUT_TITANIUM_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.CUT_TITANIUM, new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem CUT_URANIUM_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.CUT_URANIUM_SLAB, new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem CUT_TITANIUM_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.CUT_TITANIUM_SLAB, new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem CUT_URANIUM_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.CUT_URANIUM_STAIRS, new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem CUT_TITANIUM_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.CUT_TITANIUM_STAIRS, new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem CHISELED_URANIUM_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.CHISELED_URANIUM, new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem CHISELED_TITANIUM_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.CHISELED_TITANIUM, new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem URANIUM_BULB_ITEM = ITEMS.register("uranium_bulb", + () -> new com.craisinlord.antarchy.content.item.SignalSavingBulbItem(AntarchyFabricBlocks.URANIUM_BULB.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + + + public static final DeferredItem TITANIUM_BULB_ITEM = ITEMS.register("titanium_bulb", + () -> new com.craisinlord.antarchy.content.item.SignalSavingBulbItem(AntarchyFabricBlocks.TITANIUM_BULB.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + + + public static final DeferredItem URANIUM_DOOR_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.URANIUM_DOOR, new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem TITANIUM_DOOR_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.TITANIUM_DOOR, new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem URANIUM_TRAPDOOR_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.URANIUM_TRAPDOOR, new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem TITANIUM_TRAPDOOR_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.TITANIUM_TRAPDOOR, new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem URANIUM_BARS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.URANIUM_BARS, new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem TITANIUM_BARS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.TITANIUM_BARS, new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem ANTIMETAL_ITEM = ITEMS.register("antimetal", + () -> new AntimetalBlockItem(AntarchyFabricBlocks.ANTIMETAL.get(), new Item.Properties())); + + + public static final DeferredItem POLISHED_ANTIMETAL_ITEM = ITEMS.register("polished_antimetal", + () -> new AntimetalBlockItem(AntarchyFabricBlocks.POLISHED_ANTIMETAL.get(), new Item.Properties())); + + + public static final DeferredItem ANTIMETAL_SCAFFOLDING_ITEM = ITEMS.register("antimetal_scaffolding", + () -> new AntimetalScaffoldingItem(AntarchyFabricBlocks.ANTIMETAL_SCAFFOLDING.get(), new Item.Properties())); + + + public static final DeferredItem ANTIMETAL_RAIL_ITEM = ITEMS.register("antimetal_rail", + () -> new CeilingPlacementTooltipBlockItem(AntarchyFabricBlocks.ANTIMETAL_RAIL.get(), new Item.Properties())); + public static final DeferredItem ANTIMETAL_POWERED_RAIL_ITEM = ITEMS.register("antimetal_powered_rail", + () -> new CeilingPlacementTooltipBlockItem(AntarchyFabricBlocks.ANTIMETAL_POWERED_RAIL.get(), new Item.Properties())); + public static final DeferredItem ANTIMETAL_DETECTOR_RAIL_ITEM = ITEMS.register("antimetal_detector_rail", + () -> new CeilingPlacementTooltipBlockItem(AntarchyFabricBlocks.ANTIMETAL_DETECTOR_RAIL.get(), new Item.Properties())); + public static final DeferredItem ANTIMETAL_ACTIVATOR_RAIL_ITEM = ITEMS.register("antimetal_activator_rail", + () -> new CeilingPlacementTooltipBlockItem(AntarchyFabricBlocks.ANTIMETAL_ACTIVATOR_RAIL.get(), new Item.Properties())); + + + public static final DeferredItem SMALL_BLOOD_CRYSTAL_BUD_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.SMALL_BLOOD_CRYSTAL_BUD); + + + public static final DeferredItem MEDIUM_BLOOD_CRYSTAL_BUD_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.MEDIUM_BLOOD_CRYSTAL_BUD); + + + public static final DeferredItem LARGE_BLOOD_CRYSTAL_BUD_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.LARGE_BLOOD_CRYSTAL_BUD); + + + public static final DeferredItem BUDDING_BLOOD_CRYSTAL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.BUDDING_BLOOD_CRYSTAL); + + + public static final DeferredItem BLOOD_CRYSTAL_ITEM = ITEMS.register("blood_crystal_block", + () -> new net.minecraft.world.item.BlockItem(AntarchyFabricBlocks.BLOOD_CRYSTAL.get(), new Item.Properties())); + + + public static final DeferredItem BLOOD_CRYSTAL_CRYSTAL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.BLOOD_CRYSTAL_CRYSTAL); + + + public static final DeferredItem DREAM_SAND_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.DREAM_SAND); + + + public static final DeferredItem DREAM_SANDSTONE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.DREAM_SANDSTONE); + + + public static final DeferredItem CHISELED_DREAM_SANDSTONE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.CHISELED_DREAM_SANDSTONE); + + + public static final DeferredItem CUT_DREAM_SANDSTONE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.CUT_DREAM_SANDSTONE); + + + public static final DeferredItem SMOOTH_DREAM_SANDSTONE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.SMOOTH_DREAM_SANDSTONE); + + + public static final DeferredItem DREAM_SANDSTONE_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.DREAM_SANDSTONE_STAIRS); + + + public static final DeferredItem DREAM_SANDSTONE_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.DREAM_SANDSTONE_SLAB); + + + public static final DeferredItem DREAM_SANDSTONE_WALL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.DREAM_SANDSTONE_WALL); + + + public static final DeferredItem SMOOTH_DREAM_SANDSTONE_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.SMOOTH_DREAM_SANDSTONE_STAIRS); + + + public static final DeferredItem SMOOTH_DREAM_SANDSTONE_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.SMOOTH_DREAM_SANDSTONE_SLAB); + + + public static final DeferredItem CUT_DREAM_SANDSTONE_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.CUT_DREAM_SANDSTONE_SLAB); + + + public static final DeferredItem DEAD_STAR_CORAL_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.DEAD_STAR_CORAL_BLOCK); + + + public static final DeferredItem DEAD_STAR_CORAL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.DEAD_STAR_CORAL); + + + public static final DeferredItem DEAD_STAR_CORAL_FAN_ITEM = ITEMS.register("dead_star_coral_fan", + () -> new StandingAndWallBlockItem(AntarchyFabricBlocks.DEAD_STAR_CORAL_FAN.get(), AntarchyFabricBlocks.DEAD_STAR_CORAL_WALL_FAN.get(), new Item.Properties(), Direction.UP)); + + + public static final DeferredItem STAR_CORAL_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.STAR_CORAL_BLOCK); + + + public static final DeferredItem STAR_CORAL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.STAR_CORAL); + + + public static final DeferredItem STAR_CORAL_FAN_ITEM = ITEMS.register("star_coral_fan", + () -> new StandingAndWallBlockItem(AntarchyFabricBlocks.STAR_CORAL_FAN.get(), AntarchyFabricBlocks.STAR_CORAL_WALL_FAN.get(), new Item.Properties(), Direction.UP)); + + + public static final DeferredItem DUCT_TAPE_ITEM = ITEMS.register("duct_tape", + () -> new DuctTapeBlockItem(AntarchyFabricBlocks.DUCT_TAPE.get(), new Item.Properties().stacksTo(1))); + + + public static final DeferredItem INFESTED_ROOTED_DIRT_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.INFESTED_ROOTED_DIRT); + + + public static final DeferredItem INFESTED_COARSE_DIRT_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.INFESTED_COARSE_DIRT); + + + public static final DeferredItem NYXITE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.NYXITE); + public static final DeferredItem MYRMITE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.MYRMITE); + public static final DeferredItem BIOMITE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.BIOMITE); + public static final DeferredItem BIOMITE_TURF_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.BIOMITE_TURF); + public static final DeferredItem BIOWART_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.BIOWART); + public static final DeferredItem BIOWART_TENDRILS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.BIOWART_TENDRILS); + public static final DeferredItem BROODSTONE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.BROODSTONE); + public static final DeferredItem POLISHED_BROODSTONE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.POLISHED_BROODSTONE); + public static final DeferredItem CHISELED_BROODSTONE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.CHISELED_BROODSTONE); + public static final DeferredItem BROODSTONE_BRICKS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.BROODSTONE_BRICKS); + public static final DeferredItem BROODSTONE_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.BROODSTONE_STAIRS); + public static final DeferredItem BROODSTONE_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.BROODSTONE_SLAB); + public static final DeferredItem BROODSTONE_WALL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.BROODSTONE_WALL); + public static final DeferredItem POLISHED_BROODSTONE_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.POLISHED_BROODSTONE_STAIRS); + public static final DeferredItem POLISHED_BROODSTONE_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.POLISHED_BROODSTONE_SLAB); + public static final DeferredItem POLISHED_BROODSTONE_WALL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.POLISHED_BROODSTONE_WALL); + public static final DeferredItem BROODSTONE_BRICK_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.BROODSTONE_BRICK_STAIRS); + public static final DeferredItem BROODSTONE_BRICK_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.BROODSTONE_BRICK_SLAB); + public static final DeferredItem BROODSTONE_BRICK_WALL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.BROODSTONE_BRICK_WALL); + public static final DeferredItem MYRMITE_COAL_ORE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.MYRMITE_COAL_ORE); + public static final DeferredItem BROODSTONE_URANIUM_ORE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.BROODSTONE_URANIUM_ORE, new Item.Properties().rarity(Rarity.UNCOMMON)); + public static final DeferredItem BROODSTONE_TITANIUM_ORE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.BROODSTONE_TITANIUM_ORE, new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem POLISHED_NYXITE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.POLISHED_NYXITE); + + + public static final DeferredItem CHISELED_NYXITE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.CHISELED_NYXITE); + + + public static final DeferredItem NYXITE_BRICKS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.NYXITE_BRICKS); + public static final DeferredItem CHITEN_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.CHITEN_BLOCK); + + + public static final DeferredItem NYXITE_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.NYXITE_STAIRS); + + + public static final DeferredItem NYXITE_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.NYXITE_SLAB); + + + public static final DeferredItem NYXITE_WALL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.NYXITE_WALL); + + + public static final DeferredItem POLISHED_NYXITE_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.POLISHED_NYXITE_STAIRS); + + + public static final DeferredItem POLISHED_NYXITE_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.POLISHED_NYXITE_SLAB); + + + public static final DeferredItem POLISHED_NYXITE_WALL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.POLISHED_NYXITE_WALL); + public static final DeferredItem POLISHED_NYXITE_PRESSURE_PLATE_ITEM = ITEMS.register("polished_nyxite_pressure_plate", + () -> new com.craisinlord.antarchy.content.item.CeilingCompatiblePlacementTooltipBlockItem(AntarchyFabricBlocks.POLISHED_NYXITE_PRESSURE_PLATE.get(), new Item.Properties())); + public static final DeferredItem POLISHED_NYXITE_BUTTON_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.POLISHED_NYXITE_BUTTON); + + + public static final DeferredItem NYXITE_BRICK_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.NYXITE_BRICK_STAIRS); + + + public static final DeferredItem NYXITE_BRICK_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.NYXITE_BRICK_SLAB); + + + public static final DeferredItem NYXITE_BRICK_WALL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.NYXITE_BRICK_WALL); + + + public static final DeferredItem SHELLSTONE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.SHELLSTONE); + + + public static final DeferredItem POLISHED_SHELLSTONE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.POLISHED_SHELLSTONE); + + + public static final DeferredItem SHELLSTONE_BRICKS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.SHELLSTONE_BRICKS); + + + public static final DeferredItem CHISELED_SHELLSTONE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.CHISELED_SHELLSTONE); + + + public static final DeferredItem MOSSY_SHELLSTONE_BRICKS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.MOSSY_SHELLSTONE_BRICKS); + + + public static final DeferredItem CRACKED_SHELLSTONE_BRICKS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.CRACKED_SHELLSTONE_BRICKS); + + + public static final DeferredItem MOSSY_SHELLSTONE_BRICK_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.MOSSY_SHELLSTONE_BRICK_STAIRS); + + + public static final DeferredItem MOSSY_SHELLSTONE_BRICK_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.MOSSY_SHELLSTONE_BRICK_SLAB); + + + public static final DeferredItem MOSSY_SHELLSTONE_BRICK_WALL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.MOSSY_SHELLSTONE_BRICK_WALL); + + + public static final DeferredItem SHELLSTONE_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.SHELLSTONE_STAIRS); + + + public static final DeferredItem SHELLSTONE_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.SHELLSTONE_SLAB); + + + public static final DeferredItem SHELLSTONE_WALL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.SHELLSTONE_WALL); + + + public static final DeferredItem POLISHED_SHELLSTONE_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.POLISHED_SHELLSTONE_STAIRS); + + + public static final DeferredItem POLISHED_SHELLSTONE_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.POLISHED_SHELLSTONE_SLAB); + + + public static final DeferredItem POLISHED_SHELLSTONE_WALL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.POLISHED_SHELLSTONE_WALL); + + + public static final DeferredItem SHELLSTONE_BRICK_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.SHELLSTONE_BRICK_STAIRS); + + + public static final DeferredItem SHELLSTONE_BRICK_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.SHELLSTONE_BRICK_SLAB); + + + public static final DeferredItem SHELLSTONE_BRICK_WALL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.SHELLSTONE_BRICK_WALL); + + + public static final DeferredItem TRIFFID_GOO_BLOCK_ITEM = ITEMS.register("triffid_goo_block", + () -> new com.craisinlord.antarchy.content.item.TriffidGooBlockItem(AntarchyFabricBlocks.TRIFFID_GOO_BLOCK.get(), new Item.Properties())); + + + public static final DeferredItem PALE_NYXITE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.PALE_NYXITE); + + + public static final DeferredItem NYXITE_SPIKE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.NYXITE_SPIKE); + public static final DeferredItem CHITEN_SPIKE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.CHITEN_SPIKE); + + + public static final DeferredItem POTENT_NYXITE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.POTENT_NYXITE); + + + public static final DeferredItem UMBRAL_MOSS_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.UMBRAL_MOSS_BLOCK); + + + public static final DeferredItem UMBRAL_MOSS_CARPET_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.UMBRAL_MOSS_CARPET); + public static final DeferredItem AMBER_MOSS_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.AMBER_MOSS_BLOCK); + public static final DeferredItem AMBER_MOSS_CARPET_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.AMBER_MOSS_CARPET); + public static final DeferredItem AMBER_LICHEN_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.AMBER_LICHEN); + public static final DeferredItem BILE_VEIN_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.BILE_VEIN); + public static final DeferredItem CREEPVINE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.CREEPVINE); + + + public static final DeferredItem BLUSH_MOSS_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.BLUSH_MOSS_BLOCK); + + + public static final DeferredItem BLUSH_MOSS_CARPET_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.BLUSH_MOSS_CARPET); + + + public static final DeferredItem DREAM_TORCH_ITEM = ITEMS.register("dream_torch", + () -> new com.craisinlord.antarchy.content.item.DreamTorchItem(AntarchyFabricBlocks.DREAM_TORCH.get(), AntarchyFabricBlocks.DREAM_WALL_TORCH.get(), AntarchyFabricBlocks.DREAM_CEILING_TORCH.get(), new Item.Properties())); + + + public static final DeferredItem DREAM_LANTERN_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.DREAM_LANTERN); + + + public static final DeferredItem DREAM_CAMPFIRE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.DREAM_CAMPFIRE); + + + public static final DeferredItem BED_BUG_EGG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.BED_BUG_EGG); + public static final DeferredItem CREEPING_HORROR_EGG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.CREEPING_HORROR_EGG); + public static final DeferredItem JUMPY_BUG_EGG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.JUMPY_BUG_EGG); + public static final DeferredItem SPIT_BUG_EGG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.SPIT_BUG_EGG); + public static final DeferredItem JERRY_EGG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.JERRY_EGG); + public static final DeferredItem LURKING_TERROR_EGG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.LURKING_TERROR_EGG); + + + public static final DeferredItem WASP_NEST_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.WASP_NEST); + + + public static final DeferredItem HUSHWEED_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.HUSHWEED); + public static final DeferredItem HANGING_CREEPROOTS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.HANGING_CREEPROOTS); + public static final DeferredItem GLOWCAP_MUSHROOM_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.GLOWCAP_MUSHROOM); + public static final DeferredItem GLOWCAP_MUSHROOM_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.GLOWCAP_MUSHROOM_BLOCK); + public static final DeferredItem MOLTING_VINES_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.MOLTING_VINES); + + + public static final DeferredItem BILE_BUCKET = ITEMS.register("bile_bucket", + () -> new BucketItem(AntarchyFabricMisc.BILE.get(), new Item.Properties().craftRemainder(Items.BUCKET).stacksTo(1))); + + + public static final DeferredItem ICHOR_BUCKET = ITEMS.register("ichor_bucket", + () -> new BucketItem(AntarchyFabricMisc.ICHOR.get(), new Item.Properties().craftRemainder(Items.BUCKET).stacksTo(1))); + + + public static final DeferredItem ANTIWATER_BUCKET = ITEMS.register("antiwater_bucket", + () -> new BucketItem(AntarchyFabricMisc.ANTIWATER.get(), new Item.Properties().craftRemainder(Items.BUCKET).stacksTo(1))); + + + public static final DeferredItem LUMEN_BUCKET = ITEMS.register("lumen_bucket", + () -> new BucketItem(AntarchyFabricMisc.LUMEN.get(), new Item.Properties().craftRemainder(Items.BUCKET).stacksTo(1))); + + + public static final DeferredItem LUMEN_FROGLIGHT_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.LUMEN_FROGLIGHT); + + + public static final DeferredItem ROSEATE_FROGLIGHT_ITEM = ITEMS.registerSimpleBlockItem(AntarchyFabricBlocks.ROSEATE_FROGLIGHT); + + + public static final DeferredItem CLOUD_BUCKET = ITEMS.register("cloud_bucket", + () -> new com.craisinlord.antarchy.content.item.CloudBucketItem(AntarchyFabricBlocks.CLOUD_BLOCK.get(), new Item.Properties().craftRemainder(Items.BUCKET))); + + + public static final DeferredItem BLOOD_CRYSTAL_SHARD = ITEMS.register("blood_crystal_shard", + () -> new com.craisinlord.antarchy.content.item.BloodCrystalShardItem(new Item.Properties())); + + + public static final DeferredItem BLOOD_CRYSTAL_APPLE = ITEMS.register("blood_crystal_apple", + () -> new BloodCrystalAppleItem(new Item.Properties() + .rarity(Rarity.RARE) + .food(new net.minecraft.world.food.FoodProperties.Builder() + .nutrition(4) + .saturationMod(1.2f) + .effect(new MobEffectInstance(net.minecraft.world.effect.MobEffects.REGENERATION, 100, 1), 1.0f) + .alwaysEat() + .build()))); + + + public static final DeferredItem BLOOD_CRYSTAL_HELMET = ITEMS.register("blood_crystal_helmet", + () -> new BloodCrystalArmorItem(AntarchyFabricMisc.BLOOD_CRYSTAL_ARMOR_MATERIAL, ArmorItem.Type.HELMET, new Item.Properties().rarity(Rarity.RARE))); + + + public static final DeferredItem BLOOD_CRYSTAL_CHESTPLATE = ITEMS.register("blood_crystal_chestplate", + () -> new BloodCrystalArmorItem(AntarchyFabricMisc.BLOOD_CRYSTAL_ARMOR_MATERIAL, ArmorItem.Type.CHESTPLATE, new Item.Properties().rarity(Rarity.RARE))); + + + public static final DeferredItem BLOOD_CRYSTAL_LEGGINGS = ITEMS.register("blood_crystal_leggings", + () -> new BloodCrystalArmorItem(AntarchyFabricMisc.BLOOD_CRYSTAL_ARMOR_MATERIAL, ArmorItem.Type.LEGGINGS, new Item.Properties().rarity(Rarity.RARE))); + + + public static final DeferredItem BLOOD_CRYSTAL_BOOTS = ITEMS.register("blood_crystal_boots", + () -> new BloodCrystalArmorItem(AntarchyFabricMisc.BLOOD_CRYSTAL_ARMOR_MATERIAL, ArmorItem.Type.BOOTS, new Item.Properties().rarity(Rarity.RARE))); + + + public static final DeferredItem BLOOD_CRYSTAL_KATANA = ITEMS.register("blood_crystal_katana", + () -> new BloodCrystalKatanaItem( + BLOOD_CRYSTAL_KATANA_TIER, + new Item.Properties().stacksTo(1).durability(1200).rarity(Rarity.RARE), + AntarchySettings.bloodCrystalKatanaAttackDamage(), + -2.2F + )); + + + public static final DeferredItem MANTIS_CLAW = ITEMS.register("mantis_claw", + () -> new MantisClawItem(Tiers.IRON, new Item.Properties().stacksTo(1).durability(50).rarity(Rarity.UNCOMMON))); + public static final DeferredItem HERCULES_HORN = ITEMS.registerSimpleItem("hercules_horn", new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem KING_SCALE = ITEMS.register("king_scale", + () -> new MobComingSoonTooltipItem(new Item.Properties().rarity(Rarity.RARE))); + + + public static final DeferredItem QUEEN_SCALE = ITEMS.register("queen_scale", + () -> new MobComingSoonTooltipItem(new Item.Properties().rarity(Rarity.RARE))); + + + public static final DeferredItem CHITEN = ITEMS.registerSimpleItem("chiten", new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem JERRY_NUCLEUS = ITEMS.register("jerry_nucleus", + () -> new com.craisinlord.antarchy.content.item.JerryNucleusItem(new Item.Properties().rarity(Rarity.UNCOMMON) + .food(new FoodProperties.Builder() + .nutrition(2) + .saturationMod(0.1F) + .build()))); + + + public static final DeferredItem CARAPACE = ITEMS.registerSimpleItem("carapace", new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem STINK_BUG_ITEM = ITEMS.registerSimpleItem("stink_bug", new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem JUMPY_BUG_LEG = ITEMS.registerSimpleItem("jumpy_bug_leg", new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem JUMPY_BOOTS = ITEMS.register("jumpy_boots", + () -> new com.craisinlord.antarchy.content.item.JumpyBootsItem( + AntarchyFabricMisc.JUMPY_BOOTS_ARMOR_MATERIAL, + new Item.Properties().stacksTo(1).rarity(Rarity.UNCOMMON).fireResistant().durability(AntarchyFabricMisc.JUMPY_BOOTS_ARMOR_MATERIAL.getDurabilityForType(ArmorItem.Type.BOOTS)) + )); + + + public static final DeferredItem BRUTALFLY_WING = ITEMS.registerSimpleItem("brutalfly_wing", new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem BRUTALFLY_ELYTRA = ITEMS.register("brutalfly_elytra", + () -> new BrutalflyElytraItem(new Item.Properties().rarity(Rarity.UNCOMMON).durability(480))); + + + public static final DeferredItem CORNEA_EAR = ITEMS.register("cornea_ear", + () -> new CorneaEarItem(new Item.Properties() + .rarity(Rarity.UNCOMMON) + .food(new FoodProperties.Builder() + .nutrition(2) + .saturationMod(0.4F) + .build()))); + + + public static final DeferredItem CORN = ITEMS.register("corn", + () -> new Item(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(3) + .saturationMod(0.6F) + .build()))); + + + public static final DeferredItem CORN_SEEDS = ITEMS.register("corn_seeds", + () -> new net.minecraft.world.item.ItemNameBlockItem(AntarchyFabricBlocks.CORN_CROP.get(), new Item.Properties())); + + + public static final DeferredItem RAW_VENISON = ITEMS.register("raw_venison", + () -> new Item(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(2) + .saturationMod(0.3F) + .build()))); + public static final DeferredItem BROODFRUIT = ITEMS.register("broodfruit", + () -> new Item(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(2) + .saturationMod(0.1F) + .effect(new MobEffectInstance(MobEffects.DAMAGE_BOOST, 100, 0), 1.0F) + .build()))); + public static final DeferredItem RAW_BUG_MEAT = ITEMS.register("raw_bug_meat", + () -> new Item(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(4) + .saturationMod(0.1F) + .effect(new MobEffectInstance(MobEffects.HUNGER, 600), 0.8F) + .build()))); + public static final DeferredItem COOKED_BUG_MEAT = ITEMS.register("cooked_bug_meat", + () -> new Item(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(8) + .saturationMod(0.8F) + .build()))); + + + public static final DeferredItem COOKED_VENISON = ITEMS.register("cooked_venison", + () -> new Item(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(6) + .saturationMod(0.8F) + .build()))); + + + public static final DeferredItem PEACH = ITEMS.register("peach", + () -> new com.craisinlord.antarchy.content.item.PeachItem()); + + + public static final DeferredItem PEACH_PIE = ITEMS.register("peach_pie", + () -> new Item(new Item.Properties() + .stacksTo(64) + .food(new FoodProperties.Builder() + .nutrition(8) + .saturationMod(0.3F) + .build()))); + + + public static final DeferredItem CORNBREAD = ITEMS.register("cornbread", + () -> new Item(new Item.Properties() + .stacksTo(64) + .food(new FoodProperties.Builder() + .nutrition(8) + .saturationMod(0.9F) + .build()))); + + + public static final DeferredItem POPCORN = ITEMS.register("popcorn", + () -> new Item(new Item.Properties() + .stacksTo(64) + .food(new FoodProperties.Builder() + .nutrition(1) + .saturationMod(0.1F) + .build()))); + + + public static final DeferredItem RAW_CORNDOG = ITEMS.register("raw_corndog", + () -> new Item(new Item.Properties() + .stacksTo(64) + .food(new FoodProperties.Builder() + .nutrition(8) + .saturationMod(0.7F) + .build()))); + + + public static final DeferredItem COOKED_CORNDOG = ITEMS.register("cooked_corndog", + () -> new Item(new Item.Properties() + .stacksTo(64) + .food(new FoodProperties.Builder() + .nutrition(14) + .saturationMod(1.1F) + .build()))); + + + public static final DeferredItem HIGH_FRUCTOSE_CORN_SYRUP = ITEMS.register("high_fructose_corn_syrup", + () -> new com.craisinlord.antarchy.content.item.HighFructoseCornSyrupItem(new Item.Properties() + .stacksTo(16) + .food(new FoodProperties.Builder() + .nutrition(0) + .saturationMod(0.0F) + .alwaysEat() + .build()))); + + + public static final DeferredItem ROOT_BEER = ITEMS.register("root_beer", + () -> new com.craisinlord.antarchy.content.item.RootBeerItem(new Item.Properties() + .stacksTo(16) + .food(new FoodProperties.Builder() + .nutrition(4) + .saturationMod(0.4F) + .effect(new MobEffectInstance(MobEffects.REGENERATION, 100, 0), 1.0F) + .alwaysEat() + .build()))); + + + public static final DeferredItem TRIFFID_GOO = ITEMS.registerSimpleItem("triffid_goo", + new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem VORTEX_EYE = ITEMS.register("vortex_eye", + () -> new MobComingSoonTooltipItem(new Item.Properties().rarity(Rarity.RARE))); + + + public static final DeferredItem RAW_URANIUM_SCRAP = ITEMS.registerSimpleItem("raw_uranium_scrap", new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem RAW_TITANIUM_SCRAP = ITEMS.registerSimpleItem("raw_titanium_scrap", new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem RAW_URANIUM = ITEMS.registerSimpleItem("raw_uranium", new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem RAW_TITANIUM = ITEMS.registerSimpleItem("raw_titanium", new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem MUD_PIE = ITEMS.register("mud_pie", + () -> new Item(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(10) + .saturationMod(0.9F) + .effect(new MobEffectInstance(MobEffects.CONFUSION, 200), 1.0F) + .build()))); + + + public static final DeferredItem RAINBOW_SUGAR = ITEMS.register("rainbow_sugar", + () -> new RainbowSugarItem(new Item.Properties() + .rarity(Rarity.UNCOMMON) + .food(new FoodProperties.Builder().nutrition(1).saturationMod(0.0F).alwaysEat().build()))); + + + public static final DeferredItem URANIUM_NUGGET = ITEMS.registerSimpleItem("uranium_nugget", new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem TITANIUM_NUGGET = ITEMS.registerSimpleItem("titanium_nugget", new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem URANIUM_INGOT = ITEMS.registerSimpleItem("uranium_ingot", new Item.Properties().rarity(Rarity.UNCOMMON).fireResistant()); + + + public static final DeferredItem TITANIUM_INGOT = ITEMS.registerSimpleItem("titanium_ingot", new Item.Properties().rarity(Rarity.UNCOMMON).fireResistant()); + + + public static final DeferredItem MOLEVORE_NOSE = ITEMS.registerSimpleItem("molevore_nose", new Item.Properties().rarity(Rarity.RARE)); + + + public static final DeferredItem MOLEWORM_ITEM = ITEMS.register("moleworm", + () -> new Item(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(1) + .saturationMod(0.0F) + .effect(new MobEffectInstance(MobEffects.HUNGER, 600), 0.8F) + .build()))); + + + public static final DeferredItem CLOUD_SHARK_FIN = ITEMS.registerSimpleItem("cloud_shark_fin", new Item.Properties().rarity(Rarity.UNCOMMON)); + + + public static final DeferredItem CLOUD_SHARK_FIN_SOUP = ITEMS.register("cloud_shark_fin_soup", + () -> new CloudSharkFinSoupItem(new Item.Properties() + .stacksTo(1) + .craftRemainder(Items.BOWL) + .food(new FoodProperties.Builder() + .nutrition(10) + .saturationMod(0.8F) + .effect(new MobEffectInstance(MobEffects.DAMAGE_BOOST, 600, 0), 1.0F) + .effect(new MobEffectInstance(MobEffects.SLOW_FALLING, 600, 0), 1.0F) + .build()))); + + + public static final DeferredItem KRAKEN_TOOTH = ITEMS.register("kraken_tooth", + () -> new Item(new Item.Properties().rarity(net.minecraft.world.item.Rarity.RARE))); + + + public static final DeferredItem BASILISK_FANG = ITEMS.registerSimpleItem("basilisk_fang", new Item.Properties().rarity(Rarity.RARE)); + + + public static final DeferredItem BASILISK_DAGGER = ITEMS.register("basilisk_dagger", + () -> new BasiliskDaggerItem(Tiers.IRON, new Item.Properties().rarity(Rarity.RARE), 4, -1.8F)); + + + public static final DeferredItem EMPEROR_SCORPION_STINGER = ITEMS.registerSimpleItem("emperor_scorpion_stinger", new Item.Properties().rarity(Rarity.RARE)); + + + public static final DeferredItem SCORPION_WHIP = ITEMS.register("scorpion_whip", + () -> new ScorpionWhipItem(Tiers.IRON, new Item.Properties().rarity(Rarity.RARE).durability(384))); + + + public static final DeferredItem MOGGLES = ITEMS.register("moggles", + () -> new MogglesItem(AntarchyFabricMisc.MOGGLES_ARMOR_MATERIAL, new Item.Properties().rarity(Rarity.RARE).stacksTo(1))); + + + public static final DeferredItem FALLEN_KING_CROWN = ITEMS.register("fallen_king_crown", + () -> new com.craisinlord.antarchy.content.item.FallenKingCrownItem( + AntarchyFabricMisc.FALLEN_KING_CROWN_ARMOR_MATERIAL, + new Item.Properties().rarity(Rarity.RARE) + )); + + + public static final DeferredItem ULTIMATE_HELMET = ITEMS.register("ultimate_helmet", + () -> new UltimateArmorItem( + AntarchyFabricMisc.ULTIMATE_ARMOR_MATERIAL, + ArmorItem.Type.HELMET, + new Item.Properties() + .rarity(Rarity.EPIC) + .fireResistant() + .durability(AntarchyFabricMisc.ULTIMATE_ARMOR_MATERIAL.getDurabilityForType(ArmorItem.Type.HELMET)) + )); + + + public static final DeferredItem ULTIMATE_CHESTPLATE = ITEMS.register("ultimate_chestplate", + () -> new UltimateArmorItem( + AntarchyFabricMisc.ULTIMATE_ARMOR_MATERIAL, + ArmorItem.Type.CHESTPLATE, + new Item.Properties() + .rarity(Rarity.EPIC) + .fireResistant() + .durability(AntarchyFabricMisc.ULTIMATE_ARMOR_MATERIAL.getDurabilityForType(ArmorItem.Type.CHESTPLATE)) + )); + + + public static final DeferredItem ULTIMATE_LEGGINGS = ITEMS.register("ultimate_leggings", + () -> new UltimateArmorItem( + AntarchyFabricMisc.ULTIMATE_ARMOR_MATERIAL, + ArmorItem.Type.LEGGINGS, + new Item.Properties() + .rarity(Rarity.EPIC) + .fireResistant() + .durability(AntarchyFabricMisc.ULTIMATE_ARMOR_MATERIAL.getDurabilityForType(ArmorItem.Type.LEGGINGS)) + )); + + + public static final DeferredItem ULTIMATE_BOOTS = ITEMS.register("ultimate_boots", + () -> new UltimateArmorItem( + AntarchyFabricMisc.ULTIMATE_ARMOR_MATERIAL, + ArmorItem.Type.BOOTS, + new Item.Properties() + .rarity(Rarity.EPIC) + .fireResistant() + .durability(AntarchyFabricMisc.ULTIMATE_ARMOR_MATERIAL.getDurabilityForType(ArmorItem.Type.BOOTS)) + )); + + + public static final DeferredItem ULTIMATE_SWORD = ITEMS.register("ultimate_sword", + () -> new UltimateSwordItem( + ULTIMATE_TIER, + new Item.Properties().stacksTo(1).rarity(Rarity.EPIC).fireResistant(), + AntarchySettings::ultimateSwordAttackDamage, + -2.4F + )); + + + public static final DeferredItem ULTIMATE_PICKAXE = ITEMS.register("ultimate_pickaxe", + () -> new UltimatePickaxeItem( + ULTIMATE_TIER, + new Item.Properties().stacksTo(1).rarity(Rarity.EPIC).fireResistant(), + AntarchySettings::ultimatePickaxeAttackDamage, + -2.8F + )); + + + public static final DeferredItem ULTIMATE_AXE = ITEMS.register("ultimate_axe", + () -> new UltimateAxeItem( + ULTIMATE_TIER, + new Item.Properties().stacksTo(1).rarity(Rarity.EPIC).fireResistant(), + AntarchySettings::ultimateAxeAttackDamage, + -3.0F + )); + + + public static final DeferredItem ULTIMATE_SHOVEL = ITEMS.register("ultimate_shovel", + () -> new UtlimateShovelItem( + ULTIMATE_TIER, + new Item.Properties().stacksTo(1).rarity(Rarity.EPIC).fireResistant(), + AntarchySettings::ultimateShovelAttackDamage, + -3.0F + )); + + + public static final DeferredItem ULTIMATE_HOE = ITEMS.register("ultimate_hoe", + () -> new UltimateHoeItem( + ULTIMATE_TIER, + new Item.Properties().stacksTo(1).rarity(Rarity.EPIC).fireResistant(), + AntarchySettings::ultimateHoeAttackDamage, + 0.0F + )); + + + public static final DeferredItem ULTIMATE_BOW = ITEMS.register("ultimate_bow", + () -> new UltimateBowItem(new Item.Properties().stacksTo(1).durability(768).rarity(Rarity.EPIC).fireResistant())); + + + public static final DeferredItem ULTIMATE_CROSSBOW = ITEMS.register("ultimate_crossbow", + () -> new UltimateCrossbowItem(new Item.Properties().stacksTo(1).durability(1024).rarity(Rarity.EPIC).fireResistant())); + + + public static final DeferredItem NIGHTMARE_HELMET = ITEMS.register("nightmare_helmet", + () -> new NightmareArmorItem( + AntarchyFabricMisc.NIGHTMARE_ARMOR_MATERIAL, + ArmorItem.Type.HELMET, + new Item.Properties() + .rarity(Rarity.EPIC) + .fireResistant() + .durability(AntarchyFabricMisc.NIGHTMARE_ARMOR_MATERIAL.getDurabilityForType(ArmorItem.Type.HELMET)) + )); + + + public static final DeferredItem NIGHTMARE_CHESTPLATE = ITEMS.register("nightmare_chestplate", + () -> new NightmareArmorItem( + AntarchyFabricMisc.NIGHTMARE_ARMOR_MATERIAL, + ArmorItem.Type.CHESTPLATE, + new Item.Properties() + .rarity(Rarity.EPIC) + .fireResistant() + .durability(AntarchyFabricMisc.NIGHTMARE_ARMOR_MATERIAL.getDurabilityForType(ArmorItem.Type.CHESTPLATE)) + )); + + + public static final DeferredItem NIGHTMARE_LEGGINGS = ITEMS.register("nightmare_leggings", + () -> new NightmareArmorItem( + AntarchyFabricMisc.NIGHTMARE_ARMOR_MATERIAL, + ArmorItem.Type.LEGGINGS, + new Item.Properties() + .rarity(Rarity.EPIC) + .fireResistant() + .durability(AntarchyFabricMisc.NIGHTMARE_ARMOR_MATERIAL.getDurabilityForType(ArmorItem.Type.LEGGINGS)) + )); + + + public static final DeferredItem NIGHTMARE_BOOTS = ITEMS.register("nightmare_boots", + () -> new NightmareArmorItem( + AntarchyFabricMisc.NIGHTMARE_ARMOR_MATERIAL, + ArmorItem.Type.BOOTS, + new Item.Properties() + .rarity(Rarity.EPIC) + .fireResistant() + .durability(AntarchyFabricMisc.NIGHTMARE_ARMOR_MATERIAL.getDurabilityForType(ArmorItem.Type.BOOTS)) + )); + + + public static final DeferredItem NIGHTMARE_SWORD = ITEMS.register("nightmare_sword", + () -> new NightmareSwordItem( + ULTIMATE_TIER, + new Item.Properties().stacksTo(1).rarity(Rarity.EPIC).fireResistant(), + -2.4F + )); + + + public static final DeferredItem SHRINK_RAY = ITEMS.register("shrink_ray", + () -> new SizeRayItem( + new Item.Properties().stacksTo(1).durability(512).rarity(Rarity.RARE).fireResistant(), + AntarchyFabricEntities.SHRINK_RAY_PROJECTILE, + SizeRayProjectileEntity.SizeRayType.SHRINK, + new ResourceLocation(Antarchy.MODID, "geo/shrink_ray.geo.json"), + new ResourceLocation(Antarchy.MODID, "textures/models/item/shrink_ray.png"), + new ResourceLocation(Antarchy.MODID, "animations/shrink_ray.animation.json"), + "shrink_ray_active" + )); + + + public static final DeferredItem GROWTH_RAY = ITEMS.register("growth_ray", + () -> new SizeRayItem( + new Item.Properties().stacksTo(1).durability(512).rarity(Rarity.RARE).fireResistant(), + AntarchyFabricEntities.GROWTH_RAY_PROJECTILE, + SizeRayProjectileEntity.SizeRayType.GROWTH, + new ResourceLocation(Antarchy.MODID, "geo/growth_ray.geo.json"), + new ResourceLocation(Antarchy.MODID, "textures/models/item/growth_ray.png"), + new ResourceLocation(Antarchy.MODID, "animations/growth_ray.animation.json"), + "growth_ray_active" + )); + + + public static final DeferredItem GRAVITY_GUN = ITEMS.register("gravity_gun", + () -> new GravityGunItem(new Item.Properties().stacksTo(1).durability(512).rarity(Rarity.RARE).fireResistant())); + + + // Temporarily disabled: keeping the code but not registering the item for now. + // public static final DeferredItem MINERS_DREAM = ITEMS.register("miners_dream", + // () -> new MinersDreamItem(new Item.Properties().stacksTo(1).rarity(Rarity.RARE))); + + + public static final DeferredItem SQUIDZOOKA = ITEMS.register("squidzooka", + () -> new SquidzookaItem(new Item.Properties().stacksTo(1).durability(384).rarity(Rarity.RARE))); + + public static final DeferredItem RPO_LAUNCHER = ITEMS.register("rpo_launcher", + () -> new RpoLauncherItem(new Item.Properties().stacksTo(1).durability(384).rarity(Rarity.RARE))); + + + public static final DeferredItem BATTLE_AXE = ITEMS.register("battle_axe", + () -> new BattleAxeItem( + Tiers.NETHERITE, + new Item.Properties().stacksTo(1).rarity(Rarity.RARE).fireResistant(), + AntarchySettings::battleAxeAttackDamage, + -3.1F + )); + public static final DeferredItem ATTITUDE_ADJUSTER = ITEMS.register("attitude_adjuster", + () -> new AttitudeAdjusterItem( + ATTITUDE_ADJUSTER_TIER, + new Item.Properties().stacksTo(1).durability(ATTITUDE_ADJUSTER_TIER.getUses()).rarity(Rarity.EPIC).fireResistant() + )); + + + public static final DeferredItem DIAMOND_MINECART_ITEM = ITEMS.register("diamond_minecart", + () -> new DiamondMinecartItem(AntarchyFabricEntities.DIAMOND_MINECART, new Item.Properties().stacksTo(1).rarity(Rarity.RARE))); + + + public static final DeferredItem REVERIE_BOTTLE = ITEMS.register("reverie_bottle", + () -> new ReverieBottleItem(new Item.Properties().stacksTo(1).rarity(Rarity.RARE))); + + + public static final DeferredItem BIG_BERTHA_BLADE = ITEMS.registerSimpleItem( + "big_bertha_blade", + new Item.Properties().rarity(Rarity.EPIC).fireResistant() + ); + + + public static final DeferredItem BIG_BERTHA_HANDLE = ITEMS.registerSimpleItem( + "big_bertha_handle", + new Item.Properties().rarity(Rarity.EPIC).fireResistant() + ); + + + public static final DeferredItem BIG_BERTHA_HILT = ITEMS.registerSimpleItem( + "big_bertha_hilt", + new Item.Properties().rarity(Rarity.EPIC).fireResistant() + ); + + + public static final DeferredItem BIG_BERTHA = ITEMS.register("big_bertha", + () -> new BigBerthaItem( + Tiers.NETHERITE, + new Item.Properties() + .stacksTo(1) + .rarity(Rarity.EPIC) + .fireResistant() + )); + + public static final DeferredItem KRAKEN_TENTACLE = ITEMS.registerSimpleItem( + "kraken_tentacle", + new Item.Properties().rarity(Rarity.RARE) + ); + + public static final DeferredItem KRAKENS_GRASP = ITEMS.register("krakens_grasp", + () -> new KrakensGraspItem( + new Item.Properties() + .stacksTo(1) + .durability(250) + .rarity(Rarity.EPIC) + .fireResistant() + )); + + + + public static final DeferredItem EASTER_BUNNY_SPAWN_EGG = ITEMS.register("easter_bunny_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.EASTER_BUNNY, 0xFFF2B2, 0xFF85B5, new Item.Properties())); + + + public static final DeferredItem FLYING_SQUIRREL_SPAWN_EGG = ITEMS.register("flying_squirrel_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.FLYING_SQUIRREL, 0x7D6649, 0xDCC59C, new Item.Properties())); + + + public static final DeferredItem CATERPILLAR_SPAWN_EGG = ITEMS.register("caterpillar_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.CATERPILLAR, 0xA8D96A, 0xF4E04D, new Item.Properties())); + + + public static final DeferredItem BUTTERFLY_SPAWN_EGG = ITEMS.register("butterfly_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.BUTTERFLY, 0x7A4A1E, 0xFF7A00, new Item.Properties())); + + + public static final DeferredItem REVERIE_SPAWN_EGG = ITEMS.register("reverie_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.REVERIE, 0xF2F2F2, 0xBFC3C7, new Item.Properties())); + + + public static final DeferredItem BRUTALFLY_SPAWN_EGG = ITEMS.register("brutalfly_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.BRUTALFLY, 0x4A2214, 0xFF8A1D, new Item.Properties().rarity(Rarity.EPIC))); + + + public static final DeferredItem RED_ANT_SPAWN_EGG = ITEMS.register("red_ant_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.RED_ANT, 0xA31818, 0x2B0909, new Item.Properties())); + + + public static final DeferredItem BROWN_ANT_SPAWN_EGG = ITEMS.register("brown_ant_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.BROWN_ANT, 0x6A4320, 0x26160A, new Item.Properties())); + + + public static final DeferredItem RAINBOW_ANT_SPAWN_EGG = ITEMS.register("rainbow_ant_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.RAINBOW_ANT, 0x56D4F0, 0xF66DBB, new Item.Properties())); + + + public static final DeferredItem TERMITE_SPAWN_EGG = ITEMS.register("termite_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.TERMITE, 0xD4B96A, 0xFF6B1A, new Item.Properties())); + + + public static final DeferredItem MOLEWORM_SPAWN_EGG = ITEMS.register("moleworm_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.MOLEWORM, 0xB8B8B8, 0x8A623A, new Item.Properties())); + + + public static final DeferredItem MANTIS_SPAWN_EGG = ITEMS.register("mantis_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.MANTIS, 0xF8F8F2, 0x63B44A, new Item.Properties())); + + + public static final DeferredItem ALPHA_MANTIS_SPAWN_EGG = ITEMS.register("alpha_mantis_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.ALPHA_MANTIS, 0x8FDD6C, 0x2F5D22, new Item.Properties())); + + + public static final DeferredItem ROLLY_POLLY_SPAWN_EGG = ITEMS.register("rolly_polly_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.ROLLY_POLLY, 0x7284A3, 0xBCC8DB, new Item.Properties())); + + + public static final DeferredItem MOLEVORE_SPAWN_EGG = ITEMS.register("molevore_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.MOLEVORE, 0x4A4A4A, 0x6B4A2B, new Item.Properties().rarity(Rarity.UNCOMMON))); + + + public static final DeferredItem TRIFFID_SPAWN_EGG = ITEMS.register("triffid_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.TRIFFID, 0x4C8F3A, 0xFF2FB3, new Item.Properties().rarity(Rarity.UNCOMMON))); + + + public static final DeferredItem APPLE_COW_SPAWN_EGG = ITEMS.register("apple_cow_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.APPLE_COW, 0xFF1A1A, 0x32FF32, new Item.Properties())); + + + public static final DeferredItem GOLDEN_APPLE_COW_SPAWN_EGG = ITEMS.register("golden_apple_cow_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.GOLDEN_APPLE_COW, 0xFFE14A, 0x32FF32, new Item.Properties())); + + + public static final DeferredItem ENCHANTED_GOLDEN_APPLE_COW_SPAWN_EGG = ITEMS.register("enchanted_golden_apple_cow_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.ENCHANTED_GOLDEN_APPLE_COW, 0x7040B6, 0xFFE14A, new Item.Properties())); + + + public static final DeferredItem DR_TRAYAURUS_SPAWN_EGG = ITEMS.register("dr_trayaurus_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.DR_TRAYAURUS, 0xB7A27B, 0x4A3D29, new Item.Properties())); + + + public static final DeferredItem WASP_SPAWN_EGG = ITEMS.register("wasp_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.WASP, 0x111111, 0xF1D800, new Item.Properties())); + + + public static final DeferredItem BOMBER_SPAWN_EGG = ITEMS.register("bomber_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.BOMBER, 0x7A7A7A, 0xB32020, new Item.Properties())); + + + public static final DeferredItem JUMPY_BUG_SPAWN_EGG = ITEMS.register("jumpy_bug_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.JUMPY_BUG, 0x0A1636, 0x8A3E00, new Item.Properties())); + + + public static final DeferredItem SPIT_BUG_SPAWN_EGG = ITEMS.register("spit_bug_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.SPIT_BUG, 0x6B4A2B, 0x7ED957, new Item.Properties())); + + + public static final DeferredItem STINK_BUG_SPAWN_EGG = ITEMS.register("stink_bug_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.STINK_BUG, 0x111111, 0xFF7A00, new Item.Properties())); + + + public static final DeferredItem CLOUD_SHARK_SPAWN_EGG = ITEMS.register("cloud_shark_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.CLOUD_SHARK, 0xDDEAF4, 0x7F96A8, new Item.Properties())); + + + public static final DeferredItem KRAKEN_SPAWN_EGG = ITEMS.register("kraken_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.KRAKEN, 0x163C53, 0x4F8E99, new Item.Properties().rarity(Rarity.EPIC))); + + + public static final DeferredItem MISSILE_SQUID_SPAWN_EGG = ITEMS.register("missile_squid_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.MISSILE_SQUID, 0xD88FA7, 0x8D5269, new Item.Properties().rarity(Rarity.UNCOMMON))); + + + public static final DeferredItem OCTOPUS_BOMB_SPAWN_EGG = ITEMS.register("octopus_bomb_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.OCTOPUS_BOMB, 0xC882C8, 0x5C1A7A, new Item.Properties().rarity(Rarity.UNCOMMON))); + + + public static final DeferredItem NIGHTMARE_SPAWN_EGG = ITEMS.register("nightmare_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.NIGHTMARE, 0x22121C, 0xB51B2D, new Item.Properties().rarity(Rarity.RARE))); + + + public static final DeferredItem BED_BUG_SPAWN_EGG = ITEMS.register("bed_bug_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.BED_BUG, 0x3B2218, 0x611111, new Item.Properties())); + + + public static final DeferredItem LUCID_SPAWN_EGG = ITEMS.register("lucid_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.LUCID, 0xE53935, 0xF4D03F, new Item.Properties().rarity(Rarity.RARE))); + + + public static final DeferredItem SCORPION_SPAWN_EGG = ITEMS.register("scorpion_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.SCORPION, 0xA8D8FF, 0xE04B5A, new Item.Properties())); + + + public static final DeferredItem BASILISK_SPAWN_EGG = ITEMS.register("basilisk_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.BASILISK, 0x4A7C40, 0xD4A040, new Item.Properties())); + + + public static final DeferredItem EMPEROR_SCORPION_SPAWN_EGG = ITEMS.register("emperor_scorpion_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.EMPEROR_SCORPION, 0x3A3242, 0xD8CDB4, new Item.Properties())); + + + public static final DeferredItem LUCID_EYE = ITEMS.register("lucid_eye", + () -> new LucidEyeItem(new Item.Properties().stacksTo(16).rarity(Rarity.UNCOMMON))); + + + public static final DeferredItem LUCID_PEARL = ITEMS.register("lucid_pearl", + () -> new LucidPearlItem( + new Item.Properties().stacksTo(16).rarity(Rarity.UNCOMMON), + AntarchyFabricEntities.LUCID_PEARL_PROJECTILE + )); + + + public static final DeferredItem WATER_CANNON = ITEMS.register("water_cannon", + () -> new WaterCannonItem(new Item.Properties().stacksTo(1).durability(192).rarity(Rarity.RARE))); + + + public static final DeferredItem PRIMORDIAL_HELMET = ITEMS.register("primordial_helmet", + () -> new PrimordialArmorItem(AntarchyFabricMisc.PRIMORDIAL_ARMOR_MATERIAL, ArmorItem.Type.HELMET, + new Item.Properties().stacksTo(1).rarity(Rarity.RARE).fireResistant().durability(AntarchyFabricMisc.PRIMORDIAL_ARMOR_MATERIAL.getDurabilityForType(ArmorItem.Type.HELMET)))); + + + public static final DeferredItem PRIMORDIAL_CHESTPLATE = ITEMS.register("primordial_chestplate", + () -> new PrimordialArmorItem(AntarchyFabricMisc.PRIMORDIAL_ARMOR_MATERIAL, ArmorItem.Type.CHESTPLATE, + new Item.Properties().stacksTo(1).rarity(Rarity.RARE).fireResistant().durability(AntarchyFabricMisc.PRIMORDIAL_ARMOR_MATERIAL.getDurabilityForType(ArmorItem.Type.CHESTPLATE)))); + + + public static final DeferredItem PRIMORDIAL_LEGGINGS = ITEMS.register("primordial_leggings", + () -> new PrimordialArmorItem(AntarchyFabricMisc.PRIMORDIAL_ARMOR_MATERIAL, ArmorItem.Type.LEGGINGS, + new Item.Properties().stacksTo(1).rarity(Rarity.RARE).fireResistant().durability(AntarchyFabricMisc.PRIMORDIAL_ARMOR_MATERIAL.getDurabilityForType(ArmorItem.Type.LEGGINGS)))); + + + public static final DeferredItem PRIMORDIAL_BOOTS = ITEMS.register("primordial_boots", + () -> new PrimordialArmorItem(AntarchyFabricMisc.PRIMORDIAL_ARMOR_MATERIAL, ArmorItem.Type.BOOTS, + new Item.Properties().stacksTo(1).rarity(Rarity.RARE).fireResistant().durability(AntarchyFabricMisc.PRIMORDIAL_ARMOR_MATERIAL.getDurabilityForType(ArmorItem.Type.BOOTS)))); + + + public static final DeferredItem CREEPING_HORROR_SPAWN_EGG = ITEMS.register("creeping_horror_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.CREEPING_HORROR, 0x6B3A1F, 0x6B0000, new Item.Properties())); + + + public static final DeferredItem LURKING_TERROR_SPAWN_EGG = ITEMS.register("lurking_terror_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.LURKING_TERROR, 0x2D5A1B, 0x8B0000, new Item.Properties())); + + + public static final DeferredItem HERCULES_BEETLE_SPAWN_EGG = ITEMS.register("hercules_beetle_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.HERCULES_BEETLE, 0x6B1F2A, 0xD4AF37, new Item.Properties().rarity(Rarity.RARE))); + public static final DeferredItem JERRY_SPAWN_EGG = ITEMS.register("jerry_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.JERRY, 0x6D2232, 0x8ED34A, new Item.Properties())); + + + public static final DeferredItem TORETERROR_SPAWN_EGG = ITEMS.register("toreterror_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.TORETERROR, 0x90EE90, 0x5C4033, new Item.Properties().rarity(Rarity.EPIC))); + + + public static final DeferredItem CHEEP_SPAWN_EGG = ITEMS.register("cheep_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.CHEEP, 0xFF00AA, 0x00FF44, new Item.Properties())); + + public static final DeferredItem CHEEP_ITEM = ITEMS.register("cheep", + () -> new Item(new Item.Properties() + .food(new net.minecraft.world.food.FoodProperties.Builder() + .nutrition(2) + .saturationMod(0.1F) + .build()))); + + public static final DeferredItem DORRIE_SPAWN_EGG = ITEMS.register("dorrie_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.DORRIE, 0x6F8CFF, 0xD2F2FF, new Item.Properties())); + + + public static final DeferredItem OURANWOOD_DEER_SPAWN_EGG = ITEMS.register("ouranwood_deer_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.OURANWOOD_DEER, 0x8A6D4B, 0xE8D9B5, new Item.Properties())); + + + public static final DeferredItem GLIMMER_SPAWN_EGG = ITEMS.register("glimmer_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.GLIMMER, 0x7DFFFF, 0x2AC7D0, new Item.Properties())); + + + public static final DeferredItem ELKA_SPAWN_EGG = ITEMS.register("elka_spawn_egg", + () -> new DeferredSpawnEggItem(AntarchyFabricEntities.ELKA, 0x6B2FA0, 0xFFFFFF, new Item.Properties())); + + + public static final DeferredItem SPIRIT_APPLE = ITEMS.register("spirit_apple", + () -> new com.craisinlord.antarchy.content.item.SpiritAppleItem(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(4) + .saturationMod(0.3F) + .build()))); + + + public static final DeferredItem GLIMMER_BOTTLE = ITEMS.register("glimmer_bottle", + com.craisinlord.antarchy.content.item.GlimmerBottleItem::new); + + + + public static Item cloudBucketItem() { + return CLOUD_BUCKET.get(); + } + + + + public static Item diamondMinecartItem() { + return DIAMOND_MINECART_ITEM.get(); + } + + + + public static Ingredient bloodCrystalRepairIngredient() { + return Ingredient.of(BuiltInRegistries.ITEM.getOptional(new ResourceLocation(Antarchy.MODID, "blood_crystal_shard")) + .orElse(Items.AIR)); + } + + + + public static Ingredient ultimateRepairIngredient() { + return Ingredient.of(TITANIUM_INGOT.get()); + } + + + public static void register() { + ITEMS.register(); + } + +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricMisc.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricMisc.java new file mode 100644 index 00000000..8c623246 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricMisc.java @@ -0,0 +1,901 @@ +package com.craisinlord.antarchy.fabric.registry; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.recipe.AmericanizeRecipe; +import com.craisinlord.antarchy.content.worldgen.ants.BrownAntNestFeature; +import com.craisinlord.antarchy.content.worldgen.ants.RainbowAntNestFeature; +import com.craisinlord.antarchy.content.worldgen.ants.RedAntNestFeature; +import com.craisinlord.antarchy.content.worldgen.ants.TermiteNestFeature; +import com.craisinlord.antarchy.content.worldgen.cavaryn.CavarynBileCystFeature; +import com.craisinlord.antarchy.content.worldgen.cavaryn.CavarynBileVeinFeature; +import com.craisinlord.antarchy.content.worldgen.cavaryn.CavarynCreepvineFeature; +import com.craisinlord.antarchy.content.worldgen.cavaryn.CavarynWallAmberMossFeature; +import com.craisinlord.antarchy.content.worldgen.cavaryn.HangingCreeprootsFeature; +import com.craisinlord.antarchy.content.worldgen.cavaryn.MoltingVinesFeature; +import com.craisinlord.antarchy.content.worldgen.ocean.SeashellFeature; +import com.craisinlord.antarchy.content.worldgen.overworld.CornPatchFeature; +import com.craisinlord.antarchy.content.worldgen.thoraxis.NyxiteSpikeConfiguration; +import com.craisinlord.antarchy.content.worldgen.thoraxis.AntiwaterSpringsConfiguration; +import com.craisinlord.antarchy.content.worldgen.thoraxis.AntiwaterSpringsFeature; +import com.craisinlord.antarchy.content.worldgen.thoraxis.NyxiteSpikeFeature; +import com.craisinlord.antarchy.content.worldgen.thoraxis.PotentNyxiteFeature; +import com.craisinlord.antarchy.fabric.content.fluid.AntiwaterFluid; +import com.craisinlord.antarchy.content.effect.DreadMobEffect; +import com.craisinlord.antarchy.content.effect.GoopedMobEffect; +import com.craisinlord.antarchy.content.effect.GrowthMobEffect; +import com.craisinlord.antarchy.content.effect.InvertedMobEffect; +import com.craisinlord.antarchy.content.effect.ParalyzedMobEffect; +import com.craisinlord.antarchy.content.effect.ShrinkMobEffect; +import com.craisinlord.antarchy.content.effect.StinkyMobEffect; +import com.craisinlord.antarchy.content.worldgen.elythia.CoralSpikeFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.ElythiaBiomeSource; +import com.craisinlord.antarchy.content.worldgen.elythia.ElythiaRiverCarveFunction; +import com.craisinlord.antarchy.content.worldgen.elythia.ElythiaFloraFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.ElythiaLargeTuffBoulderFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.PeachForestMossyBoulderFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.PeachForestPondConfiguration; +import com.craisinlord.antarchy.content.worldgen.elythia.PeachForestPondFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.ElythiaPondFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.ElythiaSurfaceCoverFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.ElythiaTuffBoulderFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.ElythiaUndergroundFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.MolewormCaveEntranceFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.MolewormSurfaceMoundsFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.BrutalflyCocoonFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.LumenPoolFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.LumenLilyPadFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.LumenStreamFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.LumenSpireFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.MolewormTunnelsFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.MolewormWarrensFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.OuranwoodCocoonTreeFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.OuranwoodTreeConfiguration; +import com.craisinlord.antarchy.content.worldgen.elythia.OuranwoodTreeFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.PeachTreeConfiguration; +import com.craisinlord.antarchy.content.worldgen.elythia.PeachTreeFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.TriffidPatchFeature; +import com.craisinlord.antarchy.content.worldgen.cavaryn.CavarynEggPatchFeature; +import com.craisinlord.antarchy.content.worldgen.cavaryn.ChitenSpikeConfiguration; +import com.craisinlord.antarchy.content.worldgen.cavaryn.ChitenSpikeFeature; +import com.craisinlord.antarchy.content.worldgen.thoraxis.BedBugNestFeature; +import com.craisinlord.antarchy.content.worldgen.thoraxis.BedBugSurfaceClusterFeature; +import com.craisinlord.antarchy.content.worldgen.thoraxis.CloudSeaCalciteFeature; +import com.craisinlord.antarchy.content.worldgen.thoraxis.LucidAntiwaterPoolFeature; +import com.craisinlord.antarchy.content.worldgen.thoraxis.ThoraxisBiomeSource; +import com.craisinlord.antarchy.content.worldgen.thoraxis.ThoraxisDuneConfiguration; +import com.craisinlord.antarchy.content.worldgen.thoraxis.ThoraxisDuneFeature; +import com.craisinlord.antarchy.content.worldgen.thoraxis.ThoraxisFissureConfiguration; +import com.craisinlord.antarchy.content.worldgen.thoraxis.ThoraxisFissureFeature; +import com.craisinlord.antarchy.content.worldgen.thoraxis.ThoraxisBloodCrystalConfiguration; +import com.craisinlord.antarchy.content.worldgen.thoraxis.ThoraxisBloodCrystalFeature; +import com.craisinlord.antarchy.content.worldgen.thoraxis.ThoraxisAntiwaterPoolConfiguration; +import com.craisinlord.antarchy.content.worldgen.thoraxis.ThoraxisAntiwaterPoolFeature; +import com.craisinlord.antarchy.content.worldgen.thoraxis.ThoraxisRibColumnsConfiguration; +import com.craisinlord.antarchy.content.worldgen.thoraxis.ThoraxisRibColumnsFeature; +import com.craisinlord.antarchy.content.worldgen.thoraxis.ThoraxisSpikeConfiguration; +import com.craisinlord.antarchy.content.worldgen.thoraxis.ThoraxisSpikeFeature; +import com.craisinlord.antarchy.content.client.particle.InvertedGeyserBaseParticleOptions; +import com.craisinlord.antarchy.content.client.particle.InvertedGeyserParticleOptions; + +import java.util.List; + +import com.mojang.serialization.MapCodec; +import net.minecraft.advancements.critereon.EntitySubPredicate; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.item.alchemy.Potion; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.tags.TagKey; +import net.minecraft.world.damagesource.DamageType; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.flag.FeatureFlags; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.levelgen.DensityFunction; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.configurations.SimpleBlockConfiguration; +import net.minecraft.world.level.material.Fluid; +import com.craisinlord.antarchy.fabric.AntarchyFabricContent; + +public final class AntarchyFabricMisc { + + private static final java.util.Map BASE_DURABILITY = java.util.Map.of( + ArmorItem.Type.BOOTS, 13, + ArmorItem.Type.LEGGINGS, 15, + ArmorItem.Type.CHESTPLATE, 16, + ArmorItem.Type.HELMET, 11 + ); + + private static ArmorMaterial armorMaterial( + int durabilityMultiplier, + java.util.Map defense, + int enchantmentValue, + net.minecraft.sounds.SoundEvent equipSound, + java.util.function.Supplier repairIngredient, + float toughness, + float knockbackResistance, + String name + ) { + return new ArmorMaterial() { + @Override + public int getDurabilityForType(ArmorItem.Type type) { + return BASE_DURABILITY.get(type) * durabilityMultiplier; + } + + @Override + public int getDefenseForType(ArmorItem.Type type) { + return defense.getOrDefault(type, 0); + } + + @Override + public int getEnchantmentValue() { + return enchantmentValue; + } + + @Override + public net.minecraft.sounds.SoundEvent getEquipSound() { + return equipSound; + } + + @Override + public Ingredient getRepairIngredient() { + return repairIngredient.get(); + } + + @Override + public String getName() { + return new ResourceLocation(Antarchy.MODID, name).toString(); + } + + @Override + public float getToughness() { + return toughness; + } + + @Override + public float getKnockbackResistance() { + return knockbackResistance; + } + }; + } + + + public static final DeferredRegister> PARTICLE_TYPES = DeferredRegister.create(Registries.PARTICLE_TYPE, Antarchy.MODID); + + + public static final DeferredRegister> FEATURES = DeferredRegister.create(Registries.FEATURE, Antarchy.MODID); + + + public static final DeferredRegister> BIOME_SOURCES = DeferredRegister.create(Registries.BIOME_SOURCE, Antarchy.MODID); + + + public static final DeferredRegister> DENSITY_FUNCTION_TYPES = DeferredRegister.create(Registries.DENSITY_FUNCTION_TYPE, Antarchy.MODID); + + + public static final DeferredRegister ATTRIBUTES = DeferredRegister.create(Registries.ATTRIBUTE, Antarchy.MODID); + + + private static final TagKey BYPASSES_BLOODGLASS = + TagKey.create(net.minecraft.core.registries.Registries.DAMAGE_TYPE, new ResourceLocation("antarchy", "bypasses_bloodglass")); + + + public static final DeferredHolder SCALE = ATTRIBUTES.register( + "scale", + () -> new net.minecraft.world.entity.ai.attributes.RangedAttribute("attribute.antarchy.scale", 1.0, 0.0625, 16.0).setSyncable(true) + ); + + + public static final DeferredHolder DOUBLE_DAMAGE_CHANCE = ATTRIBUTES.register( + "double_damage_chance", + () -> new net.minecraft.world.entity.ai.attributes.RangedAttribute("attribute.antarchy.double_damage_chance", 0.0, 0.0, 1.0).setSyncable(true) + ); + + + public static final DeferredRegister MOB_EFFECTS = DeferredRegister.create(Registries.MOB_EFFECT, Antarchy.MODID); + + + public static final DeferredRegister POTIONS = DeferredRegister.create(Registries.POTION, Antarchy.MODID); + + + public static final DeferredRegister FLUIDS = DeferredRegister.create(Registries.FLUID, Antarchy.MODID); + + + public static final DeferredRegister> MENUS = DeferredRegister.create(Registries.MENU, Antarchy.MODID); + + + public static final DeferredRegister FROG_VARIANTS = DeferredRegister.create(Registries.FROG_VARIANT, Antarchy.MODID); + + + public static final DeferredHolder ELYTHIA_FROG_VARIANT = FROG_VARIANTS.register( + "elythia", + () -> new net.minecraft.world.entity.animal.FrogVariant(com.craisinlord.antarchy.content.entity.ElythiaFrog.TEXTURE) + ); + + + public static final DeferredHolder, net.minecraft.world.inventory.MenuType> DORRIE_INVENTORY_MENU = + MENUS.register("dorrie_inventory", () -> new net.minecraft.world.inventory.MenuType<>(com.craisinlord.antarchy.content.menu.DorrieInventoryMenu::new, FeatureFlags.DEFAULT_FLAGS)); + + + public static final DeferredRegister> RECIPE_SERIALIZERS = + DeferredRegister.create(Registries.RECIPE_SERIALIZER, Antarchy.MODID); + + + public static final DeferredHolder, net.minecraft.world.item.crafting.RecipeSerializer> AMERICANIZE_SERIALIZER = + RECIPE_SERIALIZERS.register("americanize", () -> AmericanizeRecipe.SERIALIZER); + + + public static final ArmorMaterial ULTIMATE_ARMOR_MATERIAL = armorMaterial( + 40, createUltimateArmorDefense(), 10, SoundEvents.ARMOR_EQUIP_DIAMOND, + AntarchyFabricItems::ultimateRepairIngredient, 2.0F, + (float) AntarchySettings.ultimateArmorKnockbackResistance(), "ultimate_armor"); + + + public static final ArmorMaterial NIGHTMARE_ARMOR_MATERIAL = armorMaterial( + 37, createNightmareArmorDefense(), 10, SoundEvents.ARMOR_EQUIP_NETHERITE, + () -> Ingredient.of(AntarchyFabricItems.NIGHTMARE_SCALE.get()), 3.0F, + (float) AntarchySettings.nightmareArmorKnockbackResistance(), "nightmare_armor"); + + + public static final ArmorMaterial PRIMORDIAL_ARMOR_MATERIAL = armorMaterial( + 33, createPrimordialArmorDefense(), 15, SoundEvents.ARMOR_EQUIP_NETHERITE, + () -> Ingredient.of(AntarchyFabricItems.PRIMORDIAL_SCUTE.get()), 3.0F, 0.1F, "primordial"); + + + public static final ArmorMaterial BLOOD_CRYSTAL_ARMOR_MATERIAL = armorMaterial( + 33, createBloodCrystalArmorDefense(), 30, SoundEvents.ARMOR_EQUIP_DIAMOND, + AntarchyFabricItems::bloodCrystalRepairIngredient, 0.0F, 0.0F, "blood_crystal"); + + + public static final ArmorMaterial MOGGLES_ARMOR_MATERIAL = armorMaterial( + 25, createMogglesArmorDefense(), 12, SoundEvents.ARMOR_EQUIP_GOLD, + () -> Ingredient.of(Items.GOLD_INGOT), 0.0F, 0.0F, "moggles"); + + + public static final ArmorMaterial FALLEN_KING_CROWN_ARMOR_MATERIAL = armorMaterial( + 25, createFallenKingCrownDefense(), 25, SoundEvents.ARMOR_EQUIP_GOLD, + () -> Ingredient.of(Items.GOLD_INGOT), 0.0F, 0.0F, "fallen_king_crown"); + + + public static final DeferredHolder, SimpleParticleType> DREAM_FIRE_FLAME = PARTICLE_TYPES.register("dream_fire_flame", + () -> simpleParticleType()); + + + public static final DeferredHolder, SimpleParticleType> STINKY_GAS = PARTICLE_TYPES.register("stinky_gas", + () -> simpleParticleType()); + + + public static final DeferredHolder, SimpleParticleType> STINKY_FLY = PARTICLE_TYPES.register("stinky_fly", + () -> simpleParticleType()); + + + public static final DeferredHolder, SimpleParticleType> PEACH_LEAVES_PARTICLE = PARTICLE_TYPES.register("peach_leaves_particle", + () -> simpleParticleType()); + public static final DeferredHolder, SimpleParticleType> LOTUS_POLLEN = PARTICLE_TYPES.register("lotus_pollen", + () -> simpleParticleType()); + + + public static final DeferredHolder, SimpleParticleType> HYPNOTIC_GAS = PARTICLE_TYPES.register("hypnotic_gas", + () -> simpleParticleType()); + + + public static final DeferredHolder, SimpleParticleType> HYPNOTIC_GAS_CLOUD = PARTICLE_TYPES.register("hypnotic_gas_cloud", + () -> simpleParticleType()); + + + public static final DeferredHolder, SimpleParticleType> HYPNOTIC_GAS_DOWN = PARTICLE_TYPES.register("hypnotic_gas_down", + () -> simpleParticleType()); + + + public static final DeferredHolder, SimpleParticleType> HYPNOTIC_GAS_CLOUD_DOWN = PARTICLE_TYPES.register("hypnotic_gas_cloud_down", + () -> simpleParticleType()); + + + public static final DeferredHolder, SimpleParticleType> FIREFLY = PARTICLE_TYPES.register("firefly", + () -> simpleParticleType()); + + + public static final DeferredHolder, SimpleParticleType> ORANGE_ASH = PARTICLE_TYPES.register("orange_ash", + () -> simpleParticleType()); + + + public static final DeferredHolder, ParticleType> INVERTED_GEYSER_BASE = PARTICLE_TYPES.register("inverted_geyser_base", + () -> particleType(InvertedGeyserBaseParticleOptions.deserializer())); + + + public static final DeferredHolder, ParticleType> INVERTED_GEYSER_PLUME = PARTICLE_TYPES.register("inverted_geyser_plume", + () -> particleType(InvertedGeyserParticleOptions.deserializer())); + + + public static final DeferredHolder, ParticleType> INVERTED_GEYSER_POOF = PARTICLE_TYPES.register("inverted_geyser_poof", + () -> particleType(InvertedGeyserBaseParticleOptions.deserializer())); + + + public static final DeferredHolder, ParticleType> INVERTED_GEYSER_ERUPTION = PARTICLE_TYPES.register("inverted_geyser_eruption", + () -> particleType(InvertedGeyserParticleOptions.deserializer())); + + + public static final DeferredHolder DREAD = MOB_EFFECTS.register("dread", DreadMobEffect::new); + + + public static final DeferredHolder PARALYZED = MOB_EFFECTS.register("paralyzed", ParalyzedMobEffect::new); + + + public static final DeferredHolder INVERTED = MOB_EFFECTS.register("inverted", InvertedMobEffect::new); + + + public static final DeferredHolder STINKY = MOB_EFFECTS.register("stinky", StinkyMobEffect::new); + + + public static final DeferredHolder GOOPED = MOB_EFFECTS.register("gooped", GoopedMobEffect::new); + + + public static final DeferredHolder BLOODGLASS_WARD = MOB_EFFECTS.register("bloodglass_ward", com.craisinlord.antarchy.content.effect.BloodglassWardEffect::new); + + + public static final DeferredHolder BLOODGLASS_MAX_HEARTS = ATTRIBUTES.register( + "bloodglass_max_hearts", + () -> new net.minecraft.world.entity.ai.attributes.RangedAttribute("attribute.antarchy.bloodglass_max_hearts", 0.0, 0.0, 8.0).setSyncable(true) + ); + + + public static final DeferredHolder DREAD_POTION = POTIONS.register("dread", + () -> new Potion(new MobEffectInstance(mobEffectHolder(DREAD), 600))); + + + public static final DeferredHolder LONG_DREAD = POTIONS.register("long_dread", + () -> new Potion("dread", new MobEffectInstance(mobEffectHolder(DREAD), 2400))); + + + public static final DeferredHolder INVERSION = POTIONS.register("inversion", + () -> new Potion(new MobEffectInstance(mobEffectHolder(INVERTED), 600))); + + + public static final DeferredHolder LONG_INVERSION = POTIONS.register("long_inversion", + () -> new Potion("inversion", new MobEffectInstance(mobEffectHolder(INVERTED), 2400))); + + + public static final DeferredHolder STINKY_POTION = POTIONS.register("stinky", + () -> new Potion(new MobEffectInstance(mobEffectHolder(STINKY), 1200))); + + + public static final DeferredHolder LONG_STINKY = POTIONS.register("long_stinky", + () -> new Potion("stinky", new MobEffectInstance(mobEffectHolder(STINKY), 2400))); + + + public static final DeferredHolder SHRINKING_EFFECT = MOB_EFFECTS.register("shrinking", ShrinkMobEffect::new); + + + public static final DeferredHolder GROWTH_EFFECT = MOB_EFFECTS.register("growth", GrowthMobEffect::new); + + + public static final DeferredHolder PARALYSIS = POTIONS.register("paralysis", + () -> new Potion(new MobEffectInstance(mobEffectHolder(PARALYZED), 200))); + + + public static final DeferredHolder LONG_PARALYSIS = POTIONS.register("long_paralysis", + () -> new Potion("paralysis", new MobEffectInstance(mobEffectHolder(PARALYZED), 400))); + + + public static final DeferredHolder HASTE = POTIONS.register("haste", + () -> new Potion(new MobEffectInstance(MobEffects.DIG_SPEED, 1200, 0))); + + + public static final DeferredHolder STRONG_HASTE = POTIONS.register("strong_haste", + () -> new Potion("haste", new MobEffectInstance(MobEffects.DIG_SPEED, 600, 1))); + + + public static final DeferredHolder SHRINKING = POTIONS.register("shrinking", + () -> new Potion(new MobEffectInstance(mobEffectHolder(SHRINKING_EFFECT), 1200, 0))); + + + public static final DeferredHolder STRONG_SHRINKING = POTIONS.register("strong_shrinking", + () -> new Potion("shrinking", new MobEffectInstance(mobEffectHolder(SHRINKING_EFFECT), 900, 1))); + + + public static final DeferredHolder EXTREME_SHRINKING = POTIONS.register("extreme_shrinking", + () -> new Potion("shrinking", new MobEffectInstance(mobEffectHolder(SHRINKING_EFFECT), 600, 2))); + + + public static final DeferredHolder GROWING = POTIONS.register("growing", + () -> new Potion(new MobEffectInstance(mobEffectHolder(GROWTH_EFFECT), 1200, 0))); + + + public static final DeferredHolder STRONG_GROWING = POTIONS.register("strong_growing", + () -> new Potion("growing", new MobEffectInstance(mobEffectHolder(GROWTH_EFFECT), 900, 1))); + + + public static final DeferredHolder EXTREME_GROWING = POTIONS.register("extreme_growing", + () -> new Potion("growing", new MobEffectInstance(mobEffectHolder(GROWTH_EFFECT), 600, 2))); + + + public static final DeferredHolder BILE = FLUIDS.register("bile", + () -> new com.craisinlord.antarchy.fabric.content.fluid.SimpleFluid.Source( + () -> AntarchyFabricContent.lookupFlowingFluid("bile"), + () -> AntarchyFabricContent.lookupFlowingFluid("flowing_bile"), + () -> AntarchyFabricContent.lookupItem("bile_bucket"), + "bile", + 4, + 1, + 5 + )); + + + public static final DeferredHolder FLOWING_BILE = FLUIDS.register("flowing_bile", + () -> new com.craisinlord.antarchy.fabric.content.fluid.SimpleFluid.Flowing( + () -> AntarchyFabricContent.lookupFlowingFluid("bile"), + () -> AntarchyFabricContent.lookupFlowingFluid("flowing_bile"), + () -> AntarchyFabricContent.lookupItem("bile_bucket"), + "bile", + 4, + 1, + 5 + )); + + + + public static final DeferredHolder ICHOR = FLUIDS.register("ichor", + () -> new com.craisinlord.antarchy.fabric.content.fluid.SimpleFluid.Source( + () -> AntarchyFabricContent.lookupFlowingFluid("ichor"), + () -> AntarchyFabricContent.lookupFlowingFluid("flowing_ichor"), + () -> AntarchyFabricContent.lookupItem("ichor_bucket"), + "ichor", + 4, + 1, + 5 + )); + + + public static final DeferredHolder FLOWING_ICHOR = FLUIDS.register("flowing_ichor", + () -> new com.craisinlord.antarchy.fabric.content.fluid.SimpleFluid.Flowing( + () -> AntarchyFabricContent.lookupFlowingFluid("ichor"), + () -> AntarchyFabricContent.lookupFlowingFluid("flowing_ichor"), + () -> AntarchyFabricContent.lookupItem("ichor_bucket"), + "ichor", + 4, + 1, + 5 + )); + + + + public static final DeferredHolder ANTIWATER = FLUIDS.register("antiwater", + AntiwaterFluid.Source::new); + + + public static final DeferredHolder FLOWING_ANTIWATER = FLUIDS.register("flowing_antiwater", + AntiwaterFluid.Flowing::new); + + + public static final DeferredHolder LUMEN = FLUIDS.register("lumen", + () -> new com.craisinlord.antarchy.fabric.content.fluid.SimpleFluid.Source( + () -> AntarchyFabricContent.lookupFlowingFluid("lumen"), + () -> AntarchyFabricContent.lookupFlowingFluid("flowing_lumen"), + () -> AntarchyFabricContent.lookupItem("lumen_bucket"), + "lumen", + 4, + 1, + 5 + )); + + + public static final DeferredHolder FLOWING_LUMEN = FLUIDS.register("flowing_lumen", + () -> new com.craisinlord.antarchy.fabric.content.fluid.SimpleFluid.Flowing( + () -> AntarchyFabricContent.lookupFlowingFluid("lumen"), + () -> AntarchyFabricContent.lookupFlowingFluid("flowing_lumen"), + () -> AntarchyFabricContent.lookupItem("lumen_bucket"), + "lumen", + 4, + 1, + 5 + )); + + + public static final DeferredHolder, RedAntNestFeature> RED_ANT_NEST_FEATURE = FEATURES.register("red_ant_nest", + () -> new RedAntNestFeature(SimpleBlockConfiguration.CODEC)); + + + public static final DeferredHolder, BrownAntNestFeature> BROWN_ANT_NEST_FEATURE = FEATURES.register("brown_ant_nest", + () -> new BrownAntNestFeature(SimpleBlockConfiguration.CODEC)); + + + public static final DeferredHolder, RainbowAntNestFeature> RAINBOW_ANT_NEST_FEATURE = FEATURES.register("rainbow_ant_nest", + () -> new RainbowAntNestFeature(SimpleBlockConfiguration.CODEC)); + + + public static final DeferredHolder, TermiteNestFeature> TERMITE_NEST_FEATURE = FEATURES.register("termite_nest", + () -> new TermiteNestFeature(SimpleBlockConfiguration.CODEC)); + + + public static final DeferredHolder, OuranwoodTreeFeature> OURANWOOD_LARGE_TREE = FEATURES.register("ouranwood_large_tree", + () -> new OuranwoodTreeFeature(OuranwoodTreeConfiguration.CODEC)); + + + public static final DeferredHolder, OuranwoodTreeFeature> OURANWOOD_YOUNG_TREE = FEATURES.register("ouranwood_young_tree", + () -> new OuranwoodTreeFeature(OuranwoodTreeConfiguration.CODEC)); + + + public static final DeferredHolder, OuranwoodTreeFeature> OURANWOOD_MEDIUM_TREE = FEATURES.register("ouranwood_medium_tree", + () -> new OuranwoodTreeFeature(OuranwoodTreeConfiguration.CODEC)); + + + public static final DeferredHolder, OuranwoodCocoonTreeFeature> OURANWOOD_COCOON_TREE = FEATURES.register("ouranwood_cocoon_tree", + () -> new OuranwoodCocoonTreeFeature(OuranwoodTreeConfiguration.CODEC)); + + + public static final DeferredHolder, PeachTreeFeature> PEACH_TREE_FEATURE = FEATURES.register("peach_tree", + () -> new PeachTreeFeature(PeachTreeConfiguration.CODEC)); + + + public static final DeferredHolder, PeachTreeFeature> PEACH_LARGE_TREE_FEATURE = FEATURES.register("peach_large_tree", + () -> new PeachTreeFeature(PeachTreeConfiguration.CODEC)); + + + public static final DeferredHolder, ElythiaFloraFeature> ELYTHIA_FOREST_FLORA = FEATURES.register("elythia_forest_flora", + () -> new ElythiaFloraFeature(NoneFeatureConfiguration.CODEC, ElythiaFloraFeature.Variant.FOREST)); + + + public static final DeferredHolder, ElythiaFloraFeature> ELYTHIA_MEADOW_FLORA = FEATURES.register("elythia_meadow_flora", + () -> new ElythiaFloraFeature(NoneFeatureConfiguration.CODEC, ElythiaFloraFeature.Variant.MEADOW)); + + + public static final DeferredHolder, ElythiaFloraFeature> PEACH_FOREST_FLORA = FEATURES.register("peach_forest_flora", + () -> new ElythiaFloraFeature(NoneFeatureConfiguration.CODEC, ElythiaFloraFeature.Variant.PEACH_FOREST)); + + + public static final DeferredHolder, ElythiaFloraFeature> FLOWER_FOREST_MILKWEED = FEATURES.register("flower_forest_milkweed", + () -> new ElythiaFloraFeature(NoneFeatureConfiguration.CODEC, ElythiaFloraFeature.Variant.FLOWER_FOREST_MILKWEED)); + + + public static final DeferredHolder, CornPatchFeature> CORN_PATCH = FEATURES.register("corn_patch", + () -> new CornPatchFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, com.craisinlord.antarchy.content.worldgen.ocean.StarCoralPatchFeature> STAR_CORAL_PATCH = FEATURES.register("star_coral_patch", + () -> new com.craisinlord.antarchy.content.worldgen.ocean.StarCoralPatchFeature(NoneFeatureConfiguration.CODEC)); + public static final DeferredHolder, SeashellFeature> SEASHELL_PATCH = FEATURES.register("seashell_patch", + () -> new SeashellFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, ElythiaFloraFeature> ELYTHIA_BUTTERFLY_FIELDS_FLORA = FEATURES.register("butterfly_fields_flora", + () -> new ElythiaFloraFeature(NoneFeatureConfiguration.CODEC, ElythiaFloraFeature.Variant.BUTTERFLY_FIELDS)); + + + public static final DeferredHolder, ElythiaSurfaceCoverFeature> ELYTHIA_SURFACE_COVER = FEATURES.register("elythia_surface_cover", + () -> new ElythiaSurfaceCoverFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, ElythiaUndergroundFeature> ELYTHIA_UNDERGROUND = FEATURES.register("elythia_underground", + () -> new ElythiaUndergroundFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, BrutalflyCocoonFeature> BRUTALFLY_COCOON = FEATURES.register("brutalfly_cocoon", + () -> new BrutalflyCocoonFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, MolewormTunnelsFeature> ELYTHIA_MOLEWORM_TUNNELS = FEATURES.register("elythia_moleworm_tunnels", + () -> new MolewormTunnelsFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, MolewormCaveEntranceFeature> ELYTHIA_MOLEWORM_CAVE_ENTRANCES = FEATURES.register("elythia_moleworm_cave_entrances", + () -> new MolewormCaveEntranceFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, MolewormWarrensFeature> ELYTHIA_MOLEWORM_WARRENS = FEATURES.register("elythia_moleworm_warrens", + () -> new MolewormWarrensFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, MolewormSurfaceMoundsFeature> ELYTHIA_MOLEWORM_SURFACE_MOUNDS = FEATURES.register("elythia_moleworm_surface_mounds", + () -> new MolewormSurfaceMoundsFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, TriffidPatchFeature> TRIFFID_PATCH = FEATURES.register("triffid_patch", + () -> new TriffidPatchFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, com.mojang.serialization.Codec> ELYTHIA_BIOME_SOURCE = BIOME_SOURCES.register("elythia_biome_source", + () -> ElythiaBiomeSource.CODEC.codec()); + + + public static final DeferredHolder, com.mojang.serialization.Codec> ELYTHIA_RIVER_CARVE = DENSITY_FUNCTION_TYPES.register("elythia_river_carve", + () -> ElythiaRiverCarveFunction.KEY_CODEC.codec()); + + + public static final DeferredHolder, ElythiaPondFeature> ELYTHIA_POND = FEATURES.register("elythia_pond", + () -> new ElythiaPondFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, LumenPoolFeature> LUMEN_POOL = FEATURES.register("lumen_pools", + () -> new LumenPoolFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, LumenLilyPadFeature> LUMEN_LILY_PADS = FEATURES.register("lumen_lily_pads", + () -> new LumenLilyPadFeature(NoneFeatureConfiguration.CODEC)); + + public static final DeferredHolder, com.craisinlord.antarchy.content.worldgen.elythia.GiantLilyPadPatchFeature> GIANT_LILY_PAD_PATCH = FEATURES.register("giant_lily_pad_patch", + () -> new com.craisinlord.antarchy.content.worldgen.elythia.GiantLilyPadPatchFeature(NoneFeatureConfiguration.CODEC)); + + public static final DeferredHolder, com.craisinlord.antarchy.content.worldgen.elythia.GiantLilyPadPatchFeature> GIANT_LILY_PAD_PATCH_PEACH_FOREST = FEATURES.register("giant_lily_pad_patch_peach_forest", + () -> new com.craisinlord.antarchy.content.worldgen.elythia.GiantLilyPadPatchFeature(NoneFeatureConfiguration.CODEC, 0.12F)); + + + public static final DeferredHolder, LumenStreamFeature> LUMEN_STREAM = FEATURES.register("lumen_streams", + () -> new LumenStreamFeature(NoneFeatureConfiguration.CODEC)); + public static final DeferredHolder, LumenSpireFeature> LUMEN_SPIRE = FEATURES.register("lumen_spires", + () -> new LumenSpireFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, ElythiaTuffBoulderFeature> ELYTHIA_TUFF_BOULDER = FEATURES.register("elythia_tuff_boulder", + () -> new ElythiaTuffBoulderFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, ElythiaLargeTuffBoulderFeature> ELYTHIA_LARGE_TUFF_BOULDER = FEATURES.register("elythia_large_tuff_boulder", + () -> new ElythiaLargeTuffBoulderFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, PeachForestMossyBoulderFeature> PEACH_FOREST_MOSSY_BOULDER = FEATURES.register("peach_forest_mossy_boulder", + () -> new PeachForestMossyBoulderFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, PeachForestPondFeature> PEACH_FOREST_POND = FEATURES.register("peach_forest_pond", + () -> new PeachForestPondFeature(PeachForestPondConfiguration.CODEC)); + + + public static final DeferredHolder, ThoraxisFissureFeature> THORAXIS_FISSURE = FEATURES.register("thoraxis_fissure", + () -> new ThoraxisFissureFeature(ThoraxisFissureConfiguration.CODEC)); + + + public static final DeferredHolder, ThoraxisRibColumnsFeature> THORAXIS_RIB_COLUMNS = FEATURES.register("thoraxis_rib_columns", + () -> new ThoraxisRibColumnsFeature(ThoraxisRibColumnsConfiguration.CODEC)); + + + public static final DeferredHolder, ThoraxisSpikeFeature> THORAXIS_SPIKE = FEATURES.register("thoraxis_spike", + () -> new ThoraxisSpikeFeature(ThoraxisSpikeConfiguration.CODEC)); + + + public static final DeferredHolder, NyxiteSpikeFeature> NYXITE_SPIKES = FEATURES.register("nyxite_spikes", + () -> new NyxiteSpikeFeature(NyxiteSpikeConfiguration.CODEC)); + + + public static final DeferredHolder, ChitenSpikeFeature> CAVARYN_CHITEN_SPIKES = FEATURES.register("cavaryn_chiten_spikes", + () -> new ChitenSpikeFeature(ChitenSpikeConfiguration.CODEC)); + + + public static final DeferredHolder, CavarynBileVeinFeature> CAVARYN_BILE_VEINS = FEATURES.register("cavaryn_bile_veins", + () -> new CavarynBileVeinFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, CavarynBileCystFeature> CAVARYN_BILE_CYSTS = FEATURES.register("cavaryn_bile_cysts", + () -> new CavarynBileCystFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, CavarynCreepvineFeature> CAVARYN_CREEPVINE = FEATURES.register("cavaryn_creepvine", + () -> new CavarynCreepvineFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, HangingCreeprootsFeature> HANGING_CREEPROOTS = FEATURES.register("hanging_creeproots", + () -> new HangingCreeprootsFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, MoltingVinesFeature> MOLTING_VINES = FEATURES.register("molting_vines", + () -> new MoltingVinesFeature(NoneFeatureConfiguration.CODEC)); + public static final DeferredHolder, com.craisinlord.antarchy.content.worldgen.cavaryn.GroundMoltingVinesFeature> GROUND_MOLTING_VINES = FEATURES.register("ground_molting_vines", + () -> new com.craisinlord.antarchy.content.worldgen.cavaryn.GroundMoltingVinesFeature(NoneFeatureConfiguration.CODEC)); + + public static final DeferredHolder, com.craisinlord.antarchy.content.worldgen.cavaryn.JumpyBugEggCeilingFeature> JUMPY_BUG_EGG_CEILING = FEATURES.register("jumpy_bug_egg_ceiling", + () -> new com.craisinlord.antarchy.content.worldgen.cavaryn.JumpyBugEggCeilingFeature(NoneFeatureConfiguration.CODEC)); + public static final DeferredHolder, com.craisinlord.antarchy.content.worldgen.cavaryn.SpitBugEggPatchFeature> SPIT_BUG_EGG_PATCH = FEATURES.register("spit_bug_egg_patch", + () -> new com.craisinlord.antarchy.content.worldgen.cavaryn.SpitBugEggPatchFeature(NoneFeatureConfiguration.CODEC)); + public static final DeferredHolder, com.craisinlord.antarchy.content.worldgen.cavaryn.RollyCavesGiantCavernFeature> ROLLY_CAVES_GIANT_CAVERN = FEATURES.register("rolly_caves_giant_cavern", + () -> new com.craisinlord.antarchy.content.worldgen.cavaryn.RollyCavesGiantCavernFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, CavarynWallAmberMossFeature> CAVARYN_WALL_AMBER_MOSS = FEATURES.register("cavaryn_wall_amber_moss", + () -> new CavarynWallAmberMossFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, AntiwaterSpringsFeature> ANTIWATER_SPRINGS = FEATURES.register("antiwater_springs", + () -> new AntiwaterSpringsFeature(AntiwaterSpringsConfiguration.CODEC)); + + + public static final DeferredHolder, PotentNyxiteFeature> POTENT_NYXITE_FEATURE = FEATURES.register("potent_nyxite", + () -> new PotentNyxiteFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, ThoraxisBloodCrystalFeature> THORAXIS_BLOOD_CRYSTAL_SPIRES = FEATURES.register("thoraxis_blood_crystal_spires", + () -> new ThoraxisBloodCrystalFeature(ThoraxisBloodCrystalConfiguration.CODEC)); + + + public static final DeferredHolder, CloudSeaCalciteFeature> CLOUD_SEA_CALCITE_BANKS = FEATURES.register("cloud_sea_calcite_banks", + () -> new CloudSeaCalciteFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, BedBugNestFeature> BED_BUG_NEST = FEATURES.register("bed_bug_nest", + () -> new BedBugNestFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, BedBugSurfaceClusterFeature> BED_BUG_SURFACE_CLUSTER = FEATURES.register("bed_bug_surface_cluster", + () -> new BedBugSurfaceClusterFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, CavarynEggPatchFeature> CAVARYN_TERROR_EGG_PATCH = FEATURES.register("cavaryn_terror_egg_patch", + () -> new CavarynEggPatchFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, com.craisinlord.antarchy.content.worldgen.mushroom.GlowcapHugeMushroomFeature> HUGE_GLOWCAP_MUSHROOM = FEATURES.register("huge_glowcap_mushroom", + () -> new com.craisinlord.antarchy.content.worldgen.mushroom.GlowcapHugeMushroomFeature(NoneFeatureConfiguration.CODEC)); + public static final DeferredHolder, com.craisinlord.antarchy.content.worldgen.mushroom.GlowcapHugeMushroomWorldgenFeature> HUGE_GLOWCAP_MUSHROOM_WORLDGEN = FEATURES.register("huge_glowcap_mushroom_worldgen", + () -> new com.craisinlord.antarchy.content.worldgen.mushroom.GlowcapHugeMushroomWorldgenFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, ThoraxisAntiwaterPoolFeature> THORAXIS_ANTIWATER_POOL = FEATURES.register("thoraxis_antiwater_pool", + () -> new ThoraxisAntiwaterPoolFeature(ThoraxisAntiwaterPoolConfiguration.CODEC)); + + + public static final DeferredHolder, LucidAntiwaterPoolFeature> LUCID_ANTIWATER_POOL = FEATURES.register("lucid_antiwater_pool", + () -> new LucidAntiwaterPoolFeature(ThoraxisAntiwaterPoolConfiguration.CODEC)); + + + public static final DeferredHolder, ThoraxisDuneFeature> THORAXIS_DUNE = FEATURES.register("thoraxis_dune", + () -> new ThoraxisDuneFeature(ThoraxisDuneConfiguration.CODEC)); + + + public static final DeferredHolder, CoralSpikeFeature> ELYTHIA_CORAL_SPIKE = FEATURES.register("elythia_coral_spike", + () -> new CoralSpikeFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, com.craisinlord.antarchy.content.worldgen.elythia.FallenOuranwoodFeature> FALLEN_OURANWOOD_TREE = FEATURES.register("fallen_ouranwood_tree", + () -> new com.craisinlord.antarchy.content.worldgen.elythia.FallenOuranwoodFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, com.craisinlord.antarchy.content.worldgen.elythia.FungalMushroomFeature> FUNGAL_MUSHROOM = FEATURES.register("fungal_mushroom", + () -> new com.craisinlord.antarchy.content.worldgen.elythia.FungalMushroomFeature(NoneFeatureConfiguration.CODEC)); + + + public static final DeferredHolder, com.mojang.serialization.Codec> THORAXIS_BIOME_SOURCE = BIOME_SOURCES.register("thoraxis_biome_source", + () -> ThoraxisBiomeSource.CODEC.codec()); + + + public static final ArmorMaterial JUMPY_BOOTS_ARMOR_MATERIAL = armorMaterial( + 37, createJumpyBootsDefense(), 15, net.minecraft.sounds.SoundEvents.ARMOR_EQUIP_NETHERITE, + () -> Ingredient.of(net.minecraft.world.item.Items.NETHERITE_BOOTS), 3.0F, 0.1F, "jumpy_boots"); + + + + public static MobEffect mobEffectHolder(DeferredHolder effect) { + return effect.get(); + } + + + + public static Holder attributeHolder(DeferredHolder attribute) { + return BuiltInRegistries.ATTRIBUTE.wrapAsHolder(attribute.get()); + } + + + + + + + private static java.util.EnumMap createUltimateArmorDefense() { + java.util.EnumMap defense = new java.util.EnumMap<>(ArmorItem.Type.class); + defense.put(ArmorItem.Type.BOOTS, 6); + defense.put(ArmorItem.Type.LEGGINGS, 12); + defense.put(ArmorItem.Type.CHESTPLATE, 16); + defense.put(ArmorItem.Type.HELMET, 6); + return defense; + } + + + + private static java.util.EnumMap createNightmareArmorDefense() { + java.util.EnumMap defense = new java.util.EnumMap<>(ArmorItem.Type.class); + defense.put(ArmorItem.Type.BOOTS, 4); + defense.put(ArmorItem.Type.LEGGINGS, 9); + defense.put(ArmorItem.Type.CHESTPLATE, 11); + defense.put(ArmorItem.Type.HELMET, 4); + return defense; + } + + + + private static java.util.EnumMap createJumpyBootsDefense() { + java.util.EnumMap defense = new java.util.EnumMap<>(ArmorItem.Type.class); + defense.put(ArmorItem.Type.BOOTS, 3); + defense.put(ArmorItem.Type.LEGGINGS, 0); + defense.put(ArmorItem.Type.CHESTPLATE, 0); + defense.put(ArmorItem.Type.HELMET, 0); + return defense; + } + + + + private static java.util.EnumMap createBloodCrystalArmorDefense() { + java.util.EnumMap defense = new java.util.EnumMap<>(ArmorItem.Type.class); + defense.put(ArmorItem.Type.BOOTS, 2); + defense.put(ArmorItem.Type.LEGGINGS, 5); + defense.put(ArmorItem.Type.CHESTPLATE, 6); + defense.put(ArmorItem.Type.HELMET, 2); + return defense; + } + + + + private static java.util.EnumMap createMogglesArmorDefense() { + java.util.EnumMap defense = new java.util.EnumMap<>(ArmorItem.Type.class); + defense.put(ArmorItem.Type.BOOTS, 0); + defense.put(ArmorItem.Type.LEGGINGS, 0); + defense.put(ArmorItem.Type.CHESTPLATE, 0); + defense.put(ArmorItem.Type.HELMET, 2); + return defense; + } + + + + private static java.util.EnumMap createPrimordialArmorDefense() { + java.util.EnumMap defense = new java.util.EnumMap<>(ArmorItem.Type.class); + defense.put(ArmorItem.Type.BOOTS, 3); + defense.put(ArmorItem.Type.LEGGINGS, 6); + defense.put(ArmorItem.Type.CHESTPLATE, 8); + defense.put(ArmorItem.Type.HELMET, 3); + return defense; + } + + + + private static java.util.EnumMap createFallenKingCrownDefense() { + java.util.EnumMap defense = new java.util.EnumMap<>(ArmorItem.Type.class); + defense.put(ArmorItem.Type.BOOTS, 0); + defense.put(ArmorItem.Type.LEGGINGS, 0); + defense.put(ArmorItem.Type.CHESTPLATE, 0); + defense.put(ArmorItem.Type.HELMET, 2); + return defense; + } + + + + private static SimpleParticleType simpleParticleType() { + return new SimpleParticleType(true) { + }; + } + + + + private static ParticleType particleType( + net.minecraft.core.particles.ParticleOptions.Deserializer deserializer + ) { + return new ParticleType<>(false, deserializer) { + @Override + public com.mojang.serialization.Codec codec() { + return null; + } + }; + } + + + public static void register() { + FLUIDS.register(); + ATTRIBUTES.register(); + PARTICLE_TYPES.register(); + FEATURES.register(); + BIOME_SOURCES.register(); + DENSITY_FUNCTION_TYPES.register(); + MOB_EFFECTS.register(); + POTIONS.register(); + MENUS.register(); + FROG_VARIANTS.register(); + RECIPE_SERIALIZERS.register(); + } + +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricSounds.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricSounds.java new file mode 100644 index 00000000..682c546e --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricSounds.java @@ -0,0 +1,469 @@ +package com.craisinlord.antarchy.fabric.registry; + +import com.craisinlord.antarchy.Antarchy; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; + +public final class AntarchyFabricSounds { + + public static final DeferredRegister SOUND_EVENTS = DeferredRegister.create(Registries.SOUND_EVENT, Antarchy.MODID); + + + public static final DeferredHolder SQUIDZOOKA_FIRE = registerSoundEvent("squidzooka_fire"); + + + public static final DeferredHolder SHRINK_RAY_SOUND = registerSoundEvent("shrink_ray"); + + + public static final DeferredHolder GROWTH_RAY_SOUND = registerSoundEvent("growth_ray"); + + + public static final DeferredHolder SIZE_RAY_CHARGE = registerSoundEvent("size_ray_charge"); + + + public static final DeferredHolder ANT_AMBIENT = registerSoundEvent("ant_ambient"); + + + public static final DeferredHolder ANT_IDLE = registerSoundEvent("ant_idle"); + + + public static final DeferredHolder ANT_HURT = registerSoundEvent("ant_hurt"); + + + public static final DeferredHolder ANT_BITE = registerSoundEvent("ant_bite"); + + + public static final DeferredHolder ANT_GATHER = registerSoundEvent("ant_gather"); + + + public static final DeferredHolder ANT_NEST = registerSoundEvent("ant_nest"); + + + public static final DeferredHolder CLOUD_SHARK_BITE = registerSoundEvent("cloud_shark_bite"); + + + public static final DeferredHolder CLOUD_SHARK_IDLE = registerSoundEvent("cloud_shark_idle"); + + + public static final DeferredHolder CLOUD_SHARK_HURT = registerSoundEvent("cloud_shark_hurt"); + + + public static final DeferredHolder CLOUD_SHARK_DEATH = registerSoundEvent("cloud_shark_death"); + + + public static final DeferredHolder CLOUD_SHARK_FLY = registerSoundEvent("cloud_shark_fly"); + + + public static final DeferredHolder CATERPILLAR_IDLE = registerSoundEvent("caterpillar_idle"); + + + public static final DeferredHolder CATERPILLAR_HURT = registerSoundEvent("caterpillar_hurt"); + + + public static final DeferredHolder CATERPILLAR_CRAWL = registerSoundEvent("caterpillar_crawl"); + + + public static final DeferredHolder BUTTERFLY_HURT = registerSoundEvent("butterfly_hurt"); + + + public static final DeferredHolder BRUTALFLY_IDLE = registerSoundEvent("brutalfly_idle"); + + + public static final DeferredHolder BRUTALFLY_DEATH = registerSoundEvent("brutalfly_death"); + + + public static final DeferredHolder ELYTHIA_FIREFLY_AMBIENT = registerSoundEvent("ambient.elythia.firefly"); + + + public static final DeferredHolder MISSILE_SQUID_AMBIENT = registerSoundEvent("missile_squid_ambient"); + + + public static final DeferredHolder MISSILE_SQUID_HURT = registerSoundEvent("missile_squid_hurt"); + + + public static final DeferredHolder MISSILE_SQUID_DEATH = registerSoundEvent("missile_squid_death"); + + + public static final DeferredHolder MISSILE_SQUID_ATTACK = registerSoundEvent("missile_squid_attack"); + + + public static final DeferredHolder KRAKEN_FLYING_LOOP = registerSoundEvent("kraken_flying_loop"); + + + public static final DeferredHolder KRAKEN_FLYING_SIDEWAYS_LOOP = registerSoundEvent("kraken_flying_sideways_loop"); + + + public static final DeferredHolder KRAKEN_ATTACK = registerSoundEvent("kraken_attack"); + + + public static final DeferredHolder KRAKEN_SPIN = registerSoundEvent("kraken_spin"); + + + public static final DeferredHolder KRAKEN_ROAR = registerSoundEvent("kraken_roar"); + + + public static final DeferredHolder KRAKEN_SUMMON = registerSoundEvent("kraken_summon"); + + + public static final DeferredHolder KRAKEN_HURT = registerSoundEvent("kraken_hurt"); + + + public static final DeferredHolder KRAKEN_DEATH = registerSoundEvent("kraken_death"); + + + public static final DeferredHolder BASILISK_IDLE_LOOP = registerSoundEvent("basilisk_idle_loop"); + + + public static final DeferredHolder BASILISK_SLITHER_LOOP = registerSoundEvent("basilisk_slither_loop"); + + + public static final DeferredHolder BASILISK_BITE = registerSoundEvent("basilisk_bite"); + + + public static final DeferredHolder BASILISK_HISS = registerSoundEvent("basilisk_hiss"); + + + public static final DeferredHolder BASILISK_HURT = registerSoundEvent("basilisk_hurt"); + + + public static final DeferredHolder BASILISK_DEATH = registerSoundEvent("basilisk_death"); + + + public static final DeferredHolder THORAXIS_NIGHTMARE_WASTES_AMBIENT = registerSoundEvent("thoraxis_nightmare_wastes_ambient"); + + + public static final DeferredHolder THORAXIS_NIGHTMARE_WASTES_ADDITIONS = registerSoundEvent("thoraxis_nightmare_wastes_additions"); + + + public static final DeferredHolder THORAXIS_NIGHTMARE_WASTES_MOOD = registerSoundEvent("thoraxis_nightmare_wastes_mood"); + + + public static final DeferredHolder THORAXIS_DREAM_DUNES_AMBIENT = registerSoundEvent("thoraxis_dream_dunes_ambient"); + + + public static final DeferredHolder THORAXIS_DREAM_DUNES_ADDITIONS = registerSoundEvent("thoraxis_dream_dunes_additions"); + + + public static final DeferredHolder THORAXIS_DREAM_DUNES_MOOD = registerSoundEvent("thoraxis_dream_dunes_mood"); + + + public static final DeferredHolder THORAXIS_LUCID_POOLS_AMBIENT = registerSoundEvent("thoraxis_lucid_pools_ambient"); + + + public static final DeferredHolder THORAXIS_LUCID_POOLS_ADDITIONS = registerSoundEvent("thoraxis_lucid_pools_additions"); + + + public static final DeferredHolder THORAXIS_LUCID_POOLS_MOOD = registerSoundEvent("thoraxis_lucid_pools_mood"); + + + public static final DeferredHolder LUCID_AMBIENT = registerSoundEvent("lucid_ambient"); + + + public static final DeferredHolder LUCID_FLYING = registerSoundEvent("lucid_flying"); + + + public static final DeferredHolder LUCID_ATTACK = registerSoundEvent("lucid_attack"); + + + public static final DeferredHolder LUCID_BOLT_SOUND = registerSoundEvent("lucid_bolt"); + + + public static final DeferredHolder LUCID_HURT = registerSoundEvent("lucid_hurt"); + + + public static final DeferredHolder LUCID_DEATH = registerSoundEvent("lucid_death"); + + + public static final DeferredHolder REVERIE_IDLE = registerSoundEvent("reverie_idle"); + + + public static final DeferredHolder REVERIE_HURT = registerSoundEvent("reverie_hurt"); + + + public static final DeferredHolder REVERIE_WORRY = registerSoundEvent("reverie_worry"); + + + public static final DeferredHolder REVERIE_SAVE = registerSoundEvent("reverie_save"); + + + public static final DeferredHolder REVERIE_JOIN_PLAYER = registerSoundEvent("reverie_join_player"); + + + public static final DeferredHolder REVERIE_ALERT = registerSoundEvent("reverie_alert"); + + + public static final DeferredHolder FLYING_SQUIRREL_IDLE = registerSoundEvent("flying_squirrel_idle"); + + + public static final DeferredHolder FLYING_SQUIRREL_BEG = registerSoundEvent("flying_squirrel_beg"); + + + public static final DeferredHolder FLYING_SQUIRREL_NUT = registerSoundEvent("flying_squirrel_nut"); + + + public static final DeferredHolder FLYING_SQUIRREL_GLIDE_LOOP = registerSoundEvent("flying_squirrel_glide_loop"); + + + public static final DeferredHolder FLYING_SQUIRREL_HURT = registerSoundEvent("flying_squirrel_hurt"); + + + public static final DeferredHolder FLYING_SQUIRREL_DEATH = registerSoundEvent("flying_squirrel_death"); + + + public static final DeferredHolder NIGHTMARE_IDLE = registerSoundEvent("nightmare_idle"); + + + public static final DeferredHolder NIGHTMARE_HURT = registerSoundEvent("nightmare_hurt"); + + + public static final DeferredHolder NIGHTMARE_ROAR = registerSoundEvent("nightmare_roar"); + + + public static final DeferredHolder NIGHTMARE_DEATH = registerSoundEvent("nightmare_death"); + + + public static final DeferredHolder NIGHTMARE_BITE = registerSoundEvent("nightmare_bite"); + + + public static final DeferredHolder NIGHTMARE_FLAP = registerSoundEvent("nightmare_flap"); + + + public static final DeferredHolder TRIFFID_ATTACK = registerSoundEvent("triffid_attack"); + + + public static final DeferredHolder TRIFFID_GRAB = registerSoundEvent("triffid_grab"); + + + public static final DeferredHolder TRIFFID_HURT = registerSoundEvent("triffid_hurt"); + + + public static final DeferredHolder TRIFFID_DEATH = registerSoundEvent("triffid_death"); + + + public static final DeferredHolder TRIFFID_HISS = registerSoundEvent("triffid_hiss"); + + + public static final DeferredHolder TRIFFID_GROWL = registerSoundEvent("triffid_growl"); + + + public static final DeferredHolder MANTIS_AMBIENT = registerSoundEvent("mantis_ambient"); + + + public static final DeferredHolder MANTIS_HURT = registerSoundEvent("mantis_hurt"); + + + public static final DeferredHolder MANTIS_ATTACK = registerSoundEvent("mantis_attack"); + + + public static final DeferredHolder MANTIS_FLY_LOOP = registerSoundEvent("mantis_fly_loop"); + + + public static final DeferredHolder GRAVITY_GUN_PICKUP = registerSoundEvent("gravity_gun_pickup"); + + + public static final DeferredHolder GRAVITY_GUN_DROP = registerSoundEvent("gravity_gun_drop"); + + + public static final DeferredHolder GRAVITY_GUN_HOLD_LOOP = registerSoundEvent("gravity_gun_hold_loop"); + + + public static final DeferredHolder GRAVITY_GUN_LAUNCH = registerSoundEvent("gravity_gun_launch"); + + + public static final DeferredHolder GRAVITY_GUN_DRYFIRE = registerSoundEvent("gravity_gun_dryfire"); + + + public static final DeferredHolder BED_BUG_AMBIENT = registerSoundEvent("bed_bug_ambient"); + + + public static final DeferredHolder BED_BUG_HURT = registerSoundEvent("bed_bug_hurt"); + + + public static final DeferredHolder BED_BUG_ATTACK = registerSoundEvent("bed_bug_attack"); + + + public static final DeferredHolder WASP_IDLE = registerSoundEvent("wasp_idle"); + + + public static final DeferredHolder WASP_HURT = registerSoundEvent("wasp_hurt"); + + + public static final DeferredHolder WASP_ATTACK = registerSoundEvent("wasp_attack"); + + + public static final DeferredHolder WASP_DEATH = registerSoundEvent("wasp_death"); + + + public static final DeferredHolder SCORPION_AMBIENT = registerSoundEvent("scorpion_ambient"); + + + public static final DeferredHolder SCORPION_HURT = registerSoundEvent("scorpion_hurt"); + + + public static final DeferredHolder SCORPION_ATTACK = registerSoundEvent("scorpion_attack"); + + + public static final DeferredHolder EMPEROR_SCORPION_AMBIENT = registerSoundEvent("emperor_scorpion_ambient"); + + + public static final DeferredHolder EMPEROR_SCORPION_HURT = registerSoundEvent("emperor_scorpion_hurt"); + + + public static final DeferredHolder EMPEROR_SCORPION_ATTACK = registerSoundEvent("emperor_scorpion_attack"); + + + public static final DeferredHolder EMPEROR_SCORPION_ROAR = registerSoundEvent("emperor_scorpion_roar"); + + + public static final DeferredHolder MOLEWORM_AMBIENT = registerSoundEvent("moleworm_ambient"); + + + public static final DeferredHolder MOLEWORM_HURT = registerSoundEvent("moleworm_hurt"); + + + public static final DeferredHolder MOLEWORM_ATTACK = registerSoundEvent("moleworm_attack"); + + + public static final DeferredHolder MOLEWORM_DIG = registerSoundEvent("moleworm_dig"); + + + public static final DeferredHolder MOLEVORE_AMBIENT = registerSoundEvent("molevore_ambient"); + + + public static final DeferredHolder MOLEVORE_HURT = registerSoundEvent("molevore_hurt"); + + + public static final DeferredHolder MOLEVORE_ATTACK = registerSoundEvent("molevore_attack"); + + + public static final DeferredHolder MOLEVORE_DIG = registerSoundEvent("molevore_dig"); + + + public static final DeferredHolder BOMBER_WALK = registerSoundEvent("bomber_walk"); + + + public static final DeferredHolder BOMBER_KNOCK = registerSoundEvent("bomber_knock"); + + + public static final DeferredHolder BOMBER_EXPLODE = registerSoundEvent("bomber_explode"); + + + public static final DeferredHolder TORETERROR_IDLE = registerSoundEvent("toreterror_idle"); + + + public static final DeferredHolder TORETERROR_HURT = registerSoundEvent("toreterror_hurt"); + + + public static final DeferredHolder TORETERROR_DEATH = registerSoundEvent("toreterror_death"); + + + public static final DeferredHolder TORETERROR_BOMBER_FIRE = registerSoundEvent("toreterror_bomber_fire"); + + + public static final DeferredHolder TORETERROR_SPIN = registerSoundEvent("toreterror_spin"); + + + public static final DeferredHolder TORETERROR_RICOCHET = registerSoundEvent("toreterror_ricochet"); + + + public static final DeferredHolder WATER_CANNON_FIRE = registerSoundEvent("water_cannon_fire"); + + + public static final DeferredHolder TORETERROR_JUMP_UP = registerSoundEvent("toreterror_jump_up"); + + + public static final DeferredHolder TORETERROR_JUMP_LAND = registerSoundEvent("toreterror_jump_land"); + + + public static final DeferredHolder STINKY_FLY_SOUND = registerSoundEvent("stinky_fly"); + + + public static final DeferredHolder STINK_BUG_FART = registerSoundEvent("stink_bug_fart"); + + + public static final DeferredHolder STINK_BUG_IDLE = registerSoundEvent("stink_bug_idle"); + + + public static final DeferredHolder CAVARYN_HEARTBEAT = registerSoundEvent("cavaryn_heartbeat"); + + + public static final DeferredHolder ROLLY_POLLY_IDLE = registerSoundEvent("rolly_polly_idle"); + public static final DeferredHolder ROLLY_POLLY_WHEEL_MODE = registerSoundEvent("rolly_polly_wheel_mode"); + public static final DeferredHolder ROLLY_POLLY_NORMAL_MODE = registerSoundEvent("rolly_polly_normal_mode"); + public static final DeferredHolder ROLLY_POLLY_ROLL = registerSoundEvent("rolly_polly_roll"); + public static final DeferredHolder JERRY_YOUNG_IDLE = registerSoundEvent("jerry_young_idle"); + public static final DeferredHolder JERRY_YOUNG_HURT = registerSoundEvent("jerry_young_hurt"); + public static final DeferredHolder JERRY_YOUNG_DEATH = registerSoundEvent("jerry_young_death"); + public static final DeferredHolder JERRY_YOUNG_ATTACK = registerSoundEvent("jerry_young_attack"); + public static final DeferredHolder JERRY_ADULT_IDLE = registerSoundEvent("jerry_adult_idle"); + public static final DeferredHolder JERRY_ADULT_HURT = registerSoundEvent("jerry_adult_hurt"); + public static final DeferredHolder JERRY_ADULT_DEATH = registerSoundEvent("jerry_adult_death"); + public static final DeferredHolder JERRY_ADULT_ATTACK = registerSoundEvent("jerry_adult_attack"); + + + public static final DeferredHolder CREEPING_HORROR_GROWL = registerSoundEvent("creeping_horror_growl"); + + + public static final DeferredHolder CREEPING_HORROR_HURT = registerSoundEvent("creeping_horror_hurt"); + + + public static final DeferredHolder CREEPING_HORROR_BITE = registerSoundEvent("creeping_horror_bite"); + + + public static final DeferredHolder LURKING_TERROR_SNARL = registerSoundEvent("lurking_terror_snarl"); + + + public static final DeferredHolder LURKING_TERROR_HURT = registerSoundEvent("lurking_terror_hurt"); + + + public static final DeferredHolder LURKING_TERROR_BITE = registerSoundEvent("lurking_terror_bite"); + + + public static final DeferredHolder LURKING_TERROR_FLY_LOOP = registerSoundEvent("lurking_terror_fly_loop"); + public static final DeferredHolder HERCULES_BEETLE_IDLE = registerSoundEvent("hercules_beetle_idle"); + public static final DeferredHolder HERCULES_BEETLE_HURT = registerSoundEvent("hercules_beetle_hurt"); + public static final DeferredHolder HERCULES_BEETLE_ATTACK = registerSoundEvent("hercules_beetle_attack"); + public static final DeferredHolder HERCULES_BEETLE_CRY = registerSoundEvent("hercules_beetle_cry"); + public static final DeferredHolder HERCULES_BEETLE_CHARGE_START = registerSoundEvent("hercules_beetle_charge_start"); + public static final DeferredHolder HERCULES_BEETLE_KNOCKED_DOWN = registerSoundEvent("hercules_beetle_knocked_down"); + public static final DeferredHolder JUMPY_BUG_IDLE = registerSoundEvent("jumpy_bug_idle"); + public static final DeferredHolder SPIT_BUG_IDLE = registerSoundEvent("spit_bug_idle"); + public static final DeferredHolder JUMPY_BUG_HURT = registerSoundEvent("jumpy_bug_hurt"); + public static final DeferredHolder JUMPY_BUG_JUMP = registerSoundEvent("jumpy_bug_jump"); + public static final DeferredHolder SPIT_BUG_HURT = registerSoundEvent("spit_bug_hurt"); + public static final DeferredHolder SPIT_BUG_SPIT = registerSoundEvent("spit_bug_spit"); + public static final DeferredHolder BRUTALFLY_SPIT = registerSoundEvent("brutalfly_spit"); + + + public static final DeferredHolder DUCT_TAPE_USE = registerSoundEvent("duct_tape_use"); + + + public static final DeferredHolder POTENT_NYXITE_HYPNOTIC_GAS = registerSoundEvent("potent_nyxite_hypnotic_gas"); + + + public static final DeferredHolder POTENT_NYXITE_GEYSER_ERUPTION_START = registerSoundEvent("potent_nyxite_geyser_eruption_start"); + + + public static final DeferredHolder POTENT_NYXITE_GEYSER_ERUPTION_ACTIVE = registerSoundEvent("potent_nyxite_geyser_eruption_active"); + + + public static final DeferredHolder POTENT_NYXITE_GEYSER_CONTINUOUS_START = registerSoundEvent("potent_nyxite_geyser_continuous_start"); + + + public static final DeferredHolder POTENT_NYXITE_GEYSER_CONTINUOUS_ACTIVE = registerSoundEvent("potent_nyxite_geyser_continuous_active"); + + + + + private static DeferredHolder registerSoundEvent(String path) { + return SOUND_EVENTS.register(path, + () -> SoundEvent.createVariableRangeEvent(new ResourceLocation(Antarchy.MODID, path))); + } + + + public static void register() { + SOUND_EVENTS.register(); + } + +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricSpawnPlacements.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricSpawnPlacements.java new file mode 100644 index 00000000..0f8f3199 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricSpawnPlacements.java @@ -0,0 +1,75 @@ +package com.craisinlord.antarchy.fabric.registry; + +import com.craisinlord.antarchy.content.entity.cloud_shark.CloudSharkEntity; +import com.craisinlord.antarchy.content.entity.BedBugEntity; +import com.craisinlord.antarchy.content.entity.ButterflyEntity; +import com.craisinlord.antarchy.content.entity.CaterpillarEntity; +import com.craisinlord.antarchy.content.entity.flying_squirrel.FlyingSquirrelEntity; +import com.craisinlord.antarchy.content.entity.ReverieEntity; +import com.craisinlord.antarchy.content.entity.MissileSquidEntity; +import com.craisinlord.antarchy.content.entity.lucid.LucidEntity; +import com.craisinlord.antarchy.content.entity.JumpyBugEntity; +import com.craisinlord.antarchy.content.entity.StinkBugEntity; +import com.craisinlord.antarchy.content.entity.AlphaMantisEntity; +import com.craisinlord.antarchy.content.entity.MantisEntity; +import com.craisinlord.antarchy.content.entity.basilisk.BasiliskEntity; +import com.craisinlord.antarchy.content.entity.EmperorScorpionEntity; +import com.craisinlord.antarchy.content.entity.ScorpionEntity; +import com.craisinlord.antarchy.content.entity.nightmare.NightmareEntity; +import com.craisinlord.antarchy.content.entity.ToreterrorEntity; +import com.craisinlord.antarchy.content.entity.kraken.KrakenEntity; +import com.craisinlord.antarchy.content.entity.OctopusBombEntity; +import com.craisinlord.antarchy.content.entity.MolevoreEntity; +import com.craisinlord.antarchy.content.entity.MolewormEntity; +import com.craisinlord.antarchy.content.entity.BomberEntity; +import com.craisinlord.antarchy.content.entity.WaspEntity; +import net.minecraft.world.entity.animal.Cow; +import net.minecraft.world.entity.SpawnPlacements; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.level.levelgen.Heightmap; + +public final class AntarchyFabricSpawnPlacements { + + + public static void register() { + SpawnPlacements.register(AntarchyFabricEntities.FLYING_SQUIRREL.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING, FlyingSquirrelEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.CATERPILLAR.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, CaterpillarEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.BUTTERFLY.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ButterflyEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.REVERIE.get(), SpawnPlacements.Type.NO_RESTRICTIONS, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ReverieEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.BRUTALFLY.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules); + SpawnPlacements.register(AntarchyFabricEntities.APPLE_COW.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Cow::checkAnimalSpawnRules); + SpawnPlacements.register(AntarchyFabricEntities.GOLDEN_APPLE_COW.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Cow::checkAnimalSpawnRules); + SpawnPlacements.register(AntarchyFabricEntities.ENCHANTED_GOLDEN_APPLE_COW.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Cow::checkAnimalSpawnRules); + SpawnPlacements.register(AntarchyFabricEntities.CLOUD_SHARK.get(), SpawnPlacements.Type.NO_RESTRICTIONS, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, CloudSharkEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.WASP.get(), SpawnPlacements.Type.NO_RESTRICTIONS, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, WaspEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.BOMBER.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, BomberEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.JUMPY_BUG.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, JumpyBugEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.SPIT_BUG.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, com.craisinlord.antarchy.content.entity.SpitBugEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.KRAKEN.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, KrakenEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.MISSILE_SQUID.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, MissileSquidEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.OCTOPUS_BOMB.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, OctopusBombEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.CHEEP.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.AbstractFish::checkSurfaceWaterAnimalSpawnRules); + SpawnPlacements.register(AntarchyFabricEntities.DORRIE.get(), SpawnPlacements.Type.IN_WATER, Heightmap.Types.OCEAN_FLOOR, net.minecraft.world.entity.animal.Animal::checkAnimalSpawnRules); + SpawnPlacements.register(AntarchyFabricEntities.OURANWOOD_DEER.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.Animal::checkAnimalSpawnRules); + SpawnPlacements.register(AntarchyFabricEntities.GLIMMER.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, com.craisinlord.antarchy.content.entity.glimmer.GlimmerEntity::checkGlimmerSpawnRules); + SpawnPlacements.register(AntarchyFabricEntities.ELKA.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.Animal::checkAnimalSpawnRules); + SpawnPlacements.register(AntarchyFabricEntities.NIGHTMARE.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, NightmareEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.MOLEWORM.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, MolewormEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.MANTIS.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, MantisEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.ALPHA_MANTIS.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, AlphaMantisEntity::checkAlphaMantisSpawnRules); + SpawnPlacements.register(AntarchyFabricEntities.MOLEVORE.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, MolevoreEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.BED_BUG.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, BedBugEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.STINK_BUG.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, StinkBugEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.LUCID.get(), SpawnPlacements.Type.NO_RESTRICTIONS, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, LucidEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.SCORPION.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ScorpionEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.BASILISK.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, BasiliskEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.EMPEROR_SCORPION.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EmperorScorpionEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.TORETERROR.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ToreterrorEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.CREEPING_HORROR.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, com.craisinlord.antarchy.content.entity.CreepingHorrorEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.LURKING_TERROR.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, com.craisinlord.antarchy.content.entity.LurkingTerrorEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.JERRY.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, com.craisinlord.antarchy.content.entity.JerryEntity::canSpawn); + SpawnPlacements.register(AntarchyFabricEntities.TERMITE.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.Animal::checkAnimalSpawnRules); + SpawnPlacements.register(AntarchyFabricEntities.ROLLY_POLLY.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, com.craisinlord.antarchy.content.entity.RollyPollyEntity::canSpawn); + } + +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/DeferredBlock.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/DeferredBlock.java new file mode 100644 index 00000000..bf2e76e0 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/DeferredBlock.java @@ -0,0 +1,11 @@ +package com.craisinlord.antarchy.fabric.registry; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; + +public final class DeferredBlock extends DeferredHolder { + DeferredBlock(ResourceKey registryKey, ResourceLocation id) { + super(registryKey, id); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/DeferredHolder.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/DeferredHolder.java new file mode 100644 index 00000000..555df69e --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/DeferredHolder.java @@ -0,0 +1,37 @@ +package com.craisinlord.antarchy.fabric.registry; + +import java.util.function.Supplier; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; + +public class DeferredHolder implements Supplier { + private final ResourceKey registryKey; + private final ResourceLocation id; + private T value; + + DeferredHolder(ResourceKey registryKey, ResourceLocation id) { + this.registryKey = registryKey; + this.id = id; + } + + void bind(T value) { + this.value = value; + } + + public ResourceLocation getId() { + return this.id; + } + + @SuppressWarnings("unchecked") + public ResourceKey getKey() { + return (ResourceKey) ResourceKey.create((ResourceKey) this.registryKey, this.id); + } + + @Override + public T get() { + if (this.value == null) { + throw new IllegalStateException("Registry object not yet bound: " + this.id); + } + return this.value; + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/DeferredItem.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/DeferredItem.java new file mode 100644 index 00000000..6f95de08 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/DeferredItem.java @@ -0,0 +1,11 @@ +package com.craisinlord.antarchy.fabric.registry; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; + +public final class DeferredItem extends DeferredHolder { + DeferredItem(ResourceKey registryKey, ResourceLocation id) { + super(registryKey, id); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/DeferredRegister.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/DeferredRegister.java new file mode 100644 index 00000000..c37b51a7 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/registry/DeferredRegister.java @@ -0,0 +1,121 @@ +package com.craisinlord.antarchy.fabric.registry; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.function.Supplier; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; + +public class DeferredRegister { + public static final class Blocks extends DeferredRegister { + private Blocks(String modId) { + super(net.minecraft.core.registries.Registries.BLOCK, modId); + } + + public DeferredBlock register(String name, Supplier supplier) { + return this.registerTyped(name, supplier, DeferredBlock::new); + } + } + + public static final class Items extends DeferredRegister { + private Items(String modId) { + super(net.minecraft.core.registries.Registries.ITEM, modId); + } + + public DeferredItem register(String name, Supplier supplier) { + return this.registerTyped(name, supplier, DeferredItem::new); + } + + public DeferredItem registerSimpleItem(String name) { + return this.registerSimpleItem(name, new Item.Properties()); + } + + public DeferredItem registerSimpleItem(String name, Item.Properties properties) { + return this.register(name, () -> new Item(properties)); + } + + public DeferredItem registerSimpleBlockItem(DeferredBlock block) { + return this.register(block.getId().getPath(), () -> new BlockItem(block.get(), new Item.Properties())); + } + + public DeferredItem registerSimpleBlockItem(DeferredBlock block, Item.Properties properties) { + return this.register(block.getId().getPath(), () -> new BlockItem(block.get(), properties)); + } + } + + @FunctionalInterface + protected interface HolderFactory> { + H create(ResourceKey registryKey, ResourceLocation id); + } + + private record PendingEntry(ResourceLocation id, Supplier supplier, DeferredHolder holder) { + } + + private final ResourceKey> registryKey; + private final String modId; + private final List> entries = new ArrayList<>(); + + protected DeferredRegister(ResourceKey> registryKey, String modId) { + this.registryKey = registryKey; + this.modId = modId; + } + + public static Blocks createBlocks(String modId) { + return new Blocks(modId); + } + + public static Items createItems(String modId) { + return new Items(modId); + } + + public static DeferredRegister create(ResourceKey> registryKey, String modId) { + return new DeferredRegister<>(registryKey, modId); + } + + public DeferredHolder register(String name, Supplier supplier) { + return this.registerTyped(name, supplier, DeferredHolder::new); + } + + protected > H registerTyped(String name, Supplier supplier, HolderFactory factory) { + ResourceLocation id = new ResourceLocation(this.modId, name); + H holder = factory.create(this.registryKey, id); + this.entries.add(new PendingEntry<>(id, supplier, holder)); + return holder; + } + + public List> getEntries() { + List> holders = new ArrayList<>(this.entries.size()); + for (PendingEntry entry : this.entries) { + holders.add(entry.holder()); + } + return Collections.unmodifiableList(holders); + } + + public void register() { + Registry registry = resolveRegistry(this.registryKey); + for (PendingEntry entry : this.entries) { + T value = Registry.register(registry, entry.id(), entry.supplier().get()); + bind(entry.holder(), value); + } + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + private static void bind(DeferredHolder holder, T value) { + ((DeferredHolder) holder).bind(value); + } + + @SuppressWarnings("unchecked") + private static Registry resolveRegistry(ResourceKey> registryKey) { + Registry registry = BuiltInRegistries.REGISTRY.get(registryKey.location()); + if (registry == null) { + throw new IllegalStateException("Could not resolve registry: " + registryKey.location()); + } + return (Registry) registry; + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/util/CustomFluidPhysicsChecks.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/util/CustomFluidPhysicsChecks.java new file mode 100644 index 00000000..e25839d3 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/util/CustomFluidPhysicsChecks.java @@ -0,0 +1,91 @@ +package com.craisinlord.antarchy.fabric.util; + +import com.craisinlord.antarchy.content.fluid.AntarchyFluidChecks; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; + +public final class CustomFluidPhysicsChecks { + private CustomFluidPhysicsChecks() { + } + + public static boolean isTouchingAntiwater(Entity entity) { + AABB box = entity.getBoundingBox().inflate(0.05D); + BlockPos min = BlockPos.containing(box.minX, box.minY, box.minZ); + BlockPos max = BlockPos.containing(box.maxX, box.maxY, box.maxZ); + BlockPos.MutableBlockPos cursor = new BlockPos.MutableBlockPos(); + for (int x = min.getX(); x <= max.getX(); x++) { + for (int y = min.getY(); y <= max.getY(); y++) { + for (int z = min.getZ(); z <= max.getZ(); z++) { + cursor.set(x, y, z); + FluidState fluidState = entity.level().getFluidState(cursor); + if (AntarchyFluidChecks.isAntiwater(fluidState)) { + return true; + } + } + } + } + return false; + } + + public static boolean isTouchingWaterlikeFluid(Entity entity) { + AABB box = entity.getBoundingBox().inflate(0.05D); + BlockPos min = BlockPos.containing(box.minX, box.minY, box.minZ); + BlockPos max = BlockPos.containing(box.maxX, box.maxY, box.maxZ); + BlockPos.MutableBlockPos cursor = new BlockPos.MutableBlockPos(); + for (int x = min.getX(); x <= max.getX(); x++) { + for (int y = min.getY(); y <= max.getY(); y++) { + for (int z = min.getZ(); z <= max.getZ(); z++) { + cursor.set(x, y, z); + FluidState fluidState = entity.level().getFluidState(cursor); + if (AntarchyFluidChecks.usesWaterLikePhysics(fluidState)) { + return true; + } + } + } + } + return false; + } + + public static Vec3 getAntiwaterFlow(Entity entity) { + return getAverageFlow(entity, true); + } + + public static Vec3 getWaterlikeFlow(Entity entity) { + return getAverageFlow(entity, false); + } + + private static Vec3 getAverageFlow(Entity entity, boolean antiwater) { + AABB box = entity.getBoundingBox().inflate(0.05D); + BlockPos min = BlockPos.containing(box.minX, box.minY, box.minZ); + BlockPos max = BlockPos.containing(box.maxX, box.maxY, box.maxZ); + BlockPos.MutableBlockPos cursor = new BlockPos.MutableBlockPos(); + Vec3 totalFlow = Vec3.ZERO; + int matches = 0; + for (int x = min.getX(); x <= max.getX(); x++) { + for (int y = min.getY(); y <= max.getY(); y++) { + for (int z = min.getZ(); z <= max.getZ(); z++) { + cursor.set(x, y, z); + FluidState fluidState = entity.level().getFluidState(cursor); + boolean matchesFluid = antiwater + ? AntarchyFluidChecks.isAntiwater(fluidState) + : AntarchyFluidChecks.usesWaterLikePhysics(fluidState); + if (!matchesFluid) { + continue; + } + + totalFlow = totalFlow.add(fluidState.getFlow(entity.level(), cursor)); + matches++; + } + } + } + + if (matches == 0 || totalFlow.lengthSqr() < 1.0E-6D) { + return Vec3.ZERO; + } + + return totalFlow.scale(1.0D / matches); + } +} diff --git a/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/util/JumpyBootsFabricHelper.java b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/util/JumpyBootsFabricHelper.java new file mode 100644 index 00000000..5386ac41 --- /dev/null +++ b/fabric-1.20.1/src/main/java/com/craisinlord/antarchy/fabric/util/JumpyBootsFabricHelper.java @@ -0,0 +1,19 @@ +package com.craisinlord.antarchy.fabric.util; + +import net.minecraft.world.entity.LivingEntity; + +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +public class JumpyBootsFabricHelper { + private static final Map PROTECTION_TIMES = new ConcurrentHashMap<>(); + + public static long getProtectionUntil(LivingEntity entity) { + return PROTECTION_TIMES.getOrDefault(entity.getUUID(), 0L); + } + + public static void setProtectionUntil(LivingEntity entity, long gameTime) { + PROTECTION_TIMES.put(entity.getUUID(), gameTime); + } +} diff --git a/fabric-1.20.1/src/main/resources/antarchy-fabric.mixins.json b/fabric-1.20.1/src/main/resources/antarchy-fabric.mixins.json new file mode 100644 index 00000000..16066d9b --- /dev/null +++ b/fabric-1.20.1/src/main/resources/antarchy-fabric.mixins.json @@ -0,0 +1,14 @@ +{ + "required": true, + "package": "com.craisinlord.antarchy.fabric.mixin", + "refmap": "antarchy.mixins.refmap.json", + "compatibilityLevel": "JAVA_17", + "mixins": [ + ], + "client": [ + ], + "injectors": { + "defaultRequire": 1 + }, + "minVersion": "0.8" +} diff --git a/fabric-1.20.1/src/main/resources/fabric.mod.json b/fabric-1.20.1/src/main/resources/fabric.mod.json new file mode 100644 index 00000000..9c129c96 --- /dev/null +++ b/fabric-1.20.1/src/main/resources/fabric.mod.json @@ -0,0 +1,36 @@ +{ + "schemaVersion": 1, + "id": "${mod_id}", + "version": "${version}", + "name": "${mod_name}", + "description": "${mod_description}", + "authors": [ + "${mod_author}" + ], + "contact": { + "homepage": "${homepage_url}", + "sources": "${sources_url}", + "issues": "${issues_url}" + }, + "license": "${license}", + "environment": "*", + "icon": "${logo_fabric}", + "entrypoints": { + "main": [ + "com.craisinlord.antarchy.fabric.AntarchyFabric" + ], + "client": [ + "com.craisinlord.antarchy.fabric.client.AntarchyFabricClient" + ] + }, + "mixins": [ + "antarchy-common.mixins.json", + "antarchy-fabric.mixins.json" + ], + "depends": { + "fabricloader": ">=${fabric_loader_version}", + "minecraft": "~${minecraft_version}", + "java": ">=17", + "fabric-api": "*" + } +} diff --git a/forge-1.20.1/build.gradle b/forge-1.20.1/build.gradle new file mode 100644 index 00000000..3949e5fc --- /dev/null +++ b/forge-1.20.1/build.gradle @@ -0,0 +1,166 @@ +plugins { + id 'java-library' + id 'maven-publish' + id 'net.minecraftforge.gradle' version '[6.0,6.2)' + id 'org.parchmentmc.librarian.forgegradle' version '1.+' + id 'org.spongepowered.mixin' version '0.7.+' +} + +group = mod_group_id +version = mod_version + +java { + toolchain { languageVersion = JavaLanguageVersion.of(17) } + withSourcesJar() +} + +repositories { + mavenCentral() + maven { url = 'https://maven.minecraftforge.net' } + maven { url = 'https://maven.parchmentmc.org' } + maven { url = 'https://repo.spongepowered.org/repository/maven-public/' } + maven { url = 'https://www.cursemaven.com' } + maven { url = 'https://maven.blamejared.com' } + maven { url = 'https://jitpack.io' } + exclusiveContent { + forRepository { + maven { + name = "GeckoLib" + url = "https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/" + } + } + filter { + includeGroup("software.bernie.geckolib") + includeGroup("com.eliotlash.mclib") + } + } +} + +base { + archivesName = "${mod_id}-forge-1.20.1" +} + +// Handle duplicates from common-1.20.1 in all copy tasks +tasks.withType(AbstractCopyTask).configureEach { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} + +minecraft { + mappings channel: 'parchment', version: parchment_version + + copyIdeResources = true + + runs { + configureEach { + workingDirectory project.file('run') + property 'forge.logging.markers', 'REGISTRIES' + property 'forge.logging.console.level', 'debug' + + mods { + "${mod_id}" { + source sourceSets.main + } + } + } + + client { + jvmArgs( + "-Dmixin.env.remapRefMap=true", + "-Dmixin.env.refMapRemappingFile=${projectDir}/build/createSrgToMcp/output.srg" + ) + } + + server { + args '--nogui' + } + } +} + +// Add common-1.20.1's sources directly. Path is relative because forge-1.20.1 is its +// own Gradle build (ForgeGradle 6 can't run on the root's Gradle 9) — there is no +// `:common-1.20.1` project here. +sourceSets { + main { + java { + srcDirs += file('../common-1.20.1/src/main/java') + } + resources { + srcDirs += file('../common-1.20.1/src/main/resources') + } + } +} + +dependencies { + minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" + + implementation "software.bernie.geckolib:geckolib-forge-${minecraft_version}:${geckolib_version}" + + compileOnly("curse.maven:sizeable_foliage-${sizeable_foliage_curseforge_id}:${sizeable_foliage_curseforge_file_id_forge}") + runtimeOnly("curse.maven:sizeable_foliage-${sizeable_foliage_curseforge_id}:${sizeable_foliage_curseforge_file_id_forge}") + + compileOnly("curse.maven:intapi-${intapi_curseforge_id}:${intapi_curseforge_file_id_forge}") + runtimeOnly("curse.maven:intapi-${intapi_curseforge_id}:${intapi_curseforge_file_id_forge}") + + compileOnly("curse.maven:pehkui-${pehkui_curseforge_id}:${pehkui_curseforge_file_id_forge}") + runtimeOnly("curse.maven:pehkui-${pehkui_curseforge_id}:${pehkui_curseforge_file_id_forge}") + + compileOnly(files("$rootDir/../infinite_dimensions_jars/infinity-2.7.2+1.20.1-forge.jar")) + runtimeOnly(files("$rootDir/../infinite_dimensions_jars/infinity-2.7.2+1.20.1-forge.jar")) + + compileOnly "mezz.jei:jei-${minecraft_version}-common-api:${jei_version}" + compileOnly "mezz.jei:jei-${minecraft_version}-forge-api:${jei_version}" + runtimeOnly "mezz.jei:jei-${minecraft_version}-forge:${jei_version}" + + annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' + + implementation(annotationProcessor("io.github.llamalad7:mixinextras-common:${mixin_extras}")) +} + +mixin { + add sourceSets.main, "${mod_id}-forge.mixins.refmap.json" + config "${mod_id}-common.mixins.json" + config "${mod_id}-forge.mixins.json" +} + +tasks.named('processResources', ProcessResources).configure { + var replaceProperties = [ + version : project.version, + minecraft_version : minecraft_version, + minecraft_version_range: "[${minecraft_version}]", + forge_version : forge_version, + forge_version_range : forge_version_range, + loader_version_range : loader_version_range, + mod_id : mod_id, + mod_name : mod_name, + mod_license : mod_license, + mod_authors : mod_authors, + mod_description : mod_description + ] + inputs.properties replaceProperties + + filesMatching('META-INF/mods.toml') { + expand replaceProperties + } +} + +tasks.named('jar', Jar).configure { + finalizedBy 'reobfJar' +} + +publishing { + publications { + register('mavenJava', MavenPublication) { + groupId = project.group + artifactId = project.base.archivesName.get() + version = project.version + + artifact jar + artifact sourcesJar + + pom { + name = "${mod_name} (Forge 1.20.1)" + description = mod_description + } + } + } +} diff --git a/forge-1.20.1/gradle.properties b/forge-1.20.1/gradle.properties new file mode 100644 index 00000000..af3a5742 --- /dev/null +++ b/forge-1.20.1/gradle.properties @@ -0,0 +1,29 @@ +org.gradle.jvmargs=-Xmx4G +org.gradle.java.home=C:/Program Files/Java/jdk-21.0.10 + +mod_id=antarchy +mod_name=Antarchy +mod_description=ANTS! ANTS! ANTS! ANTS! +mod_authors=CraisinLord +mod_group_id=com.craisinlord +mod_version=1.0.3 +mod_license=All Rights Reserved + +minecraft_version=1.20.1 +forge_version=47.4.0 +forge_version_range=[47,) +loader_version_range=[47,) +parchment_version=2023.09.03-1.20.1 + +jei_version=15.20.0.104 +geckolib_version=4.8.4 +mixin_extras=0.5.0 + +sizeable_foliage_curseforge_id=1601832 +sizeable_foliage_curseforge_file_id_forge=8468688 + +intapi_curseforge_id=817709 +intapi_curseforge_file_id_forge=7921671 + +pehkui_curseforge_id=319596 +pehkui_curseforge_file_id_forge=5393101 diff --git a/forge-1.20.1/gradle/wrapper/gradle-wrapper.jar b/forge-1.20.1/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7454180f2ae8848c63b8b4dea2cb829da983f2fa GIT binary patch literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL literal 0 HcmV?d00001 diff --git a/forge-1.20.1/gradle/wrapper/gradle-wrapper.properties b/forge-1.20.1/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..a4413138 --- /dev/null +++ b/forge-1.20.1/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/forge-1.20.1/gradlew b/forge-1.20.1/gradlew new file mode 100644 index 00000000..c53aefaa --- /dev/null +++ b/forge-1.20.1/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/forge-1.20.1/gradlew.bat b/forge-1.20.1/gradlew.bat new file mode 100644 index 00000000..107acd32 --- /dev/null +++ b/forge-1.20.1/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/forge-1.20.1/settings.gradle b/forge-1.20.1/settings.gradle new file mode 100644 index 00000000..4fcdf4a1 --- /dev/null +++ b/forge-1.20.1/settings.gradle @@ -0,0 +1,10 @@ +pluginManagement { + repositories { + gradlePluginPortal() + maven { url = 'https://maven.minecraftforge.net/' } + maven { url = 'https://maven.parchmentmc.org' } + maven { url = 'https://repo.spongepowered.org/repository/maven-public/' } + } +} + +rootProject.name = 'forge-1.20.1' diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyConfigModuleForge.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyConfigModuleForge.java new file mode 100644 index 00000000..ed6611c8 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyConfigModuleForge.java @@ -0,0 +1,426 @@ +package com.craisinlord.antarchy.forge; + +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.network.ImpactShakeSync; +import com.craisinlord.antarchy.config.ConfigResetGuard; +import com.craisinlord.antarchy.content.network.HerculesBeetleImpactShakePayload; +import com.craisinlord.antarchy.content.network.HerculesBeetleImpactShakeSync; +import com.craisinlord.antarchy.content.network.HordeIntensitySync; +import java.nio.file.Path; +import net.minecraftforge.fml.loading.FMLPaths; +import com.craisinlord.antarchy.forge.network.AntarchyForgeNetworkCore; +import net.minecraftforge.fml.ModLoadingContext; +import net.minecraftforge.fml.config.ModConfig; +import net.minecraftforge.fml.event.config.ModConfigEvent; + +public final class AntarchyConfigModuleForge { + private AntarchyConfigModuleForge() {} + + public static void init() { + Path configDir = FMLPaths.CONFIGDIR.get().resolve("antarchy"); + ConfigResetGuard.wipeIfNeeded( + configDir, + configDir.resolve("antarchy_mobs.toml"), + configDir.resolve("antarchy_tools.toml"), + configDir.resolve("antarchy_misc.toml") + ); + ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, AntarchyMobsConfig.SPEC, "antarchy/antarchy_mobs.toml"); + ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, AntarchyToolsConfig.SPEC, "antarchy/antarchy_tools.toml"); + ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, AntarchyMiscConfig.SPEC, "antarchy/antarchy_misc.toml"); + HerculesBeetleImpactShakeSync.setSink((player, ticks) -> AntarchyForgeNetworkCore.sendToPlayer(player, new HerculesBeetleImpactShakePayload(ticks))); + ImpactShakeSync.setSink(AntarchyForgeNetworkCore::sendToPlayer); + HordeIntensitySync.setSink(AntarchyForgeNetworkCore::sendToPlayer); + AntarchyForge.modEventBusTempHolder.addListener(AntarchyConfigModuleForge::onConfigChange); + } + + private static void onConfigChange(ModConfigEvent event) { + if (event instanceof ModConfigEvent.Reloading) { + return; + } + var spec = event.getConfig().getSpec(); + if (spec == AntarchyMobsConfig.SPEC) { + bakeMobsConfig(); + return; + } + + if (spec == AntarchyToolsConfig.SPEC) { + bakeToolsConfig(); + return; + } + + if (spec == AntarchyMiscConfig.SPEC) { + bakeMiscConfig(); + } + } + + private static void bakeMobsConfig() { + AntarchySettings.setAntsStealFromChests(AntarchyMobsConfig.antsStealFromChests()); + + AntarchySettings.setBrownAntRequiresReagent(AntarchyMobsConfig.brownAntRequiresReagent()); + AntarchySettings.setBrownAntHealth(AntarchyMobsConfig.brownAntHealth()); + AntarchySettings.setBrownAntMovementSpeed(AntarchyMobsConfig.brownAntMovementSpeed()); + AntarchySettings.setBrownAntAttackDamage(AntarchyMobsConfig.brownAntAttackDamage()); + AntarchySettings.setBrownAntDestinationDimension(AntarchyMobsConfig.brownAntDestinationDimension()); + + AntarchySettings.setRedAntRequiresReagent(AntarchyMobsConfig.redAntRequiresReagent()); + AntarchySettings.setRedAntHealth(AntarchyMobsConfig.redAntHealth()); + AntarchySettings.setRedAntMovementSpeed(AntarchyMobsConfig.redAntMovementSpeed()); + AntarchySettings.setRedAntAttackDamage(AntarchyMobsConfig.redAntAttackDamage()); + AntarchySettings.setRedAntDestinationDimension(AntarchyMobsConfig.redAntDestinationDimension()); + + AntarchySettings.setRainbowAntRequiresReagent(AntarchyMobsConfig.rainbowAntRequiresReagent()); + AntarchySettings.setRainbowAntHealth(AntarchyMobsConfig.rainbowAntHealth()); + AntarchySettings.setRainbowAntMovementSpeed(AntarchyMobsConfig.rainbowAntMovementSpeed()); + AntarchySettings.setRainbowAntAttackDamage(AntarchyMobsConfig.rainbowAntAttackDamage()); + AntarchySettings.setRainbowAntNonInfinityFallbackDimension(AntarchyMobsConfig.rainbowAntNonInfinityFallbackDimension()); + + AntarchySettings.setTermiteRequiresReagent(AntarchyMobsConfig.termiteRequiresReagent()); + AntarchySettings.setTermiteHealth(AntarchyMobsConfig.termiteHealth()); + AntarchySettings.setTermiteMovementSpeed(AntarchyMobsConfig.termiteMovementSpeed()); + AntarchySettings.setTermiteAttackDamage(AntarchyMobsConfig.termiteAttackDamage()); + AntarchySettings.setTermiteDestinationDimension(AntarchyMobsConfig.termiteDestinationDimension()); + + AntarchySettings.setEasterBunnyEnabled(AntarchyMobsConfig.easterBunnyEnabled()); + AntarchySettings.setEasterBunnyNaturalSpawnChancePercent(AntarchyMobsConfig.easterBunnyNaturalSpawnChancePercent()); + + AntarchySettings.setWaspHealth(AntarchyMobsConfig.waspHealth()); + AntarchySettings.setWaspAttackDamage(AntarchyMobsConfig.waspAttackDamage()); + AntarchySettings.setWaspMovementSpeed(AntarchyMobsConfig.waspMovementSpeed()); + + AntarchySettings.setBomberHealth(AntarchyMobsConfig.bomberHealth()); + AntarchySettings.setBomberAttackDamage(AntarchyMobsConfig.bomberAttackDamage()); + AntarchySettings.setBomberExplosionDamage(AntarchyMobsConfig.bomberExplosionDamage()); + AntarchySettings.setBomberExplosionRadius(AntarchyMobsConfig.bomberExplosionRadius()); + + AntarchySettings.setJumpyBugHealth(AntarchyMobsConfig.jumpyBugHealth()); + AntarchySettings.setJumpyBugPounceDamage(AntarchyMobsConfig.jumpyBugPounceDamage()); + AntarchySettings.setJumpyBugLatchDamage(AntarchyMobsConfig.jumpyBugLatchDamage()); + AntarchySettings.setJumpyBugCamouflageAlpha(AntarchyMobsConfig.jumpyBugCamouflageAlpha()); + + AntarchySettings.setKrakenHealth(AntarchyMobsConfig.krakenHealth()); + AntarchySettings.setKrakenAttackDamage(AntarchyMobsConfig.krakenAttackDamage()); + AntarchySettings.setKrakenProjectileDamageTakenMultiplier(AntarchyMobsConfig.krakenProjectileDamageTakenMultiplier()); + AntarchySettings.setKrakenSquidSpawnEnabled(AntarchyMobsConfig.krakenSquidSpawnEnabled()); + AntarchySettings.setKrakenMassSpawnEnabled(AntarchyMobsConfig.krakenMassSpawnEnabled()); + AntarchySettings.setKrakenRequireBadOmenToSummon(AntarchyMobsConfig.krakenRequireBadOmenToSummon()); + + AntarchySettings.setBrutalflyHealth(AntarchyMobsConfig.brutalflyHealth()); + AntarchySettings.setBrutalflySwipeDamage(AntarchyMobsConfig.brutalflySwipeDamage()); + AntarchySettings.setBrutalflySpitDamage(AntarchyMobsConfig.brutalflySpitDamage()); + + AntarchySettings.setMantisHealth(AntarchyMobsConfig.mantisHealth()); + AntarchySettings.setMantisAttackDamage(AntarchyMobsConfig.mantisAttackDamage()); + AntarchySettings.setMantisMovementSpeed(AntarchyMobsConfig.mantisMovementSpeed()); + AntarchySettings.setMantisFlyingSpeed(AntarchyMobsConfig.mantisFlyingSpeed()); + AntarchySettings.setMantisIgnoreLightLevel(AntarchyMobsConfig.mantisIgnoreLightLevel()); + + AntarchySettings.setAlphaMantisHealth(AntarchyMobsConfig.alphaMantisHealth()); + AntarchySettings.setAlphaMantisAttackDamage(AntarchyMobsConfig.alphaMantisAttackDamage()); + AntarchySettings.setAlphaMantisMovementSpeed(AntarchyMobsConfig.alphaMantisMovementSpeed()); + AntarchySettings.setAlphaMantisFlyingSpeed(AntarchyMobsConfig.alphaMantisFlyingSpeed()); + AntarchySettings.setAlphaMantisSummonIntervalTicks(AntarchyMobsConfig.alphaMantisSummonIntervalTicks()); + AntarchySettings.setAlphaMantisMaxMinions(AntarchyMobsConfig.alphaMantisMaxMinions()); + + AntarchySettings.setRollyPollyHealth(AntarchyMobsConfig.rollyPollyHealth()); + AntarchySettings.setRollyPollyMovementSpeed(AntarchyMobsConfig.rollyPollyMovementSpeed()); + AntarchySettings.setRollyPollyRollSpeedMultiplier(AntarchyMobsConfig.rollyPollyRollSpeedMultiplier()); + AntarchySettings.setRollyPollyTumbleDamage(AntarchyMobsConfig.rollyPollyTumbleDamage()); + AntarchySettings.setRollyPollyTameChance(AntarchyMobsConfig.rollyPollyTameChance()); + AntarchySettings.setRollyPollyBowlingDamage(AntarchyMobsConfig.rollyPollyBowlingDamage()); + AntarchySettings.setRollyPollyBowlingKnockback(AntarchyMobsConfig.rollyPollyBowlingKnockback()); + AntarchySettings.setRollyPollyArmor(AntarchyMobsConfig.rollyPollyArmor()); + AntarchySettings.setRollyPollyRolledArmorBonus(AntarchyMobsConfig.rollyPollyRolledArmorBonus()); + + AntarchySettings.setTriffidHealth(AntarchyMobsConfig.triffidHealth()); + AntarchySettings.setTriffidAttackDamage(AntarchyMobsConfig.triffidAttackDamage()); + AntarchySettings.setTriffidGrabDamage(AntarchyMobsConfig.triffidGrabDamage()); + + AntarchySettings.setCaterpillarPupationTimeSeconds(AntarchyMobsConfig.caterpillarPupationTimeSeconds()); + + AntarchySettings.setReverieHealth(AntarchyMobsConfig.reverieHealth()); + AntarchySettings.setReverieInterestRadius(AntarchyMobsConfig.reverieInterestRadius()); + AntarchySettings.setReverieAbandonPlayerDistance(AntarchyMobsConfig.reverieAbandonPlayerDistance()); + AntarchySettings.setReverieNoticeDurationTicks(AntarchyMobsConfig.reverieNoticeDurationTicks()); + AntarchySettings.setReverieInterestDurationTicks(AntarchyMobsConfig.reverieInterestDurationTicks()); + AntarchySettings.setReverieRebindCooldownTicks(AntarchyMobsConfig.reverieRebindCooldownTicks()); + AntarchySettings.setReverieDamageReactionDurationTicks(AntarchyMobsConfig.reverieDamageReactionDurationTicks()); + AntarchySettings.setReverieDangerousFallDistance(AntarchyMobsConfig.reverieDangerousFallDistance()); + AntarchySettings.setReverieDangerousFallSpeed(AntarchyMobsConfig.reverieDangerousFallSpeed()); + AntarchySettings.setReverieWarningThreatRadius(AntarchyMobsConfig.reverieWarningThreatRadius()); + AntarchySettings.setReverieWarningThreatVerticalRange(AntarchyMobsConfig.reverieWarningThreatVerticalRange()); + AntarchySettings.setReverieDuplicationCooldownTicks(AntarchyMobsConfig.reverieDuplicationCooldownTicks()); + + AntarchySettings.setNightmareHealth(AntarchyMobsConfig.nightmareHealth()); + AntarchySettings.setNightmareAttackDamage(AntarchyMobsConfig.nightmareAttackDamage()); + + AntarchySettings.setBasiliskPetrifyingGazeEnabled(AntarchyMobsConfig.basiliskPetrifyingGazeEnabled()); + AntarchySettings.setBasiliskSpawnMaxLightLevel(AntarchyMobsConfig.basiliskSpawnMaxLightLevel()); + AntarchySettings.setBasiliskHealth(AntarchyMobsConfig.basiliskHealth()); + AntarchySettings.setBasiliskAttackDamage(AntarchyMobsConfig.basiliskAttackDamage()); + AntarchySettings.setBasiliskMovementSpeed(AntarchyMobsConfig.basiliskMovementSpeed()); + AntarchySettings.setBasiliskArmor(AntarchyMobsConfig.basiliskArmor()); + AntarchySettings.setBasiliskKnockbackResistance(AntarchyMobsConfig.basiliskKnockbackResistance()); + AntarchySettings.setBasiliskFollowRange(AntarchyMobsConfig.basiliskFollowRange()); + AntarchySettings.setBasiliskXpReward(AntarchyMobsConfig.basiliskXpReward()); + AntarchySettings.setBasiliskAttackAnimTicks(AntarchyMobsConfig.basiliskAttackAnimTicks()); + AntarchySettings.setBasiliskAttackDamageTick(AntarchyMobsConfig.basiliskAttackDamageTick()); + AntarchySettings.setBasiliskHissCooldownTicks(AntarchyMobsConfig.basiliskHissCooldownTicks()); + AntarchySettings.setBasiliskAttackReach(AntarchyMobsConfig.basiliskAttackReach()); + AntarchySettings.setBasiliskGazeRange(AntarchyMobsConfig.basiliskGazeRange()); + AntarchySettings.setBasiliskGazeDotThreshold(AntarchyMobsConfig.basiliskGazeDotThreshold()); + AntarchySettings.setBasiliskGazeFacingThreshold(AntarchyMobsConfig.basiliskGazeFacingThreshold()); + AntarchySettings.setBasiliskHissChargeTicks(AntarchyMobsConfig.basiliskHissChargeTicks()); + AntarchySettings.setBasiliskPlayerParalyzeTicks(AntarchyMobsConfig.basiliskPlayerParalyzeTicks()); + AntarchySettings.setBasiliskPreyPetrifyCooldownTicks(AntarchyMobsConfig.basiliskPreyPetrifyCooldownTicks()); + AntarchySettings.setBasiliskPreyPetrifyRange(AntarchyMobsConfig.basiliskPreyPetrifyRange()); + AntarchySettings.setBasiliskPreyPetrifyTicks(AntarchyMobsConfig.basiliskPreyPetrifyTicks()); + + AntarchySettings.setLucidAttackRange(AntarchyMobsConfig.lucidAttackRange()); + AntarchySettings.setLucidPearlInvertedDurationSeconds(AntarchyMobsConfig.lucidPearlInvertedDurationSeconds()); + + AntarchySettings.setDreadHallucinationSoundsEnabled(AntarchyMobsConfig.dreadHallucinationSoundsEnabled()); + AntarchySettings.setDreadHallucinationSoundMinInterval(AntarchyMobsConfig.dreadHallucinationSoundMinInterval()); + AntarchySettings.setDreadHallucinationSoundMaxInterval(AntarchyMobsConfig.dreadHallucinationSoundMaxInterval()); + AntarchySettings.setDreadHallucinationMobsEnabled(AntarchyMobsConfig.dreadHallucinationMobsEnabled()); + AntarchySettings.setDreadHallucinationMobMinInterval(AntarchyMobsConfig.dreadHallucinationMobMinInterval()); + AntarchySettings.setDreadHallucinationMobMaxInterval(AntarchyMobsConfig.dreadHallucinationMobMaxInterval()); + + AntarchySettings.setToreterrorHealth(AntarchyMobsConfig.toreterrorHealth()); + AntarchySettings.setToreterrorJumpAttackDamage(AntarchyMobsConfig.toreterrorJumpAttackDamage()); + AntarchySettings.setToreterrorJumpAttackKnockback(AntarchyMobsConfig.toreterrorJumpAttackKnockback()); + AntarchySettings.setToreterrorSpinDamage(AntarchyMobsConfig.toreterrorSpinDamage()); + AntarchySettings.setToreterrorSpinKnockback(AntarchyMobsConfig.toreterrorSpinKnockback()); + AntarchySettings.setToreterrorRangedWaterBombChance(AntarchyMobsConfig.toreterrorRangedWaterBombChance()); + AntarchySettings.setToreterrorProjectileDamageMultiplier(AntarchyMobsConfig.toreterrorProjectileDamageMultiplier()); + AntarchySettings.setWaterBombDamage(AntarchyMobsConfig.waterBombDamage()); + AntarchySettings.setWaterBombLifetimeTicks(AntarchyMobsConfig.waterBombLifetimeTicks()); + AntarchySettings.setWaterBombGravity(AntarchyMobsConfig.waterBombGravity()); + AntarchySettings.setWaterBombKnockback(AntarchyMobsConfig.waterBombKnockback()); + AntarchySettings.setWaterCannonCooldownSeconds(AntarchyMobsConfig.waterCannonCooldownSeconds()); + + AntarchySettings.setCreepingHorrorHealth(AntarchyMobsConfig.creepingHorrorHealth()); + AntarchySettings.setCreepingHorrorAttackDamage(AntarchyMobsConfig.creepingHorrorAttackDamage()); + AntarchySettings.setLurkingTerrorHealth(AntarchyMobsConfig.lurkingTerrorHealth()); + AntarchySettings.setLurkingTerrorAttackDamage(AntarchyMobsConfig.lurkingTerrorAttackDamage()); + AntarchySettings.setJerryInfantHealth(AntarchyMobsConfig.jerryInfantHealth()); + AntarchySettings.setJerryInfantAttackDamage(AntarchyMobsConfig.jerryInfantAttackDamage()); + AntarchySettings.setJerryMatureHealth(AntarchyMobsConfig.jerryMatureHealth()); + AntarchySettings.setJerryMatureAttackDamage(AntarchyMobsConfig.jerryMatureAttackDamage()); + AntarchySettings.setJerryAlphaHealth(AntarchyMobsConfig.jerryAlphaHealth()); + AntarchySettings.setJerryAlphaAttackDamage(AntarchyMobsConfig.jerryAlphaAttackDamage()); + AntarchySettings.setJerryGammaHealth(AntarchyMobsConfig.jerryGammaHealth()); + AntarchySettings.setJerryGammaAttackDamage(AntarchyMobsConfig.jerryGammaAttackDamage()); + AntarchySettings.setCheepHealth(AntarchyMobsConfig.cheepHealth()); + AntarchySettings.setCheepAttackDamage(AntarchyMobsConfig.cheepAttackDamage()); + AntarchySettings.setDorrieHealth(AntarchyMobsConfig.dorrieHealth()); + AntarchySettings.setHerculesBeetleHealth(AntarchyMobsConfig.herculesBeetleHealth()); + AntarchySettings.setHerculesBeetleAttackDamage(AntarchyMobsConfig.herculesBeetleAttackDamage()); + AntarchySettings.setHerculesBeetleChargeDamage(AntarchyMobsConfig.herculesBeetleChargeDamage()); + AntarchySettings.setOuranwoodDeerHealth(AntarchyMobsConfig.ouranwoodDeerHealth()); + AntarchySettings.setGlimmerHealth(AntarchyMobsConfig.glimmerHealth()); + } + + private static void bakeToolsConfig() { + AntarchySettings.setBasiliskDaggerAttackDamage(AntarchyToolsConfig.basiliskDaggerAttackDamage()); + AntarchySettings.setBasiliskDaggerAttackSpeed(AntarchyToolsConfig.basiliskDaggerAttackSpeed()); + AntarchySettings.setBasiliskDaggerPoisonDurationTicks(AntarchyToolsConfig.basiliskDaggerPoisonDurationTicks()); + AntarchySettings.setBasiliskDaggerPoisonAmplifier(AntarchyToolsConfig.basiliskDaggerPoisonAmplifier()); + + AntarchySettings.setUltimateSwordAttackDamage(AntarchyToolsConfig.ultimateSwordAttackDamage()); + AntarchySettings.setUltimateSwordAttackSpeed(AntarchyToolsConfig.ultimateSwordAttackSpeed()); + AntarchySettings.setUltimatePickaxeAttackDamage(AntarchyToolsConfig.ultimatePickaxeAttackDamage()); + AntarchySettings.setUltimatePickaxeAttackSpeed(AntarchyToolsConfig.ultimatePickaxeAttackSpeed()); + AntarchySettings.setUltimateAxeAttackDamage(AntarchyToolsConfig.ultimateAxeAttackDamage()); + AntarchySettings.setUltimateAxeAttackSpeed(AntarchyToolsConfig.ultimateAxeAttackSpeed()); + AntarchySettings.setUltimateShovelAttackDamage(AntarchyToolsConfig.ultimateShovelAttackDamage()); + AntarchySettings.setUltimateShovelAttackSpeed(AntarchyToolsConfig.ultimateShovelAttackSpeed()); + AntarchySettings.setUltimateHoeAttackDamage(AntarchyToolsConfig.ultimateHoeAttackDamage()); + AntarchySettings.setUltimateHoeAttackSpeed(AntarchyToolsConfig.ultimateHoeAttackSpeed()); + AntarchySettings.setUltimateToolEnchantability(AntarchyToolsConfig.ultimateToolEnchantability()); + AntarchySettings.setUltimateToolsThreeByThreeEnabled(AntarchyToolsConfig.ultimateToolsThreeByThreeEnabled()); + + AntarchySettings.setUltimateBowAttackDamage(AntarchyToolsConfig.ultimateBowAttackDamage()); + AntarchySettings.setUltimateBowPlayerHeal(AntarchyToolsConfig.ultimateBowPlayerHeal()); + AntarchySettings.setUltimateBowDrawSpeedMultiplier(AntarchyToolsConfig.ultimateBowDrawSpeedMultiplier()); + AntarchySettings.setUltimateBowComesEnchantedWithFlame(AntarchyToolsConfig.ultimateBowComesEnchantedWithFlame()); + AntarchySettings.setUltimateBowEnchantability(AntarchyToolsConfig.ultimateBowEnchantability()); + + AntarchySettings.setUltimateCrossbowAttackDamage(AntarchyToolsConfig.ultimateCrossbowAttackDamage()); + AntarchySettings.setUltimateCrossbowChargeSpeedMultiplier(AntarchyToolsConfig.ultimateCrossbowChargeSpeedMultiplier()); + AntarchySettings.setUltimateCrossbowEnchantability(AntarchyToolsConfig.ultimateCrossbowEnchantability()); + + AntarchySettings.setUltimateMaceDamageMultiplier(AntarchyToolsConfig.ultimateMaceDamageMultiplier()); + AntarchySettings.setUltimateMaceAttackSpeed(AntarchyToolsConfig.ultimateMaceAttackSpeed()); + AntarchySettings.setUltimateMaceEnchantability(AntarchyToolsConfig.ultimateMaceEnchantability()); + + AntarchySettings.setUltimateArmorComesEnchanted(AntarchyToolsConfig.ultimateArmorComesEnchanted()); + AntarchySettings.setUltimateArmorEnchantability(AntarchyToolsConfig.ultimateArmorEnchantability()); + AntarchySettings.setUltimateHelmetArmorValue(AntarchyToolsConfig.ultimateHelmetArmorValue()); + AntarchySettings.setUltimateChestplateArmorValue(AntarchyToolsConfig.ultimateChestplateArmorValue()); + AntarchySettings.setUltimateLeggingsArmorValue(AntarchyToolsConfig.ultimateLeggingsArmorValue()); + AntarchySettings.setUltimateBootsArmorValue(AntarchyToolsConfig.ultimateBootsArmorValue()); + AntarchySettings.setUltimateHelmetArmorToughness(AntarchyToolsConfig.ultimateHelmetArmorToughness()); + AntarchySettings.setUltimateChestplateArmorToughness(AntarchyToolsConfig.ultimateChestplateArmorToughness()); + AntarchySettings.setUltimateLeggingsArmorToughness(AntarchyToolsConfig.ultimateLeggingsArmorToughness()); + AntarchySettings.setUltimateBootsArmorToughness(AntarchyToolsConfig.ultimateBootsArmorToughness()); + AntarchySettings.setUltimateArmorKnockbackResistance(AntarchyToolsConfig.ultimateArmorKnockbackResistance()); + + AntarchySettings.setBattleAxeAttackDamage(AntarchyToolsConfig.battleAxeAttackDamage()); + AntarchySettings.setBattleAxeAttackSpeed(AntarchyToolsConfig.battleAxeAttackSpeed()); + + AntarchySettings.setBigBerthaAttackDamage(AntarchyToolsConfig.bigBerthaAttackDamage()); + AntarchySettings.setBigBerthaReachBonus(AntarchyToolsConfig.bigBerthaReachBonus()); + AntarchySettings.setBigBerthaAttackSpeed(AntarchyToolsConfig.bigBerthaAttackSpeed()); + AntarchySettings.setAttitudeAdjusterBaseDamage(AntarchyToolsConfig.attitudeAdjusterBaseDamage()); + AntarchySettings.setAttitudeAdjusterBreaksBlocks(AntarchyToolsConfig.attitudeAdjusterBreaksBlocks()); + AntarchySettings.setBigBerthaBasiliskParalyzeDurationTicks(AntarchyToolsConfig.bigBerthaBasiliskParalyzeDurationTicks()); + AntarchySettings.setBigBerthaKrakenSlowTicks(AntarchyToolsConfig.bigBerthaKrakenSlowTicks()); + AntarchySettings.setBigBerthaBasiliskCooldownSeconds(AntarchyToolsConfig.bigBerthaBasiliskCooldownSeconds()); + AntarchySettings.setBigBerthaLucidInvertedDurationSeconds(AntarchyToolsConfig.bigBerthaLucidInvertedDurationSeconds()); + AntarchySettings.setBigBerthaLucidInvertedDamageBonusPercent(AntarchyToolsConfig.bigBerthaLucidInvertedDamageBonusPercent()); + AntarchySettings.setKrakensGraspAttackDamage(AntarchyToolsConfig.krakensGraspAttackDamage()); + AntarchySettings.setKrakensGraspAttackSpeed(AntarchyToolsConfig.krakensGraspAttackSpeed()); + AntarchySettings.setKrakensGraspThrownDamage(AntarchyToolsConfig.krakensGraspThrownDamage()); + AntarchySettings.setKrakensGraspLightningDamage(AntarchyToolsConfig.krakensGraspLightningDamage()); + AntarchySettings.setKrakensGraspInnateLoyalty(AntarchyToolsConfig.krakensGraspInnateLoyalty()); + AntarchySettings.setKrakensGraspInnateLoyaltyLevel(AntarchyToolsConfig.krakensGraspInnateLoyaltyLevel()); + AntarchySettings.setKrakensGraspTentacleDurationTicks(AntarchyToolsConfig.krakensGraspTentacleDurationTicks()); + AntarchySettings.setKrakensGraspTentacleDamage(AntarchyToolsConfig.krakensGraspTentacleDamage()); + AntarchySettings.setKrakensGraspTentacleRadius(AntarchyToolsConfig.krakensGraspTentacleRadius()); + AntarchySettings.setKrakensGraspTentacleDamageIntervalTicks(AntarchyToolsConfig.krakensGraspTentacleDamageIntervalTicks()); + AntarchySettings.setScorpionWhipBaseDamage(AntarchyToolsConfig.scorpionWhipBaseDamage()); + AntarchySettings.setScorpionWhipReachBonus(AntarchyToolsConfig.scorpionWhipReachBonus()); + AntarchySettings.setScorpionWhipPoisonDurationTicks(AntarchyToolsConfig.scorpionWhipPoisonDurationTicks()); + AntarchySettings.setScorpionWhipTetherMaxRange(AntarchyToolsConfig.scorpionWhipTetherMaxRange()); + AntarchySettings.setScorpionWhipReelCooldownTicks(AntarchyToolsConfig.scorpionWhipReelCooldownTicks()); + AntarchySettings.setScorpionWhipSnapBonusDamage(AntarchyToolsConfig.scorpionWhipSnapBonusDamage()); + AntarchySettings.setScorpionWhipSnapCooldownTicks(AntarchyToolsConfig.scorpionWhipSnapCooldownTicks()); + AntarchySettings.setScorpionWhipPullStrength(AntarchyToolsConfig.scorpionWhipPullStrength()); + AntarchySettings.setScorpionWhipHeavyPullMultiplier(AntarchyToolsConfig.scorpionWhipHeavyPullMultiplier()); + AntarchySettings.setScorpionWhipSelfPullMultiplier(AntarchyToolsConfig.scorpionWhipSelfPullMultiplier()); + AntarchySettings.setBloodCrystalKatanaAttackDamage(AntarchyToolsConfig.bloodCrystalKatanaAttackDamage()); + AntarchySettings.setBloodCrystalKatanaLaunchStrength(AntarchyToolsConfig.bloodCrystalKatanaLaunchStrength()); + AntarchySettings.setBloodCrystalKatanaTrailDurationTicks(AntarchyToolsConfig.bloodCrystalKatanaTrailDurationTicks()); + + AntarchySettings.setNightmareHelmetArmorValue(AntarchyToolsConfig.nightmareHelmetArmorValue()); + AntarchySettings.setNightmareChestplateArmorValue(AntarchyToolsConfig.nightmareChestplateArmorValue()); + AntarchySettings.setNightmareLeggingsArmorValue(AntarchyToolsConfig.nightmareLeggingsArmorValue()); + AntarchySettings.setNightmareBootsArmorValue(AntarchyToolsConfig.nightmareBootsArmorValue()); + AntarchySettings.setNightmareHelmetArmorToughness(AntarchyToolsConfig.nightmareHelmetArmorToughness()); + AntarchySettings.setNightmareChestplateArmorToughness(AntarchyToolsConfig.nightmareChestplateArmorToughness()); + AntarchySettings.setNightmareLeggingsArmorToughness(AntarchyToolsConfig.nightmareLeggingsArmorToughness()); + AntarchySettings.setNightmareBootsArmorToughness(AntarchyToolsConfig.nightmareBootsArmorToughness()); + AntarchySettings.setNightmareArmorKnockbackResistance(AntarchyToolsConfig.nightmareArmorKnockbackResistance()); + AntarchySettings.setNightmareArmorDreadAuraRangePerPiece(AntarchyToolsConfig.nightmareArmorDreadAuraRangePerPiece()); + AntarchySettings.setPrimordialArmorKnockbackPerPiece(AntarchyToolsConfig.primordialArmorKnockbackPerPiece()); + AntarchySettings.setNightmareSwordBaseDamage(AntarchyToolsConfig.nightmareSwordBaseDamage()); + AntarchySettings.setNightmareSwordAttackSpeed(AntarchyToolsConfig.nightmareSwordAttackSpeed()); + AntarchySettings.setNightmareSwordScalingFactor(AntarchyToolsConfig.nightmareSwordScalingFactor()); + AntarchySettings.setFallenKingCrownArmorValue(AntarchyToolsConfig.fallenKingCrownArmorValue()); + AntarchySettings.setFallenKingCrownArmorToughness(AntarchyToolsConfig.fallenKingCrownArmorToughness()); + + AntarchySettings.setSquidzookaCooldownSeconds(AntarchyToolsConfig.squidzookaCooldownSeconds()); + AntarchySettings.setSquidzookaLaunchVelocity(AntarchyToolsConfig.squidzookaLaunchVelocity()); + AntarchySettings.setRpoLauncherCooldownSeconds(AntarchyToolsConfig.rpoLauncherCooldownSeconds()); + AntarchySettings.setRpoLauncherLaunchVelocity(AntarchyToolsConfig.rpoLauncherLaunchVelocity()); + AntarchySettings.setRpoLauncherExplosionDamage(AntarchyToolsConfig.rpoLauncherExplosionDamage()); + AntarchySettings.setRpoLauncherExplosionRadius(AntarchyToolsConfig.rpoLauncherExplosionRadius()); + + AntarchySettings.setSizeChangingRaysEnabled(AntarchyToolsConfig.sizeChangingRaysEnabled()); + AntarchySettings.setSizeRayCooldownSeconds(AntarchyToolsConfig.sizeRayCooldownSeconds()); + AntarchySettings.setSizeRayMinScale(AntarchyToolsConfig.sizeRayMinScale()); + AntarchySettings.setSizeRayMaxScale(AntarchyToolsConfig.sizeRayMaxScale()); + AntarchySettings.setSizeRayDeltaPerHit(AntarchyToolsConfig.sizeRayDeltaPerHit()); + AntarchySettings.setShrinkingPotionDelta(AntarchyToolsConfig.shrinkingPotionDelta()); + AntarchySettings.setGrowthPotionDelta(AntarchyToolsConfig.growthPotionDelta()); + + AntarchySettings.setInvertProjectilesFromInvertedPlayers(AntarchyToolsConfig.invertProjectilesFromInvertedPlayers()); + + AntarchySettings.setGravityGunEnabled(AntarchyToolsConfig.gravityGunEnabled()); + AntarchySettings.setGravityGunBlocksEnabled(AntarchyToolsConfig.gravityGunBlocksEnabled()); + AntarchySettings.setGravityGunEntitiesEnabled(AntarchyToolsConfig.gravityGunEntitiesEnabled()); + AntarchySettings.setGravityGunRange(AntarchyToolsConfig.gravityGunRange()); + AntarchySettings.setGravityGunThrowStrength(AntarchyToolsConfig.gravityGunThrowStrength()); + AntarchySettings.setGravityGunBlastStrength(AntarchyToolsConfig.gravityGunBlastStrength()); + AntarchySettings.setGravityGunCooldownSeconds(AntarchyToolsConfig.gravityGunCooldownSeconds()); + AntarchySettings.setGravityGunMaxHoldDistance(AntarchyToolsConfig.gravityGunMaxHoldDistance()); + AntarchySettings.setCritterCageMaxCapturableWidth(AntarchyToolsConfig.critterCageMaxCapturableWidth()); + AntarchySettings.setCritterCageMaxCapturableHeight(AntarchyToolsConfig.critterCageMaxCapturableHeight()); + + AntarchySettings.setMinersDreamEnabled(AntarchyToolsConfig.minersDreamEnabled()); + AntarchySettings.setMinersDreamMinimumRange(AntarchyToolsConfig.minersDreamMinimumRange()); + AntarchySettings.setMinersDreamMaximumRange(AntarchyToolsConfig.minersDreamMaximumRange()); + AntarchySettings.setMinersDreamTorchSpacing(AntarchyToolsConfig.minersDreamTorchSpacing()); + AntarchySettings.setMinersDreamBlocksPerTick(AntarchyToolsConfig.minersDreamBlocksPerTick()); + + AntarchySettings.setDuctTapeRepairPercentPerUse(AntarchyToolsConfig.ductTapeRepairPercentPerUse()); + AntarchySettings.setPotentNyxiteInvertedDurationSeconds(AntarchyToolsConfig.potentNyxiteInvertedDurationSeconds()); + AntarchySettings.setCorneaEarNightVisionSeconds(AntarchyToolsConfig.corneaEarNightVisionSeconds()); + AntarchySettings.setAmericanizingEnabled(AntarchyToolsConfig.americanizingEnabled()); + AntarchySettings.setAmericanBonusNutrition(AntarchyToolsConfig.americanBonusNutrition()); + AntarchySettings.setAmericanBonusSaturation(AntarchyToolsConfig.americanBonusSaturation()); + AntarchySettings.setAmericanRegenerationDurationTicks(AntarchyToolsConfig.americanRegenerationDurationTicks()); + AntarchySettings.setAmericanRegenerationAmplifier(AntarchyToolsConfig.americanRegenerationAmplifier()); + AntarchySettings.setAntDanceRadius(AntarchyMobsConfig.antDanceRadius()); + + AntarchySettings.setMogglesVisionRadius(AntarchyToolsConfig.mogglesVisionRadius()); + AntarchySettings.setMogglesVisionMaxLight(AntarchyToolsConfig.mogglesVisionMaxLight()); + AntarchySettings.setMogglesVisionAlpha(AntarchyToolsConfig.mogglesVisionAlpha()); + } + + private static void bakeMiscConfig() { + AntarchySettings.setRainbowAntsLeadToInfinityDimensions(AntarchyMiscConfig.rainbowAntsLeadToInfinityDimensions()); + AntarchySettings.setDisableInfinityBookPortalCreation(AntarchyMiscConfig.disableInfinityBookPortalCreation()); + AntarchySettings.setHushweedSporeLifetimeSeconds(AntarchyMiscConfig.hushweedSporeLifetimeSeconds()); + AntarchySettings.setDiamondMinecartEnabled(AntarchyMiscConfig.diamondMinecartEnabled()); + AntarchySettings.setDiamondMinecartPlacesRails(AntarchyMiscConfig.diamondMinecartPlacesRails()); + AntarchySettings.setDiamondMinecartCruiseSpeed(AntarchyMiscConfig.diamondMinecartCruiseSpeed()); + AntarchySettings.setDiamondMinecartMaxSpeed(AntarchyMiscConfig.diamondMinecartMaxSpeed()); + AntarchySettings.setDiamondMinecartAcceleration(AntarchyMiscConfig.diamondMinecartAcceleration()); + AntarchySettings.setDiamondMinecartDeceleration(AntarchyMiscConfig.diamondMinecartDeceleration()); + AntarchySettings.setDiamondMinecartCoastDeceleration(AntarchyMiscConfig.diamondMinecartCoastDeceleration()); + AntarchySettings.setDiamondMinecartMobDamageEnabled(AntarchyMiscConfig.diamondMinecartMobDamageEnabled()); + AntarchySettings.setDiamondMinecartMaxMobDamage(AntarchyMiscConfig.diamondMinecartMaxMobDamage()); + AntarchySettings.setPermanentPortalsEnabled(AntarchyMiscConfig.permanentPortalsEnabled()); + AntarchySettings.setPermanentPortalsFlintAndSteelEnabled(AntarchyMiscConfig.permanentPortalsFlintAndSteelEnabled()); + AntarchySettings.setElythiaPortalEnabled(AntarchyMiscConfig.elythiaPortalEnabled()); + AntarchySettings.setThoraxisPortalEnabled(AntarchyMiscConfig.thoraxisPortalEnabled()); + AntarchySettings.setCavarynPortalEnabled(AntarchyMiscConfig.cavarynPortalEnabled()); + + + // Misc + + AntarchySettings.setElythiaFireflyParticlesEnabled(AntarchyMiscConfig.elythiaFireflyParticlesEnabled()); + + AntarchySettings.setDreamSandEnabled(AntarchyMiscConfig.dreamSandEnabled()); + AntarchySettings.setDreamSandJumpVelocityMultiplier(AntarchyMiscConfig.dreamSandJumpVelocityMultiplier()); + AntarchySettings.setDreamSandGravityMultiplier(AntarchyMiscConfig.dreamSandGravityMultiplier()); + AntarchySettings.setDreamSandFallDamageMultiplier(AntarchyMiscConfig.dreamSandFallDamageMultiplier()); + AntarchySettings.setDreamSandEffectDurationSeconds(AntarchyMiscConfig.dreamSandEffectDurationSeconds()); + + AntarchySettings.setIchorWitherEnabled(AntarchyMiscConfig.ichorWitherEnabled()); + + AntarchySettings.setDuplicatorTreeEnabled(AntarchyMiscConfig.duplicatorTreeEnabled()); + AntarchySettings.setGlowingTorchflowers(AntarchyMiscConfig.glowingTorchflowers()); + AntarchySettings.setGlowVinesUnderLeaves(AntarchyMiscConfig.glowVinesUnderLeaves()); + AntarchySettings.setSwingThroughGrassEnabled(AntarchyMiscConfig.swingThroughGrassEnabled()); + AntarchySettings.setFabricKeybindingConflictFixEnabled(AntarchyMiscConfig.fabricKeybindingConflictFixEnabled()); + AntarchySettings.setExperimentalSettingsPopupDisabled(AntarchyMiscConfig.experimentalSettingsPopupDisabled()); + AntarchySettings.setEntitySpecificFireOverlayEnabled(AntarchyMiscConfig.entitySpecificFireOverlayEnabled()); + + AntarchySettings.setBloodCrystalArmorShieldRechargeTicks(AntarchyToolsConfig.bloodCrystalArmorShieldRechargeTicks()); + AntarchySettings.setBloodCrystalAppleShieldCount(AntarchyToolsConfig.bloodCrystalAppleShieldCount()); + AntarchySettings.setBloodCrystalAppleDurationTicks(AntarchyToolsConfig.bloodCrystalAppleDurationTicks()); + AntarchySettings.setBloodCrystalAppleShieldRechargeTicks(AntarchyToolsConfig.bloodCrystalAppleShieldRechargeTicks()); + AntarchySettings.setBloodCrystalHardMaxShields(AntarchyToolsConfig.bloodCrystalHardMaxShields()); + AntarchySettings.setBloodCrystalHelmetDefense(AntarchyToolsConfig.bloodCrystalHelmetDefense()); + AntarchySettings.setBloodCrystalChestplateDefense(AntarchyToolsConfig.bloodCrystalChestplateDefense()); + AntarchySettings.setBloodCrystalLeggingsDefense(AntarchyToolsConfig.bloodCrystalLeggingsDefense()); + AntarchySettings.setBloodCrystalBootsDefense(AntarchyToolsConfig.bloodCrystalBootsDefense()); + AntarchySettings.setBloodCrystalArmorToughness(AntarchyToolsConfig.bloodCrystalArmorToughness()); + AntarchySettings.setBloodCrystalHelmetDurability(AntarchyToolsConfig.bloodCrystalHelmetDurability()); + AntarchySettings.setBloodCrystalChestplateDurability(AntarchyToolsConfig.bloodCrystalChestplateDurability()); + AntarchySettings.setBloodCrystalLeggingsDurability(AntarchyToolsConfig.bloodCrystalLeggingsDurability()); + AntarchySettings.setBloodCrystalBootsDurability(AntarchyToolsConfig.bloodCrystalBootsDurability()); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyForge.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyForge.java new file mode 100644 index 00000000..ddfb8ace --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyForge.java @@ -0,0 +1,408 @@ +package com.craisinlord.antarchy.forge; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.compat.infinity.InfinityCompat; +import com.craisinlord.antarchy.compat.infinity.InfinityCompatVersion; +import com.craisinlord.antarchy.content.AntarchyGameRules; +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.AntarchySoundEvents; +import com.craisinlord.antarchy.content.item.BloodCrystalKatanaItem; +import com.craisinlord.antarchy.content.item.ScorpionWhipTetherSync; +import com.craisinlord.antarchy.content.network.BloodCrystalKatanaTrailPayload; +import com.craisinlord.antarchy.content.portal.PermanentPortalType; +import com.craisinlord.antarchy.forge.registry.*; +import com.craisinlord.antarchy.forge.network.AntarchyGravityNetworking; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; + + + +@Mod(Antarchy.MODID) +public class AntarchyForge { + public static IEventBus modEventBusTempHolder = null; + + public AntarchyForge() { + IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); + modEventBusTempHolder = modEventBus; + bootstrapGameRules(); + AntarchyConfigModuleForge.init(); + AntarchySoundEvents.bind( + AntarchyForgeSounds.SQUIDZOOKA_FIRE, + AntarchyForgeSounds.SHRINK_RAY_SOUND, + AntarchyForgeSounds.GROWTH_RAY_SOUND, + AntarchyForgeSounds.SIZE_RAY_CHARGE, + AntarchyForgeSounds.ANT_AMBIENT, + AntarchyForgeSounds.ANT_IDLE, + AntarchyForgeSounds.ANT_HURT, + AntarchyForgeSounds.ANT_BITE, + AntarchyForgeSounds.ANT_GATHER, + AntarchyForgeSounds.ANT_NEST, + AntarchyForgeSounds.CLOUD_SHARK_BITE, + AntarchyForgeSounds.CLOUD_SHARK_IDLE, + AntarchyForgeSounds.CLOUD_SHARK_HURT, + AntarchyForgeSounds.CLOUD_SHARK_DEATH, + AntarchyForgeSounds.CLOUD_SHARK_FLY, + AntarchyForgeSounds.CATERPILLAR_IDLE, + AntarchyForgeSounds.CATERPILLAR_HURT, + AntarchyForgeSounds.CATERPILLAR_CRAWL, + AntarchyForgeSounds.BUTTERFLY_HURT, + AntarchyForgeSounds.BRUTALFLY_IDLE, + AntarchyForgeSounds.BRUTALFLY_DEATH, + AntarchyForgeSounds.ELYTHIA_FIREFLY_AMBIENT, + AntarchyForgeSounds.MISSILE_SQUID_AMBIENT, + AntarchyForgeSounds.MISSILE_SQUID_HURT, + AntarchyForgeSounds.MISSILE_SQUID_DEATH, + AntarchyForgeSounds.MISSILE_SQUID_ATTACK, + AntarchyForgeSounds.KRAKEN_FLYING_LOOP, + AntarchyForgeSounds.KRAKEN_FLYING_SIDEWAYS_LOOP, + AntarchyForgeSounds.KRAKEN_ATTACK, + AntarchyForgeSounds.KRAKEN_SPIN, + AntarchyForgeSounds.KRAKEN_ROAR, + AntarchyForgeSounds.KRAKEN_SUMMON, + AntarchyForgeSounds.KRAKEN_HURT, + AntarchyForgeSounds.KRAKEN_DEATH, + AntarchyForgeSounds.BASILISK_IDLE_LOOP, + AntarchyForgeSounds.BASILISK_SLITHER_LOOP, + AntarchyForgeSounds.BASILISK_BITE, + AntarchyForgeSounds.BASILISK_HISS, + AntarchyForgeSounds.BASILISK_HURT, + AntarchyForgeSounds.BASILISK_DEATH, + AntarchyForgeSounds.THORAXIS_NIGHTMARE_WASTES_AMBIENT, + AntarchyForgeSounds.THORAXIS_NIGHTMARE_WASTES_ADDITIONS, + AntarchyForgeSounds.THORAXIS_NIGHTMARE_WASTES_MOOD, + AntarchyForgeSounds.THORAXIS_DREAM_DUNES_AMBIENT, + AntarchyForgeSounds.THORAXIS_DREAM_DUNES_ADDITIONS, + AntarchyForgeSounds.THORAXIS_DREAM_DUNES_MOOD, + AntarchyForgeSounds.THORAXIS_LUCID_POOLS_AMBIENT, + AntarchyForgeSounds.THORAXIS_LUCID_POOLS_ADDITIONS, + AntarchyForgeSounds.THORAXIS_LUCID_POOLS_MOOD, + AntarchyForgeSounds.LUCID_AMBIENT, + AntarchyForgeSounds.LUCID_FLYING, + AntarchyForgeSounds.LUCID_ATTACK, + AntarchyForgeSounds.LUCID_BOLT_SOUND, + AntarchyForgeSounds.LUCID_HURT, + AntarchyForgeSounds.LUCID_DEATH, + AntarchyForgeSounds.REVERIE_IDLE, + AntarchyForgeSounds.REVERIE_HURT, + AntarchyForgeSounds.REVERIE_WORRY, + AntarchyForgeSounds.REVERIE_SAVE, + AntarchyForgeSounds.REVERIE_JOIN_PLAYER, + AntarchyForgeSounds.REVERIE_ALERT, + AntarchyForgeSounds.FLYING_SQUIRREL_IDLE, + AntarchyForgeSounds.FLYING_SQUIRREL_BEG, + AntarchyForgeSounds.FLYING_SQUIRREL_NUT, + AntarchyForgeSounds.FLYING_SQUIRREL_GLIDE_LOOP, + AntarchyForgeSounds.FLYING_SQUIRREL_HURT, + AntarchyForgeSounds.FLYING_SQUIRREL_DEATH, + AntarchyForgeSounds.NIGHTMARE_IDLE, + AntarchyForgeSounds.NIGHTMARE_HURT, + AntarchyForgeSounds.NIGHTMARE_ROAR, + AntarchyForgeSounds.NIGHTMARE_DEATH, + AntarchyForgeSounds.NIGHTMARE_BITE, + AntarchyForgeSounds.NIGHTMARE_FLAP, + AntarchyForgeSounds.TRIFFID_ATTACK, + AntarchyForgeSounds.TRIFFID_GRAB, + AntarchyForgeSounds.TRIFFID_HURT, + AntarchyForgeSounds.TRIFFID_DEATH, + AntarchyForgeSounds.TRIFFID_HISS, + AntarchyForgeSounds.TRIFFID_GROWL, + AntarchyForgeSounds.MANTIS_AMBIENT, + AntarchyForgeSounds.MANTIS_HURT, + AntarchyForgeSounds.MANTIS_ATTACK, + AntarchyForgeSounds.MANTIS_FLY_LOOP, + AntarchyForgeSounds.GRAVITY_GUN_PICKUP, + AntarchyForgeSounds.GRAVITY_GUN_DROP, + AntarchyForgeSounds.GRAVITY_GUN_HOLD_LOOP, + AntarchyForgeSounds.GRAVITY_GUN_LAUNCH, + AntarchyForgeSounds.GRAVITY_GUN_DRYFIRE, + AntarchyForgeSounds.BED_BUG_AMBIENT, + AntarchyForgeSounds.BED_BUG_HURT, + AntarchyForgeSounds.BED_BUG_ATTACK, + AntarchyForgeSounds.WASP_IDLE, + AntarchyForgeSounds.WASP_HURT, + AntarchyForgeSounds.WASP_ATTACK, + AntarchyForgeSounds.WASP_DEATH, + AntarchyForgeSounds.SCORPION_AMBIENT, + AntarchyForgeSounds.SCORPION_HURT, + AntarchyForgeSounds.SCORPION_ATTACK, + AntarchyForgeSounds.EMPEROR_SCORPION_AMBIENT, + AntarchyForgeSounds.EMPEROR_SCORPION_HURT, + AntarchyForgeSounds.EMPEROR_SCORPION_ATTACK, + AntarchyForgeSounds.EMPEROR_SCORPION_ROAR, + AntarchyForgeSounds.MOLEWORM_AMBIENT, + AntarchyForgeSounds.MOLEWORM_HURT, + AntarchyForgeSounds.MOLEWORM_ATTACK, + AntarchyForgeSounds.MOLEWORM_DIG, + AntarchyForgeSounds.MOLEVORE_AMBIENT, + AntarchyForgeSounds.MOLEVORE_HURT, + AntarchyForgeSounds.MOLEVORE_ATTACK, + AntarchyForgeSounds.MOLEVORE_DIG, + AntarchyForgeSounds.BOMBER_WALK, + AntarchyForgeSounds.BOMBER_KNOCK, + AntarchyForgeSounds.BOMBER_EXPLODE, + AntarchyForgeSounds.TORETERROR_IDLE, + AntarchyForgeSounds.TORETERROR_HURT, + AntarchyForgeSounds.TORETERROR_DEATH, + AntarchyForgeSounds.TORETERROR_BOMBER_FIRE, + AntarchyForgeSounds.TORETERROR_SPIN, + AntarchyForgeSounds.TORETERROR_RICOCHET, + AntarchyForgeSounds.WATER_CANNON_FIRE, + AntarchyForgeSounds.TORETERROR_JUMP_UP, + AntarchyForgeSounds.TORETERROR_JUMP_LAND, + AntarchyForgeSounds.STINKY_FLY, + AntarchyForgeSounds.STINK_BUG_FART, + AntarchyForgeSounds.STINK_BUG_IDLE, + AntarchyForgeSounds.CAVARYN_HEARTBEAT, + AntarchyForgeSounds.ROLLY_POLLY_IDLE, + AntarchyForgeSounds.CREEPING_HORROR_GROWL, + AntarchyForgeSounds.CREEPING_HORROR_HURT, + AntarchyForgeSounds.CREEPING_HORROR_BITE, + AntarchyForgeSounds.LURKING_TERROR_SNARL, + AntarchyForgeSounds.LURKING_TERROR_HURT, + AntarchyForgeSounds.LURKING_TERROR_BITE, + AntarchyForgeSounds.LURKING_TERROR_FLY_LOOP, + AntarchyForgeSounds.DUCT_TAPE_USE, + AntarchyForgeSounds.HERCULES_BEETLE_IDLE, + AntarchyForgeSounds.HERCULES_BEETLE_HURT, + AntarchyForgeSounds.HERCULES_BEETLE_ATTACK, + AntarchyForgeSounds.HERCULES_BEETLE_CRY, + AntarchyForgeSounds.HERCULES_BEETLE_CHARGE_START, + AntarchyForgeSounds.HERCULES_BEETLE_KNOCKED_DOWN, + AntarchyForgeSounds.JUMPY_BUG_IDLE, + AntarchyForgeSounds.SPIT_BUG_IDLE, + AntarchyForgeSounds.JUMPY_BUG_HURT, + AntarchyForgeSounds.JUMPY_BUG_JUMP, + AntarchyForgeSounds.SPIT_BUG_HURT, + AntarchyForgeSounds.SPIT_BUG_SPIT, + AntarchyForgeSounds.BRUTALFLY_SPIT, + AntarchyForgeSounds.ROLLY_POLLY_WHEEL_MODE, + AntarchyForgeSounds.ROLLY_POLLY_NORMAL_MODE, + AntarchyForgeSounds.ROLLY_POLLY_ROLL, + AntarchyForgeSounds.JERRY_YOUNG_IDLE, + AntarchyForgeSounds.JERRY_YOUNG_HURT, + AntarchyForgeSounds.JERRY_YOUNG_DEATH, + AntarchyForgeSounds.JERRY_YOUNG_ATTACK, + AntarchyForgeSounds.JERRY_ADULT_IDLE, + AntarchyForgeSounds.JERRY_ADULT_HURT, + AntarchyForgeSounds.JERRY_ADULT_DEATH, + AntarchyForgeSounds.JERRY_ADULT_ATTACK + ); + bindCommonObjects(); + ScorpionWhipTetherSync.setSink((player, targetId) -> com.craisinlord.antarchy.forge.network.AntarchyForgeNetworkCore.sendToTrackingEntity( + player, + new com.craisinlord.antarchy.content.network.ScorpionWhipTetherPayload(player.getId(), targetId) + )); + BloodCrystalKatanaItem.setTrailCallback((player, durationTicks) -> com.craisinlord.antarchy.forge.network.AntarchyForgeNetworkCore.sendToTrackingEntity( + player, + new BloodCrystalKatanaTrailPayload(player.getId(), durationTicks) + )); + com.craisinlord.antarchy.content.gravity.AntarchyGravityApi.setSyncDispatcher(AntarchyGravityNetworking::syncEntity); + com.craisinlord.antarchy.content.effect.AntarchySizeScaling.register( + com.craisinlord.antarchy.forge.registry.AntarchyForgeMisc.SHRINKING_EFFECT, + com.craisinlord.antarchy.forge.registry.AntarchyForgeMisc.GROWTH_EFFECT + ); + if (isSupportedInfinityLoaded()) { + InfinityCompat.bind(new ForgeInfinityCompat()); + } + AntarchyForgeEvents.register(modEventBus); + AntarchyForgeSounds.register(modEventBus); + AntarchyForgeEntites.register(modEventBus); + AntarchyForgeBlocks.register(modEventBus); + AntarchyForgeItems.register(modEventBus); + AntarchyForgeFluidTypes.register(modEventBus); + AntarchyForgeMisc.register(modEventBus); + AntarchyForgeSpawnPlacements.register(modEventBus); + AntarchyForgeCreativeModeTabs.register(modEventBus); + AntarchyForgeEntityAttributes.register(modEventBus); + AntarchyForgePayloadHandlers.register(); + Antarchy.init(); + } + + private static void bootstrapGameRules() { + AntarchyGameRules.bootstrap((name, category, defaultValue) -> { + net.minecraft.world.level.GameRules.Type type = + net.minecraft.world.level.GameRules.BooleanValue.create(defaultValue); + return net.minecraft.world.level.GameRules.register(name, category, type); + }); + } + + private static void bindCommonObjects() { + com.craisinlord.antarchy.content.entity.UpwardFallingBlockEntity.TYPE = AntarchyForgeEntites.UPWARD_FALLING_BLOCK; + PermanentPortalType.bindBlocks( + () -> AntarchyForgeBlocks.MOSSY_OURANWOOD_WOOD.get(), + () -> AntarchyForgeBlocks.ELYTHIA_PORTAL.get(), + () -> AntarchyForgeBlocks.NYXITE.get(), + () -> AntarchyForgeBlocks.THORAXIS_PORTAL.get(), + () -> AntarchyForgeBlocks.MYRMITE.get(), + () -> AntarchyForgeBlocks.CAVARYN_PORTAL.get() + ); + AntarchyObjects.bind( + AntarchyForgeEntites.EASTER_BUNNY, + AntarchyForgeEntites.FLYING_SQUIRREL, + AntarchyForgeEntites.KRAKEN, + AntarchyForgeEntites.MISSILE_SQUID, + AntarchyForgeEntites.MOLEWORM, + AntarchyForgeEntites.MANTIS, + AntarchyForgeEntites.BED_BUG, + AntarchyForgeEntites.WASP, + AntarchyForgeEntites.BOMBER, + AntarchyForgeEntites.SCORPION, + AntarchyForgeEntites.CATERPILLAR, + AntarchyForgeEntites.BUTTERFLY, + AntarchyForgeEntites.REVERIE, + AntarchyForgeEntites.TRIFFID, + AntarchyForgeEntites.BRUTALFLY, + AntarchyForgeEntites.BRUTALFLY_ORB, + AntarchyForgeEntites.HUSH_PROJECTILE, + AntarchyForgeEntites.TORETERROR, + AntarchyForgeEntites.WATER_BOMB, + AntarchyForgeEntites.CREEPING_HORROR, + AntarchyForgeEntites.LURKING_TERROR, + AntarchyForgeEntites.STINK_BUG, + AntarchyForgeEntites.CHEEP, + AntarchyForgeEntites.DORRIE, + () -> AntarchyForgeBlocks.DUPLICATOR_LOG.get(), + () -> AntarchyForgeBlocks.DUPLICATOR_SAPLING.get(), + () -> AntarchyForgeBlocks.DUCT_TAPE.get(), + () -> AntarchyForgeBlocks.INFESTED_ROOTED_DIRT.get(), + () -> AntarchyForgeBlocks.INFESTED_COARSE_DIRT.get(), + () -> AntarchyForgeBlocks.NYXITE.get(), + () -> AntarchyForgeBlocks.SHELLSTONE.get(), + () -> AntarchyForgeBlocks.POLISHED_SHELLSTONE.get(), + () -> AntarchyForgeBlocks.SHELLSTONE_BRICKS.get(), + () -> AntarchyForgeBlocks.CHISELED_SHELLSTONE.get(), + () -> AntarchyForgeBlocks.MOSSY_SHELLSTONE_BRICKS.get(), + () -> AntarchyForgeBlocks.CRACKED_SHELLSTONE_BRICKS.get(), + () -> AntarchyForgeBlocks.MOSSY_SHELLSTONE_BRICK_STAIRS.get(), + () -> AntarchyForgeBlocks.MOSSY_SHELLSTONE_BRICK_SLAB.get(), + () -> AntarchyForgeBlocks.MOSSY_SHELLSTONE_BRICK_WALL.get(), + () -> AntarchyForgeBlocks.SHELLSTONE_STAIRS.get(), + () -> AntarchyForgeBlocks.SHELLSTONE_SLAB.get(), + () -> AntarchyForgeBlocks.SHELLSTONE_WALL.get(), + () -> AntarchyForgeBlocks.POLISHED_SHELLSTONE_STAIRS.get(), + () -> AntarchyForgeBlocks.POLISHED_SHELLSTONE_SLAB.get(), + () -> AntarchyForgeBlocks.POLISHED_SHELLSTONE_WALL.get(), + () -> AntarchyForgeBlocks.SHELLSTONE_BRICK_STAIRS.get(), + () -> AntarchyForgeBlocks.SHELLSTONE_BRICK_SLAB.get(), + () -> AntarchyForgeBlocks.SHELLSTONE_BRICK_WALL.get(), + () -> AntarchyForgeBlocks.CLOUD_BLOCK.get(), + () -> AntarchyForgeBlocks.TRIFFID_GOO_BLOCK.get(), + () -> AntarchyForgeBlocks.PALE_NYXITE.get(), + () -> AntarchyForgeBlocks.NYXITE_SPIKE.get(), + () -> AntarchyForgeBlocks.CHITEN_BLOCK.get(), + () -> AntarchyForgeBlocks.CHITEN_SPIKE.get(), + () -> AntarchyForgeBlocks.POTENT_NYXITE.get(), + () -> AntarchyForgeBlocks.ANTIMETAL.get(), + () -> AntarchyForgeBlocks.POLISHED_ANTIMETAL.get(), + () -> AntarchyForgeBlocks.BUDDING_BLOOD_CRYSTAL.get(), + () -> AntarchyForgeBlocks.SMALL_BLOOD_CRYSTAL_BUD.get(), + () -> AntarchyForgeBlocks.MEDIUM_BLOOD_CRYSTAL_BUD.get(), + () -> AntarchyForgeBlocks.LARGE_BLOOD_CRYSTAL_BUD.get(), + () -> AntarchyForgeBlocks.BLOOD_CRYSTAL_CRYSTAL.get(), + () -> AntarchyForgeItems.OURANWOOD_ACORN.get(), + AntarchyForgeItems.KRAKEN_TOOTH, + () -> AntarchyForgeItems.MOGGLES.get(), + () -> AntarchyForgeItems.REVERIE_BOTTLE.get(), + () -> AntarchyForgeItems.STINK_BUG.get(), + () -> AntarchyForgeMisc.mobEffectHolder(AntarchyForgeMisc.DREAD), + () -> AntarchyForgeMisc.mobEffectHolder(AntarchyForgeMisc.PARALYZED), + () -> AntarchyForgeMisc.mobEffectHolder(AntarchyForgeMisc.INVERTED), + () -> AntarchyForgeMisc.mobEffectHolder(AntarchyForgeMisc.STINKY), + () -> AntarchyForgeBlocks.OURANWOOD_ACORN_BLOCK.get(), + () -> AntarchyForgeBlocks.MOSSY_OURANWOOD_LOG.get(), + () -> AntarchyForgeBlocks.MOSSY_OURANWOOD_WOOD.get(), + () -> AntarchyForgeBlocks.UMBRAL_MOSS_BLOCK.get(), + () -> AntarchyForgeBlocks.UMBRAL_MOSS_CARPET.get(), + () -> AntarchyForgeBlocks.BLUSH_MOSS_BLOCK.get(), + () -> AntarchyForgeBlocks.BLUSH_MOSS_CARPET.get(), + () -> AntarchyForgeBlocks.ORANGE_MILKWEED.get(), + () -> AntarchyForgeBlocks.PINK_MILKWEED.get(), + () -> AntarchyForgeBlocks.BED_BUG_EGG.get(), + () -> AntarchyForgeBlocks.CREEPING_HORROR_EGG.get(), + () -> AntarchyForgeBlocks.LURKING_TERROR_EGG.get(), + () -> AntarchyForgeBlocks.WASP_NEST.get(), + () -> AntarchyForgeBlocks.HUSHWEED.get(), + () -> AntarchyForgeBlocks.OURANWOOD_SQUIRREL_NEST.get(), + () -> AntarchyForgeBlocks.BRUTALFLY_COCOON_SPAWNER.get(), + () -> AntarchyForgeBlocks.GIANT_LILY_PAD.get(), + () -> AntarchyForgeBlocks.SEASHELL.get(), + () -> AntarchyForgeBlocks.ANT_NEST_BLOCK_ENTITY.get(), + () -> AntarchyForgeBlocks.DREAM_CAMPFIRE_BLOCK_ENTITY.get(), + () -> AntarchyForgeBlocks.WASP_NEST_BLOCK_ENTITY.get(), + () -> AntarchyForgeBlocks.HUSHWEED_BLOCK_ENTITY.get(), + () -> AntarchyForgeBlocks.SEASHELL_BLOCK_ENTITY.get(), + () -> AntarchyForgeMisc.STINKY_GAS.get(), + () -> AntarchyForgeMisc.STINKY_FLY.get(), + () -> AntarchyForgeMisc.PEACH_LEAVES_PARTICLE.get(), + () -> AntarchyForgeMisc.attributeHolder(AntarchyForgeMisc.SCALE), + () -> AntarchyForgeMisc.attributeHolder(AntarchyForgeMisc.DOUBLE_DAMAGE_CHANCE), + () -> AntarchyForgeMisc.attributeHolder(AntarchyForgeMisc.BLOODGLASS_MAX_HEARTS), + () -> AntarchyForgeMisc.mobEffectHolder(AntarchyForgeMisc.BLOODGLASS_WARD) + ); + AntarchyObjects.setOctopusBomb(AntarchyForgeEntites.OCTOPUS_BOMB); + AntarchyObjects.setTentacle(AntarchyForgeEntites.TENTACLE); + AntarchyObjects.setKrakensGraspTrident(AntarchyForgeEntites.KRAKENS_GRASP_TRIDENT); + AntarchyObjects.setLotus(() -> AntarchyForgeBlocks.LOTUS.get()); + AntarchyObjects.setKrakenTentacle(() -> AntarchyForgeItems.KRAKEN_TENTACLE.get()); + AntarchyObjects.setKrakensGrasp(() -> AntarchyForgeItems.KRAKENS_GRASP.get()); + AntarchyObjects.setOuranwoodDeer(AntarchyForgeEntites.OURANWOOD_DEER); + AntarchyObjects.setGlimmer(AntarchyForgeEntites.GLIMMER); + AntarchyObjects.setSpiritApple(() -> AntarchyForgeItems.SPIRIT_APPLE.get()); + AntarchyObjects.setElka(AntarchyForgeEntites.ELKA); + AntarchyObjects.setPeach(() -> AntarchyForgeItems.PEACH.get()); + AntarchyObjects.setCorn(() -> AntarchyForgeItems.CORN.get()); + AntarchyObjects.setCornSeeds(() -> AntarchyForgeItems.CORN_SEEDS.get()); + AntarchyObjects.setStarCoralBlock(() -> AntarchyForgeBlocks.STAR_CORAL_BLOCK.get()); + AntarchyObjects.setStarCoral(() -> AntarchyForgeBlocks.STAR_CORAL.get()); + AntarchyObjects.setStarCoralFan(() -> AntarchyForgeBlocks.STAR_CORAL_FAN.get()); + AntarchyObjects.setCookedCorndog(() -> AntarchyForgeItems.COOKED_CORNDOG.get()); + AntarchyObjects.setGlimmerBottle(() -> AntarchyForgeItems.GLIMMER_BOTTLE.get()); + AntarchyObjects.setLumen(() -> AntarchyForgeMisc.LUMEN.get()); + AntarchyObjects.setFlowingLumen(() -> AntarchyForgeMisc.FLOWING_LUMEN.get()); + AntarchyObjects.setLumenBucket(() -> AntarchyForgeItems.LUMEN_BUCKET.get()); + AntarchyObjects.setLumenBlock(() -> AntarchyForgeBlocks.LUMEN_BLOCK.get()); + AntarchyObjects.setLumenFroglight(() -> AntarchyForgeBlocks.LUMEN_FROGLIGHT.get()); + AntarchyObjects.setPeachLeavesParticle(() -> AntarchyForgeMisc.PEACH_LEAVES_PARTICLE.get()); + AntarchyObjects.setLotusPollen(() -> AntarchyForgeMisc.LOTUS_POLLEN.get()); + AntarchyObjects.setDorrieInventoryMenu(AntarchyForgeMisc.DORRIE_INVENTORY_MENU); + AntarchyObjects.setCritterCage(() -> AntarchyForgeItems.CRITTER_CAGE.get()); + AntarchyObjects.setCritterCageBlock(() -> AntarchyForgeBlocks.CRITTER_CAGE_BLOCK.get()); + AntarchyObjects.setCritterCageBlockEntity(() -> AntarchyForgeBlocks.CRITTER_CAGE_BLOCK_ENTITY.get()); + AntarchyObjects.setCritterCageProjectile(() -> AntarchyForgeEntites.CRITTER_CAGE_PROJECTILE.get()); + } + + private static boolean isModLoaded(String modId) { + try { + return ModList.get().isLoaded(modId); + } catch (Throwable ignored) { + return false; + } + } + + private static boolean isSupportedInfinityLoaded() { + if (!isModLoaded("infinity")) { + return false; + } + + try { + String version = ModList.get() + .getModContainerById("infinity") + .map(container -> container.getModInfo().getVersion().toString()) + .orElse(null); + if (InfinityCompatVersion.isSupported(version)) { + return true; + } + + Antarchy.LOGGER.warn( + "Skipping Infinity integration because version {} is below the supported minimum {}", + version, + InfinityCompatVersion.requiredVersion() + ); + } catch (Throwable throwable) { + Antarchy.LOGGER.warn("Skipping Infinity integration because the installed Infinity version could not be verified", throwable); + } + return false; + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyForgeFluidTypes.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyForgeFluidTypes.java new file mode 100644 index 00000000..3a928e98 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyForgeFluidTypes.java @@ -0,0 +1,277 @@ +package com.craisinlord.antarchy.forge; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.client.renderer.AntiwaterFluidRenderer; +import com.craisinlord.antarchy.forge.content.fluid.AntiwaterFluidType; +import com.mojang.blaze3d.shaders.FogShape; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.material.FluidState; +import net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions; +import net.minecraftforge.common.SoundActions; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fluids.FluidType; +import net.minecraftforge.registries.RegistryObject; +import com.craisinlord.antarchy.forge.registry.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import org.joml.Vector3f; + +import java.util.function.Consumer; + +public final class AntarchyForgeFluidTypes { + private static final ResourceLocation WATER_STILL = ResourceLocation.withDefaultNamespace("block/water_still"); + private static final ResourceLocation WATER_FLOW = ResourceLocation.withDefaultNamespace("block/water_flow"); + private static final ResourceLocation WATER_OVERLAY = ResourceLocation.withDefaultNamespace("block/water_overlay"); + private static final ResourceLocation UNDERWATER_OVERLAY = ResourceLocation.withDefaultNamespace("textures/misc/underwater.png"); + private static final ResourceLocation ANTIWATER_STILL = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "block/antiwater_still"); + private static final ResourceLocation ANTIWATER_FLOW = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "block/antiwater_flow"); + private static final ResourceLocation BILE_STILL = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "block/bile/bile_still"); + private static final ResourceLocation BILE_FLOW = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "block/bile/bile_flowing"); + + private static final DeferredRegister FLUID_TYPES = + DeferredRegister.create(ForgeRegistries.Keys.FLUID_TYPES, Antarchy.MODID); + + public static final RegistryObject ANTIWATER_TYPE = FLUID_TYPES.register("antiwater", + () -> new AntiwaterFluidType(FluidType.Properties.create() + .descriptionId("block.antarchy.antiwater") + .fallDistanceModifier(0.0F) + .canSwim(true) + .supportsBoating(true) + .sound(SoundActions.BUCKET_FILL, SoundEvents.BUCKET_FILL) + .sound(SoundActions.BUCKET_EMPTY, SoundEvents.BUCKET_EMPTY) + .density(1000) + .viscosity(1000)) { + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(new IClientFluidTypeExtensions() { + @Override + public ResourceLocation getStillTexture() { + return WATER_STILL; + } + + @Override + public ResourceLocation getFlowingTexture() { + return WATER_FLOW; + } + + @Override + public ResourceLocation getOverlayTexture() { + return WATER_OVERLAY; + } + + @Override + public ResourceLocation getRenderOverlayTexture(Minecraft mc) { + return UNDERWATER_OVERLAY; + } + + @Override + public int getTintColor() { + return 0xFFFF1A1A; + } + + @Override + public int getTintColor(FluidState state, BlockAndTintGetter getter, BlockPos pos) { + return 0xFFFF1A1A; + } + + @Override + public Vector3f modifyFogColor(Camera camera, float partialTick, ClientLevel level, int renderDistance, float darkenWorldAmount, Vector3f fluidFogColor) { + return new Vector3f(0.52F, 0.06F, 0.06F); + } + + @Override + public void modifyFogRender(Camera camera, net.minecraft.client.renderer.FogRenderer.FogMode mode, float renderDistance, float partialTick, float nearDistance, float farDistance, FogShape shape) { + RenderSystem.setShaderFogStart(0.5F); + RenderSystem.setShaderFogEnd(Math.min(farDistance, 12.0F)); + RenderSystem.setShaderFogShape(FogShape.CYLINDER); + } + }); + } + }); + + public static final RegistryObject BILE_TYPE = FLUID_TYPES.register("bile", + () -> new FluidType(FluidType.Properties.create() + .descriptionId("block.antarchy.bile") + .fallDistanceModifier(0.0F) + .supportsBoating(true) + .sound(SoundActions.BUCKET_FILL, SoundEvents.BUCKET_FILL) + .sound(SoundActions.BUCKET_EMPTY, SoundEvents.BUCKET_EMPTY) + .density(1100) + .viscosity(1200)) { + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(new IClientFluidTypeExtensions() { + @Override + public ResourceLocation getStillTexture() { + return BILE_STILL; + } + + @Override + public ResourceLocation getFlowingTexture() { + return BILE_FLOW; + } + + @Override + public ResourceLocation getOverlayTexture() { + return WATER_OVERLAY; + } + + @Override + public ResourceLocation getRenderOverlayTexture(Minecraft mc) { + return UNDERWATER_OVERLAY; + } + + @Override + public int getTintColor() { + return 0xFFFFFFFF; + } + + @Override + public int getTintColor(FluidState state, BlockAndTintGetter getter, BlockPos pos) { + return 0xFFFFFFFF; + } + + @Override + public Vector3f modifyFogColor(Camera camera, float partialTick, ClientLevel level, int renderDistance, float darkenWorldAmount, Vector3f fluidFogColor) { + return new Vector3f(0.38F, 0.42F, 0.10F); + } + + @Override + public void modifyFogRender(Camera camera, net.minecraft.client.renderer.FogRenderer.FogMode mode, float renderDistance, float partialTick, float nearDistance, float farDistance, FogShape shape) { + RenderSystem.setShaderFogStart(0.25F); + RenderSystem.setShaderFogEnd(Math.min(farDistance, 4.0F)); + RenderSystem.setShaderFogShape(FogShape.CYLINDER); + } + }); + } + }); + + public static final RegistryObject ICHOR_TYPE = FLUID_TYPES.register("ichor", + () -> new FluidType(FluidType.Properties.create() + .descriptionId("block.antarchy.ichor") + .fallDistanceModifier(0.0F) + .supportsBoating(true) + .sound(SoundActions.BUCKET_FILL, SoundEvents.BUCKET_FILL) + .sound(SoundActions.BUCKET_EMPTY, SoundEvents.BUCKET_EMPTY) + .density(1200) + .viscosity(1400)) { + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(new IClientFluidTypeExtensions() { + @Override + public ResourceLocation getStillTexture() { + return ANTIWATER_STILL; + } + + @Override + public ResourceLocation getFlowingTexture() { + return ANTIWATER_FLOW; + } + + @Override + public ResourceLocation getOverlayTexture() { + return WATER_OVERLAY; + } + + @Override + public ResourceLocation getRenderOverlayTexture(Minecraft mc) { + return UNDERWATER_OVERLAY; + } + + @Override + public int getTintColor() { + return 0xFF2A0306; + } + + @Override + public int getTintColor(FluidState state, BlockAndTintGetter getter, BlockPos pos) { + return 0xFF2A0306; + } + + @Override + public Vector3f modifyFogColor(Camera camera, float partialTick, ClientLevel level, int renderDistance, float darkenWorldAmount, Vector3f fluidFogColor) { + return new Vector3f(0.16F, 0.02F, 0.03F); + } + + @Override + public void modifyFogRender(Camera camera, net.minecraft.client.renderer.FogRenderer.FogMode mode, float renderDistance, float partialTick, float nearDistance, float farDistance, FogShape shape) { + RenderSystem.setShaderFogStart(0.5F); + RenderSystem.setShaderFogEnd(Math.min(farDistance, 10.0F)); + RenderSystem.setShaderFogShape(FogShape.CYLINDER); + } + }); + } + }); + + public static final RegistryObject LUMEN_TYPE = FLUID_TYPES.register("lumen", + () -> new FluidType(FluidType.Properties.create() + .descriptionId("block.antarchy.lumen") + .fallDistanceModifier(0.0F) + .canSwim(true) + .supportsBoating(true) + .sound(SoundActions.BUCKET_FILL, SoundEvents.BUCKET_FILL) + .sound(SoundActions.BUCKET_EMPTY, SoundEvents.BUCKET_EMPTY) + .density(1000) + .viscosity(1000)) { + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(new IClientFluidTypeExtensions() { + @Override + public ResourceLocation getStillTexture() { + return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "block/lumen_still"); + } + + @Override + public ResourceLocation getFlowingTexture() { + return ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "block/lumen_flow"); + } + + @Override + public ResourceLocation getOverlayTexture() { + return WATER_OVERLAY; + } + + @Override + public ResourceLocation getRenderOverlayTexture(Minecraft mc) { + return UNDERWATER_OVERLAY; + } + + @Override + public int getTintColor() { + return 0xFFFFFFFF; + } + + @Override + public int getTintColor(FluidState state, BlockAndTintGetter getter, BlockPos pos) { + return 0xFFFFFFFF; + } + + @Override + public Vector3f modifyFogColor(Camera camera, float partialTick, ClientLevel level, int renderDistance, float darkenWorldAmount, Vector3f fluidFogColor) { + return new Vector3f(0.58F, 0.84F, 0.88F); + } + + @Override + public void modifyFogRender(Camera camera, net.minecraft.client.renderer.FogRenderer.FogMode mode, float renderDistance, float partialTick, float nearDistance, float farDistance, FogShape shape) { + RenderSystem.setShaderFogStart(0.4F); + RenderSystem.setShaderFogEnd(Math.min(farDistance, 12.0F)); + RenderSystem.setShaderFogShape(FogShape.CYLINDER); + } + }); + } + }); + + private AntarchyForgeFluidTypes() { + } + + public static void register(IEventBus modEventBus) { + FLUID_TYPES.register(modEventBus); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyMiscConfig.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyMiscConfig.java new file mode 100644 index 00000000..d8048d97 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyMiscConfig.java @@ -0,0 +1,192 @@ +package com.craisinlord.antarchy.forge; + +import net.minecraftforge.common.ForgeConfigSpec; + +public final class AntarchyMiscConfig { + public static final ForgeConfigSpec SPEC; + + // Elythia + private static final ForgeConfigSpec.BooleanValue ELYTHIA_FIREFLY_PARTICLES_ENABLED; + + // Dream Sand + private static final ForgeConfigSpec.BooleanValue DREAM_SAND_ENABLED; + private static final ForgeConfigSpec.DoubleValue DREAM_SAND_JUMP_VELOCITY_MULTIPLIER; + private static final ForgeConfigSpec.DoubleValue DREAM_SAND_GRAVITY_MULTIPLIER; + private static final ForgeConfigSpec.DoubleValue DREAM_SAND_EFFECT_DURATION_SECONDS; + private static final ForgeConfigSpec.DoubleValue DREAM_SAND_FALL_DAMAGE_MULTIPLIER; + + // Ichor + private static final ForgeConfigSpec.BooleanValue ICHOR_WITHER_ENABLED; + + // Hushweed + private static final ForgeConfigSpec.DoubleValue HUSHWEED_SPORE_LIFETIME_SECONDS; + + // Infinite Dimensions + private static final ForgeConfigSpec.BooleanValue DISABLE_INFINITY_BOOK_PORTAL_CREATION; + private static final ForgeConfigSpec.BooleanValue RAINBOW_ANTS_LEAD_TO_INFINITY_DIMENSIONS; + + // Permanent portals + private static final ForgeConfigSpec.BooleanValue PERMANENT_PORTALS_ENABLED; + private static final ForgeConfigSpec.BooleanValue PERMANENT_PORTALS_FLINT_AND_STEEL_ENABLED; + private static final ForgeConfigSpec.BooleanValue ELYTHIA_PORTAL_ENABLED; + private static final ForgeConfigSpec.BooleanValue THORAXIS_PORTAL_ENABLED; + private static final ForgeConfigSpec.BooleanValue CAVARYN_PORTAL_ENABLED; + + // Diamond Minecart + private static final ForgeConfigSpec.BooleanValue DIAMOND_MINECART_ENABLED; + private static final ForgeConfigSpec.BooleanValue DIAMOND_MINECART_PLACES_RAILS; + private static final ForgeConfigSpec.DoubleValue DIAMOND_MINECART_CRUISE_SPEED; + private static final ForgeConfigSpec.DoubleValue DIAMOND_MINECART_MAX_SPEED; + private static final ForgeConfigSpec.DoubleValue DIAMOND_MINECART_ACCELERATION; + private static final ForgeConfigSpec.DoubleValue DIAMOND_MINECART_DECELERATION; + private static final ForgeConfigSpec.DoubleValue DIAMOND_MINECART_COAST_DECELERATION; + private static final ForgeConfigSpec.BooleanValue DIAMOND_MINECART_MOB_DAMAGE_ENABLED; + private static final ForgeConfigSpec.DoubleValue DIAMOND_MINECART_MAX_MOB_DAMAGE; + + // World / misc toggles + private static final ForgeConfigSpec.BooleanValue DUPLICATOR_TREE_ENABLED; + private static final ForgeConfigSpec.BooleanValue GLOW_VINES_UNDER_LEAVES; + private static final ForgeConfigSpec.BooleanValue GLOWING_TORCHFLOWERS; + private static final ForgeConfigSpec.BooleanValue SWING_THROUGH_GRASS_ENABLED; + private static final ForgeConfigSpec.BooleanValue FABRIC_KEYBINDING_CONFLICT_FIX_ENABLED; + private static final ForgeConfigSpec.BooleanValue EXPERIMENTAL_SETTINGS_POPUP_DISABLED; + private static final ForgeConfigSpec.BooleanValue ENTITY_SPECIFIC_FIRE_OVERLAY_ENABLED; + + static { + ForgeConfigSpec.Builder b = new ForgeConfigSpec.Builder(); + + + // Elythia + + b.push("elythia"); + ELYTHIA_FIREFLY_PARTICLES_ENABLED = b + .comment("Whether firefly ambient particles appear at night in the Elythia dimension.") + .define("fireflyParticlesEnabled", true); + b.pop(); + + + // Dream Sand + + b.push("dreamSand"); + DREAM_SAND_ENABLED = b.comment("If true, jumping from dream sand applies temporary low gravity until solid ground is touched.").define("enabled", true); + DREAM_SAND_JUMP_VELOCITY_MULTIPLIER = b.comment("Multiplier applied to upward jump velocity when leaving dream sand.") .defineInRange("jumpVelocityMultiplier", 1.3D, 0.0D, 16.0D); + DREAM_SAND_GRAVITY_MULTIPLIER = b.comment("Multiplier applied to downward velocity while low gravity is active.") .defineInRange("gravityMultiplier", 0.45D, 0.0D, 1.0D); + DREAM_SAND_EFFECT_DURATION_SECONDS = b.comment("Seconds the low-gravity effect remains active after leaving dream sand.") .defineInRange("effectDurationSeconds", 7.0D, 0.0D, 60.0D); + DREAM_SAND_FALL_DAMAGE_MULTIPLIER = b.comment("Multiplier applied to fall damage after dream sand low gravity.").defineInRange("fallDamageMultiplier", 0.4D, 0.0D, 16.0D); + b.pop(); + + + // Ichor + + b.push("ichor"); + ICHOR_WITHER_ENABLED = b + .comment("If true, players submerged in ichor receive a Wither effect.") + .define("witherEnabled", true); + b.pop(); + + + // Hushweed + + b.push("hushweed"); + HUSHWEED_SPORE_LIFETIME_SECONDS = b + .comment("How long (in seconds) a Hushweed spore projectile stays alive before disappearing.") + .defineInRange("sporeLifetimeSeconds", 5.0D, 0.1D, 120.0D); + b.pop(); + + + // Infinity Dimensions + + b.push("infinityDimensions"); + DISABLE_INFINITY_BOOK_PORTAL_CREATION = b + .comment("If true, book and quills cannot be thrown into nether portals to create random dimensions.") + .define("disableInfinityBookPortalCreation", true); + RAINBOW_ANTS_LEAD_TO_INFINITY_DIMENSIONS = b + .comment( + "Whether rainbow ants open randomly generated Infinity dimensions.", + "Only works if the Infinite Dimensions mod is installed." + ) + .define("rainbowAntsLeadToInfinityDimensions", net.minecraftforge.fml.ModList.get().isLoaded("infinity")); + b.pop(); + + + // Permanent Portals + + b.push("permanentPortals"); + PERMANENT_PORTALS_ENABLED = b.comment("Master toggle for sacrifice-activated permanent portals.").define("permanentPortalsEnabled", true); + PERMANENT_PORTALS_FLINT_AND_STEEL_ENABLED = b.comment("Whether flint and steel can ignite permanent portal frames.").define("permanentPortalsFlintAndSteelEnabled", false); + ELYTHIA_PORTAL_ENABLED = b.comment("Whether mossy ouranwood wood portals to Elythia can activate and function.").define("elythiaPortalEnabled", true); + THORAXIS_PORTAL_ENABLED = b.comment("Whether Nyxite portals to Thoraxis can activate and function.").define("thoraxisPortalEnabled", true); + CAVARYN_PORTAL_ENABLED = b.comment("Whether Myrmite portals to Cavaryn can activate and function.").define("cavarynPortalEnabled", true); + b.pop(); + + + // Diamond Minecart + + b.push("diamondMinecart"); + DIAMOND_MINECART_ENABLED = b.comment("Master toggle. If false, acts like a regular minecart.") .define("enabled", true); + DIAMOND_MINECART_PLACES_RAILS = b.comment("Whether the cart automatically places rails from the rider's inventory.") .define("placesRails", true); + DIAMOND_MINECART_CRUISE_SPEED = b.comment("Cruise speed in blocks/tick while ridden (even without holding W).") .defineInRange("cruiseSpeed", 0.6D, 0.05D, 2.0D); + DIAMOND_MINECART_MAX_SPEED = b.comment("Maximum boosted speed in blocks/tick when W is held. Vanilla cap is 0.4.") .defineInRange("maxSpeed", 1.0D, 0.05D, 2.0D); + DIAMOND_MINECART_ACCELERATION = b.comment("Speed gained per tick while accelerating.") .defineInRange("acceleration", 0.03D, 0.001D, 0.5D); + DIAMOND_MINECART_DECELERATION = b.comment("Speed lost per tick while S is held (active braking).") .defineInRange("deceleration", 0.04D, 0.001D, 0.5D); + DIAMOND_MINECART_COAST_DECELERATION = b.comment("Speed lost per tick when neither W nor S is held (coasting friction).") .defineInRange("coastDeceleration", 0.01D, 0.001D, 0.5D); + DIAMOND_MINECART_MOB_DAMAGE_ENABLED = b.comment("Whether the cart deals damage to mobs it collides with at speed.") .define("mobDamageEnabled", true); + DIAMOND_MINECART_MAX_MOB_DAMAGE = b.comment("Maximum damage dealt at full speed. Scales linearly with current speed.") .defineInRange("maxMobDamage", 8.0D, 0.0D, 200.0D); + b.pop(); + + + // World / visual toggles + + b.push("world"); + DUPLICATOR_TREE_ENABLED = b.comment("If false, duplicator trees do not generate and duplicator saplings produce nothing.").define("duplicatorTreeEnabled", true); + GLOW_VINES_UNDER_LEAVES = b.comment("Whether glow vines can be placed and survive when attached under leaf blocks.") .define("glowVinesUnderLeaves", true); + GLOWING_TORCHFLOWERS = b.comment("If true, torchflowers use the glowing behavior.").define("glowingTorchflowers", true); + SWING_THROUGH_GRASS_ENABLED = b.comment("If true, empty collision plants like grass do not block melee target picking.") .define("swingThroughGrassEnabled", true); + FABRIC_KEYBINDING_CONFLICT_FIX_ENABLED = b.define("fabricKeybindingConflictFixEnabled", true); + EXPERIMENTAL_SETTINGS_POPUP_DISABLED = b.define("experimentalSettingsPopupDisabled", true); + ENTITY_SPECIFIC_FIRE_OVERLAY_ENABLED = b.comment("If true, burning entities use soul fire / dream fire overlays where appropriate.") .define("entitySpecificFireOverlayEnabled", true); + b.pop(); + + SPEC = b.build(); + } + + private AntarchyMiscConfig() {} + + static boolean elythiaFireflyParticlesEnabled() { return ELYTHIA_FIREFLY_PARTICLES_ENABLED.get(); } + + static boolean dreamSandEnabled() { return DREAM_SAND_ENABLED.get(); } + static double dreamSandJumpVelocityMultiplier() { return DREAM_SAND_JUMP_VELOCITY_MULTIPLIER.get(); } + static double dreamSandGravityMultiplier() { return DREAM_SAND_GRAVITY_MULTIPLIER.get(); } + static double dreamSandEffectDurationSeconds() { return DREAM_SAND_EFFECT_DURATION_SECONDS.get(); } + static double dreamSandFallDamageMultiplier() { return DREAM_SAND_FALL_DAMAGE_MULTIPLIER.get(); } + + static boolean ichorWitherEnabled() { return ICHOR_WITHER_ENABLED.get(); } + + static boolean duplicatorTreeEnabled() { return DUPLICATOR_TREE_ENABLED.get(); } + static boolean glowVinesUnderLeaves() { return GLOW_VINES_UNDER_LEAVES.get(); } + static boolean glowingTorchflowers() { return GLOWING_TORCHFLOWERS.get(); } + static boolean swingThroughGrassEnabled() { return SWING_THROUGH_GRASS_ENABLED.get(); } + static boolean fabricKeybindingConflictFixEnabled() { return FABRIC_KEYBINDING_CONFLICT_FIX_ENABLED.get(); } + static boolean experimentalSettingsPopupDisabled() { return EXPERIMENTAL_SETTINGS_POPUP_DISABLED.get(); } + static boolean entitySpecificFireOverlayEnabled() { return ENTITY_SPECIFIC_FIRE_OVERLAY_ENABLED.get(); } + + static double hushweedSporeLifetimeSeconds() { return HUSHWEED_SPORE_LIFETIME_SECONDS.get(); } + + static boolean disableInfinityBookPortalCreation() { return DISABLE_INFINITY_BOOK_PORTAL_CREATION.get(); } + static boolean rainbowAntsLeadToInfinityDimensions() { return RAINBOW_ANTS_LEAD_TO_INFINITY_DIMENSIONS.get(); } + public static boolean permanentPortalsEnabled() { return PERMANENT_PORTALS_ENABLED.get(); } + public static boolean permanentPortalsFlintAndSteelEnabled() { return PERMANENT_PORTALS_FLINT_AND_STEEL_ENABLED.get(); } + public static boolean elythiaPortalEnabled() { return ELYTHIA_PORTAL_ENABLED.get(); } + public static boolean thoraxisPortalEnabled() { return THORAXIS_PORTAL_ENABLED.get(); } + public static boolean cavarynPortalEnabled() { return CAVARYN_PORTAL_ENABLED.get(); } + + static boolean diamondMinecartEnabled() { return DIAMOND_MINECART_ENABLED.get(); } + static boolean diamondMinecartPlacesRails() { return DIAMOND_MINECART_PLACES_RAILS.get(); } + static double diamondMinecartCruiseSpeed() { return DIAMOND_MINECART_CRUISE_SPEED.get(); } + static double diamondMinecartMaxSpeed() { return DIAMOND_MINECART_MAX_SPEED.get(); } + static double diamondMinecartAcceleration() { return DIAMOND_MINECART_ACCELERATION.get(); } + static double diamondMinecartDeceleration() { return DIAMOND_MINECART_DECELERATION.get(); } + static double diamondMinecartCoastDeceleration() { return DIAMOND_MINECART_COAST_DECELERATION.get(); } + static boolean diamondMinecartMobDamageEnabled() { return DIAMOND_MINECART_MOB_DAMAGE_ENABLED.get(); } + static double diamondMinecartMaxMobDamage() { return DIAMOND_MINECART_MAX_MOB_DAMAGE.get(); } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyMobsConfig.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyMobsConfig.java new file mode 100644 index 00000000..90073afa --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyMobsConfig.java @@ -0,0 +1,789 @@ +package com.craisinlord.antarchy.forge; + +import net.minecraftforge.common.ForgeConfigSpec; + +public final class AntarchyMobsConfig { + public static final ForgeConfigSpec SPEC; + + + // Ants + + private static final ForgeConfigSpec.BooleanValue ANTS_STEAL_FROM_CHESTS; + + private static final ForgeConfigSpec.BooleanValue BROWN_ANT_REQUIRES_REAGENT; + private static final ForgeConfigSpec.DoubleValue BROWN_ANT_HEALTH; + private static final ForgeConfigSpec.DoubleValue BROWN_ANT_MOVEMENT_SPEED; + private static final ForgeConfigSpec.DoubleValue BROWN_ANT_ATTACK_DAMAGE; + private static final ForgeConfigSpec.ConfigValue BROWN_ANT_DESTINATION_DIMENSION; + + private static final ForgeConfigSpec.BooleanValue RED_ANT_REQUIRES_REAGENT; + private static final ForgeConfigSpec.DoubleValue RED_ANT_HEALTH; + private static final ForgeConfigSpec.DoubleValue RED_ANT_MOVEMENT_SPEED; + private static final ForgeConfigSpec.DoubleValue RED_ANT_ATTACK_DAMAGE; + private static final ForgeConfigSpec.ConfigValue RED_ANT_DESTINATION_DIMENSION; + + private static final ForgeConfigSpec.BooleanValue RAINBOW_ANT_REQUIRES_REAGENT; + private static final ForgeConfigSpec.DoubleValue RAINBOW_ANT_HEALTH; + private static final ForgeConfigSpec.DoubleValue RAINBOW_ANT_MOVEMENT_SPEED; + private static final ForgeConfigSpec.DoubleValue RAINBOW_ANT_ATTACK_DAMAGE; + private static final ForgeConfigSpec.ConfigValue RAINBOW_ANT_NON_INFINITY_FALLBACK_DIMENSION; + + private static final ForgeConfigSpec.BooleanValue TERMITE_REQUIRES_REAGENT; + private static final ForgeConfigSpec.DoubleValue TERMITE_HEALTH; + private static final ForgeConfigSpec.DoubleValue TERMITE_MOVEMENT_SPEED; + private static final ForgeConfigSpec.DoubleValue TERMITE_ATTACK_DAMAGE; + private static final ForgeConfigSpec.ConfigValue TERMITE_DESTINATION_DIMENSION; + + + + // Easter Bunny + + private static final ForgeConfigSpec.BooleanValue EASTER_BUNNY_ENABLED; + private static final ForgeConfigSpec.IntValue EASTER_BUNNY_NATURAL_SPAWN_CHANCE_PERCENT; + + + // Wasp + + private static final ForgeConfigSpec.DoubleValue WASP_HEALTH; + private static final ForgeConfigSpec.DoubleValue WASP_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue WASP_MOVEMENT_SPEED; + + + // Bomber + + private static final ForgeConfigSpec.DoubleValue BOMBER_HEALTH; + private static final ForgeConfigSpec.DoubleValue BOMBER_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue BOMBER_EXPLOSION_DAMAGE; + private static final ForgeConfigSpec.DoubleValue BOMBER_EXPLOSION_RADIUS; + + + // Jumpy Bug + + private static final ForgeConfigSpec.DoubleValue JUMPY_BUG_HEALTH; + private static final ForgeConfigSpec.DoubleValue JUMPY_BUG_POUNCE_DAMAGE; + private static final ForgeConfigSpec.DoubleValue JUMPY_BUG_LATCH_DAMAGE; + private static final ForgeConfigSpec.DoubleValue JUMPY_BUG_CAMOUFLAGE_ALPHA; + + + // Kraken + + private static final ForgeConfigSpec.DoubleValue KRAKEN_HEALTH; + private static final ForgeConfigSpec.DoubleValue KRAKEN_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue KRAKEN_PROJECTILE_DAMAGE_TAKEN_MULTIPLIER; + private static final ForgeConfigSpec.BooleanValue KRAKEN_SQUID_SPAWN_ENABLED; + private static final ForgeConfigSpec.BooleanValue KRAKEN_MASS_SPAWN_ENABLED; + private static final ForgeConfigSpec.BooleanValue KRAKEN_REQUIRE_BAD_OMEN_TO_SUMMON; + + + // Brutalfly + + private static final ForgeConfigSpec.DoubleValue BRUTALFLY_HEALTH; + private static final ForgeConfigSpec.DoubleValue BRUTALFLY_SWIPE_DAMAGE; + private static final ForgeConfigSpec.DoubleValue BRUTALFLY_SPIT_DAMAGE; + + + // Mantis + + private static final ForgeConfigSpec.DoubleValue MANTIS_HEALTH; + private static final ForgeConfigSpec.DoubleValue MANTIS_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue MANTIS_MOVEMENT_SPEED; + private static final ForgeConfigSpec.DoubleValue MANTIS_FLYING_SPEED; + private static final ForgeConfigSpec.BooleanValue MANTIS_IGNORE_LIGHT_LEVEL; + + + // Alpha Mantis + + private static final ForgeConfigSpec.DoubleValue ALPHA_MANTIS_HEALTH; + private static final ForgeConfigSpec.DoubleValue ALPHA_MANTIS_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue ALPHA_MANTIS_MOVEMENT_SPEED; + private static final ForgeConfigSpec.DoubleValue ALPHA_MANTIS_FLYING_SPEED; + private static final ForgeConfigSpec.IntValue ALPHA_MANTIS_SUMMON_INTERVAL_TICKS; + private static final ForgeConfigSpec.IntValue ALPHA_MANTIS_MAX_MINIONS; + + + // Rolly Polly + + private static final ForgeConfigSpec.DoubleValue ROLLY_POLLY_HEALTH; + private static final ForgeConfigSpec.DoubleValue ROLLY_POLLY_MOVEMENT_SPEED; + private static final ForgeConfigSpec.DoubleValue ROLLY_POLLY_ROLL_SPEED_MULTIPLIER; + private static final ForgeConfigSpec.IntValue ROLLY_POLLY_TAME_CHANCE; + private static final ForgeConfigSpec.DoubleValue ROLLY_POLLY_BOWLING_DAMAGE; + private static final ForgeConfigSpec.DoubleValue ROLLY_POLLY_TUMBLE_DAMAGE; + private static final ForgeConfigSpec.DoubleValue ROLLY_POLLY_BOWLING_KNOCKBACK; + private static final ForgeConfigSpec.DoubleValue ROLLY_POLLY_ARMOR; + private static final ForgeConfigSpec.DoubleValue ROLLY_POLLY_ROLLED_ARMOR_BONUS; + + + // Triffid + + private static final ForgeConfigSpec.DoubleValue TRIFFID_HEALTH; + private static final ForgeConfigSpec.DoubleValue TRIFFID_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue TRIFFID_GRAB_DAMAGE; + + + // Caterpillar + + private static final ForgeConfigSpec.DoubleValue CATERPILLAR_PUPATION_TIME_SECONDS; + + + // Ant Dance + + private static final ForgeConfigSpec.DoubleValue ANT_DANCE_RADIUS; + + + // Reverie + + private static final ForgeConfigSpec.DoubleValue REVERIE_HEALTH; + private static final ForgeConfigSpec.DoubleValue REVERIE_INTEREST_RADIUS; + private static final ForgeConfigSpec.DoubleValue REVERIE_ABANDON_PLAYER_DISTANCE; + private static final ForgeConfigSpec.IntValue REVERIE_NOTICE_DURATION_TICKS; + private static final ForgeConfigSpec.IntValue REVERIE_INTEREST_DURATION_TICKS; + private static final ForgeConfigSpec.IntValue REVERIE_REBIND_COOLDOWN_TICKS; + private static final ForgeConfigSpec.IntValue REVERIE_DAMAGE_REACTION_DURATION_TICKS; + private static final ForgeConfigSpec.DoubleValue REVERIE_DANGEROUS_FALL_DISTANCE; + private static final ForgeConfigSpec.DoubleValue REVERIE_DANGEROUS_FALL_SPEED; + private static final ForgeConfigSpec.DoubleValue REVERIE_WARNING_THREAT_RADIUS; + private static final ForgeConfigSpec.DoubleValue REVERIE_WARNING_THREAT_VERTICAL_RANGE; + private static final ForgeConfigSpec.IntValue REVERIE_DUPLICATION_COOLDOWN_TICKS; + + + // Nightmare + + private static final ForgeConfigSpec.DoubleValue NIGHTMARE_HEALTH; + private static final ForgeConfigSpec.DoubleValue NIGHTMARE_ATTACK_DAMAGE; + + + // Basilisk + + private static final ForgeConfigSpec.BooleanValue BASILISK_PETRIFYING_GAZE_ENABLED; + private static final ForgeConfigSpec.IntValue BASILISK_SPAWN_MAX_LIGHT_LEVEL; + private static final ForgeConfigSpec.DoubleValue BASILISK_HEALTH; + private static final ForgeConfigSpec.DoubleValue BASILISK_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue BASILISK_MOVEMENT_SPEED; + private static final ForgeConfigSpec.DoubleValue BASILISK_ARMOR; + private static final ForgeConfigSpec.DoubleValue BASILISK_KNOCKBACK_RESISTANCE; + private static final ForgeConfigSpec.DoubleValue BASILISK_FOLLOW_RANGE; + private static final ForgeConfigSpec.IntValue BASILISK_XP_REWARD; + private static final ForgeConfigSpec.IntValue BASILISK_ATTACK_ANIM_TICKS; + private static final ForgeConfigSpec.IntValue BASILISK_ATTACK_DAMAGE_TICK; + private static final ForgeConfigSpec.IntValue BASILISK_HISS_COOLDOWN_TICKS; + private static final ForgeConfigSpec.DoubleValue BASILISK_ATTACK_REACH; + private static final ForgeConfigSpec.DoubleValue BASILISK_GAZE_RANGE; + private static final ForgeConfigSpec.DoubleValue BASILISK_GAZE_DOT_THRESHOLD; + private static final ForgeConfigSpec.DoubleValue BASILISK_GAZE_FACING_THRESHOLD; + private static final ForgeConfigSpec.IntValue BASILISK_HISS_CHARGE_TICKS; + private static final ForgeConfigSpec.IntValue BASILISK_PLAYER_PARALYZE_TICKS; + private static final ForgeConfigSpec.IntValue BASILISK_PREY_PETRIFY_COOLDOWN_TICKS; + private static final ForgeConfigSpec.DoubleValue BASILISK_PREY_PETRIFY_RANGE; + private static final ForgeConfigSpec.IntValue BASILISK_PREY_PETRIFY_TICKS; + + + // Toreterror + + private static final ForgeConfigSpec.DoubleValue TORETERROR_HEALTH; + private static final ForgeConfigSpec.DoubleValue TORETERROR_JUMP_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue TORETERROR_JUMP_ATTACK_KNOCKBACK; + private static final ForgeConfigSpec.DoubleValue TORETERROR_SPIN_DAMAGE; + private static final ForgeConfigSpec.DoubleValue TORETERROR_SPIN_KNOCKBACK; + private static final ForgeConfigSpec.DoubleValue TORETERROR_PROJECTILE_DAMAGE_MULTIPLIER; + private static final ForgeConfigSpec.DoubleValue TORETERROR_RANGED_WATER_BOMB_CHANCE; + private static final ForgeConfigSpec.DoubleValue WATER_CANNON_COOLDOWN_SECONDS; + private static final ForgeConfigSpec.DoubleValue WATER_BOMB_DAMAGE; + private static final ForgeConfigSpec.IntValue WATER_BOMB_LIFETIME_TICKS; + private static final ForgeConfigSpec.DoubleValue WATER_BOMB_GRAVITY; + private static final ForgeConfigSpec.DoubleValue WATER_BOMB_KNOCKBACK; + + + // Creeping Horror + + private static final ForgeConfigSpec.DoubleValue CREEPING_HORROR_HEALTH; + private static final ForgeConfigSpec.DoubleValue CREEPING_HORROR_ATTACK_DAMAGE; + + + // Lurking Terror + + private static final ForgeConfigSpec.DoubleValue LURKING_TERROR_HEALTH; + private static final ForgeConfigSpec.DoubleValue LURKING_TERROR_ATTACK_DAMAGE; + + // Jerry + + private static final ForgeConfigSpec.DoubleValue JERRY_INFANT_HEALTH; + private static final ForgeConfigSpec.DoubleValue JERRY_INFANT_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue JERRY_MATURE_HEALTH; + private static final ForgeConfigSpec.DoubleValue JERRY_MATURE_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue JERRY_ALPHA_HEALTH; + private static final ForgeConfigSpec.DoubleValue JERRY_ALPHA_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue JERRY_GAMMA_HEALTH; + private static final ForgeConfigSpec.DoubleValue JERRY_GAMMA_ATTACK_DAMAGE; + + + // Cheep + + private static final ForgeConfigSpec.DoubleValue CHEEP_HEALTH; + private static final ForgeConfigSpec.DoubleValue CHEEP_ATTACK_DAMAGE; + + + // Dorrie + + private static final ForgeConfigSpec.DoubleValue DORRIE_HEALTH; + + + // Ouranwood Deer + + private static final ForgeConfigSpec.DoubleValue OURANWOOD_DEER_HEALTH; + + + // Glimmer + + private static final ForgeConfigSpec.DoubleValue GLIMMER_HEALTH; + + + // Hercules Beetle + + private static final ForgeConfigSpec.DoubleValue HERCULES_BEETLE_HEALTH; + private static final ForgeConfigSpec.DoubleValue HERCULES_BEETLE_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue HERCULES_BEETLE_CHARGE_DAMAGE; + + + // Lucid + + private static final ForgeConfigSpec.DoubleValue LUCID_ATTACK_RANGE; + private static final ForgeConfigSpec.DoubleValue LUCID_PEARL_INVERTED_DURATION_SECONDS; + + + // Dread effect + + private static final ForgeConfigSpec.BooleanValue DREAD_HALLUCINATION_SOUNDS_ENABLED; + private static final ForgeConfigSpec.DoubleValue DREAD_HALLUCINATION_SOUND_MIN_INTERVAL; + private static final ForgeConfigSpec.DoubleValue DREAD_HALLUCINATION_SOUND_MAX_INTERVAL; + private static final ForgeConfigSpec.BooleanValue DREAD_HALLUCINATION_MOBS_ENABLED; + private static final ForgeConfigSpec.DoubleValue DREAD_HALLUCINATION_MOB_MIN_INTERVAL; + private static final ForgeConfigSpec.DoubleValue DREAD_HALLUCINATION_MOB_MAX_INTERVAL; + + static { + ForgeConfigSpec.Builder b = new ForgeConfigSpec.Builder(); + + + // Ants (shared) + + ANTS_STEAL_FROM_CHESTS = b + .comment("Whether ants will steal edible items from nearby chest inventories.") + .define("antsStealFromChests", true); + + b.push("brownAnt"); + BROWN_ANT_REQUIRES_REAGENT = b + .comment( + "If true, brown ants must be activated once with a reagent before they teleport.", + "Reagent tag: data/antarchy/tags/item/brown_ant_activation_items.json", + "Breeding foods tag: data/antarchy/tags/item/brown_ant_breeding_foods.json" + ) + .define("requiresReagent", false); + BROWN_ANT_HEALTH = b.comment("Base max health.") .defineInRange("health", 5.0D, 0.1D, 1024.0D); + BROWN_ANT_MOVEMENT_SPEED = b.comment("Base movement speed.") .defineInRange("movementSpeed", 0.28D, 0.0D, 10.0D); + BROWN_ANT_ATTACK_DAMAGE = b.comment("Base attack damage.") .defineInRange("attackDamage", 1.0D, 0.0D, 1024.0D); + BROWN_ANT_DESTINATION_DIMENSION = b + .comment("Dimension id brown ants teleport players to.") + .define("destinationDimension", "antarchy:elythia", AntarchyMobsConfig::isValidDimensionId); + b.pop(); + + b.push("redAnt"); + RED_ANT_REQUIRES_REAGENT = b + .comment( + "If true, red ants must be activated once with a reagent before they teleport.", + "Reagent tag: data/antarchy/tags/item/red_ant_activation_items.json", + "Breeding foods tag: data/antarchy/tags/item/red_ant_breeding_foods.json" + ) + .define("requiresReagent", false); + RED_ANT_HEALTH = b.comment("Base max health.") .defineInRange("health", 5.0D, 0.1D, 1024.0D); + RED_ANT_MOVEMENT_SPEED = b.comment("Base movement speed.") .defineInRange("movementSpeed", 0.30D, 0.0D, 10.0D); + RED_ANT_ATTACK_DAMAGE = b.comment("Base attack damage.") .defineInRange("attackDamage", 3.0D, 0.0D, 1024.0D); + RED_ANT_DESTINATION_DIMENSION = b + .comment("Dimension id red ants teleport players to.") + .define("destinationDimension", "antarchy:thoraxis", AntarchyMobsConfig::isValidDimensionId); + b.pop(); + + b.push("rainbowAnt"); + RAINBOW_ANT_REQUIRES_REAGENT = b + .comment( + "If true, rainbow ants must be activated with a reagent before opening an Infinity destination.", + "Reagent tag: data/antarchy/tags/item/rainbow_ant_activation_items.json", + "Breeding foods tag: data/antarchy/tags/item/rainbow_ant_breeding_foods.json" + ) + .define("requiresReagent", true); + RAINBOW_ANT_HEALTH = b.comment("Base max health.") .defineInRange("health", 5.0D, 0.1D, 1024.0D); + RAINBOW_ANT_MOVEMENT_SPEED = b.comment("Base movement speed.") .defineInRange("movementSpeed", 0.28D, 0.0D, 10.0D); + RAINBOW_ANT_ATTACK_DAMAGE = b.comment("Base attack damage.") .defineInRange("attackDamage", 1.0D, 0.0D, 1024.0D); + RAINBOW_ANT_NON_INFINITY_FALLBACK_DIMENSION = b + .comment("Dimension used by rainbow ants when Infinity behavior is disabled.") + .define("nonInfinityFallbackDimension", "antarchy:elythia", AntarchyMobsConfig::isValidDimensionId); + b.pop(); + + b.push("termite"); + TERMITE_REQUIRES_REAGENT = b + .comment( + "If true, termites must be activated once with a reagent before they teleport.", + "Reagent tag: data/antarchy/tags/item/termite_activation_items.json", + "Breeding foods tag: data/antarchy/tags/item/termite_breeding_foods.json" + ) + .define("requiresReagent", false); + TERMITE_HEALTH = b.comment("Base max health.") .defineInRange("health", 5.0D, 0.1D, 1024.0D); + TERMITE_MOVEMENT_SPEED = b.comment("Base movement speed.") .defineInRange("movementSpeed", 0.28D, 0.0D, 10.0D); + TERMITE_ATTACK_DAMAGE = b.comment("Base attack damage.") .defineInRange("attackDamage", 1.0D, 0.0D, 1024.0D); + TERMITE_DESTINATION_DIMENSION = b + .comment("Dimension id termites teleport players to.") + .define("destinationDimension", "antarchy:cavaryn", AntarchyMobsConfig::isValidDimensionId); + b.pop(); + + + // Easter Bunny + + b.push("easterBunny"); + EASTER_BUNNY_ENABLED = b + .comment( + "If false, Easter Bunnies stop laying spawn eggs.", + "Blacklist tag: data/antarchy/tags/item/easter_bunny_spawn_egg_blacklist.json" + ) + .define("enabled", true); + EASTER_BUNNY_NATURAL_SPAWN_CHANCE_PERCENT = b + .comment( + "Percent chance a naturally spawned rabbit is replaced by an Easter Bunny.", + "Only applies to natural and chunk-generation spawns, not breeding." + ) + .defineInRange("naturalSpawnChancePercent", 1, 0, 100); + b.pop(); + + + // Wasp + + b.push("wasp"); + WASP_HEALTH = b.comment("Base max health.") .defineInRange("health", 16.0D, 1.0D, 32768.0D); + WASP_ATTACK_DAMAGE = b.comment("Base attack damage.") .defineInRange("attackDamage", 4.0D, 0.0D, 1024.0D); + WASP_MOVEMENT_SPEED = b.comment("Base wasp speed used for both flying and movement. Vanilla bee default is 0.3, so 0.39 is 30% faster.").defineInRange("movementSpeed", 0.39D, 0.0D, 10.0D); + b.pop(); + + + // Bomber + + b.push("bomber"); + BOMBER_HEALTH = b.comment("Base max health.") .defineInRange("health", 10.0D, 1.0D, 32768.0D); + BOMBER_ATTACK_DAMAGE = b.comment("Direct damage dealt on contact before detonation.") .defineInRange("attackDamage", 4.0D, 0.0D, 1024.0D); + BOMBER_EXPLOSION_DAMAGE = b.comment("Extra damage dealt at the center of the explosion.") .defineInRange("explosionDamage", 8.0D, 0.0D, 1024.0D); + BOMBER_EXPLOSION_RADIUS = b.comment("Explosion radius when a bomber detonates. TNT uses 4.0.").defineInRange("explosionRadius", 4.0D, 0.0D, 128.0D); + b.pop(); + + + // Jumpy Bug + + b.push("jumpyBug"); + JUMPY_BUG_HEALTH = b.comment("Base max health.").defineInRange("health", 100.0D, 1.0D, 32768.0D); + JUMPY_BUG_POUNCE_DAMAGE = b.comment("Damage dealt on a successful pounce latch.").defineInRange("pounceDamage", 2.0D, 0.0D, 1024.0D); + JUMPY_BUG_LATCH_DAMAGE = b.comment("Damage dealt while latched onto a target.").defineInRange("latchDamage", 2.0D, 0.0D, 1024.0D); + JUMPY_BUG_CAMOUFLAGE_ALPHA = b.comment("Renderer alpha while camouflaged.").defineInRange("camouflageAlpha", 0.18D, 0.01D, 1.0D); + b.pop(); + + + // Kraken + + b.push("kraken"); + KRAKEN_HEALTH = b.comment("Base max health.") .defineInRange("health", 1500.0D, 1.0D, 32768.0D); + KRAKEN_ATTACK_DAMAGE = b.comment("Base attack damage.") .defineInRange("attackDamage", 45.0D, 0.0D, 1024.0D); + KRAKEN_PROJECTILE_DAMAGE_TAKEN_MULTIPLIER = b.comment("Multiplier applied to projectile damage taken by the Kraken.").defineInRange("projectileDamageTakenMultiplier", 0.5D, 0.0D, 16.0D); + KRAKEN_SQUID_SPAWN_ENABLED = b.comment("If true, a player killing a Missile Squid has a 1/100 chance to spawn a single Kraken nearby.") .define("squidSpawnEnabled", true); + KRAKEN_MASS_SPAWN_ENABLED = b.comment("If true, a player killing a Missile Squid has a 1/500 chance to spawn 10 Krakens. Independent from the single spawn.").define("massSpawnEnabled", true); + KRAKEN_REQUIRE_BAD_OMEN_TO_SUMMON = b.comment("If true, the killer must have Bad Omen to summon a single Kraken; chance scales with Bad Omen level. Mass spawn is unaffected by level but still requires Bad Omen when this is on.").define("requireBadOmenToSummon", true); + b.pop(); + + + // Brutalfly + + b.push("brutalfly"); + BRUTALFLY_HEALTH = b.comment("Base max health.") .defineInRange("health", 200.0D, 1.0D, 32768.0D); + BRUTALFLY_SWIPE_DAMAGE = b.comment("Damage dealt by a claw swipe.") .defineInRange("swipeDamage", 15.0D, 0.0D, 1024.0D); + BRUTALFLY_SPIT_DAMAGE = b.comment("Direct hit damage from a spit orb before lingering effect.").defineInRange("spitDamage", 5.0D, 0.0D, 1024.0D); + b.pop(); + + + // Mantis + + b.push("mantis"); + MANTIS_HEALTH = b.comment("Base max health.") .defineInRange("health", 50.0D, 1.0D, 32768.0D); + MANTIS_ATTACK_DAMAGE = b.comment("Base attack damage.") .defineInRange("attackDamage", 9.0D, 0.0D, 1024.0D); + MANTIS_MOVEMENT_SPEED = b.comment("Base movement speed.") .defineInRange("movementSpeed", 0.42D, 0.0D, 10.0D); + MANTIS_FLYING_SPEED = b.comment("Base flying speed.") .defineInRange("flyingSpeed", 0.77D, 0.0D, 10.0D); + MANTIS_IGNORE_LIGHT_LEVEL = b.comment("If false, mantises only spawn naturally in darkness (standard monster rules). If true, light level is ignored.").define("ignoreLightLevel", false); + b.pop(); + + + // Alpha Mantis + + b.push("alphaMantis"); + ALPHA_MANTIS_HEALTH = b.comment("Base max health.") .defineInRange("health", 250.0D, 1.0D, 32768.0D); + ALPHA_MANTIS_ATTACK_DAMAGE = b.comment("Base attack damage.") .defineInRange("attackDamage", 18.0D, 0.0D, 1024.0D); + ALPHA_MANTIS_MOVEMENT_SPEED = b.comment("Base movement speed.") .defineInRange("movementSpeed", 0.546D, 0.0D, 10.0D); + ALPHA_MANTIS_FLYING_SPEED = b.comment("Base flying speed.") .defineInRange("flyingSpeed", 0.77D, 0.0D, 10.0D); + ALPHA_MANTIS_SUMMON_INTERVAL_TICKS = b.comment("Ticks between mantis minion summons while in combat.") .defineInRange("summonIntervalTicks", 300, 20, 72000); + ALPHA_MANTIS_MAX_MINIONS = b.comment("Maximum summoned mantises alive near the alpha at once.") .defineInRange("maxMinions", 4, 0, 32); + b.pop(); + + + // Rolly Polly + + b.push("rollyPolly"); + ROLLY_POLLY_HEALTH = b.comment("Base max health.") .defineInRange("health", 25.0D, 1.0D, 32768.0D); + ROLLY_POLLY_MOVEMENT_SPEED = b.comment("Base movement speed.") .defineInRange("movementSpeed", 0.3D, 0.0D, 10.0D); + ROLLY_POLLY_ROLL_SPEED_MULTIPLIER = b.comment("Speed multiplier while rolled up.") .defineInRange("rollSpeedMultiplier", 2.2D, 0.1D, 20.0D); + ROLLY_POLLY_TAME_CHANCE = b.comment("Taming succeeds with a 1-in-N chance per food item.") .defineInRange("tameChance", 3, 1, 100); + ROLLY_POLLY_BOWLING_DAMAGE = b.comment("Damage dealt by a tamed rolly polly's rolling bowling attack.") .defineInRange("bowlingDamage", 3.0D, 0.0D, 1024.0D); + ROLLY_POLLY_TUMBLE_DAMAGE = b.comment("Damage dealt by a tumbling rolly polly impact.").defineInRange("tumbleDamage", 3.0D, 0.0D, 1024.0D); + ROLLY_POLLY_BOWLING_KNOCKBACK = b.comment("Knockback strength of a tamed rolly polly's rolling bowling attack.") .defineInRange("bowlingKnockback", 0.8D, 0.0D, 20.0D); + ROLLY_POLLY_ARMOR = b.comment("Base armor value.") .defineInRange("armor", 2.0D, 0.0D, 100.0D); + ROLLY_POLLY_ROLLED_ARMOR_BONUS = b.comment("Additional armor gained while rolled up.") .defineInRange("rolledArmorBonus", 16.0D, 0.0D, 100.0D); + b.pop(); + + + // Triffid + + b.push("triffid"); + TRIFFID_HEALTH = b.comment("Base max health.") .defineInRange("health", 80.0D, 1.0D, 32768.0D); + TRIFFID_ATTACK_DAMAGE = b.comment("Damage dealt by the sweep attack.") .defineInRange("attackDamage", 10.0D, 0.0D, 1024.0D); + TRIFFID_GRAB_DAMAGE = b.comment("Damage dealt by the grab attack.") .defineInRange("grabDamage", 15.0D, 0.0D, 1024.0D); + b.pop(); + + + // Caterpillar + + b.push("caterpillar"); + CATERPILLAR_PUPATION_TIME_SECONDS = b + .comment("Time in seconds before a caterpillar emerges from its chrysalis.") + .defineInRange("pupationTimeSeconds", 600.0D, 1.0D, 3600.0D); + b.pop(); + + + // Ant Dance + + b.push("antDance"); + ANT_DANCE_RADIUS = b + .comment("Radius in blocks where ants will dance around a playing jukebox.") + .defineInRange("radius", 5.0D, 1.0D, 32.0D); + b.pop(); + + + // Reverie + + b.push("reverie"); + REVERIE_HEALTH = b.comment("Base max health.") .defineInRange("health", 20.0D, 1.0D, 1024.0D); + REVERIE_INTEREST_RADIUS = b.comment("How far the Reverie notices and starts following a player.") .defineInRange("interestRadius", 16.0D, 1.0D, 64.0D); + REVERIE_ABANDON_PLAYER_DISTANCE = b.comment("Distance where the Reverie gives up and returns to ambient wandering.") .defineInRange("abandonPlayerDistance", 24.0D, 1.0D, 96.0D); + REVERIE_NOTICE_DURATION_TICKS = b.comment("Ticks the Reverie watches a player before becoming bound.") .defineInRange("noticeDurationTicks", 20, 1, 200); + REVERIE_INTEREST_DURATION_TICKS = b.comment("Ticks the Reverie stays interested after a color/state change.") .defineInRange("interestDurationTicks", 360, 20, 7200); + REVERIE_REBIND_COOLDOWN_TICKS = b.comment("Ticks the Reverie waits after unbinding before it can bind again.") .defineInRange("rebindCooldownTicks", 100, 0, 24000); + REVERIE_DAMAGE_REACTION_DURATION_TICKS = b.comment("Ticks the Reverie remains in its damage reaction state.").defineInRange("damageReactionDurationTicks", 60, 0, 24000); + REVERIE_DANGEROUS_FALL_DISTANCE = b.comment("Minimum fall distance before the Reverie considers its player in danger. Vanilla fall damage starts at 3.").defineInRange("dangerousFallDistance", 3.0D, 0.0D, 64.0D); + REVERIE_DANGEROUS_FALL_SPEED = b.comment("Minimum vertical speed before a dangerous fall triggers purple protection.") .defineInRange("dangerousFallSpeed", 0.18D, 0.0D, 4.0D); + REVERIE_WARNING_THREAT_RADIUS = b.comment("Horizontal scan radius for hostiles that trigger red warning mode.") .defineInRange("warningThreatRadius", 10.0D, 1.0D, 64.0D); + REVERIE_WARNING_THREAT_VERTICAL_RANGE = b.comment("Vertical scan range for hostiles that trigger red warning mode.") .defineInRange("warningThreatVerticalRange", 5.0D, 1.0D, 32.0D); + REVERIE_DUPLICATION_COOLDOWN_TICKS = b.comment("Cooldown in ticks before Blood Crystal can duplicate the Reverie again.") .defineInRange("duplicationCooldownTicks", 6000, 20, 24000); + b.pop(); + + // Nightmare + + b.push("nightmare"); + NIGHTMARE_HEALTH = b.comment("Base max health.").defineInRange("health", 180.0D, 1.0D, 32768.0D); + NIGHTMARE_ATTACK_DAMAGE = b.comment("Base attack damage.").defineInRange("attackDamage", 16.0D, 0.0D, 1024.0D); + b.pop(); + + + // Basilisk + + b.push("basilisk"); + BASILISK_PETRIFYING_GAZE_ENABLED = b + .comment("If false, the Basilisk will not use its petrifying gaze and will never apply the Paralyzed effect.") + .define("petrifyingGazeEnabled", true); + BASILISK_SPAWN_MAX_LIGHT_LEVEL = b + .comment("Maximum local raw light level where basilisk natural spawning is allowed.") + .defineInRange("spawnMaxLightLevel", 5, 0, 15); + BASILISK_HEALTH = b.comment("Base max health.").defineInRange("health", 150.0D, 1.0D, 32768.0D); + BASILISK_ATTACK_DAMAGE = b.comment("Base attack damage.").defineInRange("attackDamage", 36.0D, 0.0D, 1024.0D); + BASILISK_MOVEMENT_SPEED = b.comment("Base movement speed.").defineInRange("movementSpeed", 0.28D, 0.0D, 10.0D); + BASILISK_ARMOR = b.comment("Base armor value.").defineInRange("armor", 6.0D, 0.0D, 1024.0D); + BASILISK_KNOCKBACK_RESISTANCE = b.comment("Base knockback resistance.").defineInRange("knockbackResistance", 0.5D, 0.0D, 1.0D); + BASILISK_FOLLOW_RANGE = b.comment("Base follow range.").defineInRange("followRange", 28.0D, 1.0D, 128.0D); + BASILISK_XP_REWARD = b.comment("Base experience reward.").defineInRange("xpReward", 50, 0, 100000); + BASILISK_ATTACK_ANIM_TICKS = b.comment("Ticks for the attack animation window.").defineInRange("attackAnimTicks", 18, 1, 400); + BASILISK_ATTACK_DAMAGE_TICK = b.comment("Tick during the attack animation when damage is applied.").defineInRange("attackDamageTick", 9, 0, 400); + BASILISK_HISS_COOLDOWN_TICKS = b.comment("Ticks between petrifying gaze attempts.").defineInRange("hissCooldownTicks", 600, 0, 20000); + BASILISK_ATTACK_REACH = b.comment("Forward bite reach in blocks measured from the basilisk's center.").defineInRange("attackReach", 3.0D, 0.0D, 128.0D); + BASILISK_GAZE_RANGE = b.comment("Range in blocks for petrifying gaze checks.").defineInRange("gazeRange", 12.0D, 0.0D, 128.0D); + BASILISK_GAZE_DOT_THRESHOLD = b.comment("Dot threshold for the player gaze check.").defineInRange("gazeDotThreshold", 0.64D, -1.0D, 1.0D); + BASILISK_GAZE_FACING_THRESHOLD = b.comment("Dot threshold for the Basilisk facing check.").defineInRange("gazeFacingThreshold", 0.45D, -1.0D, 1.0D); + BASILISK_HISS_CHARGE_TICKS = b.comment("Ticks a player must keep looking to trigger petrification.").defineInRange("hissChargeTicks", 30, 0, 2000); + BASILISK_PLAYER_PARALYZE_TICKS = b.comment("Ticks the Paralyzed effect lasts on players.").defineInRange("playerParalyzeTicks", 50, 0, 20000); + BASILISK_PREY_PETRIFY_COOLDOWN_TICKS = b.comment("Ticks between prey petrification checks.").defineInRange("preyPetrifyCooldownTicks", 500, 0, 20000); + BASILISK_PREY_PETRIFY_RANGE = b.comment("Range in blocks for prey petrification checks.").defineInRange("preyPetrifyRange", 8.0D, 0.0D, 128.0D); + BASILISK_PREY_PETRIFY_TICKS = b.comment("Ticks the prey petrify effect lasts.").defineInRange("preyPetrifyTicks", 200, 0, 20000); + b.pop(); + + + // Lucid + + b.push("lucid"); + LUCID_ATTACK_RANGE = b + .comment("Attack range in blocks. The Lucid fires its gravity blast when a target enters this radius.") + .defineInRange("attackRange", 9.0D, 1.0D, 32.0D); + LUCID_PEARL_INVERTED_DURATION_SECONDS = b + .comment("How long the Inverted effect from a Lucid pearl lasts, in seconds.") + .defineInRange("pearlInvertedDurationSeconds", 6.0D, 0.0D, 3600.0D); + b.pop(); + + + // Dread effect + + b.push("dread"); + + b.push("hallucinationSounds"); + DREAD_HALLUCINATION_SOUNDS_ENABLED = b.comment("If false, the Dread effect will not play random hallucination sounds. Sound pool tag: data/antarchy/tags/sound_event/dread_hallucination_sounds.json").define("enabled", true); + DREAD_HALLUCINATION_SOUND_MIN_INTERVAL = b.comment("Minimum seconds between hallucination sound triggers.").defineInRange("minIntervalSeconds", 3.0D, 0.1D, 300.0D); + DREAD_HALLUCINATION_SOUND_MAX_INTERVAL = b.comment("Maximum seconds between hallucination sound triggers.").defineInRange("maxIntervalSeconds", 10.0D, 0.1D, 300.0D); + b.pop(); + + b.push("hallucinationMobs"); + DREAD_HALLUCINATION_MOBS_ENABLED = b.comment("If false, the Dread effect will not render apparitions.").define("enabled", true); + DREAD_HALLUCINATION_MOB_MIN_INTERVAL = b.comment("Minimum seconds between apparition spawns.").defineInRange("minIntervalSeconds", 6.0D, 0.1D, 300.0D); + DREAD_HALLUCINATION_MOB_MAX_INTERVAL = b.comment("Maximum seconds between apparition spawns.").defineInRange("maxIntervalSeconds", 16.0D, 0.1D, 300.0D); + b.pop(); + + b.pop(); // dread + + b.push("creepingHorror"); + CREEPING_HORROR_HEALTH = b.comment("Base max health.").defineInRange("health", 15.0D, 1.0D, 32768.0D); + CREEPING_HORROR_ATTACK_DAMAGE = b.comment("Base attack damage.").defineInRange("attackDamage", 6.0D, 0.0D, 1024.0D); + b.pop(); + + b.push("lurkingTerror"); + LURKING_TERROR_HEALTH = b.comment("Base max health.").defineInRange("health", 15.0D, 1.0D, 32768.0D); + LURKING_TERROR_ATTACK_DAMAGE = b.comment("Base attack damage.").defineInRange("attackDamage", 6.0D, 0.0D, 1024.0D); + b.pop(); + + b.push("jerry"); + JERRY_INFANT_HEALTH = b.comment("Infant Jerry max health.").defineInRange("infantHealth", 20.0D, 1.0D, 32768.0D); + JERRY_INFANT_ATTACK_DAMAGE = b.comment("Infant Jerry damage per attached damage tick.").defineInRange("infantAttackDamage", 2.0D, 0.0D, 1024.0D); + JERRY_MATURE_HEALTH = b.comment("Mature Jerry max health.").defineInRange("matureHealth", 40.0D, 1.0D, 32768.0D); + JERRY_MATURE_ATTACK_DAMAGE = b.comment("Mature Jerry damage per attached damage tick.").defineInRange("matureAttackDamage", 3.5D, 0.0D, 1024.0D); + JERRY_ALPHA_HEALTH = b.comment("Alpha Jerry max health.").defineInRange("alphaHealth", 60.0D, 1.0D, 32768.0D); + JERRY_ALPHA_ATTACK_DAMAGE = b.comment("Alpha Jerry attack damage.").defineInRange("alphaAttackDamage", 6.0D, 0.0D, 1024.0D); + JERRY_GAMMA_HEALTH = b.comment("Gamma Jerry max health.").defineInRange("gammaHealth", 60.0D, 1.0D, 32768.0D); + JERRY_GAMMA_ATTACK_DAMAGE = b.comment("Gamma Jerry melee attack damage.").defineInRange("gammaAttackDamage", 7.0D, 0.0D, 1024.0D); + b.pop(); + + b.push("cheep"); + CHEEP_HEALTH = b.comment("Base max health.").defineInRange("health", 8.0D, 1.0D, 32768.0D); + CHEEP_ATTACK_DAMAGE = b.comment("Base attack damage.").defineInRange("attackDamage", 3.0D, 0.0D, 1024.0D); + b.pop(); + + b.push("dorrie"); + DORRIE_HEALTH = b.comment("Base max health.").defineInRange("health", 60.0D, 1.0D, 32768.0D); + b.pop(); + + b.push("ouranwood_deer"); + OURANWOOD_DEER_HEALTH = b.comment("Base max health.").defineInRange("health", 20.0D, 1.0D, 32768.0D); + b.pop(); + + b.push("glimmer"); + GLIMMER_HEALTH = b.comment("Base max health.").defineInRange("health", 20.0D, 1.0D, 32768.0D); + b.pop(); + + b.push("herculesBeetle"); + HERCULES_BEETLE_HEALTH = b.comment("Base max health.").defineInRange("health", 500.0D, 1.0D, 32768.0D); + HERCULES_BEETLE_ATTACK_DAMAGE = b.comment("Base melee damage for ground and flying attacks.").defineInRange("attackDamage", 30.0D, 0.0D, 1024.0D); + HERCULES_BEETLE_CHARGE_DAMAGE = b.comment("AOE impact damage dealt when a charge collides.").defineInRange("chargeDamage", 40.0D, 0.0D, 1024.0D); + b.pop(); + + b.push("toreterror"); + TORETERROR_HEALTH = b.comment("Base max health.").defineInRange("health", 300.0D, 1.0D, 32768.0D); + TORETERROR_JUMP_ATTACK_DAMAGE = b.comment("Damage dealt by the jump shockwave.").defineInRange("jumpAttackDamage", 14.0D, 0.0D, 1024.0D); + TORETERROR_JUMP_ATTACK_KNOCKBACK = b.comment("Knockback strength of the jump shockwave.").defineInRange("jumpAttackKnockback", 2.5D, 0.0D, 10.0D); + TORETERROR_SPIN_DAMAGE = b.comment("Damage per spin-attack tick.").defineInRange("spinDamage", 8.0D, 0.0D, 1024.0D); + TORETERROR_SPIN_KNOCKBACK = b.comment("Knockback strength of the spin attack.").defineInRange("spinKnockback", 1.5D, 0.0D, 10.0D); + TORETERROR_PROJECTILE_DAMAGE_MULTIPLIER = b.comment("Damage multiplier applied to projectile hits on the Toreterror (0.5 = half damage).").defineInRange("projectileDamageMultiplier", 0.5D, 0.0D, 1.0D); + TORETERROR_RANGED_WATER_BOMB_CHANCE = b.comment("Chance each ranged attack cycle launches a water bomb.").defineInRange("rangedWaterBombChance", 0.35D, 0.0D, 1.0D); + WATER_CANNON_COOLDOWN_SECONDS = b.comment("Cooldown between water cannon uses, in seconds.").defineInRange("waterCannonCooldownSeconds", 1.5D, 0.0D, 60.0D); + WATER_BOMB_DAMAGE = b.comment("Damage dealt by a Water Bomb hit.").defineInRange("waterBombDamage", 6.0D, 0.0D, 1024.0D); + WATER_BOMB_LIFETIME_TICKS = b.comment("Ticks before a Water Bomb despawns.").defineInRange("waterBombLifetimeTicks", 120, 1, 6000); + WATER_BOMB_GRAVITY = b.comment("Gravity applied to Water Bombs (higher = steeper arc).").defineInRange("waterBombGravity", 0.12D, 0.0D, 2.0D); + WATER_BOMB_KNOCKBACK = b.comment("Knockback strength when a Water Bomb hits an entity.").defineInRange("waterBombKnockback", 1.2D, 0.0D, 10.0D); + b.pop(); + + SPEC = b.build(); + } + + private AntarchyMobsConfig() {} + + private static boolean isValidDimensionId(Object value) { + return value instanceof String s && net.minecraft.resources.ResourceLocation.tryParse(s) != null; + } + + static boolean antsStealFromChests() { return ANTS_STEAL_FROM_CHESTS.get(); } + + static boolean brownAntRequiresReagent() { return BROWN_ANT_REQUIRES_REAGENT.get(); } + static double brownAntHealth() { return BROWN_ANT_HEALTH.get(); } + static double brownAntMovementSpeed() { return BROWN_ANT_MOVEMENT_SPEED.get(); } + static double brownAntAttackDamage() { return BROWN_ANT_ATTACK_DAMAGE.get(); } + static String brownAntDestinationDimension() { return BROWN_ANT_DESTINATION_DIMENSION.get(); } + + static boolean redAntRequiresReagent() { return RED_ANT_REQUIRES_REAGENT.get(); } + static double redAntHealth() { return RED_ANT_HEALTH.get(); } + static double redAntMovementSpeed() { return RED_ANT_MOVEMENT_SPEED.get(); } + static double redAntAttackDamage() { return RED_ANT_ATTACK_DAMAGE.get(); } + static String redAntDestinationDimension() { return RED_ANT_DESTINATION_DIMENSION.get(); } + + static boolean rainbowAntRequiresReagent() { return RAINBOW_ANT_REQUIRES_REAGENT.get(); } + static double rainbowAntHealth() { return RAINBOW_ANT_HEALTH.get(); } + static double rainbowAntMovementSpeed() { return RAINBOW_ANT_MOVEMENT_SPEED.get(); } + static double rainbowAntAttackDamage() { return RAINBOW_ANT_ATTACK_DAMAGE.get(); } + static String rainbowAntNonInfinityFallbackDimension() { return RAINBOW_ANT_NON_INFINITY_FALLBACK_DIMENSION.get(); } + + static boolean termiteRequiresReagent() { return TERMITE_REQUIRES_REAGENT.get(); } + static double termiteHealth() { return TERMITE_HEALTH.get(); } + static double termiteMovementSpeed() { return TERMITE_MOVEMENT_SPEED.get(); } + static double termiteAttackDamage() { return TERMITE_ATTACK_DAMAGE.get(); } + static String termiteDestinationDimension() { return TERMITE_DESTINATION_DIMENSION.get(); } + + + static boolean easterBunnyEnabled() { return EASTER_BUNNY_ENABLED.get(); } + static int easterBunnyNaturalSpawnChancePercent() { return EASTER_BUNNY_NATURAL_SPAWN_CHANCE_PERCENT.get(); } + + static double waspHealth() { return WASP_HEALTH.get(); } + static double waspAttackDamage() { return WASP_ATTACK_DAMAGE.get(); } + static double waspMovementSpeed() { return WASP_MOVEMENT_SPEED.get(); } + + static double bomberHealth() { return BOMBER_HEALTH.get(); } + static double bomberAttackDamage() { return BOMBER_ATTACK_DAMAGE.get(); } + static double bomberExplosionDamage() { return BOMBER_EXPLOSION_DAMAGE.get(); } + static double bomberExplosionRadius() { return BOMBER_EXPLOSION_RADIUS.get(); } + + static double jumpyBugHealth() { return JUMPY_BUG_HEALTH.get(); } + static double jumpyBugPounceDamage() { return JUMPY_BUG_POUNCE_DAMAGE.get(); } + static double jumpyBugLatchDamage() { return JUMPY_BUG_LATCH_DAMAGE.get(); } + static double jumpyBugCamouflageAlpha() { return JUMPY_BUG_CAMOUFLAGE_ALPHA.get(); } + + static double krakenHealth() { return KRAKEN_HEALTH.get(); } + static double krakenAttackDamage() { return KRAKEN_ATTACK_DAMAGE.get(); } + static double krakenProjectileDamageTakenMultiplier() { return KRAKEN_PROJECTILE_DAMAGE_TAKEN_MULTIPLIER.get(); } + static boolean krakenSquidSpawnEnabled() { return KRAKEN_SQUID_SPAWN_ENABLED.get(); } + static boolean krakenMassSpawnEnabled() { return KRAKEN_MASS_SPAWN_ENABLED.get(); } + static boolean krakenRequireBadOmenToSummon() { return KRAKEN_REQUIRE_BAD_OMEN_TO_SUMMON.get(); } + + static double brutalflyHealth() { return BRUTALFLY_HEALTH.get(); } + static double brutalflySwipeDamage() { return BRUTALFLY_SWIPE_DAMAGE.get(); } + static double brutalflySpitDamage() { return BRUTALFLY_SPIT_DAMAGE.get(); } + + static double mantisHealth() { return MANTIS_HEALTH.get(); } + static double mantisAttackDamage() { return MANTIS_ATTACK_DAMAGE.get(); } + static double mantisMovementSpeed() { return MANTIS_MOVEMENT_SPEED.get(); } + static double mantisFlyingSpeed() { return MANTIS_FLYING_SPEED.get(); } + static boolean mantisIgnoreLightLevel() { return MANTIS_IGNORE_LIGHT_LEVEL.get(); } + static double alphaMantisHealth() { return ALPHA_MANTIS_HEALTH.get(); } + static double alphaMantisAttackDamage() { return ALPHA_MANTIS_ATTACK_DAMAGE.get(); } + static double alphaMantisMovementSpeed() { return ALPHA_MANTIS_MOVEMENT_SPEED.get(); } + static double alphaMantisFlyingSpeed() { return ALPHA_MANTIS_FLYING_SPEED.get(); } + static int alphaMantisSummonIntervalTicks() { return ALPHA_MANTIS_SUMMON_INTERVAL_TICKS.get(); } + static int alphaMantisMaxMinions() { return ALPHA_MANTIS_MAX_MINIONS.get(); } + static double rollyPollyHealth() { return ROLLY_POLLY_HEALTH.get(); } + static double rollyPollyMovementSpeed() { return ROLLY_POLLY_MOVEMENT_SPEED.get(); } + static double rollyPollyRollSpeedMultiplier() { return ROLLY_POLLY_ROLL_SPEED_MULTIPLIER.get(); } + static int rollyPollyTameChance() { return ROLLY_POLLY_TAME_CHANCE.get(); } + static double rollyPollyBowlingDamage() { return ROLLY_POLLY_BOWLING_DAMAGE.get(); } + static double rollyPollyTumbleDamage() { return ROLLY_POLLY_TUMBLE_DAMAGE.get(); } + static double rollyPollyBowlingKnockback() { return ROLLY_POLLY_BOWLING_KNOCKBACK.get(); } + static double rollyPollyArmor() { return ROLLY_POLLY_ARMOR.get(); } + static double rollyPollyRolledArmorBonus() { return ROLLY_POLLY_ROLLED_ARMOR_BONUS.get(); } + + static double triffidHealth() { return TRIFFID_HEALTH.get(); } + static double triffidAttackDamage() { return TRIFFID_ATTACK_DAMAGE.get(); } + static double triffidGrabDamage() { return TRIFFID_GRAB_DAMAGE.get(); } + + static double caterpillarPupationTimeSeconds() { return CATERPILLAR_PUPATION_TIME_SECONDS.get(); } + static double antDanceRadius() { return ANT_DANCE_RADIUS.get(); } + + static double reverieHealth() { return REVERIE_HEALTH.get(); } + static double reverieInterestRadius() { return REVERIE_INTEREST_RADIUS.get(); } + static double reverieAbandonPlayerDistance() { return REVERIE_ABANDON_PLAYER_DISTANCE.get(); } + static int reverieNoticeDurationTicks() { return REVERIE_NOTICE_DURATION_TICKS.get(); } + static int reverieInterestDurationTicks() { return REVERIE_INTEREST_DURATION_TICKS.get(); } + static int reverieRebindCooldownTicks() { return REVERIE_REBIND_COOLDOWN_TICKS.get(); } + static int reverieDamageReactionDurationTicks() { return REVERIE_DAMAGE_REACTION_DURATION_TICKS.get(); } + static double reverieDangerousFallDistance() { return REVERIE_DANGEROUS_FALL_DISTANCE.get(); } + static double reverieDangerousFallSpeed() { return REVERIE_DANGEROUS_FALL_SPEED.get(); } + static double reverieWarningThreatRadius() { return REVERIE_WARNING_THREAT_RADIUS.get(); } + static double reverieWarningThreatVerticalRange() { return REVERIE_WARNING_THREAT_VERTICAL_RANGE.get(); } + static int reverieDuplicationCooldownTicks() { return REVERIE_DUPLICATION_COOLDOWN_TICKS.get(); } + + static double nightmareHealth() { return NIGHTMARE_HEALTH.get(); } + static double nightmareAttackDamage() { return NIGHTMARE_ATTACK_DAMAGE.get(); } + + static boolean basiliskPetrifyingGazeEnabled() { return BASILISK_PETRIFYING_GAZE_ENABLED.get(); } + static int basiliskSpawnMaxLightLevel() { return BASILISK_SPAWN_MAX_LIGHT_LEVEL.get(); } + static double basiliskHealth() { return BASILISK_HEALTH.get(); } + static double basiliskAttackDamage() { return BASILISK_ATTACK_DAMAGE.get(); } + static double basiliskMovementSpeed() { return BASILISK_MOVEMENT_SPEED.get(); } + static double basiliskArmor() { return BASILISK_ARMOR.get(); } + static double basiliskKnockbackResistance() { return BASILISK_KNOCKBACK_RESISTANCE.get(); } + static double basiliskFollowRange() { return BASILISK_FOLLOW_RANGE.get(); } + static int basiliskXpReward() { return BASILISK_XP_REWARD.get(); } + static int basiliskAttackAnimTicks() { return BASILISK_ATTACK_ANIM_TICKS.get(); } + static int basiliskAttackDamageTick() { return BASILISK_ATTACK_DAMAGE_TICK.get(); } + static int basiliskHissCooldownTicks() { return BASILISK_HISS_COOLDOWN_TICKS.get(); } + static double basiliskAttackReach() { return BASILISK_ATTACK_REACH.get(); } + static double basiliskGazeRange() { return BASILISK_GAZE_RANGE.get(); } + static double basiliskGazeDotThreshold() { return BASILISK_GAZE_DOT_THRESHOLD.get(); } + static double basiliskGazeFacingThreshold() { return BASILISK_GAZE_FACING_THRESHOLD.get(); } + static int basiliskHissChargeTicks() { return BASILISK_HISS_CHARGE_TICKS.get(); } + static int basiliskPlayerParalyzeTicks() { return BASILISK_PLAYER_PARALYZE_TICKS.get(); } + static int basiliskPreyPetrifyCooldownTicks() { return BASILISK_PREY_PETRIFY_COOLDOWN_TICKS.get(); } + static double basiliskPreyPetrifyRange() { return BASILISK_PREY_PETRIFY_RANGE.get(); } + static int basiliskPreyPetrifyTicks() { return BASILISK_PREY_PETRIFY_TICKS.get(); } + + static double lucidAttackRange() { return LUCID_ATTACK_RANGE.get(); } + static double lucidPearlInvertedDurationSeconds() { return LUCID_PEARL_INVERTED_DURATION_SECONDS.get(); } + + static double toreterrorHealth() { return TORETERROR_HEALTH.get(); } + static double toreterrorJumpAttackDamage() { return TORETERROR_JUMP_ATTACK_DAMAGE.get(); } + static double toreterrorJumpAttackKnockback() { return TORETERROR_JUMP_ATTACK_KNOCKBACK.get(); } + static double toreterrorSpinDamage() { return TORETERROR_SPIN_DAMAGE.get(); } + static double toreterrorSpinKnockback() { return TORETERROR_SPIN_KNOCKBACK.get(); } + static double toreterrorProjectileDamageMultiplier() { return TORETERROR_PROJECTILE_DAMAGE_MULTIPLIER.get(); } + static double toreterrorRangedWaterBombChance() { return TORETERROR_RANGED_WATER_BOMB_CHANCE.get(); } + static double waterCannonCooldownSeconds() { return WATER_CANNON_COOLDOWN_SECONDS.get(); } + static double waterBombDamage() { return WATER_BOMB_DAMAGE.get(); } + static int waterBombLifetimeTicks() { return WATER_BOMB_LIFETIME_TICKS.get(); } + static double waterBombGravity() { return WATER_BOMB_GRAVITY.get(); } + static double waterBombKnockback() { return WATER_BOMB_KNOCKBACK.get(); } + + static boolean dreadHallucinationSoundsEnabled() { return DREAD_HALLUCINATION_SOUNDS_ENABLED.get(); } + static double dreadHallucinationSoundMinInterval() { return DREAD_HALLUCINATION_SOUND_MIN_INTERVAL.get(); } + static double dreadHallucinationSoundMaxInterval() { return DREAD_HALLUCINATION_SOUND_MAX_INTERVAL.get(); } + static boolean dreadHallucinationMobsEnabled() { return DREAD_HALLUCINATION_MOBS_ENABLED.get(); } + static double dreadHallucinationMobMinInterval() { return DREAD_HALLUCINATION_MOB_MIN_INTERVAL.get(); } + static double dreadHallucinationMobMaxInterval() { return DREAD_HALLUCINATION_MOB_MAX_INTERVAL.get(); } + + static double creepingHorrorHealth() { return CREEPING_HORROR_HEALTH.get(); } + static double creepingHorrorAttackDamage() { return CREEPING_HORROR_ATTACK_DAMAGE.get(); } + static double lurkingTerrorHealth() { return LURKING_TERROR_HEALTH.get(); } + static double lurkingTerrorAttackDamage() { return LURKING_TERROR_ATTACK_DAMAGE.get(); } + static double jerryInfantHealth() { return JERRY_INFANT_HEALTH.get(); } + static double jerryInfantAttackDamage() { return JERRY_INFANT_ATTACK_DAMAGE.get(); } + static double jerryMatureHealth() { return JERRY_MATURE_HEALTH.get(); } + static double jerryMatureAttackDamage() { return JERRY_MATURE_ATTACK_DAMAGE.get(); } + static double jerryAlphaHealth() { return JERRY_ALPHA_HEALTH.get(); } + static double jerryAlphaAttackDamage() { return JERRY_ALPHA_ATTACK_DAMAGE.get(); } + static double jerryGammaHealth() { return JERRY_GAMMA_HEALTH.get(); } + static double jerryGammaAttackDamage() { return JERRY_GAMMA_ATTACK_DAMAGE.get(); } + static double cheepHealth() { return CHEEP_HEALTH.get(); } + static double cheepAttackDamage() { return CHEEP_ATTACK_DAMAGE.get(); } + static double dorrieHealth() { return DORRIE_HEALTH.get(); } + static double ouranwoodDeerHealth() { return OURANWOOD_DEER_HEALTH.get(); } + static double glimmerHealth() { return GLIMMER_HEALTH.get(); } + static double herculesBeetleHealth() { return HERCULES_BEETLE_HEALTH.get(); } + static double herculesBeetleAttackDamage() { return HERCULES_BEETLE_ATTACK_DAMAGE.get(); } + static double herculesBeetleChargeDamage() { return HERCULES_BEETLE_CHARGE_DAMAGE.get(); } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyToolsConfig.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyToolsConfig.java new file mode 100644 index 00000000..e1a97622 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyToolsConfig.java @@ -0,0 +1,702 @@ +package com.craisinlord.antarchy.forge; + +import net.minecraftforge.common.ForgeConfigSpec; + +public final class AntarchyToolsConfig { + public static final ForgeConfigSpec SPEC; + + + // Basilisk Dagger + + private static final ForgeConfigSpec.DoubleValue BASILISK_DAGGER_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue BASILISK_DAGGER_ATTACK_SPEED; + private static final ForgeConfigSpec.IntValue BASILISK_DAGGER_POISON_DURATION_TICKS; + private static final ForgeConfigSpec.IntValue BASILISK_DAGGER_POISON_AMPLIFIER; + + + // Ultimate Tools + + private static final ForgeConfigSpec.DoubleValue ULTIMATE_SWORD_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue ULTIMATE_SWORD_ATTACK_SPEED; + private static final ForgeConfigSpec.DoubleValue ULTIMATE_PICKAXE_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue ULTIMATE_PICKAXE_ATTACK_SPEED; + private static final ForgeConfigSpec.DoubleValue ULTIMATE_AXE_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue ULTIMATE_AXE_ATTACK_SPEED; + private static final ForgeConfigSpec.DoubleValue ULTIMATE_SHOVEL_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue ULTIMATE_SHOVEL_ATTACK_SPEED; + private static final ForgeConfigSpec.DoubleValue ULTIMATE_HOE_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue ULTIMATE_HOE_ATTACK_SPEED; + private static final ForgeConfigSpec.IntValue ULTIMATE_TOOL_ENCHANTABILITY; + private static final ForgeConfigSpec.BooleanValue ULTIMATE_TOOLS_THREE_BY_THREE_ENABLED; + + + // Ultimate Bow + + private static final ForgeConfigSpec.DoubleValue ULTIMATE_BOW_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue ULTIMATE_BOW_PLAYER_HEAL; + private static final ForgeConfigSpec.DoubleValue ULTIMATE_BOW_DRAW_SPEED_MULTIPLIER; + private static final ForgeConfigSpec.BooleanValue ULTIMATE_BOW_COMES_ENCHANTED_WITH_FLAME; + private static final ForgeConfigSpec.IntValue ULTIMATE_BOW_ENCHANTABILITY; + + + // Ultimate Crossbow + + private static final ForgeConfigSpec.DoubleValue ULTIMATE_CROSSBOW_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue ULTIMATE_CROSSBOW_CHARGE_SPEED_MULTIPLIER; + private static final ForgeConfigSpec.IntValue ULTIMATE_CROSSBOW_ENCHANTABILITY; + + + // Ultimate Mace + + private static final ForgeConfigSpec.DoubleValue ULTIMATE_MACE_DAMAGE_MULTIPLIER; + private static final ForgeConfigSpec.DoubleValue ULTIMATE_MACE_ATTACK_SPEED; + private static final ForgeConfigSpec.IntValue ULTIMATE_MACE_ENCHANTABILITY; + + + // Ultimate Armor + + private static final ForgeConfigSpec.BooleanValue ULTIMATE_ARMOR_COMES_ENCHANTED; + private static final ForgeConfigSpec.IntValue ULTIMATE_ARMOR_ENCHANTABILITY; + private static final ForgeConfigSpec.IntValue ULTIMATE_HELMET_ARMOR_VALUE; + private static final ForgeConfigSpec.IntValue ULTIMATE_CHESTPLATE_ARMOR_VALUE; + private static final ForgeConfigSpec.IntValue ULTIMATE_LEGGINGS_ARMOR_VALUE; + private static final ForgeConfigSpec.IntValue ULTIMATE_BOOTS_ARMOR_VALUE; + private static final ForgeConfigSpec.DoubleValue ULTIMATE_HELMET_ARMOR_TOUGHNESS; + private static final ForgeConfigSpec.DoubleValue ULTIMATE_CHESTPLATE_ARMOR_TOUGHNESS; + private static final ForgeConfigSpec.DoubleValue ULTIMATE_LEGGINGS_ARMOR_TOUGHNESS; + private static final ForgeConfigSpec.DoubleValue ULTIMATE_BOOTS_ARMOR_TOUGHNESS; + private static final ForgeConfigSpec.DoubleValue ULTIMATE_ARMOR_KNOCKBACK_RESISTANCE; + + + // Battle Axe + + private static final ForgeConfigSpec.DoubleValue BATTLE_AXE_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue BATTLE_AXE_ATTACK_SPEED; + + + // Big Bertha + + private static final ForgeConfigSpec.DoubleValue BIG_BERTHA_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue BIG_BERTHA_REACH_BONUS; + private static final ForgeConfigSpec.DoubleValue BIG_BERTHA_ATTACK_SPEED; + private static final ForgeConfigSpec.DoubleValue ATTITUDE_ADJUSTER_BASE_DAMAGE; + private static final ForgeConfigSpec.BooleanValue ATTITUDE_ADJUSTER_BREAKS_BLOCKS; + private static final ForgeConfigSpec.DoubleValue KRAKENS_GRASP_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue KRAKENS_GRASP_ATTACK_SPEED; + private static final ForgeConfigSpec.DoubleValue KRAKENS_GRASP_THROWN_DAMAGE; + private static final ForgeConfigSpec.DoubleValue KRAKENS_GRASP_LIGHTNING_DAMAGE; + private static final ForgeConfigSpec.BooleanValue KRAKENS_GRASP_INNATE_LOYALTY; + private static final ForgeConfigSpec.IntValue KRAKENS_GRASP_INNATE_LOYALTY_LEVEL; + private static final ForgeConfigSpec.IntValue KRAKENS_GRASP_TENTACLE_DURATION_TICKS; + private static final ForgeConfigSpec.DoubleValue KRAKENS_GRASP_TENTACLE_DAMAGE; + private static final ForgeConfigSpec.DoubleValue KRAKENS_GRASP_TENTACLE_RADIUS; + private static final ForgeConfigSpec.IntValue KRAKENS_GRASP_TENTACLE_DAMAGE_INTERVAL_TICKS; + private static final ForgeConfigSpec.IntValue BIG_BERTHA_BASILISK_PARALYZE_DURATION_TICKS; + private static final ForgeConfigSpec.IntValue BIG_BERTHA_KRAKEN_SLOW_TICKS; + private static final ForgeConfigSpec.DoubleValue BIG_BERTHA_BASILISK_COOLDOWN_SECONDS; + private static final ForgeConfigSpec.DoubleValue BIG_BERTHA_LUCID_INVERTED_DURATION_SECONDS; + private static final ForgeConfigSpec.DoubleValue BIG_BERTHA_LUCID_INVERTED_DAMAGE_BONUS_PERCENT; + private static final ForgeConfigSpec.DoubleValue SCORPION_WHIP_BASE_DAMAGE; + private static final ForgeConfigSpec.DoubleValue SCORPION_WHIP_REACH_BONUS; + private static final ForgeConfigSpec.IntValue SCORPION_WHIP_POISON_DURATION_TICKS; + private static final ForgeConfigSpec.DoubleValue SCORPION_WHIP_TETHER_MAX_RANGE; + private static final ForgeConfigSpec.DoubleValue SCORPION_WHIP_SNAP_BONUS_DAMAGE; + private static final ForgeConfigSpec.DoubleValue SCORPION_WHIP_PULL_STRENGTH; + private static final ForgeConfigSpec.DoubleValue SCORPION_WHIP_HEAVY_PULL_MULTIPLIER; + private static final ForgeConfigSpec.DoubleValue SCORPION_WHIP_SELF_PULL_MULTIPLIER; + private static final ForgeConfigSpec.IntValue SCORPION_WHIP_REEL_COOLDOWN_TICKS; + private static final ForgeConfigSpec.IntValue SCORPION_WHIP_SNAP_COOLDOWN_TICKS; + private static final ForgeConfigSpec.IntValue BLOOD_CRYSTAL_KATANA_ATTACK_DAMAGE; + private static final ForgeConfigSpec.DoubleValue BLOOD_CRYSTAL_KATANA_LAUNCH_STRENGTH; + private static final ForgeConfigSpec.IntValue BLOOD_CRYSTAL_KATANA_TRAIL_DURATION_TICKS; + + + // Nightmare Gear + + private static final ForgeConfigSpec.IntValue NIGHTMARE_HELMET_ARMOR_VALUE; + private static final ForgeConfigSpec.IntValue NIGHTMARE_CHESTPLATE_ARMOR_VALUE; + private static final ForgeConfigSpec.IntValue NIGHTMARE_LEGGINGS_ARMOR_VALUE; + private static final ForgeConfigSpec.IntValue NIGHTMARE_BOOTS_ARMOR_VALUE; + private static final ForgeConfigSpec.DoubleValue NIGHTMARE_HELMET_ARMOR_TOUGHNESS; + private static final ForgeConfigSpec.DoubleValue NIGHTMARE_CHESTPLATE_ARMOR_TOUGHNESS; + private static final ForgeConfigSpec.DoubleValue NIGHTMARE_LEGGINGS_ARMOR_TOUGHNESS; + private static final ForgeConfigSpec.DoubleValue NIGHTMARE_BOOTS_ARMOR_TOUGHNESS; + private static final ForgeConfigSpec.DoubleValue NIGHTMARE_ARMOR_KNOCKBACK_RESISTANCE; + private static final ForgeConfigSpec.DoubleValue PRIMORDIAL_ARMOR_KNOCKBACK_PER_PIECE; + private static final ForgeConfigSpec.DoubleValue NIGHTMARE_ARMOR_DREAD_AURA_RANGE_PER_PIECE; + private static final ForgeConfigSpec.DoubleValue NIGHTMARE_SWORD_BASE_DAMAGE; + private static final ForgeConfigSpec.DoubleValue NIGHTMARE_SWORD_ATTACK_SPEED; + private static final ForgeConfigSpec.DoubleValue NIGHTMARE_SWORD_SCALING_FACTOR; + + + // Fallen King's Crown + + private static final ForgeConfigSpec.IntValue FALLEN_KING_CROWN_ARMOR_VALUE; + private static final ForgeConfigSpec.DoubleValue FALLEN_KING_CROWN_ARMOR_TOUGHNESS; + + + // Blood Crystal Armor + + private static final ForgeConfigSpec.IntValue BLOOD_CRYSTAL_ARMOR_SHIELD_RECHARGE_TICKS; + private static final ForgeConfigSpec.IntValue BLOOD_CRYSTAL_APPLE_SHIELD_COUNT; + private static final ForgeConfigSpec.IntValue BLOOD_CRYSTAL_APPLE_DURATION_TICKS; + private static final ForgeConfigSpec.IntValue BLOOD_CRYSTAL_APPLE_SHIELD_RECHARGE_TICKS; + private static final ForgeConfigSpec.IntValue BLOOD_CRYSTAL_HARD_MAX_SHIELDS; + private static final ForgeConfigSpec.IntValue BLOOD_CRYSTAL_HELMET_DEFENSE; + private static final ForgeConfigSpec.IntValue BLOOD_CRYSTAL_CHESTPLATE_DEFENSE; + private static final ForgeConfigSpec.IntValue BLOOD_CRYSTAL_LEGGINGS_DEFENSE; + private static final ForgeConfigSpec.IntValue BLOOD_CRYSTAL_BOOTS_DEFENSE; + private static final ForgeConfigSpec.DoubleValue BLOOD_CRYSTAL_ARMOR_TOUGHNESS; + private static final ForgeConfigSpec.IntValue BLOOD_CRYSTAL_HELMET_DURABILITY; + private static final ForgeConfigSpec.IntValue BLOOD_CRYSTAL_CHESTPLATE_DURABILITY; + private static final ForgeConfigSpec.IntValue BLOOD_CRYSTAL_LEGGINGS_DURABILITY; + private static final ForgeConfigSpec.IntValue BLOOD_CRYSTAL_BOOTS_DURABILITY; + + + // Squidzooka + + private static final ForgeConfigSpec.DoubleValue SQUIDZOOKA_COOLDOWN_SECONDS; + private static final ForgeConfigSpec.DoubleValue SQUIDZOOKA_LAUNCH_VELOCITY; + private static final ForgeConfigSpec.DoubleValue RPO_LAUNCHER_COOLDOWN_SECONDS; + private static final ForgeConfigSpec.DoubleValue RPO_LAUNCHER_LAUNCH_VELOCITY; + private static final ForgeConfigSpec.DoubleValue RPO_LAUNCHER_EXPLOSION_DAMAGE; + private static final ForgeConfigSpec.DoubleValue RPO_LAUNCHER_EXPLOSION_RADIUS; + + + // Size Rays + + private static final ForgeConfigSpec.BooleanValue SIZE_CHANGING_RAYS_ENABLED; + private static final ForgeConfigSpec.DoubleValue SIZE_RAY_COOLDOWN_SECONDS; + private static final ForgeConfigSpec.DoubleValue SIZE_RAY_MIN_SCALE; + private static final ForgeConfigSpec.DoubleValue SIZE_RAY_MAX_SCALE; + private static final ForgeConfigSpec.DoubleValue SIZE_RAY_DELTA_PER_HIT; + private static final ForgeConfigSpec.DoubleValue SHRINKING_POTION_DELTA; + private static final ForgeConfigSpec.DoubleValue GROWTH_POTION_DELTA; + + + // Gravity Gun + + private static final ForgeConfigSpec.BooleanValue GRAVITY_GUN_ENABLED; + private static final ForgeConfigSpec.BooleanValue GRAVITY_GUN_BLOCKS_ENABLED; + private static final ForgeConfigSpec.BooleanValue GRAVITY_GUN_ENTITIES_ENABLED; + private static final ForgeConfigSpec.DoubleValue GRAVITY_GUN_RANGE; + private static final ForgeConfigSpec.DoubleValue GRAVITY_GUN_THROW_STRENGTH; + private static final ForgeConfigSpec.DoubleValue GRAVITY_GUN_BLAST_STRENGTH; + private static final ForgeConfigSpec.DoubleValue GRAVITY_GUN_COOLDOWN_SECONDS; + private static final ForgeConfigSpec.DoubleValue GRAVITY_GUN_MAX_HOLD_DISTANCE; + + // Critter Cage + + private static final ForgeConfigSpec.DoubleValue CRITTER_CAGE_MAX_CAPTURABLE_WIDTH; + private static final ForgeConfigSpec.DoubleValue CRITTER_CAGE_MAX_CAPTURABLE_HEIGHT; + + // Miner's Dream + + private static final ForgeConfigSpec.BooleanValue MINERS_DREAM_ENABLED; + private static final ForgeConfigSpec.IntValue MINERS_DREAM_MINIMUM_RANGE; + private static final ForgeConfigSpec.IntValue MINERS_DREAM_MAXIMUM_RANGE; + private static final ForgeConfigSpec.IntValue MINERS_DREAM_TORCH_SPACING; + private static final ForgeConfigSpec.IntValue MINERS_DREAM_BLOCKS_PER_TICK; + + + // Miscellaneous items / consumables + + private static final ForgeConfigSpec.DoubleValue DUCT_TAPE_REPAIR_PERCENT_PER_USE; + private static final ForgeConfigSpec.DoubleValue POTENT_NYXITE_INVERTED_DURATION_SECONDS; + private static final ForgeConfigSpec.BooleanValue INVERT_PROJECTILES_FROM_INVERTED_PLAYERS; + private static final ForgeConfigSpec.IntValue CORNEA_EAR_NIGHT_VISION_SECONDS; + private static final ForgeConfigSpec.BooleanValue AMERICAN_ENABLED; + private static final ForgeConfigSpec.IntValue AMERICAN_BONUS_NUTRITION; + private static final ForgeConfigSpec.DoubleValue AMERICAN_BONUS_SATURATION; + private static final ForgeConfigSpec.IntValue AMERICAN_REGENERATION_DURATION_TICKS; + private static final ForgeConfigSpec.IntValue AMERICAN_REGENERATION_AMPLIFIER; + + // Moggles + private static final ForgeConfigSpec.DoubleValue MOGGLES_VISION_RADIUS; + private static final ForgeConfigSpec.IntValue MOGGLES_VISION_MAX_LIGHT; + private static final ForgeConfigSpec.DoubleValue MOGGLES_VISION_ALPHA; + + + static { + ForgeConfigSpec.Builder b = new ForgeConfigSpec.Builder(); + + + // Basilisk Dagger + + b.push("basiliskDagger"); + BASILISK_DAGGER_ATTACK_DAMAGE = b.comment("Attack damage.") .defineInRange("attackDamage", 6.0D, 0.0D, 1024.0D); + BASILISK_DAGGER_ATTACK_SPEED = b.comment("Attack speed.") .defineInRange("attackSpeed", -1.8D, -10.0D, 10.0D); + BASILISK_DAGGER_POISON_DURATION_TICKS = b.comment("Poison duration applied on hit.") .defineInRange("poisonDurationTicks", 200, 0, 20000); + BASILISK_DAGGER_POISON_AMPLIFIER = b.comment("Poison level applied on hit (0 = I).") .defineInRange("poisonAmplifier", 2, 0, 10); + b.pop(); + + + // Ultimate Tools + + b.push("ultimateTools"); + ULTIMATE_SWORD_ATTACK_DAMAGE = b.comment("Attack damage of the Ultimate Sword.") .defineInRange("swordAttackDamage", 30.0D, 0.0D, 1024.0D); + ULTIMATE_SWORD_ATTACK_SPEED = b.comment("Attack speed of the Ultimate Sword.") .defineInRange("swordAttackSpeed", -2.4D, -10.0D, 10.0D); + ULTIMATE_PICKAXE_ATTACK_DAMAGE = b.comment("Attack damage of the Ultimate Pickaxe.") .defineInRange("pickaxeAttackDamage", 22.0D, 0.0D, 1024.0D); + ULTIMATE_PICKAXE_ATTACK_SPEED = b.comment("Attack speed of the Ultimate Pickaxe.") .defineInRange("pickaxeAttackSpeed", -2.8D, -10.0D, 10.0D); + ULTIMATE_AXE_ATTACK_DAMAGE = b.comment("Attack damage of the Ultimate Axe.") .defineInRange("axeAttackDamage", 38.0D, 0.0D, 1024.0D); + ULTIMATE_AXE_ATTACK_SPEED = b.comment("Attack speed of the Ultimate Axe.") .defineInRange("axeAttackSpeed", -3.0D, -10.0D, 10.0D); + ULTIMATE_SHOVEL_ATTACK_DAMAGE = b.comment("Attack damage of the Ultimate Shovel.") .defineInRange("shovelAttackDamage", 24.0D, 0.0D, 1024.0D); + ULTIMATE_SHOVEL_ATTACK_SPEED = b.comment("Attack speed of the Ultimate Shovel.") .defineInRange("shovelAttackSpeed", -3.0D, -10.0D, 10.0D); + ULTIMATE_HOE_ATTACK_DAMAGE = b.comment("Attack damage of the Ultimate Hoe.") .defineInRange("hoeAttackDamage", 8.0D, 0.0D, 1024.0D); + ULTIMATE_HOE_ATTACK_SPEED = b.comment("Attack speed of the Ultimate Hoe.") .defineInRange("hoeAttackSpeed", 0.0D, -10.0D, 10.0D); + ULTIMATE_TOOL_ENCHANTABILITY = b.comment("Enchantability for all Ultimate tools.") .defineInRange("toolEnchantability", 25, 0, 100); + ULTIMATE_TOOLS_THREE_BY_THREE_ENABLED = b + .comment("If false, Ultimate pickaxe, axe, shovel, and hoe lose their 3x3 mining mode and tooltip.") + .define("threeByThreeEnabled", true); + b.pop(); + + + // Ultimate Bow + + b.push("ultimateBow"); + ULTIMATE_BOW_ATTACK_DAMAGE = b.comment("Damage dealt to non-player targets.") .defineInRange("attackDamage", 18.0D, 0.0D, 1024.0D); + ULTIMATE_BOW_PLAYER_HEAL = b.comment("Health restored to players hit by arrows from this bow.") .defineInRange("playerHeal", 8.0D, 0.0D, 1024.0D); + ULTIMATE_BOW_DRAW_SPEED_MULTIPLIER = b.comment("Draw speed relative to a normal bow. 2.5 = 2.5x as fast.") .defineInRange("drawSpeedMultiplier", 2.5D, 0.1D, 16.0D); + ULTIMATE_BOW_COMES_ENCHANTED_WITH_FLAME = b.comment("If true, Ultimate Bows are automatically given and keep the Flame enchant.") .define("comesEnchantedWithFlame", true); + ULTIMATE_BOW_ENCHANTABILITY = b.comment("Enchantability of the Ultimate Bow.") .defineInRange("enchantability", 20, 0, 100); + b.pop(); + + + // Ultimate Crossbow + + b.push("ultimateCrossbow"); + ULTIMATE_CROSSBOW_ATTACK_DAMAGE = b.comment("Damage dealt by projectiles fired from the Ultimate Crossbow.").defineInRange("attackDamage", 8.0D, 0.0D, 1024.0D); + ULTIMATE_CROSSBOW_CHARGE_SPEED_MULTIPLIER = b + .comment( + "Charge speed relative to a normal crossbow. Below 1.0 is slower.", + "Default 0.25 means 4x slower (16-arrow full load ~5 s). Quick Charge still applies." + ) + .defineInRange("chargeSpeedMultiplier", 0.25D, 0.01D, 16.0D); + ULTIMATE_CROSSBOW_ENCHANTABILITY = b.comment("Enchantability of the Ultimate Crossbow.").defineInRange("enchantability", 20, 0, 100); + b.pop(); + + + // Ultimate Mace + + b.push("ultimateMace"); + ULTIMATE_MACE_DAMAGE_MULTIPLIER = b.comment("Multiplier on both base damage and smash bonus. 1.5 = 50% stronger than a normal mace.").defineInRange("damageMultiplier", 1.5D, 0.1D, 16.0D); + ULTIMATE_MACE_ATTACK_SPEED = b.comment("Attack speed of the Ultimate Mace.") .defineInRange("attackSpeed", -3.4D, -10.0D, 10.0D); + ULTIMATE_MACE_ENCHANTABILITY = b.comment("Enchantability of the Ultimate Mace.") .defineInRange("enchantability", 20, 0, 100); + b.pop(); + + + // Ultimate Armor + + b.push("ultimateArmor"); + ULTIMATE_ARMOR_COMES_ENCHANTED = b.comment("If true, newly crafted Ultimate Armor has Protection, Fire Protection, Projectile Protection, and Blast Protection.").define("comesEnchanted", true); + ULTIMATE_ARMOR_ENCHANTABILITY = b.comment("Enchantability for all Ultimate Armor pieces.") .defineInRange("enchantability", 10, 0, 100); + ULTIMATE_HELMET_ARMOR_VALUE = b.comment("Armor points of the Ultimate Helmet.") .defineInRange("helmetArmor", 4, 0, 100); + ULTIMATE_CHESTPLATE_ARMOR_VALUE = b.comment("Armor points of the Ultimate Chestplate.") .defineInRange("chestplateArmor", 9, 0, 100); + ULTIMATE_LEGGINGS_ARMOR_VALUE = b.comment("Armor points of the Ultimate Leggings.") .defineInRange("leggingsArmor", 7, 0, 100); + ULTIMATE_BOOTS_ARMOR_VALUE = b.comment("Armor points of the Ultimate Boots.") .defineInRange("bootsArmor", 4, 0, 100); + ULTIMATE_HELMET_ARMOR_TOUGHNESS = b.comment("Armor toughness of the Ultimate Helmet.") .defineInRange("helmetToughness", 3.0D, 0.0D, 100.0D); + ULTIMATE_CHESTPLATE_ARMOR_TOUGHNESS = b.comment("Armor toughness of the Ultimate Chestplate.") .defineInRange("chestplateToughness", 3.0D, 0.0D, 100.0D); + ULTIMATE_LEGGINGS_ARMOR_TOUGHNESS = b.comment("Armor toughness of the Ultimate Leggings.") .defineInRange("leggingsToughness", 3.0D, 0.0D, 100.0D); + ULTIMATE_BOOTS_ARMOR_TOUGHNESS = b.comment("Armor toughness of the Ultimate Boots.") .defineInRange("bootsToughness", 3.0D, 0.0D, 100.0D); + ULTIMATE_ARMOR_KNOCKBACK_RESISTANCE = b.comment("Knockback resistance granted by each Ultimate Armor piece.") .defineInRange("knockbackResistance", 0.1D, 0.0D, 1.0D); + b.pop(); + + + // Battle Axe + + b.push("battleAxe"); + BATTLE_AXE_ATTACK_DAMAGE = b.comment("Attack damage of the Battle Axe.").defineInRange("attackDamage", 46.0D, 0.0D, 4096.0D); + BATTLE_AXE_ATTACK_SPEED = b.comment("Attack speed of the Battle Axe.") .defineInRange("attackSpeed", -3.1D, -10.0D, 10.0D); + b.pop(); + + + // Big Bertha + + b.push("bigBertha"); + BIG_BERTHA_ATTACK_DAMAGE = b.comment("Attack damage of Big Bertha.") .defineInRange("attackDamage", 55.0D, 0.0D, 4096.0D); + BIG_BERTHA_REACH_BONUS = b.comment("Extra attack range in blocks while held in main hand.") .defineInRange("reachBonus", 3.0D, 0.0D, 32.0D); + BIG_BERTHA_ATTACK_SPEED = b.comment("Attack speed of Big Bertha.") .defineInRange("attackSpeed", -3.0D, -10.0D, 10.0D); + BIG_BERTHA_BASILISK_PARALYZE_DURATION_TICKS = b.comment("Paralyze duration used by Basilisk mode.") .defineInRange("basiliskParalyzeDurationTicks", 80, 0, 20000); + BIG_BERTHA_KRAKEN_SLOW_TICKS = b.comment("Slow duration used by Kraken mode.") .defineInRange("krakenSlowTicks", 80, 0, 20000); + BIG_BERTHA_BASILISK_COOLDOWN_SECONDS = b.comment("Cooldown in seconds after using Basilisk mode's right-click paralyze.") .defineInRange("basiliskModeCooldownSeconds", 7.0D, 0.0D, 3600.0D); + BIG_BERTHA_LUCID_INVERTED_DURATION_SECONDS = b.comment("How long Lucid mode's inversion lasts on a target, in seconds.") .defineInRange("lucidModeInvertedDurationSeconds", 3.0D, 0.0D, 3600.0D); + BIG_BERTHA_LUCID_INVERTED_DAMAGE_BONUS_PERCENT = b.comment("Bonus damage percent from Lucid mode while the wielder is inverted.") .defineInRange("lucidModeInvertedDamageBonusPercent", 25.0D, 0.0D, 1000.0D); + b.pop(); + + b.push("attitudeAdjuster"); + ATTITUDE_ADJUSTER_BASE_DAMAGE = b.comment("Base attack damage of the Attitude Adjuster.").defineInRange("baseDamage", 47.0D, 0.0D, 4096.0D); + ATTITUDE_ADJUSTER_BREAKS_BLOCKS = b.comment("If true, player ground slams can break a small patch of blocks on impact.").define("breaksBlocks", true); + b.pop(); + + b.push("krakensGrasp"); + KRAKENS_GRASP_ATTACK_DAMAGE = b.comment("Melee attack damage of Kraken's Grasp.") .defineInRange("attackDamage", 16.0D, 0.0D, 4096.0D); + KRAKENS_GRASP_ATTACK_SPEED = b.comment("Attack speed of Kraken's Grasp.") .defineInRange("attackSpeed", -2.9D, -10.0D, 10.0D); + KRAKENS_GRASP_THROWN_DAMAGE = b.comment("Damage dealt when the thrown trident hits an entity.") .defineInRange("thrownDamage", 16.0D, 0.0D, 4096.0D); + KRAKENS_GRASP_LIGHTNING_DAMAGE = b.comment("Bonus damage from the lightning strike on every hit.") .defineInRange("lightningDamage", 6.0D, 0.0D, 4096.0D); + KRAKENS_GRASP_INNATE_LOYALTY = b.comment("Whether Kraken's Grasp automatically returns to its thrower like an enchanted Loyalty trident.").define("innateLoyalty", true); + KRAKENS_GRASP_INNATE_LOYALTY_LEVEL = b.comment("Effective Loyalty level used for the innate return, from 1 to 3.") .defineInRange("innateLoyaltyLevel", 3, 1, 3); + KRAKENS_GRASP_TENTACLE_DURATION_TICKS = b.comment("How long a summoned tentacle lasts, in ticks.") .defineInRange("tentacleDurationTicks", 100, 1, 72000); + KRAKENS_GRASP_TENTACLE_DAMAGE = b.comment("Damage a tentacle deals per damage interval to nearby entities.") .defineInRange("tentacleDamage", 3.0D, 0.0D, 4096.0D); + KRAKENS_GRASP_TENTACLE_RADIUS = b.comment("Radius in blocks around a tentacle that it can grab and damage.") .defineInRange("tentacleRadius", 3.0D, 0.0D, 32.0D); + KRAKENS_GRASP_TENTACLE_DAMAGE_INTERVAL_TICKS = b.comment("How often, in ticks, a tentacle damages nearby entities.") .defineInRange("tentacleDamageIntervalTicks", 20, 1, 2000); + b.pop(); + + b.push("scorpionWhip"); + SCORPION_WHIP_BASE_DAMAGE = b.comment("Base lash damage of the Scorpion Stinger Whip.").defineInRange("baseDamage", 10.0D, 0.0D, 4096.0D); + SCORPION_WHIP_REACH_BONUS = b.comment("Extra entity interaction range in blocks while held in main hand.").defineInRange("reachBonus", 5.0D, 0.0D, 32.0D); + SCORPION_WHIP_POISON_DURATION_TICKS = b.comment("Poison duration applied on lash.").defineInRange("poisonDurationTicks", 100, 0, 20000); + SCORPION_WHIP_TETHER_MAX_RANGE = b.comment("Maximum tether distance before it breaks.").defineInRange("tetherMaxRange", 10.0D, 0.0D, 128.0D); + SCORPION_WHIP_SNAP_BONUS_DAMAGE = b.comment("Bonus damage dealt when snapping the tether free.").defineInRange("snapBonusDamage", 6.0D, 0.0D, 4096.0D); + SCORPION_WHIP_PULL_STRENGTH = b.comment("Pull strength applied to normal tethered targets.").defineInRange("pullStrength", 0.75D, 0.0D, 8.0D); + SCORPION_WHIP_HEAVY_PULL_MULTIPLIER = b.comment("Reduced pull strength applied to heavy targets.").defineInRange("heavyPullMultiplier", 0.25D, 0.0D, 8.0D); + SCORPION_WHIP_SELF_PULL_MULTIPLIER = b.comment("Self-pull strength toward heavy tethered targets.").defineInRange("selfPullMultiplier", 0.45D, 0.0D, 8.0D); + SCORPION_WHIP_REEL_COOLDOWN_TICKS = b.comment("Cooldown after reeling with the whip, in ticks.").defineInRange("reelCooldownTicks", 10, 0, 72000); + SCORPION_WHIP_SNAP_COOLDOWN_TICKS = b.comment("Cooldown after snapping the whip, in ticks.").defineInRange("snapCooldownTicks", 30, 0, 72000); + b.pop(); + + b.push("bloodCrystalKatana"); + BLOOD_CRYSTAL_KATANA_ATTACK_DAMAGE = b.comment("Attack damage of the Blood Crystal Katana.").defineInRange("attackDamage", 7, 0, 1024); + BLOOD_CRYSTAL_KATANA_LAUNCH_STRENGTH = b.comment("Forward launch strength applied to the wielder when the katana hits.").defineInRange("launchStrength", 1.1D, 0.0D, 8.0D); + BLOOD_CRYSTAL_KATANA_TRAIL_DURATION_TICKS = b.comment("How long the crimson trail lingers after a katana hit, in ticks.").defineInRange("trailDurationTicks", 12, 0, 200); + b.pop(); + + + // Nightmare Gear + + b.push("nightmareArmor"); + NIGHTMARE_HELMET_ARMOR_VALUE = b.comment("Armor points of the Nightmare Helmet. (Netherite default: 3)") .defineInRange("helmetArmor", 3, 0, 100); + NIGHTMARE_CHESTPLATE_ARMOR_VALUE = b.comment("Armor points of the Nightmare Chestplate. (Netherite default: 8)") .defineInRange("chestplateArmor", 8, 0, 100); + NIGHTMARE_LEGGINGS_ARMOR_VALUE = b.comment("Armor points of the Nightmare Leggings. (Netherite default: 6)") .defineInRange("leggingsArmor", 6, 0, 100); + NIGHTMARE_BOOTS_ARMOR_VALUE = b.comment("Armor points of the Nightmare Boots. (Netherite default: 3)") .defineInRange("bootsArmor", 3, 0, 100); + NIGHTMARE_HELMET_ARMOR_TOUGHNESS = b.comment("Armor toughness of the Nightmare Helmet.") .defineInRange("helmetToughness", 3.0D, 0.0D, 100.0D); + NIGHTMARE_CHESTPLATE_ARMOR_TOUGHNESS = b.comment("Armor toughness of the Nightmare Chestplate.") .defineInRange("chestplateToughness", 3.0D, 0.0D, 100.0D); + NIGHTMARE_LEGGINGS_ARMOR_TOUGHNESS = b.comment("Armor toughness of the Nightmare Leggings.") .defineInRange("leggingsToughness", 3.0D, 0.0D, 100.0D); + NIGHTMARE_BOOTS_ARMOR_TOUGHNESS = b.comment("Armor toughness of the Nightmare Boots.") .defineInRange("bootsToughness", 3.0D, 0.0D, 100.0D); + NIGHTMARE_ARMOR_KNOCKBACK_RESISTANCE = b.comment("Knockback resistance granted by each Nightmare Armor piece.") .defineInRange("knockbackResistance", 0.1D, 0.0D, 1.0D); + PRIMORDIAL_ARMOR_KNOCKBACK_PER_PIECE = b.comment("Attack knockback added by each Primordial Armor piece.") .defineInRange("primordialArmorKnockbackPerPiece", 0.5D, 0.0D, 16.0D); + NIGHTMARE_ARMOR_DREAD_AURA_RANGE_PER_PIECE = b.comment("Additional Dread aura range added by each Nightmare armor piece.").defineInRange("dreadAuraRangePerPiece", 2.0D, 0.0D, 64.0D); + b.pop(); + + b.push("nightmareSword"); + NIGHTMARE_SWORD_BASE_DAMAGE = b + .comment( + "Base attack damage. Also the minimum damage at full health.", + "Formula: damage = baseDamage * (1 + missingHealthFraction * scalingFactor)" + ) + .defineInRange("baseDamage", 15.0D, 0.0D, 1024.0D); + NIGHTMARE_SWORD_ATTACK_SPEED = b.comment("Attack speed of the Nightmare Sword.").defineInRange("attackSpeed", -2.4D, -10.0D, 10.0D); + NIGHTMARE_SWORD_SCALING_FACTOR = b + .comment( + "How much damage scales with missing health.", + "At 1.0 and 0 HP remaining: damage doubles. At full health: always baseDamage." + ) + .defineInRange("scalingFactor", 1.5D, 0.0D, 100.0D); + b.pop(); + + b.push("fallenKingCrown"); + FALLEN_KING_CROWN_ARMOR_VALUE = b.comment("Armor value of the Fallen King's Crown. Default: 2 (gold helmet).").defineInRange("armorValue", 2, 0, 100); + FALLEN_KING_CROWN_ARMOR_TOUGHNESS = b.comment("Armor toughness of the Fallen King's Crown. Default: 0.0 (gold helmet).").defineInRange("armorToughness", 0.0D, 0.0D, 100.0D); + b.pop(); + + + // Blood Crystal Armor + + b.push("bloodCrystalArmor"); + BLOOD_CRYSTAL_ARMOR_SHIELD_RECHARGE_TICKS = b.comment("Ticks (20/s) for each armor Bloodglass Shield to recharge after shattering. Default: 600 (30s).").defineInRange("armorShieldRechargeTicks", 600, 1, 72000); + BLOOD_CRYSTAL_APPLE_SHIELD_COUNT = b.comment("Number of Bloodglass Shields granted by a Blood Crystal Apple (Bloodglass Ward level). Default: 2.").defineInRange("appleShieldCount", 2, 1, 8); + BLOOD_CRYSTAL_APPLE_DURATION_TICKS = b.comment("Duration in ticks of the Bloodglass Ward effect from a Blood Crystal Apple. Default: 2400 (120s).").defineInRange("appleDurationTicks", 2400, 1, 144000); + BLOOD_CRYSTAL_APPLE_SHIELD_RECHARGE_TICKS = b.comment("Ticks for each apple Bloodglass Shield to recharge while Bloodglass Ward is active. Default: 600 (30s).").defineInRange("appleShieldRechargeTicks", 600, 1, 72000); + BLOOD_CRYSTAL_HARD_MAX_SHIELDS = b.comment("Hard cap on total Bloodglass Shields from all sources combined. Default: 8.").defineInRange("hardMaxShields", 8, 1, 20); + BLOOD_CRYSTAL_HELMET_DEFENSE = b.comment("Armor defense value for Blood Crystal Helmet. Default: 2 (iron).").defineInRange("helmetDefense", 2, 0, 30); + BLOOD_CRYSTAL_CHESTPLATE_DEFENSE = b.comment("Armor defense value for Blood Crystal Chestplate. Default: 6 (iron).").defineInRange("chestplateDefense", 6, 0, 30); + BLOOD_CRYSTAL_LEGGINGS_DEFENSE = b.comment("Armor defense value for Blood Crystal Leggings. Default: 5 (iron).").defineInRange("leggingsDefense", 5, 0, 30); + BLOOD_CRYSTAL_BOOTS_DEFENSE = b.comment("Armor defense value for Blood Crystal Boots. Default: 2 (iron).").defineInRange("bootsDefense", 2, 0, 30); + BLOOD_CRYSTAL_ARMOR_TOUGHNESS = b.comment("Armor toughness for all Blood Crystal armor pieces. Default: 0.0 (iron).").defineInRange("armorToughness", 0.0, 0.0, 20.0); + BLOOD_CRYSTAL_HELMET_DURABILITY = b.comment("Max durability of Blood Crystal Helmet. Default: 77 (gold).").defineInRange("helmetDurability", 77, 1, 2000); + BLOOD_CRYSTAL_CHESTPLATE_DURABILITY = b.comment("Max durability of Blood Crystal Chestplate. Default: 112 (gold).").defineInRange("chestplateDurability", 112, 1, 2000); + BLOOD_CRYSTAL_LEGGINGS_DURABILITY = b.comment("Max durability of Blood Crystal Leggings. Default: 105 (gold).").defineInRange("leggingsDurability", 105, 1, 2000); + BLOOD_CRYSTAL_BOOTS_DURABILITY = b.comment("Max durability of Blood Crystal Boots. Default: 91 (gold).").defineInRange("bootsDurability", 91, 1, 2000); + b.pop(); + + + // Squidzooka + + b.push("squidzooka"); + SQUIDZOOKA_COOLDOWN_SECONDS = b.comment("Cooldown in seconds after firing. Set to 0 to disable.").defineInRange("cooldownSeconds", 1.0D, 0.0D, 3600.0D); + SQUIDZOOKA_LAUNCH_VELOCITY = b.comment("Initial launch velocity applied to the Missile Squid.") .defineInRange("launchVelocity", 2.1D, 0.1D, 20.0D); + b.pop(); + + b.push("rpoLauncher"); + RPO_LAUNCHER_COOLDOWN_SECONDS = b.comment("Cooldown in seconds after firing. Set to 0 to disable.").defineInRange("cooldownSeconds", 1.0D, 0.0D, 3600.0D); + RPO_LAUNCHER_LAUNCH_VELOCITY = b.comment("Initial launch velocity applied to the Octopus Bomb.") .defineInRange("launchVelocity", 2.1D, 0.1D, 20.0D); + RPO_LAUNCHER_EXPLOSION_DAMAGE = b.comment("Max damage dealt at the center of the ink explosion.") .defineInRange("explosionDamage", 14.0D, 0.0D, 4096.0D); + RPO_LAUNCHER_EXPLOSION_RADIUS = b.comment("Radius in blocks of the ink explosion.") .defineInRange("explosionRadius", 4.0D, 0.5D, 32.0D); + b.pop(); + + + // Size Rays + + b.push("sizeRays"); + SIZE_CHANGING_RAYS_ENABLED = b + .comment( + "If false, shrink and grow rays cannot be fired by players or dispensers.", + "Immune entities tag: data/antarchy/tags/entity_types/size_changing_immune.json" + ) + .define("enabled", true); + SIZE_RAY_COOLDOWN_SECONDS = b.comment("Cooldown in seconds after firing. Set to 0 to disable.") .defineInRange("cooldownSeconds", 1.0D, 0.0D, 3600.0D); + SIZE_RAY_MIN_SCALE = b.comment("Minimum entity scale the shrink ray can reach. 1.0 is normal size.") .defineInRange("minScale", 0.1D, 0.01D, 64.0D); + SIZE_RAY_MAX_SCALE = b.comment("Maximum entity scale the growth ray can reach. 1.0 is normal size.") .defineInRange("maxScale", 5.0D, 0.01D, 64.0D); + SIZE_RAY_DELTA_PER_HIT = b.comment("Scale delta per projectile hit. 0.25 changes scale by 25% of normal per hit.") .defineInRange("deltaPerHit", 0.25D, 0.001D, 64.0D); + SHRINKING_POTION_DELTA = b.comment("Scale delta per level of Shrinking Potion. Level II applies double this value.") .defineInRange("shrinkingPotionDelta", 0.3D, 0.001D, 64.0D); + GROWTH_POTION_DELTA = b.comment("Scale delta per level of Growth Potion. Level II applies double this value.") .defineInRange("growthPotionDelta", 0.5D, 0.001D, 64.0D); + b.pop(); + + + // Gravity + + b.push("gravity"); + INVERT_PROJECTILES_FROM_INVERTED_PLAYERS = b + .comment( + "If true, projectiles fired by inverted players keep their inverted launch and gravity.", + "Affects bows, crossbows, throwables, and firework boosts." + ) + .define("invertProjectilesFromInvertedPlayers", false); + b.pop(); + + + // Gravity Gun + + b.push("gravityGun"); + GRAVITY_GUN_ENABLED = b.comment("Master toggle for the Gravity Gun.") .define("enabled", true); + GRAVITY_GUN_BLOCKS_ENABLED = b.comment("If false, the Gravity Gun cannot grab blocks.") .define("blocksEnabled", true); + GRAVITY_GUN_ENTITIES_ENABLED = b.comment("If false, the Gravity Gun cannot grab entities.") .define("entitiesEnabled", true); + GRAVITY_GUN_RANGE = b.comment("Search range for a target in blocks.") .defineInRange("range", 16.0D, 1.0D, 64.0D); + GRAVITY_GUN_THROW_STRENGTH = b.comment("Velocity multiplier when throwing a held target.") .defineInRange("throwStrength", 1.8D, 0.1D, 10.0D); + GRAVITY_GUN_BLAST_STRENGTH = b.comment("Velocity multiplier for the push blast.") .defineInRange("blastStrength", 1.4D, 0.1D, 10.0D); + GRAVITY_GUN_COOLDOWN_SECONDS = b.comment("Cooldown in seconds after any Gravity Gun action.") .defineInRange("cooldownSeconds", 0.35D, 0.0D, 10.0D); + GRAVITY_GUN_MAX_HOLD_DISTANCE = b.comment("Maximum distance a held target can be pushed from the player, in blocks.") .defineInRange("maxHoldDistance", 10.0D, 1.5D, 64.0D); + b.pop(); + + + // Critter Cage + + b.push("critterCage"); + CRITTER_CAGE_MAX_CAPTURABLE_WIDTH = b.comment("Maximum capturable entity width/depth based on the live hitbox, in blocks.").defineInRange("maxCapturableWidth", 1.65D, 0.1D, 64.0D); + CRITTER_CAGE_MAX_CAPTURABLE_HEIGHT = b.comment("Maximum capturable entity height based on the live hitbox, in blocks.").defineInRange("maxCapturableHeight", 1.65D, 0.1D, 64.0D); + b.pop(); + + + // Miner's Dream + + b.push("minersDream"); + MINERS_DREAM_ENABLED = b.comment("Master toggle. If false, the item remains craftable but cannot be used.").define("enabled", true); + MINERS_DREAM_MINIMUM_RANGE = b.comment("Minimum cave length in blocks. Clamped to [8, 256].") .defineInRange("minimumRange", 48, 8, 256); + MINERS_DREAM_MAXIMUM_RANGE = b.comment("Maximum cave length in blocks. Clamped to [8, 256].") .defineInRange("maximumRange", 96, 8, 256); + MINERS_DREAM_TORCH_SPACING = b.comment("Approximate blocks between torch placements along the cave.") .defineInRange("torchSpacing", 10, 4, 64); + MINERS_DREAM_BLOCKS_PER_TICK = b.comment("Maximum blocks removed per server tick while excavating.") .defineInRange("blocksPerTick", 150, 1, 2000); + b.pop(); + + + // Miscellaneous items / consumables + + b.push("ductTape"); + DUCT_TAPE_REPAIR_PERCENT_PER_USE = b + .comment("Fraction of max durability repaired per use. 0.25 = 25% per application.") + .defineInRange("repairPercentPerUse", 0.25D, 0.0D, 1.0D); + b.pop(); + + b.push("potentNyxite"); + POTENT_NYXITE_INVERTED_DURATION_SECONDS = b + .comment("How long the Inverted effect from Potent Nyxite eruptions lasts, in seconds.") + .defineInRange("invertedDurationSeconds", 60.0D, 0.0D, 3600.0D); + b.pop(); + + b.push("corneaEar"); + CORNEA_EAR_NIGHT_VISION_SECONDS = b + .comment("How long Cornea Ear grants Night Vision after being eaten, in seconds.") + .defineInRange("nightVisionSeconds", 15, 0, 600); + b.pop(); + + b.push("american"); + AMERICAN_ENABLED = b.comment("If false, foods cannot be Americanized with High Fructose Corn Syrup.").define("enabled", true); + AMERICAN_BONUS_NUTRITION = b.comment("Extra hunger points restored when eating an Americanized food.").defineInRange("bonusNutrition", 2, 0, 100); + AMERICAN_BONUS_SATURATION = b.comment("Extra saturation restored when eating an Americanized food.").defineInRange("bonusSaturation", 1.0D, 0.0D, 100.0D); + AMERICAN_REGENERATION_DURATION_TICKS = b.comment("Duration of the Regeneration effect granted when eating an Americanized food, in ticks.").defineInRange("regenerationDurationTicks", 60, 0, 72000); + AMERICAN_REGENERATION_AMPLIFIER = b.comment("Amplifier of the Regeneration effect granted when eating an Americanized food (0 = I).").defineInRange("regenerationAmplifier", 0, 0, 10); + b.pop(); + + b.push("moggles"); + MOGGLES_VISION_RADIUS = b.comment("Radius used by Moggles cave detection.").defineInRange("visionRadius", 20.0D, 1.0D, 128.0D); + MOGGLES_VISION_MAX_LIGHT = b.comment("Maximum block light level counted as dark enough for Moggles.").defineInRange("visionMaxLight", 7, 0, 15); + MOGGLES_VISION_ALPHA = b.comment("Overlay alpha used by Moggles vision rendering.").defineInRange("visionAlpha", 0.65D, 0.0D, 1.0D); + b.pop(); + + SPEC = b.build(); + } + + private AntarchyToolsConfig() {} + + static double basiliskDaggerAttackDamage() { return BASILISK_DAGGER_ATTACK_DAMAGE.get(); } + static double basiliskDaggerAttackSpeed() { return BASILISK_DAGGER_ATTACK_SPEED.get(); } + static int basiliskDaggerPoisonDurationTicks() { return BASILISK_DAGGER_POISON_DURATION_TICKS.get(); } + static int basiliskDaggerPoisonAmplifier() { return BASILISK_DAGGER_POISON_AMPLIFIER.get(); } + + static double ultimateSwordAttackDamage() { return ULTIMATE_SWORD_ATTACK_DAMAGE.get(); } + static double ultimateSwordAttackSpeed() { return ULTIMATE_SWORD_ATTACK_SPEED.get(); } + static double ultimatePickaxeAttackDamage() { return ULTIMATE_PICKAXE_ATTACK_DAMAGE.get(); } + static double ultimatePickaxeAttackSpeed() { return ULTIMATE_PICKAXE_ATTACK_SPEED.get(); } + static double ultimateAxeAttackDamage() { return ULTIMATE_AXE_ATTACK_DAMAGE.get(); } + static double ultimateAxeAttackSpeed() { return ULTIMATE_AXE_ATTACK_SPEED.get(); } + static double ultimateShovelAttackDamage() { return ULTIMATE_SHOVEL_ATTACK_DAMAGE.get(); } + static double ultimateShovelAttackSpeed() { return ULTIMATE_SHOVEL_ATTACK_SPEED.get(); } + static double ultimateHoeAttackDamage() { return ULTIMATE_HOE_ATTACK_DAMAGE.get(); } + static double ultimateHoeAttackSpeed() { return ULTIMATE_HOE_ATTACK_SPEED.get(); } + static int ultimateToolEnchantability() { return ULTIMATE_TOOL_ENCHANTABILITY.get(); } + static boolean ultimateToolsThreeByThreeEnabled() { return ULTIMATE_TOOLS_THREE_BY_THREE_ENABLED.get(); } + + static double ultimateBowAttackDamage() { return ULTIMATE_BOW_ATTACK_DAMAGE.get(); } + static double ultimateBowPlayerHeal() { return ULTIMATE_BOW_PLAYER_HEAL.get(); } + static double ultimateBowDrawSpeedMultiplier() { return ULTIMATE_BOW_DRAW_SPEED_MULTIPLIER.get(); } + static boolean ultimateBowComesEnchantedWithFlame() { return ULTIMATE_BOW_COMES_ENCHANTED_WITH_FLAME.get(); } + static int ultimateBowEnchantability() { return ULTIMATE_BOW_ENCHANTABILITY.get(); } + + static double ultimateCrossbowAttackDamage() { return ULTIMATE_CROSSBOW_ATTACK_DAMAGE.get(); } + static double ultimateCrossbowChargeSpeedMultiplier() { return ULTIMATE_CROSSBOW_CHARGE_SPEED_MULTIPLIER.get(); } + static int ultimateCrossbowEnchantability() { return ULTIMATE_CROSSBOW_ENCHANTABILITY.get(); } + + static double ultimateMaceDamageMultiplier() { return ULTIMATE_MACE_DAMAGE_MULTIPLIER.get(); } + static double ultimateMaceAttackSpeed() { return ULTIMATE_MACE_ATTACK_SPEED.get(); } + static int ultimateMaceEnchantability() { return ULTIMATE_MACE_ENCHANTABILITY.get(); } + + static boolean ultimateArmorComesEnchanted() { return ULTIMATE_ARMOR_COMES_ENCHANTED.get(); } + static int ultimateArmorEnchantability() { return ULTIMATE_ARMOR_ENCHANTABILITY.get(); } + static int ultimateHelmetArmorValue() { return ULTIMATE_HELMET_ARMOR_VALUE.get(); } + static int ultimateChestplateArmorValue() { return ULTIMATE_CHESTPLATE_ARMOR_VALUE.get(); } + static int ultimateLeggingsArmorValue() { return ULTIMATE_LEGGINGS_ARMOR_VALUE.get(); } + static int ultimateBootsArmorValue() { return ULTIMATE_BOOTS_ARMOR_VALUE.get(); } + static double ultimateHelmetArmorToughness() { return ULTIMATE_HELMET_ARMOR_TOUGHNESS.get(); } + static double ultimateChestplateArmorToughness() { return ULTIMATE_CHESTPLATE_ARMOR_TOUGHNESS.get(); } + static double ultimateLeggingsArmorToughness() { return ULTIMATE_LEGGINGS_ARMOR_TOUGHNESS.get(); } + static double ultimateBootsArmorToughness() { return ULTIMATE_BOOTS_ARMOR_TOUGHNESS.get(); } + static double ultimateArmorKnockbackResistance() { return ULTIMATE_ARMOR_KNOCKBACK_RESISTANCE.get(); } + + static double battleAxeAttackDamage() { return BATTLE_AXE_ATTACK_DAMAGE.get(); } + static double battleAxeAttackSpeed() { return BATTLE_AXE_ATTACK_SPEED.get(); } + + static double bigBerthaAttackDamage() { return BIG_BERTHA_ATTACK_DAMAGE.get(); } + static double bigBerthaReachBonus() { return BIG_BERTHA_REACH_BONUS.get(); } + static double bigBerthaAttackSpeed() { return BIG_BERTHA_ATTACK_SPEED.get(); } + static double attitudeAdjusterBaseDamage() { return ATTITUDE_ADJUSTER_BASE_DAMAGE.get(); } + static boolean attitudeAdjusterBreaksBlocks() { return ATTITUDE_ADJUSTER_BREAKS_BLOCKS.get(); } + static int bigBerthaBasiliskParalyzeDurationTicks() { return BIG_BERTHA_BASILISK_PARALYZE_DURATION_TICKS.get(); } + static int bigBerthaKrakenSlowTicks() { return BIG_BERTHA_KRAKEN_SLOW_TICKS.get(); } + static double bigBerthaBasiliskCooldownSeconds() { return BIG_BERTHA_BASILISK_COOLDOWN_SECONDS.get(); } + static double bigBerthaLucidInvertedDurationSeconds() { return BIG_BERTHA_LUCID_INVERTED_DURATION_SECONDS.get(); } + static double bigBerthaLucidInvertedDamageBonusPercent(){ return BIG_BERTHA_LUCID_INVERTED_DAMAGE_BONUS_PERCENT.get(); } + + static double krakensGraspAttackDamage() { return KRAKENS_GRASP_ATTACK_DAMAGE.get(); } + static double krakensGraspAttackSpeed() { return KRAKENS_GRASP_ATTACK_SPEED.get(); } + static double krakensGraspThrownDamage() { return KRAKENS_GRASP_THROWN_DAMAGE.get(); } + static double krakensGraspLightningDamage() { return KRAKENS_GRASP_LIGHTNING_DAMAGE.get(); } + static boolean krakensGraspInnateLoyalty() { return KRAKENS_GRASP_INNATE_LOYALTY.get(); } + static int krakensGraspInnateLoyaltyLevel() { return KRAKENS_GRASP_INNATE_LOYALTY_LEVEL.get(); } + static int krakensGraspTentacleDurationTicks() { return KRAKENS_GRASP_TENTACLE_DURATION_TICKS.get(); } + static double krakensGraspTentacleDamage() { return KRAKENS_GRASP_TENTACLE_DAMAGE.get(); } + static double krakensGraspTentacleRadius() { return KRAKENS_GRASP_TENTACLE_RADIUS.get(); } + static int krakensGraspTentacleDamageIntervalTicks() { return KRAKENS_GRASP_TENTACLE_DAMAGE_INTERVAL_TICKS.get(); } + static double scorpionWhipBaseDamage() { return SCORPION_WHIP_BASE_DAMAGE.get(); } + static double scorpionWhipReachBonus() { return SCORPION_WHIP_REACH_BONUS.get(); } + static int scorpionWhipPoisonDurationTicks() { return SCORPION_WHIP_POISON_DURATION_TICKS.get(); } + static double scorpionWhipTetherMaxRange() { return SCORPION_WHIP_TETHER_MAX_RANGE.get(); } + static double scorpionWhipSnapBonusDamage() { return SCORPION_WHIP_SNAP_BONUS_DAMAGE.get(); } + static double scorpionWhipPullStrength() { return SCORPION_WHIP_PULL_STRENGTH.get(); } + static double scorpionWhipHeavyPullMultiplier() { return SCORPION_WHIP_HEAVY_PULL_MULTIPLIER.get(); } + static double scorpionWhipSelfPullMultiplier() { return SCORPION_WHIP_SELF_PULL_MULTIPLIER.get(); } + static int scorpionWhipReelCooldownTicks() { return SCORPION_WHIP_REEL_COOLDOWN_TICKS.get(); } + static int scorpionWhipSnapCooldownTicks() { return SCORPION_WHIP_SNAP_COOLDOWN_TICKS.get(); } + static int bloodCrystalKatanaAttackDamage() { return BLOOD_CRYSTAL_KATANA_ATTACK_DAMAGE.get(); } + static double bloodCrystalKatanaLaunchStrength() { return BLOOD_CRYSTAL_KATANA_LAUNCH_STRENGTH.get(); } + static int bloodCrystalKatanaTrailDurationTicks() { return BLOOD_CRYSTAL_KATANA_TRAIL_DURATION_TICKS.get(); } + + static int nightmareHelmetArmorValue() { return NIGHTMARE_HELMET_ARMOR_VALUE.get(); } + static int nightmareChestplateArmorValue() { return NIGHTMARE_CHESTPLATE_ARMOR_VALUE.get(); } + static int nightmareLeggingsArmorValue() { return NIGHTMARE_LEGGINGS_ARMOR_VALUE.get(); } + static int nightmareBootsArmorValue() { return NIGHTMARE_BOOTS_ARMOR_VALUE.get(); } + static double nightmareHelmetArmorToughness() { return NIGHTMARE_HELMET_ARMOR_TOUGHNESS.get(); } + static double nightmareChestplateArmorToughness() { return NIGHTMARE_CHESTPLATE_ARMOR_TOUGHNESS.get(); } + static double nightmareLeggingsArmorToughness() { return NIGHTMARE_LEGGINGS_ARMOR_TOUGHNESS.get(); } + static double nightmareBootsArmorToughness() { return NIGHTMARE_BOOTS_ARMOR_TOUGHNESS.get(); } + static double nightmareArmorKnockbackResistance() { return NIGHTMARE_ARMOR_KNOCKBACK_RESISTANCE.get(); } + static double primordialArmorKnockbackPerPiece() { return PRIMORDIAL_ARMOR_KNOCKBACK_PER_PIECE.get(); } + static double nightmareArmorDreadAuraRangePerPiece() { return NIGHTMARE_ARMOR_DREAD_AURA_RANGE_PER_PIECE.get(); } + static double nightmareSwordBaseDamage() { return NIGHTMARE_SWORD_BASE_DAMAGE.get(); } + static double nightmareSwordAttackSpeed() { return NIGHTMARE_SWORD_ATTACK_SPEED.get(); } + static double nightmareSwordScalingFactor() { return NIGHTMARE_SWORD_SCALING_FACTOR.get(); } + + static int fallenKingCrownArmorValue() { return FALLEN_KING_CROWN_ARMOR_VALUE.get(); } + static double fallenKingCrownArmorToughness() { return FALLEN_KING_CROWN_ARMOR_TOUGHNESS.get(); } + + static int bloodCrystalArmorShieldRechargeTicks() { return BLOOD_CRYSTAL_ARMOR_SHIELD_RECHARGE_TICKS.get(); } + static int bloodCrystalAppleShieldCount() { return BLOOD_CRYSTAL_APPLE_SHIELD_COUNT.get(); } + static int bloodCrystalAppleDurationTicks() { return BLOOD_CRYSTAL_APPLE_DURATION_TICKS.get(); } + static int bloodCrystalAppleShieldRechargeTicks() { return BLOOD_CRYSTAL_APPLE_SHIELD_RECHARGE_TICKS.get(); } + static int bloodCrystalHardMaxShields() { return BLOOD_CRYSTAL_HARD_MAX_SHIELDS.get(); } + static int bloodCrystalHelmetDefense() { return BLOOD_CRYSTAL_HELMET_DEFENSE.get(); } + static int bloodCrystalChestplateDefense() { return BLOOD_CRYSTAL_CHESTPLATE_DEFENSE.get(); } + static int bloodCrystalLeggingsDefense() { return BLOOD_CRYSTAL_LEGGINGS_DEFENSE.get(); } + static int bloodCrystalBootsDefense() { return BLOOD_CRYSTAL_BOOTS_DEFENSE.get(); } + static double bloodCrystalArmorToughness() { return BLOOD_CRYSTAL_ARMOR_TOUGHNESS.get(); } + static int bloodCrystalHelmetDurability() { return BLOOD_CRYSTAL_HELMET_DURABILITY.get(); } + static int bloodCrystalChestplateDurability() { return BLOOD_CRYSTAL_CHESTPLATE_DURABILITY.get(); } + static int bloodCrystalLeggingsDurability() { return BLOOD_CRYSTAL_LEGGINGS_DURABILITY.get(); } + static int bloodCrystalBootsDurability() { return BLOOD_CRYSTAL_BOOTS_DURABILITY.get(); } + + static double squidzookaCooldownSeconds() { return SQUIDZOOKA_COOLDOWN_SECONDS.get(); } + static double squidzookaLaunchVelocity() { return SQUIDZOOKA_LAUNCH_VELOCITY.get(); } + static double rpoLauncherCooldownSeconds() { return RPO_LAUNCHER_COOLDOWN_SECONDS.get(); } + static double rpoLauncherLaunchVelocity() { return RPO_LAUNCHER_LAUNCH_VELOCITY.get(); } + static double rpoLauncherExplosionDamage() { return RPO_LAUNCHER_EXPLOSION_DAMAGE.get(); } + static double rpoLauncherExplosionRadius() { return RPO_LAUNCHER_EXPLOSION_RADIUS.get(); } + + static boolean sizeChangingRaysEnabled() { return SIZE_CHANGING_RAYS_ENABLED.get(); } + static double sizeRayCooldownSeconds() { return SIZE_RAY_COOLDOWN_SECONDS.get(); } + static double sizeRayMinScale() { return SIZE_RAY_MIN_SCALE.get(); } + static double sizeRayMaxScale() { return SIZE_RAY_MAX_SCALE.get(); } + static double sizeRayDeltaPerHit() { return SIZE_RAY_DELTA_PER_HIT.get(); } + static double shrinkingPotionDelta() { return SHRINKING_POTION_DELTA.get(); } + static double growthPotionDelta() { return GROWTH_POTION_DELTA.get(); } + + static boolean invertProjectilesFromInvertedPlayers() { return INVERT_PROJECTILES_FROM_INVERTED_PLAYERS.get(); } + + static boolean gravityGunEnabled() { return GRAVITY_GUN_ENABLED.get(); } + static boolean gravityGunBlocksEnabled() { return GRAVITY_GUN_BLOCKS_ENABLED.get(); } + static boolean gravityGunEntitiesEnabled() { return GRAVITY_GUN_ENTITIES_ENABLED.get(); } + static double gravityGunRange() { return GRAVITY_GUN_RANGE.get(); } + static double gravityGunThrowStrength() { return GRAVITY_GUN_THROW_STRENGTH.get(); } + static double gravityGunBlastStrength() { return GRAVITY_GUN_BLAST_STRENGTH.get(); } + static double gravityGunCooldownSeconds() { return GRAVITY_GUN_COOLDOWN_SECONDS.get(); } + static double gravityGunMaxHoldDistance() { return GRAVITY_GUN_MAX_HOLD_DISTANCE.get(); } + + static double critterCageMaxCapturableWidth() { return CRITTER_CAGE_MAX_CAPTURABLE_WIDTH.get(); } + static double critterCageMaxCapturableHeight() { return CRITTER_CAGE_MAX_CAPTURABLE_HEIGHT.get(); } + + static boolean minersDreamEnabled() { return MINERS_DREAM_ENABLED.get(); } + static int minersDreamMinimumRange() { return MINERS_DREAM_MINIMUM_RANGE.get(); } + static int minersDreamMaximumRange() { return MINERS_DREAM_MAXIMUM_RANGE.get(); } + static int minersDreamTorchSpacing() { return MINERS_DREAM_TORCH_SPACING.get(); } + static int minersDreamBlocksPerTick() { return MINERS_DREAM_BLOCKS_PER_TICK.get(); } + + static double ductTapeRepairPercentPerUse() { return DUCT_TAPE_REPAIR_PERCENT_PER_USE.get(); } + static double potentNyxiteInvertedDurationSeconds() { return POTENT_NYXITE_INVERTED_DURATION_SECONDS.get(); } + static int corneaEarNightVisionSeconds() { return CORNEA_EAR_NIGHT_VISION_SECONDS.get(); } + static boolean americanizingEnabled() { return AMERICAN_ENABLED.get(); } + static int americanBonusNutrition() { return AMERICAN_BONUS_NUTRITION.get(); } + static double americanBonusSaturation() { return AMERICAN_BONUS_SATURATION.get(); } + static int americanRegenerationDurationTicks() { return AMERICAN_REGENERATION_DURATION_TICKS.get(); } + static int americanRegenerationAmplifier() { return AMERICAN_REGENERATION_AMPLIFIER.get(); } + static double mogglesVisionRadius() { return MOGGLES_VISION_RADIUS.get(); } + static int mogglesVisionMaxLight() { return MOGGLES_VISION_MAX_LIGHT.get(); } + static double mogglesVisionAlpha() { return MOGGLES_VISION_ALPHA.get(); } + + +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyWoodTypes.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyWoodTypes.java new file mode 100644 index 00000000..5718d4fe --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/AntarchyWoodTypes.java @@ -0,0 +1,17 @@ +package com.craisinlord.antarchy.forge; + +import com.craisinlord.antarchy.Antarchy; +import net.minecraft.world.level.block.state.properties.BlockSetType; +import net.minecraft.world.level.block.state.properties.WoodType; + +public final class AntarchyWoodTypes { + public static final WoodType OURANWOOD = register("ouranwood"); + public static final WoodType PEACH = register("peach"); + + private AntarchyWoodTypes() { + } + + private static WoodType register(String name) { + return WoodType.register(new WoodType(Antarchy.MODID + ":" + name, BlockSetType.JUNGLE)); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/ForgeInfinityCompat.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/ForgeInfinityCompat.java new file mode 100644 index 00000000..afc8da37 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/ForgeInfinityCompat.java @@ -0,0 +1,37 @@ +package com.craisinlord.antarchy.forge; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.compat.infinity.InfinityCompatBridge; +import net.lerariemann.infinity.util.InfinityMethods; +import net.lerariemann.infinity.util.teleport.WarpLogic; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.RandomSource; + +public final class ForgeInfinityCompat implements InfinityCompatBridge { + @Override + public boolean isAvailable() { + return true; + } + + @Override + public ResourceLocation getRandomDimensionId(RandomSource random) { + try { + return InfinityMethods.getRandomId(random); + } catch (Throwable throwable) { + Antarchy.LOGGER.error("[Antarchy] Failed to get a random Infinity dimension id", throwable); + return null; + } + } + + @Override + public boolean requestWarp(ServerPlayer player, ResourceLocation dimensionId) { + try { + WarpLogic.requestWarp(player, dimensionId, false); + return true; + } catch (Throwable throwable) { + Antarchy.LOGGER.error("[Antarchy] Failed to request an Infinity warp to {}", dimensionId, throwable); + return false; + } + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/AntarchyForgeClient.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/AntarchyForgeClient.java new file mode 100644 index 00000000..9bf95f87 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/AntarchyForgeClient.java @@ -0,0 +1,489 @@ +package com.craisinlord.antarchy.forge.client; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.client.GoopedHudRenderer; +import com.craisinlord.antarchy.content.client.HordeHudRenderer; +import com.craisinlord.antarchy.content.client.hud.BloodglassHudRenderer; +import com.craisinlord.antarchy.content.client.particle.*; +import com.craisinlord.antarchy.content.client.renderer.*; +import com.craisinlord.antarchy.content.client.renderer.CreepingHorrorRenderer; +import com.craisinlord.antarchy.content.client.renderer.LurkingTerrorRenderer; +import com.craisinlord.antarchy.forge.AntarchyForgeFluidTypes; +import com.craisinlord.antarchy.forge.registry.AntarchyForgeBlocks; +import com.craisinlord.antarchy.forge.registry.AntarchyForgeEntites; +import com.craisinlord.antarchy.forge.registry.AntarchyForgeItems; +import com.craisinlord.antarchy.forge.registry.AntarchyForgeMisc; +import com.mojang.blaze3d.shaders.FogShape; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.BoatModel; +import net.minecraft.client.model.ArmorStandModel; +import net.minecraft.client.model.ChestBoatModel; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.entity.ThrownItemRenderer; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import software.bernie.geckolib.renderer.GeoEntityRenderer; +import net.minecraft.client.Camera; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.BiomeColors; +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.client.renderer.ItemBlockRenderTypes; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.blockentity.CampfireRenderer; +import net.minecraft.client.renderer.entity.ArmorStandRenderer; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.item.ItemProperties; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.item.CrossbowItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.FoliageColor; +import net.minecraft.world.level.material.FluidState; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.client.event.RegisterParticleProvidersEvent; +import net.minecraftforge.client.event.RegisterColorHandlersEvent; +import net.minecraftforge.client.event.EntityRenderersEvent; +import net.minecraftforge.client.event.RegisterGuiOverlaysEvent; +import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import net.minecraftforge.client.model.DynamicFluidContainerModel; +import org.joml.Vector3f; +import software.bernie.geckolib.core.animatable.GeoAnimatable; +import com.craisinlord.antarchy.content.client.AntarchyGeoItem; +import com.craisinlord.antarchy.content.client.AntarchyGeoItemRenderer; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) +public final class AntarchyForgeClient { + private static final ResourceLocation DR_TRAYAURUS_TEXTURE = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/dr_trayaurus.png"); + private static final ResourceLocation OURANWOOD_BOAT_TEXTURE = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/boat/ouranwood.png"); + private static final ResourceLocation OURANWOOD_CHEST_BOAT_TEXTURE = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/chest_boat/ouranwood.png"); + private static final ResourceLocation PEACH_BOAT_TEXTURE = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/boat/peach.png"); + private static final ResourceLocation PEACH_CHEST_BOAT_TEXTURE = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/entity/chest_boat/peach.png"); + private static final ResourceLocation WATER_STILL = ResourceLocation.withDefaultNamespace("block/water_still"); + private static final ResourceLocation WATER_FLOW = ResourceLocation.withDefaultNamespace("block/water_flow"); + private static final ResourceLocation WATER_OVERLAY = ResourceLocation.withDefaultNamespace("block/water_overlay"); + private static final ResourceLocation UNDERWATER_OVERLAY = ResourceLocation.withDefaultNamespace("textures/misc/underwater.png"); + private static final ResourceLocation ANTIWATER_STILL = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "block/antiwater_still"); + private static final ResourceLocation ANTIWATER_FLOW = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "block/antiwater_flow"); + private static final ResourceLocation BILE_STILL = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "block/bile/bile_still"); + private static final ResourceLocation BILE_FLOW = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "block/bile/bile_flowing"); + private AntarchyForgeClient() { + } + + @SubscribeEvent + public static void registerRenderers(EntityRenderersEvent.RegisterRenderers event) { + event.registerBlockEntityRenderer(AntarchyForgeBlocks.DREAM_CAMPFIRE_BLOCK_ENTITY.get(), CampfireRenderer::new); + event.registerBlockEntityRenderer(AntarchyForgeBlocks.SEASHELL_BLOCK_ENTITY.get(), SeashellRenderer::new); + event.registerBlockEntityRenderer(AntarchyForgeBlocks.CRITTER_CAGE_BLOCK_ENTITY.get(), CritterCageRenderer::new); + event.registerEntityRenderer(AntarchyForgeEntites.EASTER_BUNNY.get(), context -> withParalyzedGeoLayer(new EasterBunnyRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.FLYING_SQUIRREL.get(), context -> withParalyzedGeoLayer(new FlyingSquirrelRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.CATERPILLAR.get(), context -> withParalyzedGeoLayer(new CaterpillarRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.BUTTERFLY.get(), context -> withParalyzedGeoLayer(new ButterflyRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.REVERIE.get(), context -> withParalyzedGeoLayer(new ReverieRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.BRUTALFLY.get(), context -> withParalyzedGeoLayer(new BrutalflyRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.RED_ANT.get(), context -> withParalyzedGeoLayer(new AntRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.BROWN_ANT.get(), context -> withParalyzedGeoLayer(new AntRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.RAINBOW_ANT.get(), context -> withParalyzedGeoLayer(new AntRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.MOLEWORM.get(), context -> withParalyzedGeoLayer(new MolewormRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.MANTIS.get(), context -> withParalyzedGeoLayer(new MantisRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.ALPHA_MANTIS.get(), context -> withParalyzedGeoLayer(new AlphaMantisRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.MOLEVORE.get(), context -> withParalyzedGeoLayer(new MolevoreRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.TRIFFID.get(), context -> withParalyzedGeoLayer(new TriffidRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.OURANWOOD_BOAT_ENTITY.get(), context -> new OuranwoodBoatRenderer<>(context, OURANWOOD_BOAT_TEXTURE, false)); + event.registerEntityRenderer(AntarchyForgeEntites.OURANWOOD_CHEST_BOAT_ENTITY.get(), context -> new OuranwoodBoatRenderer<>(context, OURANWOOD_CHEST_BOAT_TEXTURE, true)); + event.registerEntityRenderer(AntarchyForgeEntites.PEACH_BOAT_ENTITY.get(), context -> new PeachBoatRenderer<>(context, PEACH_BOAT_TEXTURE, false)); + event.registerEntityRenderer(AntarchyForgeEntites.PEACH_CHEST_BOAT_ENTITY.get(), context -> new PeachBoatRenderer<>(context, PEACH_CHEST_BOAT_TEXTURE, true)); + event.registerEntityRenderer(AntarchyForgeEntites.APPLE_COW.get(), context -> withParalyzedGeoLayer(new AppleCowRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.GOLDEN_APPLE_COW.get(), context -> withParalyzedGeoLayer(new AppleCowRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.ENCHANTED_GOLDEN_APPLE_COW.get(), context -> withParalyzedGeoLayer(new AppleCowRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.DIAMOND_MINECART.get(), DiamondMinecartRenderer::new); + event.registerEntityRenderer(AntarchyForgeEntites.DR_TRAYAURUS.get(), context -> new DrTrayaurusRenderer(context, DR_TRAYAURUS_TEXTURE)); + event.registerEntityRenderer(AntarchyForgeEntites.CLOUD_SHARK.get(), context -> withParalyzedGeoLayer(new CloudSharkRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.KRAKEN.get(), context -> withParalyzedGeoLayer(new KrakenRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.TENTACLE.get(), com.craisinlord.antarchy.content.client.renderer.TentacleRenderer::new); + event.registerEntityRenderer(AntarchyForgeEntites.KRAKENS_GRASP_TRIDENT.get(), com.craisinlord.antarchy.content.client.renderer.KrakensGraspThrownTridentRenderer::new); + event.registerEntityRenderer(AntarchyForgeEntites.MISSILE_SQUID.get(), context -> withParalyzedGeoLayer(new MissileSquidRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.OCTOPUS_BOMB.get(), context -> withParalyzedGeoLayer(new OctopusBombRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.NIGHTMARE.get(), context -> withParalyzedGeoLayer(new NightmareRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.LUCID.get(), context -> withParalyzedGeoLayer(new LucidRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.BED_BUG.get(), context -> withParalyzedGeoLayer(new BedBugRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.WASP.get(), context -> withParalyzedGeoLayer(new WaspRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.BOMBER.get(), context -> withParalyzedGeoLayer(new BomberRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.BASILISK.get(), context -> withParalyzedGeoLayer(new BasiliskRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.SHRINK_RAY_PROJECTILE.get(), SizeRayProjectileRenderer::new); + event.registerEntityRenderer(AntarchyForgeEntites.GROWTH_RAY_PROJECTILE.get(), SizeRayProjectileRenderer::new); + event.registerEntityRenderer(AntarchyForgeEntites.LUCID_BOLT.get(), LucidBoltRenderer::new); + event.registerEntityRenderer(AntarchyForgeEntites.LUCID_PEARL_PROJECTILE.get(), ThrownItemRenderer::new); + event.registerEntityRenderer(AntarchyForgeEntites.CRITTER_CAGE_PROJECTILE.get(), ThrownItemRenderer::new); + event.registerEntityRenderer(AntarchyForgeEntites.HUSH_PROJECTILE.get(), HushProjectileRenderer::new); + event.registerEntityRenderer(AntarchyForgeEntites.BRUTALFLY_ORB.get(), BrutalflyOrbRenderer::new); + event.registerEntityRenderer(AntarchyForgeEntites.UPWARD_FALLING_BLOCK.get(), com.craisinlord.antarchy.content.client.renderer.UpwardFallingBlockRenderer::new); + event.registerEntityRenderer(AntarchyForgeEntites.SCORPION.get(), context -> withParalyzedGeoLayer(new ScorpionRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.EMPEROR_SCORPION.get(), context -> withParalyzedGeoLayer(new EmperorScorpionRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.TORETERROR.get(), ToreterrorRenderer::new); + event.registerEntityRenderer(AntarchyForgeEntites.WATER_BOMB.get(), WaterBombRenderer::new); + event.registerEntityRenderer(AntarchyForgeEntites.CHEEP.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.CheepRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.DORRIE.get(), context -> new com.craisinlord.antarchy.content.client.renderer.DorrieRenderer(context)); + event.registerEntityRenderer(AntarchyForgeEntites.OURANWOOD_DEER.get(), context -> new com.craisinlord.antarchy.content.client.renderer.OuranwoodDeerRenderer(context)); + event.registerEntityRenderer(AntarchyForgeEntites.GLIMMER.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.glimmer.GlimmerRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.ELKA.get(), context -> new com.craisinlord.antarchy.content.client.renderer.ElkaRenderer(context)); + event.registerEntityRenderer(AntarchyForgeEntites.ROLLY_POLLY.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.RollyPollyRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.TERMITE.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.TermiteRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.CREEPING_HORROR.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.CreepingHorrorRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.LURKING_TERROR.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.LurkingTerrorRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.HERCULES_BEETLE.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.HerculesBeetleRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.JERRY.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.JerryRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.JUMPY_BUG.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.JumpyBugRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.SPIT_BUG.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.SpitBugRenderer(context))); + event.registerEntityRenderer(AntarchyForgeEntites.SPIT_BUG_PROJECTILE.get(), com.craisinlord.antarchy.content.client.renderer.SpitBugProjectileRenderer::new); + event.registerEntityRenderer(AntarchyForgeEntites.STINK_BUG.get(), context -> withParalyzedGeoLayer(new com.craisinlord.antarchy.content.client.renderer.StinkBugRenderer(context))); + } + + @SubscribeEvent + @SuppressWarnings({"unchecked", "rawtypes"}) + public static void addRenderLayers(EntityRenderersEvent.AddLayers event) { + for (String skin : event.getSkins()) { + LivingEntityRenderer> renderer = + (LivingEntityRenderer>) event.getSkin(skin); + if (renderer != null) { + renderer.addLayer(new ParalyzedStonePlayerLayer(renderer)); + renderer.addLayer(new GoopedLivingLayer(renderer)); + renderer.addLayer(new BrutalflyElytraLayer(renderer)); + renderer.addLayer(new FallenKingCrownLayer(renderer)); + } + } + LivingEntityRenderer armorStandRenderer = + (LivingEntityRenderer) event.getRenderer(EntityType.ARMOR_STAND); + if (armorStandRenderer != null) { + armorStandRenderer.addLayer(new FallenKingCrownArmorStandLayer(armorStandRenderer)); + } + BuiltInRegistries.ENTITY_TYPE.forEach(entityType -> addStatusLayersToEntity(event, entityType)); + } + + @SubscribeEvent + public static void registerLayerDefinitions(EntityRenderersEvent.RegisterLayerDefinitions event) { + event.registerLayerDefinition(OuranwoodBoatRenderer.boatLayer(), BoatModel::createBodyModel); + event.registerLayerDefinition(OuranwoodBoatRenderer.chestBoatLayer(), ChestBoatModel::createBodyModel); + event.registerLayerDefinition(PeachBoatRenderer.boatLayer(), BoatModel::createBodyModel); + event.registerLayerDefinition(PeachBoatRenderer.chestBoatLayer(), ChestBoatModel::createBodyModel); + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + private static void addStatusLayersToEntity(EntityRenderersEvent.AddLayers event, EntityType entityType) { + if (entityType == EntityType.PLAYER) { + return; + } + Object renderer = event.getRenderer((EntityType) entityType); + if (renderer == null) { + return; + } + if (renderer instanceof GeoEntityRenderer) { + return; + } + if (!(renderer instanceof LivingEntityRenderer)) { + return; + } + LivingEntityRenderer livingRenderer = (LivingEntityRenderer) renderer; + livingRenderer.addLayer(new ParalyzedStoneLivingLayer<>(livingRenderer)); + livingRenderer.addLayer(new GoopedLivingLayer<>(livingRenderer)); + } + + private static GeoEntityRenderer withParalyzedGeoLayer(GeoEntityRenderer renderer) { + renderer.addRenderLayer(new ParalyzedStoneGeoLayer<>(renderer)); + renderer.addRenderLayer(new GoopedGeoLayer<>(renderer)); + return renderer; + } + + @SubscribeEvent + public static void registerBlockColors(RegisterColorHandlersEvent.Block event) { + event.register( + (state, level, pos, tintIndex) -> tintIndex == 0 ? bluestoneWireColor(state.getValue(com.craisinlord.antarchy.content.block.BluestoneWireBlock.POWER)) : -1, + AntarchyForgeBlocks.BLUESTONE_WIRE.get() + ); + event.register( + (state, level, pos, tintIndex) -> level != null && pos != null + ? BiomeColors.getAverageFoliageColor(level, pos) + : FoliageColor.getDefaultColor(), + AntarchyForgeBlocks.OURANWOOD_LEAVES.get() + ); + event.register( + (state, level, pos, tintIndex) -> 0xFF4A0000, + AntarchyForgeBlocks.ANTIWATER_BLOCK.get() + ); + event.register( + (state, level, pos, tintIndex) -> level != null && pos != null + ? BiomeColors.getAverageGrassColor(level, pos) + : net.minecraft.world.level.GrassColor.getDefaultColor(), + AntarchyForgeBlocks.SPIDER_LILY.get() + ); + event.register( + (state, level, pos, tintIndex) -> level != null && pos != null + ? BiomeColors.getAverageGrassColor(level, pos) + : net.minecraft.world.level.GrassColor.getDefaultColor(), + AntarchyForgeBlocks.POTTED_SPIDER_LILY.get() + ); + } + + @SubscribeEvent + public static void registerItemColors(RegisterColorHandlersEvent.Item event) { + event.register( + (stack, tintIndex) -> FoliageColor.getDefaultColor(), + AntarchyForgeItems.OURANWOOD_LEAVES_ITEM.get() + ); + event.register( + (stack, tintIndex) -> tintIndex == 0 ? net.minecraft.world.level.GrassColor.getDefaultColor() : -1, + AntarchyForgeItems.SPIDER_LILY_ITEM.get() + ); + event.register( + (stack, tintIndex) -> { + if (!(stack.getItem() instanceof com.craisinlord.antarchy.content.item.CritterCageItem cage)) { + return -1; + } + if (cage.getItemState(stack) != 2) { + return -1; + } + if (tintIndex == 1) { + return cage.getPrimaryColor(stack); + } + if (tintIndex == 2) { + return cage.getSecondaryColor(stack); + } + return -1; + }, + AntarchyForgeItems.CRITTER_CAGE.get() + ); + event.register(new DynamicFluidContainerModel.Colors(), AntarchyForgeItems.ICHOR_BUCKET.get()); + event.register(new DynamicFluidContainerModel.Colors(), AntarchyForgeItems.LUMEN_BUCKET.get()); + event.register(new DynamicFluidContainerModel.Colors(), AntarchyForgeItems.ANTIWATER_BUCKET.get()); + } + + @SubscribeEvent + public static void registerParticleProviders(RegisterParticleProvidersEvent event) { + event.registerSpriteSet(AntarchyForgeMisc.DREAM_FIRE_FLAME.get(), DreamFlameParticle.Provider::new); + event.registerSpriteSet(AntarchyForgeMisc.STINKY_GAS.get(), HypnoticGasParticle.Provider::new); + event.registerSpriteSet(AntarchyForgeMisc.STINKY_FLY.get(), FireflyParticle.Provider::new); + event.registerSpriteSet(AntarchyForgeMisc.PEACH_LEAVES_PARTICLE.get(), PeachLeavesParticle.Provider::new); + event.registerSpriteSet(AntarchyForgeMisc.LOTUS_POLLEN.get(), com.craisinlord.antarchy.content.client.particle.LotusPollenParticle.Provider::new); + event.registerSpriteSet(AntarchyForgeMisc.HYPNOTIC_GAS.get(), HypnoticGasParticle.Provider::new); + event.registerSpriteSet(AntarchyForgeMisc.HYPNOTIC_GAS_DOWN.get(), sprites -> new HypnoticGasParticle.Provider(sprites, true)); + event.registerSpecial(AntarchyForgeMisc.HYPNOTIC_GAS_CLOUD.get(), new HypnoticGasCloudParticle.Provider()); + event.registerSpecial(AntarchyForgeMisc.HYPNOTIC_GAS_CLOUD_DOWN.get(), new HypnoticGasCloudParticle.Provider(true)); + event.registerSpriteSet(AntarchyForgeMisc.INVERTED_GEYSER_BASE.get(), InvertedGeyserBaseParticle.Provider::new); + event.registerSpriteSet(AntarchyForgeMisc.INVERTED_GEYSER_PLUME.get(), InvertedGeyserPlumeParticle.Provider::new); + event.registerSpriteSet(AntarchyForgeMisc.INVERTED_GEYSER_POOF.get(), InvertedGeyserBaseParticle.Provider::new); + event.registerSpecial(AntarchyForgeMisc.INVERTED_GEYSER_ERUPTION.get(), new InvertedGeyserEruptionParticle.Provider()); + event.registerSpriteSet(AntarchyForgeMisc.FIREFLY.get(), FireflyParticle.Provider::new); + event.registerSpriteSet(AntarchyForgeMisc.ORANGE_ASH.get(), OrangeAshParticle.Provider::new); + } + + @SubscribeEvent + public static void registerGuiLayers(RegisterGuiOverlaysEvent event) { + event.registerAboveAll("dread_darkness", + (gui, guiGraphics, partialTick, width, height) -> DreadHudRenderer.render(guiGraphics) + ); + event.registerAboveAll("horde_intensity", + (gui, guiGraphics, partialTick, width, height) -> HordeHudRenderer.render(guiGraphics) + ); + event.registerAboveAll("paralyzed_stone", + (gui, guiGraphics, partialTick, width, height) -> ParalyzedHudRenderer.render(guiGraphics) + ); + event.registerAboveAll("gooped_tint", + (gui, guiGraphics, partialTick, width, height) -> GoopedHudRenderer.render(guiGraphics) + ); + event.registerAboveAll("brutalfly_elytra", + (gui, guiGraphics, partialTick, width, height) -> BrutalflyElytraHudRenderer.render(guiGraphics) + ); + event.registerBelow( + VanillaGuiOverlay.CHAT_PANEL.id(), + "bloodglass_hearts", + (gui, guiGraphics, partialTick, width, height) -> BloodglassHudRenderer.render(guiGraphics) + ); + event.registerAboveAll("triffid_goo", + (gui, guiGraphics, partialTick, width, height) -> TriffidGooHudRenderer.render(guiGraphics) + ); + event.registerAboveAll("jumpy_boots", + (gui, guiGraphics, partialTick, width, height) -> JumpyBootsHudRenderer.render(guiGraphics) + ); + event.registerAboveAll("dorrie_jump", + (gui, guiGraphics, partialTick, width, height) -> DorrieJumpHudRenderer.render(guiGraphics) + ); + event.registerAboveAll("hercules_beetle_charge", + (gui, guiGraphics, partialTick, width, height) -> HerculesBeetleChargeHudRenderer.render(guiGraphics) + ); + } + + @SubscribeEvent + public static void onClientSetup(FMLClientSetupEvent event) { + event.enqueueWork(() -> { + net.minecraft.client.gui.screens.MenuScreens.register(AntarchyForgeMisc.DORRIE_INVENTORY_MENU.get(), com.craisinlord.antarchy.content.client.screen.DorrieInventoryScreen::new); + + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.ANTIMETAL_RAIL.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.ANTIMETAL_POWERED_RAIL.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.ANTIMETAL_DETECTOR_RAIL.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.ANTIMETAL_ACTIVATOR_RAIL.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.OURANWOOD_LEAVES.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.OURANWOOD_DOOR.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.OURANWOOD_TRAPDOOR.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.OURANWOOD_ACORN_BLOCK.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.POTTED_OURANWOOD_ACORN.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.PEACH_LEAVES.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.PEACH_HANGING_PEACH.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.PEACH_DOOR.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.PEACH_TRAPDOOR.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.PEACH_SAPLING.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.POTTED_PEACH_SAPLING.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.DUPLICATOR_SAPLING.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.ORANGE_MILKWEED.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.PINK_MILKWEED.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.AMBER_LICHEN.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.CREEPVINE.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.CAMELLIA.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.SPIDER_LILY.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.POTTED_SPIDER_LILY.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.LOTUS.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.POTTED_LOTUS.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.GIANT_LILY_PAD.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.HUSHWEED.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.CRITTER_CAGE_BLOCK.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.CORNEA_STALK.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.CORN_CROP.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.WILD_CORN.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.ANTIMETAL_SCAFFOLDING.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.UMBRAL_MOSS_CARPET.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.NYXITE_SPIKE.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.CHITEN_SPIKE.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.STAR_CORAL.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.STAR_CORAL_FAN.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.STAR_CORAL_WALL_FAN.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.DEAD_STAR_CORAL.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.DEAD_STAR_CORAL_FAN.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.DEAD_STAR_CORAL_WALL_FAN.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.SMALL_BLOOD_CRYSTAL_BUD.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.MEDIUM_BLOOD_CRYSTAL_BUD.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.LARGE_BLOOD_CRYSTAL_BUD.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.BLOOD_CRYSTAL_CRYSTAL.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.DREAM_TORCH.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.DREAM_WALL_TORCH.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.DREAM_CEILING_TORCH.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.BLUESTONE_WIRE.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.BLUESTONE_REPEATER.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.BLUESTONE_COMPARATOR.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.BLUESTONE_TORCH.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.DREAM_LANTERN.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.DREAM_CAMPFIRE.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.DREAM_FIRE.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.DREAM_CEILING_FIRE.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.ANTIWATER_BLOCK.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.LUMEN_BLOCK.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeMisc.ANTIWATER.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeMisc.FLOWING_ANTIWATER.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeMisc.ICHOR.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeMisc.FLOWING_ICHOR.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeMisc.LUMEN.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeMisc.FLOWING_LUMEN.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeMisc.BILE.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeMisc.FLOWING_BILE.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.ELYTHIA_PORTAL.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.THORAXIS_PORTAL.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.TRIFFID_GOO_BLOCK.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.URANIUM_DOOR.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.TITANIUM_DOOR.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.URANIUM_TRAPDOOR.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.TITANIUM_TRAPDOOR.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.URANIUM_BARS.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.TITANIUM_BARS.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.CLOUD_BLOCK.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.JUMPY_BUG_EGG.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.SPIT_BUG_EGG.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.JERRY_EGG.get(), RenderType.translucent()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.BIOWART_TENDRILS.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.HANGING_CREEPROOTS.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.MOLTING_VINES.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.POTTED_GLOWCAP_MUSHROOM.get(), RenderType.cutout()); + ItemBlockRenderTypes.setRenderLayer(AntarchyForgeBlocks.GLOWCAP_MUSHROOM.get(), RenderType.cutout()); + registerUltimateBowProperties(); + registerUltimateCrossbowProperties(); + }); + } + + private static void registerUltimateBowProperties() { + ItemProperties.register( + AntarchyForgeItems.ULTIMATE_BOW.get(), + ResourceLocation.withDefaultNamespace("pull"), + (stack, level, entity, seed) -> { + if (entity == null || entity.getUseItem() != stack) { + return 0.0F; + } + + return (stack.getItem().getUseDuration(stack) - entity.getUseItemRemainingTicks()) / 20.0F; + } + ); + ItemProperties.register( + AntarchyForgeItems.ULTIMATE_BOW.get(), + ResourceLocation.withDefaultNamespace("pulling"), + (stack, level, entity, seed) -> + entity != null && entity.isUsingItem() && entity.getUseItem() == stack ? 1.0F : 0.0F + ); + } + + private static void registerUltimateCrossbowProperties() { + ItemProperties.register( + AntarchyForgeItems.ULTIMATE_CROSSBOW.get(), + ResourceLocation.withDefaultNamespace("pull"), + (stack, level, entity, seed) -> { + if (entity == null || CrossbowItem.isCharged(stack) || entity.getUseItem() != stack) { + return 0.0F; + } + + float adjustedChargeDuration = Math.max(1.0F, stack.getItem().getUseDuration(stack) - 3.0F); + return Mth.clamp((stack.getItem().getUseDuration(stack) - entity.getUseItemRemainingTicks()) / adjustedChargeDuration, 0.0F, 1.0F); + } + ); + ItemProperties.register( + AntarchyForgeItems.ULTIMATE_CROSSBOW.get(), + ResourceLocation.withDefaultNamespace("pulling"), + (stack, level, entity, seed) -> + entity != null && entity.isUsingItem() && entity.getUseItem() == stack && !CrossbowItem.isCharged(stack) ? 1.0F : 0.0F + ); + ItemProperties.register( + AntarchyForgeItems.ULTIMATE_CROSSBOW.get(), + ResourceLocation.withDefaultNamespace("charged"), + (stack, level, entity, seed) -> CrossbowItem.isCharged(stack) ? 1.0F : 0.0F + ); + ItemProperties.register( + AntarchyForgeItems.ULTIMATE_CROSSBOW.get(), + ResourceLocation.withDefaultNamespace("firework"), + (stack, level, entity, seed) -> CrossbowItem.isCharged(stack) && CrossbowItem.containsChargedProjectile(stack, Items.FIREWORK_ROCKET) ? 1.0F : 0.0F + ); + ItemProperties.register( + AntarchyForgeItems.CRITTER_CAGE.get(), + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "critter_cage_state"), + (stack, level, entity, seed) -> { + if (!(stack.getItem() instanceof com.craisinlord.antarchy.content.item.CritterCageItem cage)) { + return 0.0F; + } + return cage.getItemState(stack); + } + ); + } + + private static int bluestoneWireColor(int power) { + float normalized = power / 15.0F; + int red = (int) (6.0F + normalized * 54.0F); + int green = (int) (22.0F + normalized * 132.0F); + int blue = (int) (64.0F + normalized * 191.0F); + return red << 16 | green << 8 | blue; + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/AntarchyKeyBindings.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/AntarchyKeyBindings.java new file mode 100644 index 00000000..51f7c437 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/AntarchyKeyBindings.java @@ -0,0 +1,62 @@ +package com.craisinlord.antarchy.forge.client; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import com.mojang.blaze3d.platform.InputConstants; +import net.minecraft.client.KeyMapping; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.client.event.RegisterKeyMappingsEvent; +import net.minecraftforge.client.settings.KeyConflictContext; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) +public final class AntarchyKeyBindings { + public static final String CATEGORY = "key.categories.antarchy"; + + public static final KeyMapping BRUTALFLY_FLAP = new KeyMapping( + "key.antarchy.brutalfly_flap", + KeyConflictContext.IN_GAME, + InputConstants.Type.KEYSYM, + InputConstants.KEY_LSHIFT, + CATEGORY + ); + + public static final KeyMapping DORRIE_CHARGE_JUMP = new KeyMapping( + "key.antarchy.dorrie_charge_jump", + KeyConflictContext.IN_GAME, + InputConstants.Type.KEYSYM, + InputConstants.KEY_LCONTROL, + CATEGORY + ); + + public static final KeyMapping HERCULES_BEETLE_CHARGE = new KeyMapping( + "key.antarchy.hercules_beetle_charge", + KeyConflictContext.IN_GAME, + InputConstants.Type.KEYSYM, + InputConstants.KEY_LCONTROL, + CATEGORY + ); + + public static final KeyMapping HERCULES_BEETLE_FLIGHT_TOGGLE = new KeyMapping( + "key.antarchy.hercules_beetle_flight_toggle", + KeyConflictContext.IN_GAME, + InputConstants.Type.KEYSYM, + InputConstants.KEY_R, + CATEGORY + ); + + private AntarchyKeyBindings() {} + + @SubscribeEvent + public static void onRegisterKeyMappings(RegisterKeyMappingsEvent event) { + event.register(BRUTALFLY_FLAP); + event.register(DORRIE_CHARGE_JUMP); + event.register(HERCULES_BEETLE_CHARGE); + event.register(HERCULES_BEETLE_FLIGHT_TOGGLE); + } + + public static boolean isHerculesBeetleFlightTogglePressed() { + return HERCULES_BEETLE_FLIGHT_TOGGLE.isDown(); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/BigBerthaClientHandler.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/BigBerthaClientHandler.java new file mode 100644 index 00000000..44590d4c --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/BigBerthaClientHandler.java @@ -0,0 +1,44 @@ +package com.craisinlord.antarchy.forge.client; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.item.BigBerthaItem; +import com.craisinlord.antarchy.content.network.BigBerthaModeCyclePayload; +import net.minecraft.client.Minecraft; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TickEvent; +import com.craisinlord.antarchy.forge.network.AntarchyForgeNetworkCore; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT) +public final class BigBerthaClientHandler { + private static boolean lastUseDown; + + private BigBerthaClientHandler() { + } + + @SubscribeEvent + public static void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + Minecraft mc = Minecraft.getInstance(); + if (mc.player == null || mc.level == null || mc.screen != null) { + lastUseDown = false; + return; + } + + if (!(mc.player.getMainHandItem().getItem() instanceof BigBerthaItem)) { + lastUseDown = false; + return; + } + + boolean useDown = mc.options.keyUse.isDown(); + if (useDown + && !lastUseDown + && mc.player.isShiftKeyDown() + && mc.player.getCooldowns().isOnCooldown(mc.player.getMainHandItem().getItem())) { + AntarchyForgeNetworkCore.sendToServer(new BigBerthaModeCyclePayload()); + } + lastUseDown = useDown; + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/BloodCrystalKatanaTrailHandler.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/BloodCrystalKatanaTrailHandler.java new file mode 100644 index 00000000..00630d06 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/BloodCrystalKatanaTrailHandler.java @@ -0,0 +1,210 @@ +package com.craisinlord.antarchy.forge.client; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.client.BloodCrystalKatanaTrailClientState; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.client.event.RenderLevelStageEvent; +import org.joml.Matrix4f; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.FORGE) +public final class BloodCrystalKatanaTrailHandler { + private static final int MAX_TRAIL_POINTS = 16; + private static final int POINT_LIFETIME_TICKS = 10; + private static final double MIN_DISTANCE_BETWEEN_POINTS = 0.05D; + private static final float CORE_WIDTH = 0.06F; + private static final float GLOW_WIDTH = 0.16F; + private static final Map> TRAILS = new HashMap<>(); + + private BloodCrystalKatanaTrailHandler() {} + + private static final class TrailPoint { + private final Vec3 position; + private int age; + + private TrailPoint(Vec3 position) { + this.position = position; + } + + private float alpha() { + return 1.0F - ((float) age / POINT_LIFETIME_TICKS); + } + + private boolean expired() { + return age >= POINT_LIFETIME_TICKS || alpha() <= 0.01F; + } + } + + @SubscribeEvent + public static void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + Minecraft mc = Minecraft.getInstance(); + if (mc.level == null) { + TRAILS.clear(); + BloodCrystalKatanaTrailClientState.clear(); + return; + } + if (mc.isPaused()) { + return; + } + + BloodCrystalKatanaTrailClientState.tick(); + Set activeIds = new HashSet<>(); + + for (Entity entity : mc.level.entitiesForRendering()) { + int remaining = BloodCrystalKatanaTrailClientState.getRemainingTicks(entity.getId()); + if (remaining <= 0) { + continue; + } + + activeIds.add(entity.getId()); + Vec3 position = entity.position().add(0.0D, entity.getBbHeight() * 0.45D, 0.0D); + ArrayDeque points = TRAILS.computeIfAbsent(entity.getId(), id -> new ArrayDeque<>()); + + if (points.isEmpty() || points.peekFirst().position.distanceToSqr(position) >= MIN_DISTANCE_BETWEEN_POINTS * MIN_DISTANCE_BETWEEN_POINTS) { + points.addFirst(new TrailPoint(position)); + while (points.size() > MAX_TRAIL_POINTS) { + points.pollLast(); + } + } + } + + TRAILS.keySet().removeIf(id -> !activeIds.contains(id)); + for (ArrayDeque points : TRAILS.values()) { + Iterator iterator = points.iterator(); + while (iterator.hasNext()) { + TrailPoint point = iterator.next(); + point.age++; + if (point.expired()) { + iterator.remove(); + } + } + } + TRAILS.values().removeIf(ArrayDeque::isEmpty); + } + + @SubscribeEvent + public static void onRenderLevelStage(RenderLevelStageEvent event) { + if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_PARTICLES || TRAILS.isEmpty()) { + return; + } + + Minecraft mc = Minecraft.getInstance(); + if (mc.level == null) { + return; + } + + Camera camera = event.getCamera(); + Vec3 cameraPos = camera.getPosition(); + Matrix4f matrix = event.getPoseStack().last().pose(); + + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.depthMask(false); + RenderSystem.disableCull(); + RenderSystem.setShader(GameRenderer::getPositionColorShader); + + Tesselator tesselator = Tesselator.getInstance(); + List> snapshots = new ArrayList<>(TRAILS.size()); + for (ArrayDeque deque : TRAILS.values()) { + if (deque.size() >= 2) { + snapshots.add(new ArrayList<>(deque)); + } + } + + if (snapshots.isEmpty()) { + RenderSystem.enableCull(); + RenderSystem.depthMask(true); + RenderSystem.disableBlend(); + return; + } + + BufferBuilder glowBuffer = tesselator.getBuilder(); + glowBuffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + for (List points : snapshots) { + buildTrail(glowBuffer, matrix, points, cameraPos, GLOW_WIDTH, 0.95F, 0.14F, 0.18F, 0.38F); + } + BufferUploader.drawWithShader(glowBuffer.end()); + + BufferBuilder coreBuffer = tesselator.getBuilder(); + coreBuffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + for (List points : snapshots) { + buildTrail(coreBuffer, matrix, points, cameraPos, CORE_WIDTH, 1.0F, 0.32F, 0.36F, 0.92F); + } + BufferUploader.drawWithShader(coreBuffer.end()); + + RenderSystem.enableCull(); + RenderSystem.depthMask(true); + RenderSystem.disableBlend(); + } + + private static void buildTrail(BufferBuilder builder, Matrix4f matrix, List points, Vec3 cameraPos, + float width, float red, float green, float blue, float alphaScale) { + for (int i = 0; i < points.size() - 1; i++) { + TrailPoint newer = points.get(i); + TrailPoint older = points.get(i + 1); + Vec3 side = cameraFacingRight(newer.position, older.position, cameraPos); + if (side == null) { + continue; + } + + float nearAlpha = newer.alpha() * alphaScale; + float farAlpha = older.alpha() * alphaScale * 0.85F; + Vec3 nearOffset = side.scale(width); + Vec3 farOffset = side.scale(width); + Vec3 nearPos = newer.position.subtract(cameraPos); + Vec3 farPos = older.position.subtract(cameraPos); + + builder.vertex(matrix, (float) (nearPos.x + nearOffset.x), (float) (nearPos.y + nearOffset.y), (float) (nearPos.z + nearOffset.z)).color(red, green, blue, nearAlpha).endVertex(); + builder.vertex(matrix, (float) (nearPos.x - nearOffset.x), (float) (nearPos.y - nearOffset.y), (float) (nearPos.z - nearOffset.z)).color(red, green, blue, nearAlpha).endVertex(); + builder.vertex(matrix, (float) (farPos.x - farOffset.x), (float) (farPos.y - farOffset.y), (float) (farPos.z - farOffset.z)).color(red, green, blue, farAlpha).endVertex(); + builder.vertex(matrix, (float) (farPos.x + farOffset.x), (float) (farPos.y + farOffset.y), (float) (farPos.z + farOffset.z)).color(red, green, blue, farAlpha).endVertex(); + } + } + + private static Vec3 cameraFacingRight(Vec3 current, Vec3 next, Vec3 cameraPos) { + Vec3 segmentDirection = next.subtract(current); + if (segmentDirection.lengthSqr() < 1.0E-8D) { + return null; + } + segmentDirection = segmentDirection.normalize(); + + Vec3 midpoint = current.add(next).scale(0.5D); + Vec3 cameraDirection = cameraPos.subtract(midpoint); + if (cameraDirection.lengthSqr() < 1.0E-8D) { + return null; + } + cameraDirection = cameraDirection.normalize(); + + Vec3 side = segmentDirection.cross(cameraDirection); + if (side.lengthSqr() < 1.0E-8D) { + side = segmentDirection.cross(new Vec3(0.0D, 1.0D, 0.0D)); + if (side.lengthSqr() < 1.0E-8D) { + return null; + } + } + return side.normalize(); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/BrutalflyElytraClientHandler.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/BrutalflyElytraClientHandler.java new file mode 100644 index 00000000..0d601936 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/BrutalflyElytraClientHandler.java @@ -0,0 +1,87 @@ +package com.craisinlord.antarchy.forge.client; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.client.BrutalflyElytraClientState; +import com.craisinlord.antarchy.content.item.BrutalflyElytraFlightHelper; +import com.craisinlord.antarchy.content.item.BrutalflyElytraItem; +import com.craisinlord.antarchy.content.network.BrutalflyElytraFlapPayload; +import net.minecraft.client.Minecraft; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.client.event.RenderGuiOverlayEvent; +import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay; +import com.craisinlord.antarchy.forge.network.AntarchyForgeNetworkCore; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT) +public final class BrutalflyElytraClientHandler { + private static final Logger LOGGER = LoggerFactory.getLogger("Antarchy/BrutalflyElytra"); + private static boolean lastJumpDown; + private static int chargeTicks; + + static { + BrutalflyElytraItem.FLAP_KEY_NAME = () -> AntarchyKeyBindings.BRUTALFLY_FLAP.getTranslatedKeyMessage(); + } + + private BrutalflyElytraClientHandler() { + } + + @SubscribeEvent + public static void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + BrutalflyElytraClientState.tick(); + + Minecraft minecraft = Minecraft.getInstance(); + if (minecraft.player == null || minecraft.level == null || minecraft.screen != null) { + reset(); + return; + } + + if (!BrutalflyElytraItem.isWearingBrutalflyElytra(minecraft.player) || !minecraft.player.isFallFlying()) { + reset(); + return; + } + + boolean sneakDown = AntarchyKeyBindings.BRUTALFLY_FLAP.isDown(); + boolean wasSneakDown = lastJumpDown; + lastJumpDown = sneakDown; + + if (sneakDown) { + chargeTicks = Math.min(chargeTicks + 1, BrutalflyElytraFlightHelper.FLAP_CHARGE_TICKS_MAX); + return; + } + + if (wasSneakDown && chargeTicks > 0) { + AntarchyForgeNetworkCore.sendToServer(new BrutalflyElytraFlapPayload(chargeTicks)); + } + chargeTicks = 0; + } + + private static void reset() { + lastJumpDown = false; + chargeTicks = 0; + } + + @SubscribeEvent + public static void onRenderGuiLayer(RenderGuiOverlayEvent.Pre event) { + Minecraft minecraft = Minecraft.getInstance(); + if (minecraft.player == null || !BrutalflyElytraItem.isWearingBrutalflyElytra(minecraft.player) || !minecraft.player.isFallFlying()) { + return; + } + if (event.getOverlay().id().equals(VanillaGuiOverlay.EXPERIENCE_BAR.id())) { + event.setCanceled(true); + } + } + + public static boolean isCharging() { + return chargeTicks > 0 && lastJumpDown; + } + + public static int getChargeTicks() { + return chargeTicks; + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/BrutalflyElytraHudRenderer.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/BrutalflyElytraHudRenderer.java new file mode 100644 index 00000000..73068a5f --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/BrutalflyElytraHudRenderer.java @@ -0,0 +1,45 @@ +package com.craisinlord.antarchy.forge.client; + +import com.craisinlord.antarchy.content.item.BrutalflyElytraFlightHelper; +import com.craisinlord.antarchy.content.item.BrutalflyElytraItem; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; + +public final class BrutalflyElytraHudRenderer { + private static final ResourceLocation GUI_ICONS_LOCATION = ResourceLocation.withDefaultNamespace("textures/gui/icons.png"); + private static final int BAR_WIDTH = 182; + private static final int BAR_HEIGHT = 5; + + private BrutalflyElytraHudRenderer() { + } + + public static void render(GuiGraphics guiGraphics) { + Minecraft minecraft = Minecraft.getInstance(); + Player player = minecraft.player; + if (player == null || minecraft.screen != null || player.isDeadOrDying()) { + return; + } + if (!BrutalflyElytraItem.isWearingBrutalflyElytra(player) || !player.isFallFlying()) { + return; + } + + int width = minecraft.getWindow().getGuiScaledWidth(); + int height = minecraft.getWindow().getGuiScaledHeight(); + int x0 = width / 2 - BAR_WIDTH / 2; + int y0 = height - 29; + + guiGraphics.blit(GUI_ICONS_LOCATION, x0, y0, 0, 84, BAR_WIDTH, BAR_HEIGHT); + + int chargeTicks = BrutalflyElytraClientHandler.getChargeTicks(); + float chargeRatio = Mth.clamp(chargeTicks / (float) BrutalflyElytraFlightHelper.FLAP_CHARGE_TICKS_MAX, 0.0F, 1.0F); + int filledWidth = Mth.clamp((int) (chargeRatio * BAR_WIDTH), 0, BAR_WIDTH); + if (filledWidth > 0) { + guiGraphics.setColor(1.0F, 1.0F, 1.0F, 0.35F + chargeRatio * 0.65F); + guiGraphics.blit(GUI_ICONS_LOCATION, x0, y0, 0, 89, filledWidth, BAR_HEIGHT); + guiGraphics.setColor(1.0F, 1.0F, 1.0F, 1.0F); + } + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/CameraShakeHandler.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/CameraShakeHandler.java new file mode 100644 index 00000000..1d5d1337 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/CameraShakeHandler.java @@ -0,0 +1,49 @@ +package com.craisinlord.antarchy.forge.client; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.client.CameraShakeClientState; +import com.craisinlord.antarchy.content.client.HerculesBeetleImpactShakeClientState; +import com.craisinlord.antarchy.content.item.BigBerthaItem; +import net.minecraft.client.Minecraft; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.client.event.ViewportEvent; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT) +public final class CameraShakeHandler { + private static final int TORETERROR_SHAKE_TICKS = 25; + + private CameraShakeHandler() { + } + + @SubscribeEvent + public static void onComputeCameraAngles(ViewportEvent.ComputeCameraAngles event) { + Minecraft mc = Minecraft.getInstance(); + if (mc.level == null || mc.player == null) { + CameraShakeClientState.clear(); + return; + } + + float shakeStrength = CameraShakeClientState.getStrength(event.getCamera().getPosition()); + + int beetleShakeTicks = HerculesBeetleImpactShakeClientState.getTicks(); + if (beetleShakeTicks > 0) { + shakeStrength += (float) beetleShakeTicks / TORETERROR_SHAKE_TICKS * 2.0F; + } + + int bigBerthaShakeTicks = BigBerthaItem.clientShakeTicks; + if (bigBerthaShakeTicks > 0) { + shakeStrength += (float) bigBerthaShakeTicks / TORETERROR_SHAKE_TICKS * 2.0F; + } + + if (shakeStrength <= 0.0F) return; + + float time = (float) (mc.player.tickCount + event.getPartialTick()); + event.setYaw(event.getYaw() + Mth.sin(time * 1.5F) * shakeStrength * 2.5F); + event.setPitch(event.getPitch() + Mth.cos(time * 1.8F) * shakeStrength * 2.0F); + event.setRoll(event.getRoll() + Mth.sin(time * 2.2F) * shakeStrength * 1.5F); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DiamondMinecartClientHandler.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DiamondMinecartClientHandler.java new file mode 100644 index 00000000..71e48103 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DiamondMinecartClientHandler.java @@ -0,0 +1,51 @@ +package com.craisinlord.antarchy.forge.client; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.entity.DiamondMinecartEntity; +import com.craisinlord.antarchy.content.network.DiamondMinecartInputPayload; +import net.minecraft.client.Minecraft; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TickEvent; +import com.craisinlord.antarchy.forge.network.AntarchyForgeNetworkCore; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT) +public final class DiamondMinecartClientHandler { + + private DiamondMinecartClientHandler() { + } + + + private static byte lastFlags = 0; + + @SubscribeEvent + public static void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + Minecraft mc = Minecraft.getInstance(); + + if (!AntarchySettings.diamondMinecartEnabled()) return; + if (mc.player == null || mc.level == null) return; + if (!(mc.player.getVehicle() instanceof DiamondMinecartEntity)) return; + if (mc.screen != null) { + if (lastFlags != 0) { + AntarchyForgeNetworkCore.sendToServer(new DiamondMinecartInputPayload((byte) 0)); + lastFlags = 0; + } + return; + } + + byte flags = 0; + if (mc.options.keyUp.isDown()) flags |= DiamondMinecartInputPayload.FLAG_FORWARD; + if (mc.options.keyDown.isDown()) flags |= DiamondMinecartInputPayload.FLAG_BACK; + if (mc.options.keyLeft.isDown()) flags |= DiamondMinecartInputPayload.FLAG_LEFT; + if (mc.options.keyRight.isDown()) flags |= DiamondMinecartInputPayload.FLAG_RIGHT; + + if (flags != lastFlags) { + AntarchyForgeNetworkCore.sendToServer(new DiamondMinecartInputPayload(flags)); + lastFlags = flags; + } + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DorrieJumpClientHandler.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DorrieJumpClientHandler.java new file mode 100644 index 00000000..44120ede --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DorrieJumpClientHandler.java @@ -0,0 +1,65 @@ +package com.craisinlord.antarchy.forge.client; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.entity.DorrieEntity; +import com.craisinlord.antarchy.content.network.DorrieChargeJumpPayload; +import com.craisinlord.antarchy.content.network.DorrieJumpInputPayload; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TickEvent; +import com.craisinlord.antarchy.forge.network.AntarchyForgeNetworkCore; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT) +public final class DorrieJumpClientHandler { + private static boolean wasPressingJump = false; + private static boolean wasPressingCharge = false; + + private DorrieJumpClientHandler() {} + + @SubscribeEvent + public static void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + Minecraft mc = Minecraft.getInstance(); + LocalPlayer player = mc.player; + + if (player == null || mc.screen != null) { + resetAll(); + return; + } + + if (!(player.getVehicle() instanceof DorrieEntity)) { + resetAll(); + return; + } + + boolean pressingJump = mc.options.keyJump.isDown(); + if (pressingJump != wasPressingJump) { + AntarchyForgeNetworkCore.sendToServer(new DorrieJumpInputPayload(pressingJump)); + wasPressingJump = pressingJump; + } + + boolean pressingCharge = AntarchyKeyBindings.DORRIE_CHARGE_JUMP.isDown(); + if (pressingCharge != wasPressingCharge) { + AntarchyForgeNetworkCore.sendToServer(new DorrieChargeJumpPayload(pressingCharge)); + if (!pressingCharge && player.getVehicle() instanceof DorrieEntity dorrie) { + dorrie.applyJumpImpulseClient(); + } + wasPressingCharge = pressingCharge; + } + } + + private static void resetAll() { + if (wasPressingJump) { + AntarchyForgeNetworkCore.sendToServer(new DorrieJumpInputPayload(false)); + wasPressingJump = false; + } + if (wasPressingCharge) { + AntarchyForgeNetworkCore.sendToServer(new DorrieChargeJumpPayload(false)); + wasPressingCharge = false; + } + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DorrieJumpHudRenderer.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DorrieJumpHudRenderer.java new file mode 100644 index 00000000..ff6e6da4 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DorrieJumpHudRenderer.java @@ -0,0 +1,44 @@ +package com.craisinlord.antarchy.forge.client; + +import com.craisinlord.antarchy.content.entity.DorrieEntity; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; + +public final class DorrieJumpHudRenderer { + private static final ResourceLocation GUI_ICONS_LOCATION = ResourceLocation.withDefaultNamespace("textures/gui/icons.png"); + private static final int BAR_WIDTH = 182; + private static final int BAR_HEIGHT = 5; + + private DorrieJumpHudRenderer() {} + + public static void render(GuiGraphics guiGraphics) { + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + if (player == null || mc.screen != null || player.isDeadOrDying()) return; + + Entity vehicle = player.getVehicle(); + if (!(vehicle instanceof DorrieEntity dorrie)) return; + + int charge = dorrie.getJumpCharge(); + if (charge <= 0) return; + + int width = mc.getWindow().getGuiScaledWidth(); + int height = mc.getWindow().getGuiScaledHeight(); + int x0 = width / 2 - BAR_WIDTH / 2; + int y0 = height - 29; + + guiGraphics.blit(GUI_ICONS_LOCATION, x0, y0, 0, 84, BAR_WIDTH, BAR_HEIGHT); + + float chargeRatio = Mth.clamp(charge / 100.0F, 0.0F, 1.0F); + int filledWidth = Mth.clamp((int) (chargeRatio * BAR_WIDTH), 0, BAR_WIDTH); + if (filledWidth > 0) { + guiGraphics.setColor(0.2F, 0.8F, 1.0F, 0.4F + chargeRatio * 0.6F); + guiGraphics.blit(GUI_ICONS_LOCATION, x0, y0, 0, 89, filledWidth, BAR_HEIGHT); + guiGraphics.setColor(1.0F, 1.0F, 1.0F, 1.0F); + } + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DreadClientHandler.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DreadClientHandler.java new file mode 100644 index 00000000..9c8a74fe --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DreadClientHandler.java @@ -0,0 +1,392 @@ +package com.craisinlord.antarchy.forge.client; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.AntarchyTags; +import com.craisinlord.antarchy.forge.registry.AntarchyForgeMisc; +import com.craisinlord.antarchy.forge.registry.AntarchyForgeSounds; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.DeathScreen; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderSet; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TickEvent; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Optional; +import java.util.Random; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT) +public final class DreadClientHandler { + private static final int FOOTSTEP_MIN_INTERVAL_TICKS = 10; + private static final int FOOTSTEP_MAX_INTERVAL_TICKS = 22; + private static final int APPARITION_MIN_DURATION_TICKS = 16; + private static final int APPARITION_MAX_DURATION_TICKS = 34; + private static final int LUNGE_MIN_DURATION_TICKS = 10; + private static final int LUNGE_MAX_DURATION_TICKS = 16; + + private static int nextSoundTick = 0; + private static int nextApparitionTick = 0; + private static int nextFootstepTick = 0; + private static final List ACTIVE_APPARITIONS = new ArrayList<>(); + private static final Random RANDOM = new Random(); + + private DreadClientHandler() { + } + + private enum ApparitionType { + PERIPHERAL_SILHOUETTE, + CROSSING_SHADOW, + LUNGE_FLASH + } + + private static final class ApparitionEntry { + private final ApparitionType type; + private final float scale; + private final int lifetime; + private final int baseColor; + private float xNorm; + private float yNorm; + private float xVelocity; + private float yVelocity; + private int age; + + private ApparitionEntry(ApparitionType type, float xNorm, float yNorm, float xVelocity, float yVelocity, float scale, int lifetime, int baseColor) { + this.type = type; + this.xNorm = xNorm; + this.yNorm = yNorm; + this.xVelocity = xVelocity; + this.yVelocity = yVelocity; + this.scale = scale; + this.lifetime = lifetime; + this.baseColor = baseColor; + } + + private void tick() { + this.age++; + this.xNorm += this.xVelocity; + this.yNorm += this.yVelocity; + } + + private boolean expired() { + return this.age >= this.lifetime; + } + + private float alpha() { + float progress = this.lifetime <= 0 ? 1.0F : (float) this.age / (float) this.lifetime; + return Mth.clamp(Mth.sin(progress * (float) Math.PI), 0.0F, 1.0F); + } + } + + @SubscribeEvent + public static void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + Minecraft mc = Minecraft.getInstance(); + if (mc.level == null || mc.player == null) { + resetState(); + return; + } + if (mc.isPaused()) { + return; + } + + Player player = mc.player; + if (!player.isAlive() || player.isRemoved() || player.deathTime > 0 || player.isDeadOrDying() || mc.screen instanceof DeathScreen) { + resetState(); + return; + } + + tickApparitions(); + + if (!player.hasEffect(AntarchyForgeMisc.DREAD.get())) { + resetState(); + return; + } + + if (AntarchySettings.dreadHallucinationSoundsEnabled()) { + nextSoundTick--; + if (nextSoundTick <= 0) { + playHallucinationSound(mc, player); + nextSoundTick = randomIntervalTicks( + AntarchySettings.dreadHallucinationSoundMinInterval(), + AntarchySettings.dreadHallucinationSoundMaxInterval() + ); + } + } else { + nextSoundTick = 0; + } + + nextFootstepTick--; + if (nextFootstepTick <= 0) { + if (player.onGround() && player.getDeltaMovement().horizontalDistanceSqr() > 0.0025D) { + playFootstepSound(mc, player); + nextFootstepTick = randomTickInterval(FOOTSTEP_MIN_INTERVAL_TICKS, FOOTSTEP_MAX_INTERVAL_TICKS); + } else { + nextFootstepTick = 4; + } + } + + if (AntarchySettings.dreadHallucinationMobsEnabled()) { + nextApparitionTick--; + if (nextApparitionTick <= 0) { + spawnApparition(mc, player); + nextApparitionTick = randomIntervalTicks( + AntarchySettings.dreadHallucinationMobMinInterval(), + AntarchySettings.dreadHallucinationMobMaxInterval() + ); + } + } else { + nextApparitionTick = 0; + ACTIVE_APPARITIONS.clear(); + } + } + + public static void render(GuiGraphics guiGraphics) { + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + if (player == null || !player.hasEffect(AntarchyForgeMisc.DREAD.get()) || ACTIVE_APPARITIONS.isEmpty()) { + return; + } + + int width = mc.getWindow().getGuiScaledWidth(); + int height = mc.getWindow().getGuiScaledHeight(); + for (ApparitionEntry entry : ACTIVE_APPARITIONS) { + float alpha = entry.alpha(); + if (alpha <= 0.01F) { + continue; + } + + switch (entry.type) { + case PERIPHERAL_SILHOUETTE -> renderPeripheralSilhouette(guiGraphics, width, height, entry, alpha); + case CROSSING_SHADOW -> renderCrossingShadow(guiGraphics, width, height, entry, alpha); + case LUNGE_FLASH -> renderLungeFlash(guiGraphics, width, height, entry, alpha); + } + } + } + + private static void tickApparitions() { + Iterator iterator = ACTIVE_APPARITIONS.iterator(); + while (iterator.hasNext()) { + ApparitionEntry entry = iterator.next(); + entry.tick(); + if (entry.expired()) { + iterator.remove(); + } + } + } + + private static void playHallucinationSound(Minecraft mc, Player player) { + Optional> tagOpt = + BuiltInRegistries.SOUND_EVENT.getTag(AntarchyTags.SoundEvents.DREAD_HALLUCINATION_SOUNDS); + if (tagOpt.isEmpty()) { + return; + } + + List> sounds = tagOpt.get().stream().toList(); + if (sounds.isEmpty()) { + return; + } + + SoundEvent soundEvent = sounds.get(RANDOM.nextInt(sounds.size())).value(); + + Vec3 look = player.getLookAngle(); + double baseAngle = Math.atan2(-look.x, -look.z); + double spread = (RANDOM.nextDouble() - 0.5D) * Math.PI; + double angle = baseAngle + spread; + double distance = 10.0D + RANDOM.nextDouble() * 15.0D; + + double soundX = player.getX() + Math.sin(angle) * distance; + double soundY = player.getY() + RANDOM.nextDouble() * 4.0D - 1.0D; + double soundZ = player.getZ() + Math.cos(angle) * distance; + + mc.level.playLocalSound( + soundX, + soundY, + soundZ, + soundEvent, + SoundSource.HOSTILE, + 1.0F, + 0.85F + RANDOM.nextFloat() * 0.3F, + false + ); + } + + private static void spawnApparition(Minecraft mc, Player player) { + double roll = RANDOM.nextDouble(); + if (roll < 0.5D) { + spawnPeripheralSilhouette(); + return; + } + if (roll < 0.82D) { + spawnCrossingShadow(); + return; + } + spawnLungeFlash(mc, player); + } + + private static void spawnPeripheralSilhouette() { + boolean leftSide = RANDOM.nextBoolean(); + float xNorm = leftSide ? 0.08F + RANDOM.nextFloat() * 0.08F : 0.84F + RANDOM.nextFloat() * 0.08F; + float yNorm = 0.48F + (RANDOM.nextFloat() - 0.5F) * 0.26F; + float scale = 0.85F + RANDOM.nextFloat() * 0.4F; + int lifetime = randomTickInterval(APPARITION_MIN_DURATION_TICKS, APPARITION_MAX_DURATION_TICKS); + ACTIVE_APPARITIONS.add(new ApparitionEntry( + ApparitionType.PERIPHERAL_SILHOUETTE, + xNorm, + yNorm, + leftSide ? -0.0015F : 0.0015F, + 0.0F, + scale, + lifetime, + 0x160000 + )); + } + + private static void spawnCrossingShadow() { + boolean leftToRight = RANDOM.nextBoolean(); + float xNorm = leftToRight ? -0.18F : 1.18F; + float yNorm = 0.38F + RANDOM.nextFloat() * 0.36F; + float velocity = leftToRight ? 0.04F + RANDOM.nextFloat() * 0.015F : -(0.04F + RANDOM.nextFloat() * 0.015F); + float scale = 0.9F + RANDOM.nextFloat() * 0.45F; + int lifetime = randomTickInterval(APPARITION_MIN_DURATION_TICKS, APPARITION_MAX_DURATION_TICKS); + ACTIVE_APPARITIONS.add(new ApparitionEntry( + ApparitionType.CROSSING_SHADOW, + xNorm, + yNorm, + velocity, + 0.0F, + scale, + lifetime, + 0x1A0000 + )); + } + + private static void spawnLungeFlash(Minecraft mc, Player player) { + float xNorm = 0.5F + (RANDOM.nextBoolean() ? -1.0F : 1.0F) * (0.12F + RANDOM.nextFloat() * 0.12F); + float yNorm = 0.58F + (RANDOM.nextFloat() - 0.5F) * 0.12F; + float scale = 0.95F + RANDOM.nextFloat() * 0.35F; + int lifetime = randomTickInterval(LUNGE_MIN_DURATION_TICKS, LUNGE_MAX_DURATION_TICKS); + ACTIVE_APPARITIONS.add(new ApparitionEntry( + ApparitionType.LUNGE_FLASH, + xNorm, + yNorm, + 0.0F, + -0.002F, + scale, + lifetime, + 0x2A0000 + )); + mc.level.playLocalSound( + player.getX(), + player.getY() + 1.0D, + player.getZ(), + AntarchyForgeSounds.NIGHTMARE_BITE.get(), + SoundSource.HOSTILE, + 0.4F, + 0.88F + RANDOM.nextFloat() * 0.12F, + false + ); + } + + private static void playFootstepSound(Minecraft mc, Player player) { + double soundX = player.getX() + (RANDOM.nextDouble() - 0.5D) * 1.2D; + double soundY = player.getY() - 0.95D; + double soundZ = player.getZ() + (RANDOM.nextDouble() - 0.5D) * 1.2D; + + mc.level.playLocalSound( + soundX, + soundY, + soundZ, + SoundEvents.SILVERFISH_STEP, + SoundSource.HOSTILE, + 0.45F, + 0.85F + RANDOM.nextFloat() * 0.25F, + false + ); + } + + private static void renderPeripheralSilhouette(GuiGraphics guiGraphics, int width, int height, ApparitionEntry entry, float alpha) { + int centerX = Math.round(entry.xNorm * width); + int baseY = Math.round(entry.yNorm * height); + int bodyWidth = Math.round(width * 0.045F * entry.scale); + int bodyHeight = Math.round(height * 0.24F * entry.scale); + int headSize = Math.round(bodyWidth * 0.78F); + int x0 = centerX - bodyWidth / 2; + int y0 = baseY - bodyHeight / 2; + + int outerColor = alphaColor(entry.baseColor, alpha * 0.8F); + int innerColor = alphaColor(0x5A0000, alpha * 0.22F); + + guiGraphics.fill(x0, y0, x0 + bodyWidth, y0 + bodyHeight, outerColor); + guiGraphics.fill(x0 - headSize / 2 + bodyWidth / 2, y0 - headSize / 2, x0 + bodyWidth / 2 + headSize / 2, y0 + headSize / 2, outerColor); + guiGraphics.fill(x0 + bodyWidth / 6, y0 + bodyHeight / 6, x0 + bodyWidth - bodyWidth / 6, y0 + bodyHeight - bodyHeight / 7, innerColor); + } + + private static void renderCrossingShadow(GuiGraphics guiGraphics, int width, int height, ApparitionEntry entry, float alpha) { + int centerX = Math.round(entry.xNorm * width); + int centerY = Math.round(entry.yNorm * height); + int shadowWidth = Math.round(width * 0.22F * entry.scale); + int shadowHeight = Math.round(height * 0.035F * entry.scale); + + int outerColor = alphaColor(entry.baseColor, alpha * 0.65F); + int innerColor = alphaColor(0x340000, alpha * 0.28F); + + guiGraphics.fill(centerX - shadowWidth / 2, centerY - shadowHeight / 2, centerX + shadowWidth / 2, centerY + shadowHeight / 2, outerColor); + guiGraphics.fill(centerX - shadowWidth / 3, centerY - shadowHeight, centerX + shadowWidth / 3, centerY + shadowHeight, innerColor); + } + + private static void renderLungeFlash(GuiGraphics guiGraphics, int width, int height, ApparitionEntry entry, float alpha) { + int centerX = Math.round(entry.xNorm * width); + int centerY = Math.round(entry.yNorm * height); + int faceWidth = Math.round(width * 0.11F * entry.scale); + int faceHeight = Math.round(height * 0.12F * entry.scale); + + int shadowColor = alphaColor(entry.baseColor, alpha * 0.82F); + int glowColor = alphaColor(0x4A0000, alpha * 0.25F); + int eyeColor = alphaColor(0xB02020, alpha * 0.8F); + + guiGraphics.fill(centerX - faceWidth / 2, centerY - faceHeight / 2, centerX + faceWidth / 2, centerY + faceHeight / 2, shadowColor); + guiGraphics.fill(centerX - faceWidth, centerY - faceHeight / 3, centerX + faceWidth, centerY + faceHeight, glowColor); + + int eyeWidth = Math.max(2, faceWidth / 7); + int eyeHeight = Math.max(2, faceHeight / 12); + int eyeY = centerY - faceHeight / 8; + int eyeOffset = faceWidth / 4; + guiGraphics.fill(centerX - eyeOffset - eyeWidth, eyeY, centerX - eyeOffset + eyeWidth, eyeY + eyeHeight, eyeColor); + guiGraphics.fill(centerX + eyeOffset - eyeWidth, eyeY, centerX + eyeOffset + eyeWidth, eyeY + eyeHeight, eyeColor); + } + + private static void resetState() { + ACTIVE_APPARITIONS.clear(); + nextSoundTick = 0; + nextApparitionTick = 0; + nextFootstepTick = 0; + } + + private static int randomIntervalTicks(double minSeconds, double maxSeconds) { + double seconds = minSeconds + RANDOM.nextDouble() * Math.max(0.0D, maxSeconds - minSeconds); + return Math.max(1, (int) (seconds * 20.0D)); + } + + private static int randomTickInterval(int minTicks, int maxTicks) { + return minTicks + RANDOM.nextInt(Math.max(1, maxTicks - minTicks + 1)); + } + + private static int alphaColor(int rgb, float alpha) { + int alphaByte = Mth.clamp((int) (alpha * 255.0F), 0, 255); + return (alphaByte << 24) | rgb; + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DreadHudRenderer.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DreadHudRenderer.java new file mode 100644 index 00000000..864dee43 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DreadHudRenderer.java @@ -0,0 +1,28 @@ +package com.craisinlord.antarchy.forge.client; + +import com.craisinlord.antarchy.forge.registry.AntarchyForgeMisc; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; + +public final class DreadHudRenderer { + private DreadHudRenderer() { + } + + public static void render(GuiGraphics guiGraphics) { + Minecraft minecraft = Minecraft.getInstance(); + Player player = minecraft.player; + if (player == null || minecraft.screen != null || player.isDeadOrDying() || !player.hasEffect(AntarchyForgeMisc.DREAD.get())) { + return; + } + + float pulse = Math.max(0.0F, Mth.sin(player.tickCount * ((float) Math.PI * 2.0F / 80.0F))); + int alpha = Mth.clamp(18 + Mth.floor(pulse * 64.0F), 0, 255); + int color = (alpha << 24) | 0x120000; + int width = minecraft.getWindow().getGuiScaledWidth(); + int height = minecraft.getWindow().getGuiScaledHeight(); + guiGraphics.fill(0, 0, width, height, color); + DreadClientHandler.render(guiGraphics); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DuctTapeClientHandler.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DuctTapeClientHandler.java new file mode 100644 index 00000000..ca48d7a0 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/DuctTapeClientHandler.java @@ -0,0 +1,39 @@ +package com.craisinlord.antarchy.forge.client; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.block.DuctTapeBlock; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.client.event.MovementInputUpdateEvent; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT) +public final class DuctTapeClientHandler { + private DuctTapeClientHandler() { + } + + @SubscribeEvent + public static void onMovementInputUpdate(MovementInputUpdateEvent event) { + if (!(event.getEntity() instanceof LocalPlayer player)) { + return; + } + + Minecraft mc = Minecraft.getInstance(); + if (mc.level == null || (!player.isNoGravity() && !DuctTapeBlock.isTouchingTape(mc.level, player))) { + return; + } + + var input = event.getInput(); + input.left = false; + input.right = false; + input.up = false; + input.down = false; + input.leftImpulse = 0.0F; + input.forwardImpulse = 0.0F; + input.jumping = false; + input.shiftKeyDown = false; + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ElythiaFireflyManager.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ElythiaFireflyManager.java new file mode 100644 index 00000000..5c70a317 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ElythiaFireflyManager.java @@ -0,0 +1,91 @@ +package com.craisinlord.antarchy.forge.client; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.AntarchyTags; +import com.craisinlord.antarchy.content.AntarchySoundEvents; +import com.craisinlord.antarchy.content.client.renderer.ElythiaSkyRenderer; +import com.craisinlord.antarchy.forge.registry.AntarchyForgeMisc; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.player.Player; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TickEvent; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT) +public final class ElythiaFireflyManager { + private static final long NIGHT_START = 13000L; + private static final long NIGHT_END = 23000L; + private static final int SPAWN_INTERVAL = 3; + private static final int SPAWN_RADIUS_H = 20; + private static final int SPAWN_Y_MIN = -2; + private static final int SPAWN_Y_MAX = 10; + private static final int SOUND_INTERVAL_MIN = 250; + private static final int SOUND_INTERVAL_MAX = 450; + + private static int nextSoundTick = SOUND_INTERVAL_MIN; + + private ElythiaFireflyManager() {} + + @SubscribeEvent + public static void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + Minecraft mc = Minecraft.getInstance(); + ClientLevel level = mc.level; + if (level == null || mc.player == null) return; + if (mc.isPaused()) return; + if (!ElythiaSkyRenderer.shouldRender(level)) return; + + long dayTime = level.getDayTime() % 24000L; + if (dayTime < NIGHT_START || dayTime > NIGHT_END) return; + + long gameTime = level.getGameTime(); + boolean fireflyBiome = level.getBiome(mc.player.blockPosition()).is(AntarchyTags.Biomes.ELYTHIA_FIREFLY_PARTICLE_BIOMES); + + if (AntarchySettings.elythiaFireflyParticlesEnabled() && fireflyBiome) { + if (gameTime % SPAWN_INTERVAL == 0) { + Player player = mc.player; + int px = (int) player.getX(); + int py = (int) player.getY(); + int pz = (int) player.getZ(); + + int attempts = 1 + level.random.nextInt(3); + for (int i = 0; i < attempts; i++) { + int ox = level.random.nextInt(SPAWN_RADIUS_H * 2 + 1) - SPAWN_RADIUS_H; + int oy = SPAWN_Y_MIN + level.random.nextInt(SPAWN_Y_MAX - SPAWN_Y_MIN + 1); + int oz = level.random.nextInt(SPAWN_RADIUS_H * 2 + 1) - SPAWN_RADIUS_H; + + BlockPos candidate = new BlockPos(px + ox, py + oy, pz + oz); + if (!level.getBlockState(candidate).isAir()) continue; + + level.addParticle( + AntarchyForgeMisc.FIREFLY.get(), + candidate.getX() + level.random.nextDouble(), + candidate.getY() + level.random.nextDouble(), + candidate.getZ() + level.random.nextDouble(), + 0.0, 0.0, 0.0 + ); + } + } + } + + nextSoundTick--; + if (nextSoundTick <= 0) { + nextSoundTick = SOUND_INTERVAL_MIN + level.random.nextInt(SOUND_INTERVAL_MAX - SOUND_INTERVAL_MIN + 1); + Player player = mc.player; + level.playLocalSound( + player.getX(), player.getY(), player.getZ(), + AntarchySoundEvents.ELYTHIA_FIREFLY_AMBIENT.get(), + SoundSource.AMBIENT, + 0.6f + level.random.nextFloat() * 0.3f, + 0.9f + level.random.nextFloat() * 0.2f, + false + ); + } + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/FallenKingCrownArmorStandLayer.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/FallenKingCrownArmorStandLayer.java new file mode 100644 index 00000000..1f71c17b --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/FallenKingCrownArmorStandLayer.java @@ -0,0 +1,46 @@ +package com.craisinlord.antarchy.forge.client; + +import com.craisinlord.antarchy.forge.registry.AntarchyForgeBlocks; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.ArmorStandModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.decoration.ArmorStand; +import net.minecraft.world.item.ItemStack; + +public final class FallenKingCrownArmorStandLayer extends RenderLayer { + private final BlockRenderDispatcher blockRenderer; + + public FallenKingCrownArmorStandLayer(RenderLayerParent renderer) { + super(renderer); + this.blockRenderer = Minecraft.getInstance().getBlockRenderer(); + } + + @Override + public void render(PoseStack poseStack, MultiBufferSource buffer, int packedLight, ArmorStand armorStand, float limbSwing, float limbSwingAmount, float partialTick, float ageInTicks, float netHeadYaw, float headPitch) { + ItemStack headStack = armorStand.getItemBySlot(EquipmentSlot.HEAD); + if (!headStack.is(com.craisinlord.antarchy.forge.registry.AntarchyForgeItems.FALLEN_KING_CROWN.get()) || armorStand.isInvisible()) { + return; + } + + poseStack.pushPose(); + this.getParentModel().head.translateAndRotate(poseStack); + poseStack.translate(0.5D, -0.125D, -0.5D); + poseStack.mulPose(Axis.XP.rotationDegrees(180.0F)); + poseStack.mulPose(Axis.YP.rotationDegrees(180.0F)); + this.blockRenderer.renderSingleBlock( + AntarchyForgeBlocks.FALLEN_KING_CROWN.get().defaultBlockState(), + poseStack, + buffer, + packedLight, + LivingEntityRenderer.getOverlayCoords(armorStand, 0.0F) + ); + poseStack.popPose(); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/FallenKingCrownLayer.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/FallenKingCrownLayer.java new file mode 100644 index 00000000..66decc42 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/FallenKingCrownLayer.java @@ -0,0 +1,58 @@ +package com.craisinlord.antarchy.forge.client; + +import com.craisinlord.antarchy.forge.registry.AntarchyForgeBlocks; +import com.craisinlord.antarchy.forge.registry.AntarchyForgeItems; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ItemStack; + +public final class FallenKingCrownLayer extends RenderLayer> { + private final BlockRenderDispatcher blockRenderer; + + public FallenKingCrownLayer(RenderLayerParent> renderer) { + super(renderer); + this.blockRenderer = Minecraft.getInstance().getBlockRenderer(); + } + + @Override + public void render( + PoseStack poseStack, + MultiBufferSource buffer, + int packedLight, + AbstractClientPlayer player, + float limbSwing, + float limbSwingAmount, + float partialTick, + float ageInTicks, + float netHeadYaw, + float headPitch + ) { + ItemStack headStack = player.getItemBySlot(EquipmentSlot.HEAD); + if (!headStack.is(AntarchyForgeItems.FALLEN_KING_CROWN.get()) || player.isInvisible()) { + return; + } + + poseStack.pushPose(); + this.getParentModel().head.translateAndRotate(poseStack); + poseStack.translate(0.5D, -0.125D, -0.5D); + poseStack.mulPose(Axis.XP.rotationDegrees(180.0F)); + poseStack.mulPose(Axis.YP.rotationDegrees(180.0F)); + this.blockRenderer.renderSingleBlock( + AntarchyForgeBlocks.FALLEN_KING_CROWN.get().defaultBlockState(), + poseStack, + buffer, + packedLight, + LivingEntityRenderer.getOverlayCoords(player, 0.0F) + ); + poseStack.popPose(); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/GravityCameraRollHandler.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/GravityCameraRollHandler.java new file mode 100644 index 00000000..1c3bb956 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/GravityCameraRollHandler.java @@ -0,0 +1,30 @@ +package com.craisinlord.antarchy.forge.client; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.gravity.AntarchyGravityApi; +import net.minecraft.world.entity.Entity; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.ViewportEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT) +public final class GravityCameraRollHandler { + private GravityCameraRollHandler() { + } + + @SubscribeEvent + public static void onComputeCameraAngles(ViewportEvent.ComputeCameraAngles event) { + Entity entity = event.getCamera().getEntity(); + if (entity == null) { + return; + } + + float flipProgress = AntarchyGravityApi.getGravityFlipProgress(entity, (float) event.getPartialTick()); + if (flipProgress <= 0.0F) { + return; + } + + event.setRoll(event.getRoll() + 180.0F * flipProgress); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/GravityGunClientHandler.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/GravityGunClientHandler.java new file mode 100644 index 00000000..3fd5fb42 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/GravityGunClientHandler.java @@ -0,0 +1,67 @@ +package com.craisinlord.antarchy.forge.client; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.item.GravityGunItem; +import com.craisinlord.antarchy.content.network.GravityGunPrimaryPayload; +import com.craisinlord.antarchy.content.network.GravityGunScrollPayload; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.util.Mth; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.client.event.InputEvent; +import com.craisinlord.antarchy.forge.network.AntarchyForgeNetworkCore; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT) +public final class GravityGunClientHandler { + private static final double SCROLL_STEP_DISTANCE = 0.75D; + private static boolean lastAttackDown; + + private GravityGunClientHandler() { + } + + @SubscribeEvent + public static void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + Minecraft mc = Minecraft.getInstance(); + if (mc.player == null || mc.level == null || mc.screen != null || !AntarchySettings.gravityGunEnabled()) { + lastAttackDown = false; + return; + } + + if (!(mc.player.getMainHandItem().getItem() instanceof GravityGunItem)) { + lastAttackDown = false; + return; + } + + boolean attackDown = mc.options.keyAttack.isDown(); + if (attackDown && !lastAttackDown) { + AntarchyForgeNetworkCore.sendToServer(new GravityGunPrimaryPayload()); + } + lastAttackDown = attackDown; + } + + @SubscribeEvent + public static void onMouseScroll(InputEvent.MouseScrollingEvent event) { + Minecraft mc = Minecraft.getInstance(); + if (mc.player == null || mc.level == null || mc.screen != null || !Screen.hasControlDown() || !AntarchySettings.gravityGunEnabled()) { + return; + } + + if (!(mc.player.getMainHandItem().getItem() instanceof GravityGunItem) || !GravityGunItem.hasHeldTarget(mc.player.getMainHandItem())) { + return; + } + + double scrollAmount = Mth.clamp(event.getScrollDelta(), -1.0D, 1.0D); + if (Math.abs(scrollAmount) < 1.0E-4D) { + return; + } + + AntarchyForgeNetworkCore.sendToServer(new GravityGunScrollPayload(scrollAmount * SCROLL_STEP_DISTANCE)); + event.setCanceled(true); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/HerculesBeetleChargeHudRenderer.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/HerculesBeetleChargeHudRenderer.java new file mode 100644 index 00000000..856adf66 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/HerculesBeetleChargeHudRenderer.java @@ -0,0 +1,47 @@ +package com.craisinlord.antarchy.forge.client; + +import com.craisinlord.antarchy.content.entity.HerculesBeetleEntity; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; + +public final class HerculesBeetleChargeHudRenderer { + private static final ResourceLocation GUI_ICONS_LOCATION = ResourceLocation.withDefaultNamespace("textures/gui/icons.png"); + private static final int BAR_WIDTH = 182; + private static final int BAR_HEIGHT = 5; + + private HerculesBeetleChargeHudRenderer() { + } + + public static void render(GuiGraphics guiGraphics) { + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + if (player == null || mc.screen != null || player.isDeadOrDying()) { + return; + } + if (!(player.getVehicle() instanceof HerculesBeetleEntity beetle)) { + return; + } + + int charge = beetle.getMountedCharge(); + if (charge <= 0) { + return; + } + + int width = mc.getWindow().getGuiScaledWidth(); + int height = mc.getWindow().getGuiScaledHeight(); + int x0 = width / 2 - BAR_WIDTH / 2; + int y0 = height - 29; + float chargeRatio = Mth.clamp(charge / 100.0F, 0.0F, 1.0F); + int filledWidth = Mth.clamp((int) (chargeRatio * BAR_WIDTH), 0, BAR_WIDTH); + + guiGraphics.blit(GUI_ICONS_LOCATION, x0, y0, 0, 84, BAR_WIDTH, BAR_HEIGHT); + if (filledWidth > 0) { + guiGraphics.setColor(1.0F, 0.78F, 0.2F, 0.45F + chargeRatio * 0.55F); + guiGraphics.blit(GUI_ICONS_LOCATION, x0, y0, 0, 89, filledWidth, BAR_HEIGHT); + guiGraphics.setColor(1.0F, 1.0F, 1.0F, 1.0F); + } + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/HerculesBeetleClientHandler.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/HerculesBeetleClientHandler.java new file mode 100644 index 00000000..16a59849 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/HerculesBeetleClientHandler.java @@ -0,0 +1,84 @@ +package com.craisinlord.antarchy.forge.client; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.client.CameraShakeClientState; +import com.craisinlord.antarchy.content.client.HerculesBeetleImpactShakeClientState; +import com.craisinlord.antarchy.content.client.HordeClientState; +import com.craisinlord.antarchy.content.entity.HerculesBeetleEntity; +import com.craisinlord.antarchy.content.network.HerculesBeetleFlightTogglePayload; +import com.craisinlord.antarchy.content.network.HerculesBeetleJumpInputPayload; +import com.craisinlord.antarchy.content.network.HerculesBeetleMountedAttackPayload; +import com.craisinlord.antarchy.content.network.HerculesBeetleMountedChargePayload; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TickEvent; +import com.craisinlord.antarchy.forge.network.AntarchyForgeNetworkCore; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT) +public final class HerculesBeetleClientHandler { + private static boolean wasPressingJump; + private static boolean wasPressingAttack; + private static boolean wasCharging; + private static boolean wasPressingFlightToggle; + + private HerculesBeetleClientHandler() { + } + + @SubscribeEvent + public static void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + CameraShakeClientState.tick(); + HerculesBeetleImpactShakeClientState.tick(); + HordeClientState.tick(); + + Minecraft mc = Minecraft.getInstance(); + LocalPlayer player = mc.player; + if (player == null || mc.screen != null) { + resetAll(); + return; + } + + if (!(player.getVehicle() instanceof HerculesBeetleEntity)) { + resetAll(); + return; + } + + boolean pressingJump = mc.options.keyJump.isDown(); + if (pressingJump != wasPressingJump) { + AntarchyForgeNetworkCore.sendToServer(new HerculesBeetleJumpInputPayload(pressingJump)); + wasPressingJump = pressingJump; + } + + boolean pressingAttack = mc.options.keyAttack.isDown(); + if (pressingAttack && !wasPressingAttack) { + AntarchyForgeNetworkCore.sendToServer(new HerculesBeetleMountedAttackPayload()); + } + wasPressingAttack = pressingAttack; + + boolean charging = AntarchyKeyBindings.HERCULES_BEETLE_CHARGE.isDown(); + if (charging != wasCharging) { + AntarchyForgeNetworkCore.sendToServer(new HerculesBeetleMountedChargePayload(charging)); + } + wasCharging = charging; + + boolean pressingFlightToggle = AntarchyKeyBindings.HERCULES_BEETLE_FLIGHT_TOGGLE.isDown(); + if (pressingFlightToggle && !wasPressingFlightToggle) { + AntarchyForgeNetworkCore.sendToServer(new HerculesBeetleFlightTogglePayload()); + } + wasPressingFlightToggle = pressingFlightToggle; + } + + private static void resetAll() { + if (wasPressingJump) { + AntarchyForgeNetworkCore.sendToServer(new HerculesBeetleJumpInputPayload(false)); + wasPressingJump = false; + } + wasPressingAttack = false; + wasCharging = false; + wasPressingFlightToggle = false; + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/InvertedGeyserEruptionParticle.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/InvertedGeyserEruptionParticle.java new file mode 100644 index 00000000..b3ce9a74 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/InvertedGeyserEruptionParticle.java @@ -0,0 +1,77 @@ +package com.craisinlord.antarchy.forge.client; + +import com.craisinlord.antarchy.content.client.particle.InvertedGeyserBaseParticleOptions; +import com.craisinlord.antarchy.content.client.particle.InvertedGeyserParticleOptions; +import com.craisinlord.antarchy.forge.registry.AntarchyForgeMisc; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.NoRenderParticle; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleProvider; + +public final class InvertedGeyserEruptionParticle extends NoRenderParticle { + private final int fluidBlocks; + private final double motionX; + private final double motionY; + private final double motionZ; + private final InvertedGeyserParticleOptions plumeParticle; + private final InvertedGeyserBaseParticleOptions baseParticle; + private final InvertedGeyserBaseParticleOptions poofParticle; + + protected InvertedGeyserEruptionParticle( + ClientLevel level, + double x, + double y, + double z, + double xd, + double yd, + double zd, + InvertedGeyserParticleOptions options + ) { + super(level, x, y, z); + this.motionX = xd; + this.motionY = yd; + this.motionZ = zd; + this.fluidBlocks = options.fluidBlocks(); + this.lifetime = 20; + this.plumeParticle = new InvertedGeyserParticleOptions(AntarchyForgeMisc.INVERTED_GEYSER_PLUME.get(), this.fluidBlocks, options.direction()); + this.baseParticle = new InvertedGeyserBaseParticleOptions(AntarchyForgeMisc.INVERTED_GEYSER_BASE.get(), this.fluidBlocks, 1.5F, options.direction()); + this.poofParticle = new InvertedGeyserBaseParticleOptions(AntarchyForgeMisc.INVERTED_GEYSER_POOF.get(), this.fluidBlocks, 2.0F, options.direction()); + } + + @Override + public void tick() { + super.tick(); + + if (this.age % 2 == 0) { + for (int i = 0; i < 2; i++) { + this.level.addParticle(this.baseParticle, this.x, this.y, this.z, this.motionX, this.motionY, this.motionZ); + } + } + + for (int i = 0; i < this.fluidBlocks + 2; i++) { + this.level.addParticle(this.plumeParticle, this.x, this.y, this.z, this.motionX, this.motionY, this.motionZ); + } + + if (this.age % 10 == 0) { + for (int i = 0; i < 20; i++) { + this.level.addParticle(this.poofParticle, this.x, this.y, this.z, this.motionX, this.motionY, this.motionZ); + } + } + } + + public static final class Provider implements ParticleProvider { + @Override + public Particle createParticle( + InvertedGeyserParticleOptions options, + ClientLevel level, + double x, + double y, + double z, + double xd, + double yd, + double zd + ) { + return new InvertedGeyserEruptionParticle(level, x, y, z, xd, yd, zd, options); + } + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/JumpyBootsClientHandler.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/JumpyBootsClientHandler.java new file mode 100644 index 00000000..9e0bd937 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/JumpyBootsClientHandler.java @@ -0,0 +1,117 @@ +package com.craisinlord.antarchy.forge.client; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.item.JumpyBootsHelper; +import com.craisinlord.antarchy.content.item.JumpyBootsItem; +import com.craisinlord.antarchy.content.network.JumpyBootsLaunchPayload; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.client.event.RenderGuiOverlayEvent; +import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay; +import com.craisinlord.antarchy.forge.network.AntarchyForgeNetworkCore; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT) +public final class JumpyBootsClientHandler { + private static int chargeTicks = 0; + private static boolean wasCharging = false; + private static int primeWindowTicks = 0; + private static int storedChargeTicks = 0; + + private JumpyBootsClientHandler() { + } + + @SubscribeEvent + public static void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + Minecraft mc = Minecraft.getInstance(); + LocalPlayer player = mc.player; + + if (player == null || mc.level == null || mc.screen != null) { + reset(); + return; + } + + if (!JumpyBootsItem.isWearingJumpyBoots(player)) { + reset(); + return; + } + + boolean onGround = player.onGround(); + boolean sneaking = player.input.shiftKeyDown; + boolean jumpPressed = mc.options.keyJump.consumeClick(); + + if (primeWindowTicks > 0) { + primeWindowTicks--; + if (jumpPressed) { + AntarchyForgeNetworkCore.sendToServer(new JumpyBootsLaunchPayload(storedChargeTicks, player.isSprinting())); + reset(); + return; + } + if (primeWindowTicks <= 0) { + reset(); + } + return; + } + + if (!onGround) { + chargeTicks = 0; + wasCharging = false; + return; + } + + if (jumpPressed && wasCharging && chargeTicks > 0) { + AntarchyForgeNetworkCore.sendToServer(new JumpyBootsLaunchPayload(chargeTicks, player.isSprinting())); + reset(); + return; + } + + if (sneaking) { + chargeTicks = Math.min(chargeTicks + 1, JumpyBootsHelper.CHARGE_TICKS_MAX); + wasCharging = true; + } else if (wasCharging && chargeTicks > 0) { + storedChargeTicks = chargeTicks; + if (jumpPressed) { + AntarchyForgeNetworkCore.sendToServer(new JumpyBootsLaunchPayload(storedChargeTicks, player.isSprinting())); + reset(); + return; + } + primeWindowTicks = JumpyBootsHelper.PRIME_WINDOW_TICKS; + chargeTicks = 0; + wasCharging = false; + } else { + chargeTicks = 0; + wasCharging = false; + } + } + + private static void reset() { + chargeTicks = 0; + wasCharging = false; + primeWindowTicks = 0; + storedChargeTicks = 0; + } + + @SubscribeEvent + public static void onRenderGuiLayer(RenderGuiOverlayEvent.Pre event) { + Minecraft mc = Minecraft.getInstance(); + if (mc.player == null || !JumpyBootsItem.isWearingJumpyBoots(mc.player) || !isCharging()) { + return; + } + if (event.getOverlay().id().equals(VanillaGuiOverlay.EXPERIENCE_BAR.id())) { + event.setCanceled(true); + } + } + + public static boolean isCharging() { + return chargeTicks > 0; + } + + public static int getChargeTicks() { + return chargeTicks; + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/JumpyBootsHudRenderer.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/JumpyBootsHudRenderer.java new file mode 100644 index 00000000..e0616169 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/JumpyBootsHudRenderer.java @@ -0,0 +1,48 @@ +package com.craisinlord.antarchy.forge.client; + +import com.craisinlord.antarchy.content.item.JumpyBootsHelper; +import com.craisinlord.antarchy.content.item.JumpyBootsItem; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; + +public final class JumpyBootsHudRenderer { + private static final ResourceLocation GUI_ICONS_LOCATION = ResourceLocation.withDefaultNamespace("textures/gui/icons.png"); + private static final int BAR_WIDTH = 182; + private static final int BAR_HEIGHT = 5; + + private JumpyBootsHudRenderer() { + } + + public static void render(GuiGraphics guiGraphics) { + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + if (player == null || mc.screen != null || player.isDeadOrDying()) { + return; + } + if (!JumpyBootsItem.isWearingJumpyBoots(player)) { + return; + } + if (!JumpyBootsClientHandler.isCharging()) { + return; + } + + int width = mc.getWindow().getGuiScaledWidth(); + int height = mc.getWindow().getGuiScaledHeight(); + int x0 = width / 2 - BAR_WIDTH / 2; + int y0 = height - 29; + + guiGraphics.blit(GUI_ICONS_LOCATION, x0, y0, 0, 84, BAR_WIDTH, BAR_HEIGHT); + + int chargeTicks = JumpyBootsClientHandler.getChargeTicks(); + float chargeRatio = Mth.clamp(chargeTicks / (float) JumpyBootsHelper.CHARGE_TICKS_MAX, 0.0F, 1.0F); + int filledWidth = Mth.clamp((int) (chargeRatio * BAR_WIDTH), 0, BAR_WIDTH); + if (filledWidth > 0) { + guiGraphics.setColor(1.0F, 1.0F, 1.0F, 0.35F + chargeRatio * 0.65F); + guiGraphics.blit(GUI_ICONS_LOCATION, x0, y0, 0, 89, filledWidth, BAR_HEIGHT); + guiGraphics.setColor(1.0F, 1.0F, 1.0F, 1.0F); + } + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/LucidSoundHandler.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/LucidSoundHandler.java new file mode 100644 index 00000000..3382e5da --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/LucidSoundHandler.java @@ -0,0 +1,292 @@ +package com.craisinlord.antarchy.forge.client; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.entity.lucid.LucidEntity; +import com.craisinlord.antarchy.forge.registry.AntarchyForgeSounds; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.DeathScreen; +import net.minecraft.client.resources.sounds.AbstractTickableSoundInstance; +import net.minecraft.client.resources.sounds.SoundInstance; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TickEvent; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT) +public final class LucidSoundHandler { + private static final double START_SCAN_RADIUS = 96.0D; + private static final int ANIM_ATTACK = 2; + private static final int ANIM_DEATH = 3; + private static final Map ACTIVE_LOOPS = new HashMap<>(); + + private LucidSoundHandler() { + } + + @SubscribeEvent + public static void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + Minecraft mc = Minecraft.getInstance(); + if (mc.level == null || mc.player == null || mc.isPaused()) { + resetAll(mc); + return; + } + + if (!mc.player.isAlive() || mc.player.isRemoved() || mc.player.isDeadOrDying() || mc.screen instanceof DeathScreen) { + resetAll(mc); + return; + } + + pruneStaleLoops(mc); + refreshNearbyLucids(mc); + } + + private static void refreshNearbyLucids(Minecraft mc) { + List lucids = mc.level.getEntitiesOfClass( + LucidEntity.class, + mc.player.getBoundingBox().inflate(START_SCAN_RADIUS) + ); + + for (LucidEntity lucid : lucids) { + if (!lucid.shouldPlayAmbientLoop()) { + continue; + } + + LucidLoopSet set = ACTIVE_LOOPS.get(lucid.getUUID()); + if (set == null) { + set = new LucidLoopSet(lucid); + ACTIVE_LOOPS.put(lucid.getUUID(), set); + set.start(mc); + continue; + } + + set.refresh(mc, lucid); + } + } + + private static void pruneStaleLoops(Minecraft mc) { + Iterator> iterator = ACTIVE_LOOPS.entrySet().iterator(); + while (iterator.hasNext()) { + LucidLoopSet set = iterator.next().getValue(); + if (!set.isValid()) { + set.stop(mc); + iterator.remove(); + continue; + } + + if (!set.entity.shouldPlayAmbientLoop()) { + set.stop(mc); + iterator.remove(); + } + } + } + + private static void resetAll(Minecraft mc) { + for (LucidLoopSet set : ACTIVE_LOOPS.values()) { + set.stop(mc); + } + ACTIVE_LOOPS.clear(); + } + + private static final class LucidLoopSet { + private LucidEntity entity; + @Nullable private LucidLoopSound ambient; + @Nullable private LucidLoopSound flying; + private int lastAnimationState = -1; + + private LucidLoopSet(LucidEntity entity) { + this.entity = entity; + } + + private boolean isValid() { + return this.entity != null && this.entity.isAlive() && !this.entity.isRemoved(); + } + + private void start(Minecraft mc) { + this.playAttackSoundIfNeeded(mc, this.entity); + + if (this.ambient == null || !mc.getSoundManager().isActive(this.ambient)) { + this.ambient = new LucidLoopSound( + this.entity, + AntarchyForgeSounds.LUCID_AMBIENT.get(), + SoundSource.HOSTILE, + 0.14F, + 0.97F, + true + ); + mc.getSoundManager().play(this.ambient); + } + + if (this.entity.shouldPlayFlyingLoop() && (this.flying == null || !mc.getSoundManager().isActive(this.flying))) { + this.flying = new LucidLoopSound( + this.entity, + AntarchyForgeSounds.LUCID_FLYING.get(), + SoundSource.HOSTILE, + 0.18F, + 1.0F, + false + ); + mc.getSoundManager().play(this.flying); + } + } + + private void refresh(Minecraft mc, LucidEntity entity) { + this.entity = entity; + this.playAttackSoundIfNeeded(mc, entity); + + if (this.ambient == null || !mc.getSoundManager().isActive(this.ambient)) { + this.ambient = new LucidLoopSound( + entity, + AntarchyForgeSounds.LUCID_AMBIENT.get(), + SoundSource.HOSTILE, + 0.14F, + 0.97F, + true + ); + mc.getSoundManager().play(this.ambient); + } else { + this.ambient.setEntity(entity); + } + + if (entity.shouldPlayFlyingLoop()) { + if (this.flying == null || !mc.getSoundManager().isActive(this.flying)) { + this.flying = new LucidLoopSound( + entity, + AntarchyForgeSounds.LUCID_FLYING.get(), + SoundSource.HOSTILE, + 0.18F, + 1.0F, + false + ); + mc.getSoundManager().play(this.flying); + } else { + this.flying.setEntity(entity); + } + } else if (this.flying != null) { + mc.getSoundManager().stop(this.flying); + this.flying = null; + } + } + + private void stop(Minecraft mc) { + if (this.ambient != null) { + mc.getSoundManager().stop(this.ambient); + this.ambient = null; + } + if (this.flying != null) { + mc.getSoundManager().stop(this.flying); + this.flying = null; + } + this.lastAnimationState = -1; + } + + private void playAttackSoundIfNeeded(Minecraft mc, LucidEntity entity) { + int currentState = entity.getAnimationState(); + if (currentState == ANIM_ATTACK && this.lastAnimationState != ANIM_ATTACK) { + mc.getSoundManager().play(new LucidOneShotSound( + entity, + AntarchyForgeSounds.LUCID_ATTACK.get(), + SoundSource.HOSTILE, + 1.0F, + 1.02F + entity.getRandom().nextFloat() * 0.08F + )); + } + this.lastAnimationState = currentState; + } + } + + private static final class LucidLoopSound extends AbstractTickableSoundInstance { + private LucidEntity entity; + private final boolean ambient; + + private LucidLoopSound(LucidEntity entity, SoundEvent soundEvent, SoundSource source, + float volume, float pitch, boolean ambient) { + super(soundEvent, source, RandomSource.create()); + this.entity = entity; + this.ambient = ambient; + this.looping = true; + this.delay = 0; + this.relative = false; + this.attenuation = SoundInstance.Attenuation.LINEAR; + this.volume = volume; + this.pitch = pitch; + this.x = entity.getX(); + this.y = entity.getY(); + this.z = entity.getZ(); + } + + private void setEntity(LucidEntity entity) { + this.entity = entity; + } + + @Override + public void tick() { + if (this.entity == null + || this.entity.isRemoved() + || this.entity.isDeadOrDying() + || this.entity.getAnimationState() == 3 + || !this.entity.shouldPlayAmbientLoop()) { + this.stop(); + return; + } + + if (!this.ambient && !this.entity.shouldPlayFlyingLoop()) { + this.stop(); + return; + } + + this.x = this.entity.getX(); + this.y = this.entity.getY(); + this.z = this.entity.getZ(); + } + + @Override + public boolean canStartSilent() { + return true; + } + } + + private static final class LucidOneShotSound extends AbstractTickableSoundInstance { + private LucidEntity entity; + + private LucidOneShotSound(LucidEntity entity, SoundEvent soundEvent, SoundSource source, + float volume, float pitch) { + super(soundEvent, source, RandomSource.create()); + this.entity = entity; + this.looping = false; + this.delay = 0; + this.relative = false; + this.attenuation = SoundInstance.Attenuation.LINEAR; + this.volume = volume; + this.pitch = pitch; + this.x = entity.getX(); + this.y = entity.getY(); + this.z = entity.getZ(); + } + + @Override + public void tick() { + if (this.entity == null + || this.entity.isRemoved() + || this.entity.isDeadOrDying() + || this.entity.getAnimationState() == ANIM_DEATH) { + this.stop(); + return; + } + + this.x = this.entity.getX(); + this.y = this.entity.getY(); + this.z = this.entity.getZ(); + } + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/MogglesClientRenderer.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/MogglesClientRenderer.java new file mode 100644 index 00000000..581a0f64 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/MogglesClientRenderer.java @@ -0,0 +1,63 @@ +package com.craisinlord.antarchy.forge.client; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.item.MogglesCaveDetector; +import com.craisinlord.antarchy.content.item.MogglesLogic; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TickEvent; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, bus = Mod.EventBusSubscriber.Bus.FORGE, value = Dist.CLIENT) +public final class MogglesClientRenderer { + private MogglesClientRenderer() {} + + @SubscribeEvent + public static void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + Level level = mc.level; + if (player == null || level == null) return; + + if (!MogglesLogic.isWearingMoggles(player) || level.canSeeSky(player.blockPosition())) { + MogglesCaveDetector.clear(); + return; + } + + // Run cave BFS (internally rate-limited to every 40 ticks). + MogglesCaveDetector.tick(player, level); + + BlockPos target = MogglesCaveDetector.getCaveTarget(); + if (target == null) return; + + // Spawn particle trail toward the cave every 2 ticks. + if (level.getGameTime() % 2 != 0) return; + + Vec3 eye = player.getEyePosition(); + Vec3 end = Vec3.atCenterOf(target); + double totalDist = eye.distanceTo(end); + if (totalDist < 1.5) return; + + Vec3 dir = end.subtract(eye).normalize(); + + int steps = Math.min(5, (int) (totalDist / 1.5)); + double spacing = (totalDist - 1.5) / Math.max(steps, 1); + + for (int i = 0; i < steps; i++) { + double t = 1.5 + i * spacing; + Vec3 p = eye.add(dir.scale(t)); + Vec3 vel = dir.scale(0.04); + level.addParticle(ParticleTypes.END_ROD, + p.x, p.y, p.z, + vel.x, vel.y, vel.z); + } + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ParalyzedClientHandler.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ParalyzedClientHandler.java new file mode 100644 index 00000000..704d380b --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ParalyzedClientHandler.java @@ -0,0 +1,96 @@ +package com.craisinlord.antarchy.forge.client; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.forge.registry.AntarchyForgeMisc; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.client.event.MovementInputUpdateEvent; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT) +public final class ParalyzedClientHandler { + + + private static final int PARTICLE_INTERVAL = 3; + + private static final int PARTICLES_PER_ENTITY = 4; + + private static final double PARTICLE_RADIUS = 24.0; + + private ParalyzedClientHandler() { + } + + + @SubscribeEvent + public static void onMovementInputUpdate(MovementInputUpdateEvent event) { + if (!event.getEntity().hasEffect(AntarchyForgeMisc.PARALYZED.get())) { + return; + } + + var input = event.getInput(); + input.left = false; + input.right = false; + input.up = false; + input.down = false; + input.leftImpulse = 0.0F; + input.forwardImpulse = 0.0F; + input.jumping = false; + } + + @SubscribeEvent + public static void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + Minecraft mc = Minecraft.getInstance(); + if (mc.player == null || mc.level == null) { + return; + } + + Player player = mc.player; + if (player.hasEffect(AntarchyForgeMisc.PARALYZED.get())) { + while (mc.options.keyAttack.consumeClick()) { } + while (mc.options.keyUse.consumeClick()) { } + } + if (player.tickCount % PARTICLE_INTERVAL != 0) { + return; + } + + ClientLevel level = mc.level; + level.getEntitiesOfClass( + LivingEntity.class, + player.getBoundingBox().inflate(PARTICLE_RADIUS), + entity -> entity != player + && entity.isAlive() + && entity.hasEffect(AntarchyForgeMisc.PARALYZED.get()) + ).forEach(entity -> spawnStoneParticles(level, entity)); + } + + private static void spawnStoneParticles(ClientLevel level, LivingEntity entity) { + BlockState stone = Blocks.STONE.defaultBlockState(); + BlockParticleOption particle = new BlockParticleOption(ParticleTypes.BLOCK, stone); + + float w = entity.getBbWidth(); + float h = entity.getBbHeight(); + + for (int i = 0; i < PARTICLES_PER_ENTITY; i++) { + double px = entity.getX() + (Math.random() - 0.5) * w; + double py = entity.getY() + Math.random() * h; + double pz = entity.getZ() + (Math.random() - 0.5) * w; + + double vx = (Math.random() - 0.5) * 0.08; + double vy = Math.random() * 0.06; + double vz = (Math.random() - 0.5) * 0.08; + + level.addParticle(particle, px, py, pz, vx, vy, vz); + } + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ParalyzedHudRenderer.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ParalyzedHudRenderer.java new file mode 100644 index 00000000..2f5ad7e8 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ParalyzedHudRenderer.java @@ -0,0 +1,44 @@ +package com.craisinlord.antarchy.forge.client; + +import com.craisinlord.antarchy.forge.registry.AntarchyForgeMisc; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.player.Player; + +public final class ParalyzedHudRenderer { + + private ParalyzedHudRenderer() { + } + + public static void render(GuiGraphics guiGraphics) { + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + if (player == null || player.isDeadOrDying()) { + return; + } + + MobEffectInstance effect = player.getEffect(AntarchyForgeMisc.PARALYZED.get()); + if (effect == null) { + return; + } + + int duration = effect.getDuration(); + float fade = effect.isInfiniteDuration() + ? 1.0F + : Math.min(1.0F, Math.max(duration, 20) / 20.0F); + float pulse = 0.85F + 0.15F * Mth.sin(player.tickCount * ((float) Math.PI * 2.0F / 120.0F)); + + int alpha = Mth.clamp((int) (fade * pulse * 0xC0), 0, 0xFF); + + int width = mc.getWindow().getGuiScaledWidth(); + int height = mc.getWindow().getGuiScaledHeight(); + int color = (alpha << 24) | 0x303030; + guiGraphics.fill(0, 0, width, height, color); + int innerAlpha = Mth.clamp(alpha / 3, 0, 0xFF); + int innerColor = (innerAlpha << 24) | 0x606060; + int margin = Math.min(width, height) / 6; + guiGraphics.fill(margin, margin, width - margin, height - margin, innerColor); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ParalyzedStoneRenderHandler.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ParalyzedStoneRenderHandler.java new file mode 100644 index 00000000..0055fbb3 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ParalyzedStoneRenderHandler.java @@ -0,0 +1,18 @@ +package com.craisinlord.antarchy.forge.client; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import software.bernie.geckolib.event.GeoRenderEvent; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT) +public final class ParalyzedStoneRenderHandler { + + private ParalyzedStoneRenderHandler() { + } + @SubscribeEvent + public static void onCompileGeoEntityLayers(GeoRenderEvent.Entity.CompileRenderLayers event) { + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ReverieTrailHandler.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ReverieTrailHandler.java new file mode 100644 index 00000000..a094f64e --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ReverieTrailHandler.java @@ -0,0 +1,282 @@ +package com.craisinlord.antarchy.forge.client; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.entity.ReverieEntity; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.client.event.RenderLevelStageEvent; +import org.joml.Matrix4f; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.FORGE) +public final class ReverieTrailHandler { + + private static final int MAX_TRAIL_POINTS = 20; + private static final int IDLE_LIFETIME_TICKS = 8; + private static final int NORMAL_LIFETIME_TICKS = 14; + private static final int DASH_LIFETIME_TICKS = 22; + private static final float CORE_LINE_WIDTH = 0.035f; + private static final float GLOW_LINE_WIDTH = 0.10f; + private static final double MIN_DISTANCE_BETWEEN_POINTS = 0.05; + private static final double DASH_DISTANCE_THRESHOLD = 0.35; + + private static final Map> TRAILS = new HashMap<>(); + + private ReverieTrailHandler() {} + + private static final class TrailPoint { + final Vec3 pos; + final ReverieEntity.Mood mood; + int age; + final int lifetime; + + TrailPoint(Vec3 pos, ReverieEntity.Mood mood, int lifetime) { + this.pos = pos; + this.mood = mood; + this.age = 0; + this.lifetime = lifetime; + } + + float progress() { + return lifetime <= 0 ? 1f : (float) age / (float) lifetime; + } + + boolean expired() { + return age >= lifetime; + } + } + + @SubscribeEvent + public static void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + Minecraft mc = Minecraft.getInstance(); + if (mc.level == null) { + TRAILS.clear(); + return; + } + if (mc.isPaused()) return; + + Set activeIds = new HashSet<>(); + + for (Entity entity : mc.level.entitiesForRendering()) { + if (!(entity instanceof ReverieEntity reverie)) continue; + + int id = reverie.getId(); + activeIds.add(id); + ReverieEntity.Mood mood = reverie.getMood(); + Vec3 pos = reverie.position().add(0.0, reverie.getBbHeight() * 0.5, 0.0); + + ArrayDeque points = TRAILS.computeIfAbsent(id, k -> new ArrayDeque<>()); + + if (points.isEmpty()) { + points.addFirst(new TrailPoint(pos, mood, lifetimeFor(mood, false))); + } else { + Vec3 lastPos = points.peekFirst().pos; + double distSq = pos.distanceToSqr(lastPos); + if (distSq >= MIN_DISTANCE_BETWEEN_POINTS * MIN_DISTANCE_BETWEEN_POINTS) { + boolean isDash = distSq >= DASH_DISTANCE_THRESHOLD * DASH_DISTANCE_THRESHOLD; + points.addFirst(new TrailPoint(pos, mood, lifetimeFor(mood, isDash))); + while (points.size() > MAX_TRAIL_POINTS) { + points.pollLast(); + } + } + } + + Iterator it = points.iterator(); + while (it.hasNext()) { + TrailPoint p = it.next(); + p.age++; + if (p.expired()) it.remove(); + } + } + + TRAILS.keySet().removeIf(id -> !activeIds.contains(id)); + } + + private static int lifetimeFor(ReverieEntity.Mood mood, boolean isDash) { + if (isDash || mood == ReverieEntity.Mood.PURPLE) return DASH_LIFETIME_TICKS; + if (mood == ReverieEntity.Mood.WHITE) return IDLE_LIFETIME_TICKS; + return NORMAL_LIFETIME_TICKS; + } + + @SubscribeEvent + public static void onRenderLevelStage(RenderLevelStageEvent event) { + if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_PARTICLES) return; + if (TRAILS.isEmpty()) return; + + Minecraft mc = Minecraft.getInstance(); + if (mc.level == null) return; + + Camera camera = event.getCamera(); + Vec3 camPos = camera.getPosition(); + Matrix4f mat = event.getPoseStack().last().pose(); + + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.depthMask(false); + RenderSystem.disableCull(); + RenderSystem.setShader(GameRenderer::getPositionColorShader); + + Tesselator tesselator = Tesselator.getInstance(); + + List> snapshots = new ArrayList<>(TRAILS.size()); + for (ArrayDeque deque : TRAILS.values()) { + if (deque.size() >= 2) snapshots.add(new ArrayList<>(deque)); + } + + if (snapshots.isEmpty()) { + RenderSystem.enableCull(); + RenderSystem.depthMask(true); + RenderSystem.disableBlend(); + return; + } + + BufferBuilder glowBuf = tesselator.getBuilder(); + glowBuf.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + for (List points : snapshots) { + buildPass(glowBuf, mat, points, camPos, true); + } + BufferUploader.drawWithShader(glowBuf.end()); + + BufferBuilder coreBuf = tesselator.getBuilder(); + coreBuf.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + for (List points : snapshots) { + buildPass(coreBuf, mat, points, camPos, false); + } + BufferUploader.drawWithShader(coreBuf.end()); + + RenderSystem.enableCull(); + RenderSystem.depthMask(true); + RenderSystem.disableBlend(); + } + + private static void buildPass(BufferBuilder buf, Matrix4f mat, List points, Vec3 camPos, boolean glow) { + int n = points.size(); + + for (int i = 0; i < n - 1; i++) { + TrailPoint newer = points.get(i); + TrailPoint older = points.get(i + 1); + + float alphaNearer = (glow ? glowAlpha(newer.mood) : coreAlpha(newer.mood)) * indexAlpha(i, n) * (1f - newer.progress()); + float alphaFarther = (glow ? glowAlpha(older.mood) : coreAlpha(older.mood)) * indexAlpha(i + 1, n) * (1f - older.progress()); + if (alphaNearer < 0.005f && alphaFarther < 0.005f) continue; + + Vec3 right = cameraFacingRight(newer.pos, older.pos, camPos); + if (right == null) continue; + + float halfWidth = glow ? glowHalfWidth(newer.mood) : coreHalfWidth(newer.mood); + right = right.scale(halfWidth); + + float[] cn = color(newer.mood); + float[] co = color(older.mood); + Vec3 na = newer.pos.subtract(camPos); + Vec3 nb = older.pos.subtract(camPos); + + buf.vertex(mat, (float)(na.x + right.x), (float)(na.y + right.y), (float)(na.z + right.z)).color(cn[0], cn[1], cn[2], alphaNearer).endVertex(); + buf.vertex(mat, (float)(na.x - right.x), (float)(na.y - right.y), (float)(na.z - right.z)).color(cn[0], cn[1], cn[2], alphaNearer).endVertex(); + buf.vertex(mat, (float)(nb.x - right.x), (float)(nb.y - right.y), (float)(nb.z - right.z)).color(co[0], co[1], co[2], alphaFarther).endVertex(); + buf.vertex(mat, (float)(nb.x + right.x), (float)(nb.y + right.y), (float)(nb.z + right.z)).color(co[0], co[1], co[2], alphaFarther).endVertex(); + } + } + + private static Vec3 cameraFacingRight(Vec3 a, Vec3 b, Vec3 camPos) { + Vec3 segDir = b.subtract(a); + if (segDir.lengthSqr() < 1e-12) return null; + segDir = segDir.normalize(); + Vec3 mid = a.add(b).scale(0.5); + Vec3 toCamera = camPos.subtract(mid); + if (toCamera.lengthSqr() < 1e-12) return null; + toCamera = toCamera.normalize(); + Vec3 right = segDir.cross(toCamera); + if (right.lengthSqr() < 1e-10) { + right = segDir.cross(new Vec3(0.0, 1.0, 0.0)); + if (right.lengthSqr() < 1e-10) return null; + } + return right.normalize(); + } + + private static float indexAlpha(int i, int n) { + if (n <= 1) return 1f; + return 1f - (float) i / (float) (n - 1); + } + + private static final float[] COLOR_WHITE = { 1.0f, 1.0f, 1.0f }; + private static final float[] COLOR_YELLOW = { 1.0f, 0.85f, 0.1f }; + private static final float[] COLOR_RED = { 1.0f, 0.1f, 0.05f }; + private static final float[] COLOR_PURPLE = { 0.7f, 0.1f, 1.0f }; + private static final float[] COLOR_BLUE = { 0.1f, 0.5f, 1.0f }; + + private static float[] color(ReverieEntity.Mood mood) { + return switch (mood) { + case WHITE -> COLOR_WHITE; + case YELLOW -> COLOR_YELLOW; + case RED -> COLOR_RED; + case PURPLE -> COLOR_PURPLE; + case BLUE -> COLOR_BLUE; + }; + } + + private static float glowAlpha(ReverieEntity.Mood mood) { + return switch (mood) { + case WHITE -> 0.15f; + case YELLOW -> 0.30f; + case RED -> 0.55f; + case PURPLE -> 0.65f; + case BLUE -> 0.35f; + }; + } + + private static float coreAlpha(ReverieEntity.Mood mood) { + return switch (mood) { + case WHITE -> 0.35f; + case YELLOW -> 0.55f; + case RED -> 0.85f; + case PURPLE -> 0.95f; + case BLUE -> 0.60f; + }; + } + + private static float glowHalfWidth(ReverieEntity.Mood mood) { + float base = GLOW_LINE_WIDTH * 0.5f; + return switch (mood) { + case WHITE -> base * 0.60f; + case YELLOW -> base * 0.80f; + case RED -> base * 1.00f; + case PURPLE -> base * 1.25f; + case BLUE -> base * 0.90f; + }; + } + + private static float coreHalfWidth(ReverieEntity.Mood mood) { + float base = CORE_LINE_WIDTH * 0.5f; + return switch (mood) { + case WHITE -> base * 0.60f; + case YELLOW -> base * 0.80f; + case RED -> base * 1.20f; + case PURPLE -> base * 1.50f; + case BLUE -> base * 1.00f; + }; + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ScorpionWhipTetherRenderHandler.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ScorpionWhipTetherRenderHandler.java new file mode 100644 index 00000000..68897fa3 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ScorpionWhipTetherRenderHandler.java @@ -0,0 +1,151 @@ +package com.craisinlord.antarchy.forge.client; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.client.ScorpionWhipTetherClientState; +import com.craisinlord.antarchy.content.item.ScorpionWhipItem; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import java.util.Map; +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.HumanoidArm; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.client.event.RenderLevelStageEvent; +import org.joml.Matrix4f; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.FORGE) +public final class ScorpionWhipTetherRenderHandler { + private ScorpionWhipTetherRenderHandler() { + } + + @SubscribeEvent + public static void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + Minecraft minecraft = Minecraft.getInstance(); + if (minecraft.level == null) { + ScorpionWhipTetherClientState.clear(); + } + } + + @SubscribeEvent + public static void onRenderLevelStage(RenderLevelStageEvent event) { + if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_PARTICLES) { + return; + } + + Minecraft minecraft = Minecraft.getInstance(); + if (minecraft.level == null) { + return; + } + + Map tethers = ScorpionWhipTetherClientState.snapshot(); + if (tethers.isEmpty()) { + return; + } + + Camera camera = event.getCamera(); + Vec3 cameraPos = camera.getPosition(); + Matrix4f pose = event.getPoseStack().last().pose(); + + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.depthMask(false); + RenderSystem.disableCull(); + RenderSystem.setShader(GameRenderer::getPositionColorShader); + + BufferBuilder buffer = Tesselator.getInstance().getBuilder(); + buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + for (Map.Entry entry : tethers.entrySet()) { + Entity source = minecraft.level.getEntity(entry.getKey()); + Entity target = minecraft.level.getEntity(entry.getValue()); + if (!(source instanceof Player player) || target == null || target.isRemoved()) { + continue; + } + + buildTether( + buffer, + pose, + tetherStart(player, event.getPartialTick()), + target.position().add(0.0D, target.getBbHeight() * 0.5D, 0.0D), + cameraPos + ); + } + + BufferUploader.drawWithShader(buffer.end()); + + RenderSystem.enableCull(); + RenderSystem.depthMask(true); + RenderSystem.disableBlend(); + } + + private static Vec3 tetherStart(Player player, float partialTick) { + Vec3 start = player.getEyePosition(partialTick).add(0.0D, -0.45D, 0.0D); + boolean mainHandWhip = player.getMainHandItem().getItem() instanceof ScorpionWhipItem; + boolean offHandWhip = player.getOffhandItem().getItem() instanceof ScorpionWhipItem; + if (!mainHandWhip && !offHandWhip) { + return start; + } + + boolean useMainHand = mainHandWhip || !offHandWhip; + HumanoidArm arm = useMainHand ? player.getMainArm() : player.getMainArm().getOpposite(); + float bodyYaw = Mth.rotLerp(partialTick, player.yBodyRotO, player.yBodyRot); + double radians = Math.toRadians(bodyYaw + 90.0F); + double side = arm == HumanoidArm.RIGHT ? -0.28D : 0.28D; + return start.add(Math.cos(radians) * side, -0.12D, Math.sin(radians) * side); + } + + private static void buildTether(BufferBuilder buffer, Matrix4f pose, Vec3 start, Vec3 end, Vec3 cameraPos) { + Vec3 delta = end.subtract(start); + double length = delta.length(); + if (length < 0.001D) { + return; + } + + Vec3 forward = delta.scale(1.0D / length); + Vec3 right = forward.cross(new Vec3(0.0D, 1.0D, 0.0D)); + if (right.lengthSqr() < 1.0E-6D) { + right = forward.cross(new Vec3(1.0D, 0.0D, 0.0D)); + } + right = right.normalize(); + + int segments = Math.max(16, Mth.ceil(length * 8.0D)); + for (int i = 0; i < segments; i++) { + double t0 = (double) i / (double) segments; + double t1 = (double) (i + 1) / (double) segments; + Vec3 p0 = ropePoint(start, delta, t0, length); + Vec3 p1 = ropePoint(start, delta, t1, length); + float width = 0.045F; + Vec3 offset = right.scale(width); + + Vec3 a = p0.subtract(cameraPos); + Vec3 b = p1.subtract(cameraPos); + float shade = i % 2 == 0 ? 0.82F : 0.62F; + float red = 0.36F * shade; + float green = 0.20F * shade; + float blue = 0.11F * shade; + + buffer.vertex(pose, (float) (a.x + offset.x), (float) (a.y + offset.y), (float) (a.z + offset.z)).color(red, green, blue, 1.0F).endVertex(); + buffer.vertex(pose, (float) (a.x - offset.x), (float) (a.y - offset.y), (float) (a.z - offset.z)).color(red, green, blue, 1.0F).endVertex(); + buffer.vertex(pose, (float) (b.x - offset.x), (float) (b.y - offset.y), (float) (b.z - offset.z)).color(red, green, blue, 1.0F).endVertex(); + buffer.vertex(pose, (float) (b.x + offset.x), (float) (b.y + offset.y), (float) (b.z + offset.z)).color(red, green, blue, 1.0F).endVertex(); + } + } + + private static Vec3 ropePoint(Vec3 start, Vec3 delta, double t, double length) { + double sag = Math.sin(t * Math.PI) * Math.min(0.45D, length * 0.07D); + return start.add(delta.scale(t)).add(0.0D, -sag, 0.0D); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/StinkySoundHandler.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/StinkySoundHandler.java new file mode 100644 index 00000000..bd4d4d58 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/StinkySoundHandler.java @@ -0,0 +1,56 @@ +package com.craisinlord.antarchy.forge.client; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.AntarchySoundEvents; +import net.minecraft.client.Minecraft; +import net.minecraft.sounds.SoundSource; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TickEvent; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.FORGE) +public final class StinkySoundHandler { + private static final int FIRST_SOUND_DELAY = 20; + private static final int MIN_INTERVAL = 60; + private static final int MAX_INTERVAL = 120; + + private static int nextSoundTick = FIRST_SOUND_DELAY; + + private StinkySoundHandler() { + } + + @SubscribeEvent + public static void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + Minecraft mc = Minecraft.getInstance(); + if (mc.level == null || mc.player == null || mc.isPaused()) { + nextSoundTick = FIRST_SOUND_DELAY; + return; + } + + if (!mc.player.hasEffect(AntarchyObjects.STINKY_EFFECT.get())) { + nextSoundTick = FIRST_SOUND_DELAY; + return; + } + + nextSoundTick--; + if (nextSoundTick > 0) { + return; + } + + mc.level.playLocalSound( + mc.player.getX(), + mc.player.getY(), + mc.player.getZ(), + AntarchySoundEvents.STINKY_FLY.get(), + SoundSource.AMBIENT, + 0.14F + mc.level.random.nextFloat() * 0.06F, + 0.92F + mc.level.random.nextFloat() * 0.16F, + false + ); + nextSoundTick = MIN_INTERVAL + mc.level.random.nextInt(MAX_INTERVAL - MIN_INTERVAL + 1); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ThoraxisGravityCameraHandler.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ThoraxisGravityCameraHandler.java new file mode 100644 index 00000000..afd39bca --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/ThoraxisGravityCameraHandler.java @@ -0,0 +1,18 @@ +package com.craisinlord.antarchy.forge.client; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.client.event.ViewportEvent; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT) +public final class ThoraxisGravityCameraHandler { + private ThoraxisGravityCameraHandler() { + } + + @SubscribeEvent + public static void onComputeCameraAngles(ViewportEvent.ComputeCameraAngles event) { + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/TriffidGooHudRenderer.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/TriffidGooHudRenderer.java new file mode 100644 index 00000000..9ae5480d --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/TriffidGooHudRenderer.java @@ -0,0 +1,45 @@ +package com.craisinlord.antarchy.forge.client; + +import com.craisinlord.antarchy.forge.registry.AntarchyForgeBlocks; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.Block; + +public final class TriffidGooHudRenderer { + private TriffidGooHudRenderer() { + } + private static float fadeProgress = 0f; + private static final float FADE_SPEED = 0.05f; + private static final int MAX_ALPHA = 0x55; + + public static void render(GuiGraphics guiGraphics) { + Minecraft minecraft = Minecraft.getInstance(); + Player player = minecraft.player; + if (player == null || player.isDeadOrDying()) { + fadeProgress = Math.max(0f, fadeProgress - FADE_SPEED); + if (fadeProgress <= 0f) return; + } else { + Block goo = AntarchyForgeBlocks.TRIFFID_GOO_BLOCK.get(); + BlockPos feet = player.blockPosition(); + boolean inGoo = player.level().getBlockState(feet).is(goo) + || player.level().getBlockState(feet.above()).is(goo); + + if (inGoo) { + fadeProgress = Math.min(1f, fadeProgress + FADE_SPEED); + } else { + fadeProgress = Math.max(0f, fadeProgress - FADE_SPEED); + } + + if (fadeProgress <= 0f || minecraft.screen != null) return; + } + + int alpha = Mth.floor(MAX_ALPHA * fadeProgress); + int color = (alpha << 24) | 0x003300; + int width = minecraft.getWindow().getGuiScaledWidth(); + int height = minecraft.getWindow().getGuiScaledHeight(); + guiGraphics.fill(0, 0, width, height, color); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/WaspSoundHandler.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/WaspSoundHandler.java new file mode 100644 index 00000000..c87ee0d2 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/client/WaspSoundHandler.java @@ -0,0 +1,121 @@ +package com.craisinlord.antarchy.forge.client; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.entity.WaspEntity; +import com.craisinlord.antarchy.forge.registry.AntarchyForgeSounds; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.UUID; +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.sounds.AbstractTickableSoundInstance; +import net.minecraft.client.resources.sounds.SoundInstance; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.TickEvent; +import org.jetbrains.annotations.Nullable; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID, value = Dist.CLIENT) +public final class WaspSoundHandler { + private static final double START_SCAN_RADIUS = 96.0D; + private static final Map ACTIVE_LOOPS = new HashMap<>(); + + private WaspSoundHandler() { + } + + @SubscribeEvent + public static void onClientTick(TickEvent.ClientTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + // Ambient buzzing now comes from the wasp entity itself. + } + + private static void refreshNearbyWasps(Minecraft mc) { + for (WaspEntity wasp : mc.level.getEntitiesOfClass(WaspEntity.class, mc.player.getBoundingBox().inflate(START_SCAN_RADIUS))) { + WaspLoopSound loopSound = ACTIVE_LOOPS.get(wasp.getUUID()); + if (loopSound == null || !mc.getSoundManager().isActive(loopSound)) { + loopSound = new WaspLoopSound( + wasp, + AntarchyForgeSounds.WASP_IDLE.get(), + SoundSource.HOSTILE, + 0.12F, + 1.0F + ); + ACTIVE_LOOPS.put(wasp.getUUID(), loopSound); + mc.getSoundManager().play(loopSound); + } else { + loopSound.setEntity(wasp); + } + } + } + + private static void pruneStaleLoops(Minecraft mc) { + Iterator> iterator = ACTIVE_LOOPS.entrySet().iterator(); + while (iterator.hasNext()) { + WaspLoopSound loopSound = iterator.next().getValue(); + if (!loopSound.isValid()) { + loopSound.stop(mc); + iterator.remove(); + } + } + } + + private static void resetAll(Minecraft mc) { + for (WaspLoopSound loopSound : ACTIVE_LOOPS.values()) { + loopSound.stop(mc); + } + ACTIVE_LOOPS.clear(); + } + + private static final class WaspLoopSound extends AbstractTickableSoundInstance { + @Nullable + private WaspEntity entity; + + private WaspLoopSound(WaspEntity entity, SoundEvent soundEvent, SoundSource source, float volume, float pitch) { + super(soundEvent, source, RandomSource.create()); + this.entity = entity; + this.looping = true; + this.delay = 0; + this.relative = false; + this.attenuation = SoundInstance.Attenuation.LINEAR; + this.volume = volume; + this.pitch = pitch; + this.x = entity.getX(); + this.y = entity.getY(); + this.z = entity.getZ(); + } + + private void setEntity(WaspEntity entity) { + this.entity = entity; + } + + private boolean isValid() { + return this.entity != null && this.entity.isAlive() && !this.entity.isRemoved(); + } + + private void stop(Minecraft mc) { + mc.getSoundManager().stop(this); + } + + @Override + public void tick() { + if (this.entity == null || this.entity.isRemoved() || this.entity.isDeadOrDying() || !this.entity.isAlive()) { + this.stop(); + return; + } + + this.x = this.entity.getX(); + this.y = this.entity.getY(); + this.z = this.entity.getZ(); + } + + @Override + public boolean canStartSilent() { + return true; + } + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/content/block/WildCornBlock.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/content/block/WildCornBlock.java new file mode 100644 index 00000000..a4eef04d --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/content/block/WildCornBlock.java @@ -0,0 +1,55 @@ +package com.craisinlord.antarchy.forge.content.block; + +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.block.CornCropBlock; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; + +public final class WildCornBlock extends CornCropBlock { + public WildCornBlock(BlockBehaviour.Properties properties) { + super(properties); + this.registerDefaultState(this.stateDefinition.any().setValue(AGE, 3).setValue(HALF, DoubleBlockHalf.LOWER)); + } + + @Override + public boolean mayPlaceOn(BlockState state, BlockGetter level, BlockPos pos) { + return state.is(Blocks.GRASS_BLOCK); + } + + @Override + public boolean isRandomlyTicking(BlockState state) { + return false; + } + + @Override + public void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + } + + @Override + public boolean isValidBonemealTarget(LevelReader level, BlockPos pos, BlockState state, boolean isClient) { + return false; + } + + @Override + public boolean isBonemealSuccess(Level level, RandomSource random, BlockPos pos, BlockState state) { + return false; + } + + @Override + public void performBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state) { + } + + @Override + public ItemStack getCloneItemStack(BlockGetter level, BlockPos pos, BlockState state) { + return new ItemStack(AntarchyObjects.CORN.get()); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/content/fluid/AntiwaterFluid.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/content/fluid/AntiwaterFluid.java new file mode 100644 index 00000000..a8a56866 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/content/fluid/AntiwaterFluid.java @@ -0,0 +1,463 @@ +package com.craisinlord.antarchy.forge.content.fluid; + +import com.craisinlord.antarchy.forge.registry.AntarchyForgeBlocks; +import java.util.HashSet; +import java.util.Set; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.LiquidBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.common.ForgeMod; +import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.fluids.ForgeFlowingFluid; + +public abstract class AntiwaterFluid extends ForgeFlowingFluid { + private static final int MAX_HORIZONTAL_SPREAD_AMOUNT = 5; + private static final int MAX_VERTICAL_FLOW_AMOUNT = 7; + + protected AntiwaterFluid(Properties properties) { + super(properties); + } + + @Override + protected BlockState createLegacyBlock(FluidState state) { + return AntarchyForgeBlocks.ANTIWATER_BLOCK.get() + .defaultBlockState() + .setValue(LiquidBlock.LEVEL, getLegacyLevel(state)); + } + + @Override + public Vec3 getFlow(BlockGetter level, BlockPos pos, FluidState state) { + double flowX = 0.0D; + double flowZ = 0.0D; + + for (Direction direction : Direction.Plane.HORIZONTAL) { + BlockPos neighborPos = pos.relative(direction); + FluidState neighborFluid = level.getFluidState(neighborPos); + int neighborAmount = this.isSame(neighborFluid.getType()) ? neighborFluid.getAmount() : 0; + int currentAmount = state.getAmount(); + int delta = neighborAmount - currentAmount; + if (delta != 0) { + flowX += direction.getStepX() * delta; + flowZ += direction.getStepZ() * delta; + } + } + + Vec3 flow = new Vec3(flowX, 1.0D, flowZ); + return flow.lengthSqr() < 1.0E-6D ? new Vec3(0.0D, 1.0D, 0.0D) : flow.normalize(); + } + + @Override + protected boolean canConvertToSource(Level level) { + return false; + } + + @Override + public int getTickDelay(LevelReader level) { + return 5; + } + + @Override + protected int getSpreadDelay(Level level, BlockPos pos, FluidState currentState, FluidState newState) { + return this.getTickDelay(level); + } + + @Override + protected boolean canBeReplacedWith(FluidState state, BlockGetter level, BlockPos pos, Fluid fluid, Direction direction) { + return direction != Direction.DOWN && !this.isSame(fluid); + } + + @Override + protected boolean canSpreadTo( + BlockGetter level, + BlockPos fromPos, + BlockState fromState, + Direction direction, + BlockPos toPos, + BlockState toState, + FluidState toFluidState, + Fluid fluid + ) { + if (direction == Direction.DOWN) { + return false; + } + + return super.canSpreadTo(level, fromPos, fromState, direction, toPos, toState, toFluidState, fluid); + } + + @Override + protected FluidState getNewLiquid(Level level, BlockPos pos, BlockState blockState) { + FluidState currentState = blockState.getFluidState(); + if (!currentState.isSource() && !this.isFlowingStateValid(level, pos, currentState)) { + return Fluids.EMPTY.defaultFluidState(); + } + + if (this.canCreateSourceAt(level, pos)) { + return this.getSource(false); + } + + if (this.isValidVerticalSupport(level, pos)) { + return this.getFlowing(MAX_VERTICAL_FLOW_AMOUNT, false); + } + + int bestNeighborAmount = this.getBestHorizontalNeighborAmount(level, pos); + if (bestNeighborAmount > 1) { + return this.getFlowing(bestNeighborAmount - 1, false); + } + + return net.minecraft.world.level.material.Fluids.EMPTY.defaultFluidState(); + } + + /* + @Override + protected void spread(Level level, BlockPos pos, FluidState state) { + if (state.isEmpty()) { + return; + } + if (!state.isSource() && !this.isFlowingStateValid(level, pos, state)) { + level.setBlockAndUpdate(pos, net.minecraft.world.level.block.Blocks.AIR.defaultBlockState()); + this.scheduleCleanup(level, pos); + return; + } + + BlockState blockState = level.getBlockState(pos); + int nextAmount = state.getAmount() - 1; + + BlockPos abovePos = pos.above(); + BlockState aboveState = level.getBlockState(abovePos); + FluidState aboveFluid = level.getFluidState(abovePos); + + if (!aboveState.isSolid() && !aboveFluid.getType().isSame(this)) { + FluidState upwardState = this.getFlowing(8, false); + if (this.canSpreadTo(level, pos, blockState, Direction.UP, abovePos, aboveState, aboveFluid, upwardState.getType())) { + this.spreadTo(level, abovePos, aboveState, Direction.UP, upwardState); + } + } + + if (!this.canHangAt(level, pos)) { + return; + } + + if (nextAmount <= 0) { + return; + } + + for (Direction direction : Direction.Plane.HORIZONTAL) { + BlockPos targetPos = pos.relative(direction); + BlockState targetState = level.getBlockState(targetPos); + FluidState targetFluid = targetState.getFluidState(); + if (!this.canSpreadHorizontallyInto(level, targetPos)) { + continue; + } + + FluidState horizontalState = this.getFlowing(Math.min(nextAmount, MAX_HORIZONTAL_SPREAD_AMOUNT), false); + if (!this.canSpreadTo(level, pos, blockState, direction, targetPos, targetState, targetFluid, horizontalState.getType())) { + continue; + } + + this.spreadTo(level, targetPos, targetState, direction, horizontalState); + } + } + */ + + @Override + protected void spread(Level level, BlockPos pos, FluidState state) { + if (state.isEmpty()) { + return; + } + + if (!state.isSource() && !this.isFlowingStateValid(level, pos, state)) { + level.setBlockAndUpdate(pos, net.minecraft.world.level.block.Blocks.AIR.defaultBlockState()); + this.scheduleCleanup(level, pos); + return; + } + + BlockState blockState = level.getBlockState(pos); + this.spreadUpward(level, pos, state, blockState); + + if (!this.canHangAt(level, pos)) { + return; + } + + int nextAmount = state.getAmount() - 1; + if (nextAmount <= 0) { + return; + } + + this.spreadHorizontally(level, pos, blockState, nextAmount); + } + + @Override + protected int getSlopeFindDistance(LevelReader level) { + return 4; + } + + @Override + public void tick(Level level, BlockPos pos, FluidState state) { + if (!state.isSource() && !this.isFlowingStateValid(level, pos, state)) { + level.setBlockAndUpdate(pos, net.minecraft.world.level.block.Blocks.AIR.defaultBlockState()); + this.scheduleDependentCleanup(level, pos); + return; + } + + super.tick(level, pos, state); + } + + private boolean hasCeiling(Level level, BlockPos pos) { + return level.getBlockState(pos.above()).isSolid(); + } + + private boolean canHangAt(Level level, BlockPos pos) { + return this.hasCeiling(level, pos); + } + + private boolean hasHorizontalSupport(Level level, BlockPos pos) { + FluidState state = level.getFluidState(pos); + if (!this.isAntiwater(state)) { + return false; + } + + int currentAmount = state.getAmount(); + for (Direction direction : Direction.Plane.HORIZONTAL) { + FluidState neighbor = level.getFluidState(pos.relative(direction)); + if (!this.isAntiwater(neighbor)) { + continue; + } + + if (this.getHorizontalSpreadAmount(neighbor) > currentAmount) { + return true; + } + } + + return false; + } + + private boolean canSpreadHorizontallyInto(Level level, BlockPos pos) { + return true; + } + + private int getBestHorizontalNeighborAmount(Level level, BlockPos pos) { + int bestAmount = 0; + for (Direction direction : Direction.Plane.HORIZONTAL) { + BlockPos neighborPos = pos.relative(direction); + FluidState neighborFluid = level.getFluidState(neighborPos); + if (neighborFluid.isEmpty() || !neighborFluid.getType().isSame(this)) { + continue; + } + + if (!this.hasSourceConnection(level, neighborPos, neighborFluid, new HashSet<>())) { + continue; + } + + bestAmount = Math.max(bestAmount, this.getHorizontalSpreadAmount(neighborFluid)); + } + + return bestAmount; + } + + private int getHorizontalSpreadAmount(FluidState state) { + if (state.isSource() || this.isValidVerticalSupportState(state)) { + return MAX_HORIZONTAL_SPREAD_AMOUNT + 1; + } + + return state.getAmount(); + } + + private boolean isValidVerticalSupportState(FluidState state) { + return this.isAntiwater(state) && !state.isSource() && state.getAmount() >= MAX_VERTICAL_FLOW_AMOUNT; + } + + private boolean isFlowingStateValid(Level level, BlockPos pos, FluidState state) { + return state.isSource() + || this.hasImmediateVerticalSupport(level, pos) + || this.hasHorizontalSupport(level, pos); + } + + private boolean canCreateSourceAt(Level level, BlockPos pos) { + if (!this.canHangAt(level, pos)) { + return false; + } + + int sourceNeighbors = 0; + for (Direction direction : Direction.Plane.HORIZONTAL) { + FluidState neighbor = level.getFluidState(pos.relative(direction)); + if (this.isAntiwater(neighbor) && neighbor.isSource()) { + sourceNeighbors++; + if (sourceNeighbors >= 2) { + return true; + } + } + } + + return false; + } + + private boolean isValidVerticalSupport(Level level, BlockPos pos) { + return this.hasImmediateVerticalSupport(level, pos); + } + + private boolean isAntiwater(FluidState state) { + return !state.isEmpty() && state.getType().isSame(this); + } + + private boolean hasImmediateVerticalSupport(Level level, BlockPos pos) { + FluidState below = level.getFluidState(pos.below()); + return this.isAntiwater(below); + } + + private void spreadUpward(Level level, BlockPos pos, FluidState state, BlockState blockState) { + BlockPos abovePos = pos.above(); + BlockState aboveState = level.getBlockState(abovePos); + FluidState aboveFluid = level.getFluidState(abovePos); + + // Antiwater flowing into water solidifies rather than displacing it + if (aboveFluid.getFluidType() == ForgeMod.WATER_TYPE.get()) { + BlockState result = state.isSource() + ? AntarchyForgeBlocks.ANTIMETAL.get().defaultBlockState() + : AntarchyForgeBlocks.NYXITE.get().defaultBlockState(); + net.minecraftforge.event.level.BlockEvent.FluidPlaceBlockEvent fluidPlaceEvent = + new net.minecraftforge.event.level.BlockEvent.FluidPlaceBlockEvent(level, pos, pos, result); + net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(fluidPlaceEvent); + level.setBlockAndUpdate(pos, fluidPlaceEvent.getNewState()); + level.levelEvent(1501, pos, 0); + return; + } + + FluidState upwardState = this.getFlowing(MAX_VERTICAL_FLOW_AMOUNT, false); + + if (!this.canSpreadTo(level, pos, blockState, Direction.UP, abovePos, aboveState, aboveFluid, upwardState.getType())) { + return; + } + + if (aboveFluid.getType().isSame(this) && aboveFluid.getAmount() >= upwardState.getAmount()) { + return; + } + + this.spreadTo(level, abovePos, aboveState, Direction.UP, upwardState); + } + + private void spreadHorizontally(Level level, BlockPos pos, BlockState blockState, int nextAmount) { + FluidState horizontalState = this.getFlowing(Math.min(nextAmount, MAX_HORIZONTAL_SPREAD_AMOUNT), false); + + for (Direction direction : Direction.Plane.HORIZONTAL) { + BlockPos targetPos = pos.relative(direction); + BlockState targetState = level.getBlockState(targetPos); + FluidState targetFluid = targetState.getFluidState(); + if (!this.canSpreadHorizontallyInto(level, targetPos)) { + continue; + } + + if (targetFluid.getType().isSame(this) && targetFluid.getAmount() >= horizontalState.getAmount()) { + continue; + } + + if (!this.canSpreadTo(level, pos, blockState, direction, targetPos, targetState, targetFluid, horizontalState.getType())) { + continue; + } + + this.spreadTo(level, targetPos, targetState, direction, horizontalState); + } + } + + private boolean hasSourceConnection(Level level, BlockPos pos, FluidState state, Set visited) { + if (!this.isAntiwater(state)) { + return false; + } + + if (state.isSource()) { + return true; + } + + if (!visited.add(pos)) { + return false; + } + + FluidState below = level.getFluidState(pos.below()); + if (this.hasSourceConnection(level, pos.below(), below, visited)) { + return true; + } + + int currentAmount = state.getAmount(); + for (Direction direction : Direction.Plane.HORIZONTAL) { + BlockPos neighborPos = pos.relative(direction); + FluidState neighbor = level.getFluidState(neighborPos); + if (!this.isAntiwater(neighbor)) { + continue; + } + + if (this.getHorizontalSpreadAmount(neighbor) <= currentAmount) { + continue; + } + + if (this.hasSourceConnection(level, neighborPos, neighbor, visited)) { + return true; + } + } + + return false; + } + + private void scheduleCleanup(Level level, BlockPos pos) { + int tickDelay = this.getTickDelay(level); + level.scheduleTick(pos, this, tickDelay); + level.scheduleTick(pos.above(), this, tickDelay); + level.scheduleTick(pos.below(), this, tickDelay); + for (Direction direction : Direction.Plane.HORIZONTAL) { + level.scheduleTick(pos.relative(direction), this, tickDelay); + } + } + + private void scheduleDependentCleanup(Level level, BlockPos pos) { + int tickDelay = this.getTickDelay(level); + level.scheduleTick(pos.above(), this, tickDelay); + for (Direction direction : Direction.Plane.HORIZONTAL) { + level.scheduleTick(pos.relative(direction), this, tickDelay); + } + } + + public static final class Source extends AntiwaterFluid { + public Source(Properties properties) { + super(properties); + } + + @Override + public int getAmount(FluidState state) { + return 8; + } + + @Override + public boolean isSource(FluidState state) { + return true; + } + } + + public static final class Flowing extends AntiwaterFluid { + public Flowing(Properties properties) { + super(properties); + this.registerDefaultState(this.getStateDefinition().any().setValue(LEVEL, 7)); + } + + @Override + protected void createFluidStateDefinition(net.minecraft.world.level.block.state.StateDefinition.Builder builder) { + super.createFluidStateDefinition(builder); + builder.add(LEVEL); + } + + @Override + public int getAmount(FluidState state) { + return state.getValue(LEVEL); + } + + @Override + public boolean isSource(FluidState state) { + return false; + } + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/content/fluid/AntiwaterFluidType.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/content/fluid/AntiwaterFluidType.java new file mode 100644 index 00000000..02c0abfe --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/content/fluid/AntiwaterFluidType.java @@ -0,0 +1,76 @@ +package com.craisinlord.antarchy.forge.content.fluid; + +import com.craisinlord.antarchy.content.gravity.AntarchyGravityApi; +import com.craisinlord.antarchy.content.gravity.AntarchyGravityDirection; +import com.craisinlord.antarchy.content.gravity.AntarchyGravityRotationUtil; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.MoverType; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.fluids.FluidType; + +public class AntiwaterFluidType extends FluidType { + + public AntiwaterFluidType(Properties properties) { + super(properties); + } + + + @Override + public boolean move(FluidState state, LivingEntity entity, Vec3 movementVector, double gravity) { + double prevY = entity.getY(); + float swimSpeed = entity.isSprinting() ? 0.026F : 0.02F; + + entity.moveRelative(swimSpeed, movementVector); + entity.move(MoverType.SELF, entity.getDeltaMovement()); + + Vec3 motion = entity.getDeltaMovement(); + if (entity.horizontalCollision && entity.onClimbable()) { + motion = new Vec3(motion.x, 0.2, motion.z); + } + + AntarchyGravityDirection gravityDirection = AntarchyGravityApi.getGravityDirection(entity); + Vec3 worldMotion = gravityDirection.isInverted() + ? AntarchyGravityRotationUtil.vecPlayerToWorld(motion, gravityDirection) + : motion; + + double drag = entity.isSwimming() ? 0.9 : 0.8; + worldMotion = worldMotion.scale(drag); + boolean isFlying = entity instanceof Player p && p.getAbilities().flying; + if (!isFlying) { + worldMotion = worldMotion.add(0.0D, 0.005D, 0.0D); + } + + entity.setDeltaMovement( + gravityDirection.isInverted() + ? AntarchyGravityRotationUtil.vecWorldToPlayer(worldMotion, gravityDirection) + : worldMotion + ); + if (entity.horizontalCollision && entity.isFree( + worldMotion.x, + worldMotion.y + 0.6 - entity.getY() + prevY, + worldMotion.z)) { + Vec3 boostedWorldMotion = new Vec3(worldMotion.x, 0.3D, worldMotion.z); + entity.setDeltaMovement( + gravityDirection.isInverted() + ? AntarchyGravityRotationUtil.vecWorldToPlayer(boostedWorldMotion, gravityDirection) + : boostedWorldMotion + ); + } + + return true; + } + + + @Override + public void setItemMovement(ItemEntity entity) { + Vec3 vec3 = entity.getDeltaMovement(); + entity.setDeltaMovement( + vec3.x * 0.99, + vec3.y + (vec3.y < 0.06 ? 5.0E-4 : 0.0), + vec3.z * 0.99 + ); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/entity/multipart/MultipartPartEntity.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/entity/multipart/MultipartPartEntity.java new file mode 100644 index 00000000..e716f1a8 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/entity/multipart/MultipartPartEntity.java @@ -0,0 +1,195 @@ +package com.craisinlord.antarchy.forge.entity.multipart; + +import com.craisinlord.antarchy.content.entity.multipart.MultipartEntityOwner; +import com.craisinlord.antarchy.content.entity.multipart.MultipartFramework; +import com.craisinlord.antarchy.content.entity.multipart.MultipartPartAccess; +import com.craisinlord.antarchy.content.entity.multipart.MultipartPartDefinition; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.OwnableEntity; +import net.minecraft.world.entity.Pose; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.entity.PartEntity; +import org.jetbrains.annotations.Nullable; + +public class MultipartPartEntity extends PartEntity implements OwnableEntity, MultipartPartAccess { + private final MultipartEntityOwner owner; + private final int partIndex; + private final MultipartPartDefinition definition; + + public MultipartPartEntity(Entity parent, MultipartEntityOwner owner, int partIndex, MultipartPartDefinition definition) { + super(parent); + this.owner = owner; + this.partIndex = partIndex; + this.definition = definition; + this.setNoGravity(true); + this.refreshDimensions(); + this.antarchy$syncFromParent(); + } + + public int getPartIndex() { + return this.partIndex; + } + + public String getPartName() { + return this.definition.name(); + } + + public float getDamageMultiplier() { + return this.definition.damageMultiplier(); + } + + public MultipartPartDefinition getPartDefinition() { + return this.definition; + } + + @Override + public @Nullable java.util.UUID getOwnerUUID() { + Entity parent = this.getParent(); + return parent instanceof OwnableEntity ownable ? ownable.getOwnerUUID() : null; + } + + @Override + public EntityDimensions getDimensions(Pose pose) { + return EntityDimensions.scalable(this.definition.width(), this.definition.height()); + } + + @Override + public void antarchy$syncFromParent() { + Entity parent = this.getParent(); + if (parent == null || parent.isRemoved()) { + return; + } + + double oldX = this.getX(); + double oldY = this.getY(); + double oldZ = this.getZ(); + double yawRadians = Math.toRadians(parent.getYRot()); + Vec3 forward = new Vec3(-Math.sin(yawRadians), 0.0D, Math.cos(yawRadians)); + Vec3 right = new Vec3(forward.z, 0.0D, -forward.x); + Vec3 position = new Vec3( + parent.getX() + forward.x * this.definition.forwardOffset() + right.x * this.definition.lateralOffset(), + parent.getY() + this.definition.yOffset(), + parent.getZ() + forward.z * this.definition.forwardOffset() + right.z * this.definition.lateralOffset() + ); + this.setPos(position.x, position.y, position.z); + this.setRot(parent.getYRot(), parent.getXRot()); + this.xo = oldX; + this.yo = oldY; + this.zo = oldZ; + this.xOld = oldX; + this.yOld = oldY; + this.zOld = oldZ; + } + + @Override + public boolean is(Entity entity) { + return entity == this || entity == this.getParent(); + } + + @Override + public boolean isPickable() { + return true; + } + + @Override + public boolean isAttackable() { + return true; + } + + @Override + public boolean isPushable() { + return false; + } + + @Override + public boolean canBeCollidedWith() { + // Always true so player melee raycasts (ProjectileUtil.getEntityHitResult) can find this part. + // Physical push is prevented separately via isPushable()=false and canCollideWith()=false. + return !this.isRemoved(); + } + + @Override + public boolean canCollideWith(Entity entity) { + if (!this.definition.collisionEnabled()) { + return false; + } + + Entity parent = this.getParent(); + if (entity == parent) { + return false; + } + + if (entity instanceof PartEntity otherPart && otherPart.getParent() == parent) { + return false; + } + + return entity.canBeCollidedWith() && !this.isPassengerOfSameVehicle(entity); + } + + @Override + public boolean shouldBeSaved() { + return false; + } + + @Override + public ItemStack getPickResult() { + Entity parent = this.getParent(); + return parent == null ? ItemStack.EMPTY : parent.getPickResult(); + } + + @Override + public boolean hurt(DamageSource source, float amount) { + Entity parent = this.getParent(); + if (parent == null || parent.isRemoved()) { + return false; + } + + if (this.level().isClientSide()) { + if (source.getEntity() instanceof Player) { + MultipartFramework.sendMultipartAttack(parent.getUUID(), this.partIndex, amount * this.definition.damageMultiplier()); + } + return true; + } + + return this.owner.antarchy$hurtMultipartPart(this, source, amount * this.definition.damageMultiplier()); + } + + @Override + public boolean isInvulnerableTo(DamageSource source) { + return false; + } + + @Override + public InteractionResult interactAt(Player player, Vec3 vec, InteractionHand hand) { + Entity parent = this.getParent(); + if (parent == null || parent.isRemoved()) { + return InteractionResult.PASS; + } + + if (this.level().isClientSide()) { + MultipartFramework.sendMultipartInteract(parent.getUUID(), this.partIndex, hand.ordinal()); + return InteractionResult.SUCCESS; + } + + return this.owner.antarchy$interactMultipartPart(this, player, vec, hand); + } + + @Override + protected void defineSynchedData() { + } + + @Override + protected void readAdditionalSaveData(CompoundTag tag) { + } + + @Override + protected void addAdditionalSaveData(CompoundTag tag) { + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/entity/multipart/MultipartPartLevelRegistry.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/entity/multipart/MultipartPartLevelRegistry.java new file mode 100644 index 00000000..b8ae887d --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/entity/multipart/MultipartPartLevelRegistry.java @@ -0,0 +1,64 @@ +package com.craisinlord.antarchy.forge.entity.multipart; + +import com.craisinlord.antarchy.content.entity.multipart.MultipartEntityOwner; +import com.craisinlord.antarchy.forge.mixins.level.ClientLevelPartEntitiesAccessor; +import com.craisinlord.antarchy.forge.mixins.level.ServerLevelPartEntitiesAccessor; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import net.minecraftforge.entity.PartEntity; + +public final class MultipartPartLevelRegistry { + private MultipartPartLevelRegistry() { + } + + public static void register(MultipartEntityOwner owner) { + Entity[] parts = owner.antarchy$getMultipartParts(); + if (parts == null) { + return; + } + + Int2ObjectMap> registry = getRegistry(((Entity) owner).level()); + if (registry == null) { + return; + } + + for (Entity part : parts) { + if (part instanceof PartEntity partEntity) { + registry.put(partEntity.getId(), partEntity); + } + } + } + + public static void unregister(MultipartEntityOwner owner) { + Entity[] parts = owner.antarchy$getMultipartParts(); + if (parts == null) { + return; + } + + Int2ObjectMap> registry = getRegistry(((Entity) owner).level()); + if (registry == null) { + return; + } + + for (Entity part : parts) { + if (part instanceof PartEntity partEntity) { + registry.remove(partEntity.getId()); + } + } + } + + private static Int2ObjectMap> getRegistry(Level level) { + if (level instanceof ServerLevel serverLevel) { + return ((ServerLevelPartEntitiesAccessor) serverLevel).antarchy$getPartEntities(); + } + + if (level instanceof ClientLevel clientLevel) { + return ((ClientLevelPartEntitiesAccessor) clientLevel).antarchy$getPartEntities(); + } + + return null; + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/client/LiquidBlockRendererMixin.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/client/LiquidBlockRendererMixin.java new file mode 100644 index 00000000..e164d267 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/client/LiquidBlockRendererMixin.java @@ -0,0 +1,39 @@ +package com.craisinlord.antarchy.forge.mixins.client; + +import com.craisinlord.antarchy.content.client.renderer.AntiwaterFluidRenderer; +import com.craisinlord.antarchy.content.fluid.AntarchyFluidChecks; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.block.LiquidBlockRenderer; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; +import net.minecraftforge.client.ForgeHooksClient; +import net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions; +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(LiquidBlockRenderer.class) +public abstract class LiquidBlockRendererMixin { + @Inject(method = "tesselate", at = @At("HEAD"), cancellable = true) + private void antarchy$renderAntiwater( + BlockAndTintGetter level, + BlockPos pos, + VertexConsumer buffer, + BlockState blockState, + FluidState fluidState, + CallbackInfo ci + ) { + if (!AntarchyFluidChecks.isAntiwater(fluidState)) { + return; + } + + TextureAtlasSprite[] sprites = ForgeHooksClient.getFluidSprites(level, pos, fluidState); + int tint = IClientFluidTypeExtensions.of(fluidState).getTintColor(fluidState, level, pos); + AntiwaterFluidRenderer.render(level, pos, buffer, blockState, fluidState, sprites[0], sprites[1], sprites[2], tint); + ci.cancel(); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/entity/MultipartEntityBridgeMixin.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/entity/MultipartEntityBridgeMixin.java new file mode 100644 index 00000000..0f9ebd44 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/entity/MultipartEntityBridgeMixin.java @@ -0,0 +1,56 @@ +package com.craisinlord.antarchy.forge.mixins.entity; + +import com.craisinlord.antarchy.content.entity.multipart.MultipartEntityOwner; +import net.minecraft.world.entity.Entity; +import net.minecraftforge.entity.PartEntity; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; + +@Mixin(Entity.class) +/* + * Exposes multipart child lookup from base entities. + */ +public abstract class MultipartEntityBridgeMixin { + @Unique + private Entity[] antarchy$multipartSourceParts; + + @Unique + private PartEntity[] antarchy$multipartBridgeParts; + + public boolean isMultipartEntity() { + return (Object) this instanceof MultipartEntityOwner; + } + + @Nullable + public PartEntity[] getParts() { + if (!((Object) this instanceof MultipartEntityOwner owner)) { + return null; + } + + Entity[] parts = owner.antarchy$getMultipartParts(); + if (parts == null) { + parts = owner.antarchy$createMultipartParts(); + owner.antarchy$setMultipartParts(parts); + owner.antarchy$syncMultipartParts(); + } + + if (parts.length == 0) { + return new PartEntity[0]; + } + + if (this.antarchy$multipartSourceParts != parts || this.antarchy$multipartBridgeParts == null || this.antarchy$multipartBridgeParts.length != parts.length) { + PartEntity[] bridgedParts = new PartEntity[parts.length]; + for (int i = 0; i < parts.length; i++) { + if (!(parts[i] instanceof PartEntity part)) { + throw new IllegalStateException("Multipart owner returned a non-PartEntity child: " + parts[i]); + } + bridgedParts[i] = part; + } + this.antarchy$multipartSourceParts = parts; + this.antarchy$multipartBridgeParts = bridgedParts; + } + + return this.antarchy$multipartBridgeParts; + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/entity/MultipartEntityLevelRegistryMixin.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/entity/MultipartEntityLevelRegistryMixin.java new file mode 100644 index 00000000..98cbac7c --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/entity/MultipartEntityLevelRegistryMixin.java @@ -0,0 +1,34 @@ +package com.craisinlord.antarchy.forge.mixins.entity; + +import com.craisinlord.antarchy.content.entity.multipart.MultipartEntityOwner; +import com.craisinlord.antarchy.forge.entity.multipart.MultipartPartLevelRegistry; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.entity.EntityInLevelCallback; +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(Entity.class) +/* + * Keeps multipart child entities registered in NeoForge levels. + */ +public abstract class MultipartEntityLevelRegistryMixin { + @Inject(method = "setLevelCallback", at = @At("TAIL")) + private void antarchy$registerMultipartParts(EntityInLevelCallback entityInLevelCallback, CallbackInfo ci) { + if ((Object) this instanceof MultipartEntityOwner owner + && entityInLevelCallback != EntityInLevelCallback.NULL) { + if (owner.antarchy$getMultipartParts() == null) { + owner.antarchy$spawnMultipartParts(); + } + MultipartPartLevelRegistry.register(owner); + } + } + + @Inject(method = "setRemoved", at = @At("HEAD")) + private void antarchy$unregisterMultipartParts(Entity.RemovalReason removalReason, CallbackInfo ci) { + if ((Object) this instanceof MultipartEntityOwner owner) { + MultipartPartLevelRegistry.unregister(owner); + } + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/entity/ParalyzedMobFreezeMixin.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/entity/ParalyzedMobFreezeMixin.java new file mode 100644 index 00000000..949f4632 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/entity/ParalyzedMobFreezeMixin.java @@ -0,0 +1,25 @@ +package com.craisinlord.antarchy.forge.mixins.entity; + +import com.craisinlord.antarchy.forge.registry.AntarchyForgeMisc; +import net.minecraft.world.entity.Mob; +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(Mob.class) +/* + * Stops mob AI movement while paralyzed. + */ +public abstract class ParalyzedMobFreezeMixin { + @Inject(method = "serverAiStep", at = @At("HEAD")) + private void antarchy$freezeAiWhileParalyzed(CallbackInfo ci) { + Mob mob = (Mob) (Object) this; + if (!mob.hasEffect(AntarchyForgeMisc.PARALYZED.get())) { + return; + } + + mob.getNavigation().stop(); + mob.setJumping(false); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/infinity/ConfigGenInvocationMixin.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/infinity/ConfigGenInvocationMixin.java new file mode 100644 index 00000000..a4ee7262 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/infinity/ConfigGenInvocationMixin.java @@ -0,0 +1,37 @@ +package com.craisinlord.antarchy.forge.mixins.infinity; + +import com.craisinlord.antarchy.Antarchy; +import net.lerariemann.infinity.util.config.ConfigGenInvocation; +import net.lerariemann.infinity.util.config.ConfigGenerator; +import net.minecraft.server.MinecraftServer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(value = ConfigGenInvocation.class, remap = false) +/* + * Guards against a NPE in Infinite Dimensions' SurfaceRuleScanner when another mod + * registers a surface rule with a missing "biome_is" field. Without this, the crash + * propagates up through PlayerList.placeNewPlayer and kicks the player on login + */ +public class ConfigGenInvocationMixin { + + @Redirect( + method = "run", + at = @At( + value = "INVOKE", + target = "Lnet/lerariemann/infinity/util/config/ConfigGenerator;generateAll(Lnet/minecraft/server/MinecraftServer;)V" + ), + remap = false + ) + private void antarchy$safeGenerateAll(MinecraftServer server) { + try { + ConfigGenerator.generateAll(server); + } catch (Exception e) { + Antarchy.LOGGER.error( + "[Antarchy] Infinite Dimensions surface rule scan crashed — likely a mod has a malformed surface rule (null 'biome_is' entry). Player login will continue.", + e + ); + } + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/item/BucketItemThoraxisWaterMixin.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/item/BucketItemThoraxisWaterMixin.java new file mode 100644 index 00000000..9f5b7822 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/item/BucketItemThoraxisWaterMixin.java @@ -0,0 +1,83 @@ +package com.craisinlord.antarchy.forge.mixins.item; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.forge.registry.AntarchyForgeMisc; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BucketItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.phys.BlockHitResult; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(BucketItem.class) +public abstract class BucketItemThoraxisWaterMixin { + private static final ResourceLocation THORAXIS_DIMENSION_ID = + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "thoraxis"); + + @Shadow + @Final + public Fluid content; + + @Shadow + protected abstract void playEmptySound(@Nullable Player player, LevelAccessor level, BlockPos pos); + + @Inject( + method = "emptyContents(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/phys/BlockHitResult;Lnet/minecraft/world/item/ItemStack;)Z", + at = @At("HEAD"), + cancellable = true, + remap = false + ) + private void antarchy$replaceWaterVaporizeCheckWithAntiwater( + @Nullable Player player, + Level level, + BlockPos pos, + @Nullable BlockHitResult hitResult, + @Nullable ItemStack container, + CallbackInfoReturnable cir + ) { + if (this.content != Fluids.WATER) { + return; + } + if (!level.dimension().location().equals(THORAXIS_DIMENSION_ID)) { + return; + } + if (container == null) { + return; + } + + BlockState state = level.getBlockState(pos); + boolean canReplace = state.canBeReplaced(this.content); + + if (!state.isAir() && !canReplace && !state.getFluidState().isSource()) { + cir.setReturnValue(false); + return; + } + + if (!level.isClientSide) { + if (canReplace && !state.liquid()) { + level.destroyBlock(pos, true); + } + } + + boolean placed = level.setBlock(pos, AntarchyForgeMisc.ANTIWATER.get().defaultFluidState().createLegacyBlock(), 11); + if (placed || state.getFluidState().isSource()) { + this.playEmptySound(player, level, pos); + cir.setReturnValue(true); + return; + } + + cir.setReturnValue(false); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/level/ClientLevelPartEntitiesAccessor.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/level/ClientLevelPartEntitiesAccessor.java new file mode 100644 index 00000000..3bdcc134 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/level/ClientLevelPartEntitiesAccessor.java @@ -0,0 +1,16 @@ +package com.craisinlord.antarchy.forge.mixins.level; + +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraftforge.entity.PartEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ClientLevel.class) +/* + * Accessor for client part-entity storage. + */ +public interface ClientLevelPartEntitiesAccessor { + @Accessor("partEntities") + Int2ObjectMap> antarchy$getPartEntities(); +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/level/LevelStemDiagnosticMixin.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/level/LevelStemDiagnosticMixin.java new file mode 100644 index 00000000..458a7c66 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/level/LevelStemDiagnosticMixin.java @@ -0,0 +1,24 @@ +package com.craisinlord.antarchy.forge.mixins.level; + +import com.craisinlord.antarchy.Antarchy; +import net.minecraft.core.RegistryAccess; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.storage.PrimaryLevelData; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(PrimaryLevelData.class) +public abstract class LevelStemDiagnosticMixin { + @Inject(method = "createTag", at = @At("HEAD")) + private void antarchy$logLevelStems(RegistryAccess registryAccess, CompoundTag playerTag, CallbackInfoReturnable cir) { + try { + var registry = registryAccess.registryOrThrow(Registries.LEVEL_STEM); + Antarchy.LOGGER.info("[Antarchy/Diagnostic] createTag LEVEL_STEM size={} keys={}", registry.size(), registry.keySet()); + } catch (Throwable t) { + Antarchy.LOGGER.error("[Antarchy/Diagnostic] createTag LEVEL_STEM lookup failed", t); + } + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/level/ServerLevelPartEntitiesAccessor.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/level/ServerLevelPartEntitiesAccessor.java new file mode 100644 index 00000000..8587bc97 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/mixins/level/ServerLevelPartEntitiesAccessor.java @@ -0,0 +1,16 @@ +package com.craisinlord.antarchy.forge.mixins.level; + +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import net.minecraft.server.level.ServerLevel; +import net.minecraftforge.entity.PartEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(ServerLevel.class) +/* + * Accessor for server part-entity storage. + */ +public interface ServerLevelPartEntitiesAccessor { + @Accessor("dragonParts") + Int2ObjectMap> antarchy$getPartEntities(); +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/AntarchyForgeNetworkCore.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/AntarchyForgeNetworkCore.java new file mode 100644 index 00000000..c4413aff --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/AntarchyForgeNetworkCore.java @@ -0,0 +1,81 @@ +package com.craisinlord.antarchy.forge.network; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.compat.network.CustomPacketPayload; +import com.craisinlord.antarchy.compat.network.StreamCodec; +import io.netty.buffer.ByteBuf; +import java.util.function.BiConsumer; +import java.util.function.Supplier; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.network.NetworkDirection; +import net.minecraftforge.network.NetworkEvent; +import net.minecraftforge.network.NetworkRegistry; +import net.minecraftforge.network.PacketDistributor; +import net.minecraftforge.network.simple.SimpleChannel; + +public final class AntarchyForgeNetworkCore { + private static final String PROTOCOL_VERSION = "1"; + private static final SimpleChannel CHANNEL = NetworkRegistry.ChannelBuilder + .named(new ResourceLocation(Antarchy.MODID, "main")) + .networkProtocolVersion(() -> PROTOCOL_VERSION) + .clientAcceptedVersions(PROTOCOL_VERSION::equals) + .serverAcceptedVersions(PROTOCOL_VERSION::equals) + .simpleChannel(); + + private static int nextId = 0; + + private AntarchyForgeNetworkCore() { + } + + public static void registerS2C(Class clazz, StreamCodec codec, java.util.function.Consumer clientHandler) { + CHANNEL.registerMessage( + nextId++, + clazz, + (msg, buf) -> codec.encode(buf, msg), + codec::decode, + (msg, ctxSupplier) -> { + NetworkEvent.Context ctx = ctxSupplier.get(); + ctx.enqueueWork(() -> clientHandler.accept(msg)); + ctx.setPacketHandled(true); + }, + java.util.Optional.of(NetworkDirection.PLAY_TO_CLIENT) + ); + } + + public static void registerC2S(Class clazz, StreamCodec codec, BiConsumer serverHandler) { + CHANNEL.registerMessage( + nextId++, + clazz, + (msg, buf) -> codec.encode(buf, msg), + codec::decode, + (msg, ctxSupplier) -> { + NetworkEvent.Context ctx = ctxSupplier.get(); + ServerPlayer player = ctx.getSender(); + ctx.enqueueWork(() -> { + if (player != null) { + serverHandler.accept(player, msg); + } + }); + ctx.setPacketHandled(true); + }, + java.util.Optional.of(NetworkDirection.PLAY_TO_SERVER) + ); + } + + public static void sendToPlayer(ServerPlayer player, T payload) { + CHANNEL.send(PacketDistributor.PLAYER.with(() -> player), payload); + } + + public static void sendToTracking(ServerPlayer player, T payload) { + CHANNEL.send(PacketDistributor.TRACKING_ENTITY_AND_SELF.with(player::getVehicle), payload); + } + + public static void sendToTrackingEntity(net.minecraft.world.entity.Entity entity, T payload) { + CHANNEL.send(PacketDistributor.TRACKING_ENTITY_AND_SELF.with(() -> entity), payload); + } + + public static void sendToServer(T payload) { + CHANNEL.sendToServer(payload); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/AntarchyGravityNetworking.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/AntarchyGravityNetworking.java new file mode 100644 index 00000000..92938ffe --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/AntarchyGravityNetworking.java @@ -0,0 +1,116 @@ +package com.craisinlord.antarchy.forge.network; + +import com.craisinlord.antarchy.content.entity.DiamondMinecartEntity; +import com.craisinlord.antarchy.content.gravity.AntarchyGravityApi; +import com.craisinlord.antarchy.content.item.BigBerthaItem; +import com.craisinlord.antarchy.content.item.GravityGunItem; +import com.craisinlord.antarchy.content.network.BigBerthaModeCyclePayload; +import com.craisinlord.antarchy.content.network.DiamondMinecartInputPayload; +import com.craisinlord.antarchy.content.network.GravityGunPrimaryPayload; +import com.craisinlord.antarchy.content.network.GravityGunScrollPayload; +import com.craisinlord.antarchy.content.network.GravityStatePayload; +import com.craisinlord.antarchy.content.network.ImpactShakePayload; +import com.craisinlord.antarchy.content.client.CameraShakeClientState; +import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.Entity; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.phys.Vec3; + +public final class AntarchyGravityNetworking { + private AntarchyGravityNetworking() { + } + + public static void register() { + AntarchyForgeNetworkCore.registerS2C(GravityStatePayload.class, GravityStatePayload.STREAM_CODEC, AntarchyGravityNetworking::handleGravityState); + AntarchyForgeNetworkCore.registerS2C(ImpactShakePayload.class, ImpactShakePayload.STREAM_CODEC, AntarchyGravityNetworking::handleImpactShake); + AntarchyForgeNetworkCore.registerC2S(GravityGunPrimaryPayload.class, GravityGunPrimaryPayload.STREAM_CODEC, AntarchyGravityNetworking::handleGravityGunPrimary); + AntarchyForgeNetworkCore.registerC2S(GravityGunScrollPayload.class, GravityGunScrollPayload.STREAM_CODEC, AntarchyGravityNetworking::handleGravityGunScroll); + AntarchyForgeNetworkCore.registerC2S(BigBerthaModeCyclePayload.class, BigBerthaModeCyclePayload.STREAM_CODEC, AntarchyGravityNetworking::handleBigBerthaModeCycle); + AntarchyForgeNetworkCore.registerC2S(DiamondMinecartInputPayload.class, DiamondMinecartInputPayload.STREAM_CODEC, AntarchyGravityNetworking::handleDiamondMinecartInput); + } + + public static void syncToPlayer(ServerPlayer target, Entity entity) { + GravityStatePayload payload = new GravityStatePayload( + entity.getId(), + AntarchyGravityApi.getGravityDirection(entity), + AntarchyGravityApi.getPrevGravityDirection(entity), + AntarchyGravityApi.isGravityForced(entity), + AntarchyGravityApi.getTransitionDuration(entity), + AntarchyGravityApi.getTransitionRemaining(entity) + ); + AntarchyForgeNetworkCore.sendToPlayer(target, payload); + } + + public static void syncEntity(Entity entity) { + GravityStatePayload payload = new GravityStatePayload( + entity.getId(), + AntarchyGravityApi.getGravityDirection(entity), + AntarchyGravityApi.getPrevGravityDirection(entity), + AntarchyGravityApi.isGravityForced(entity), + AntarchyGravityApi.getTransitionDuration(entity), + AntarchyGravityApi.getTransitionRemaining(entity) + ); + AntarchyForgeNetworkCore.sendToTrackingEntity(entity, payload); + } + + private static void handleGravityState(GravityStatePayload payload) { + var player = Minecraft.getInstance().player; + if (player == null) { + return; + } + Entity entity = player.level().getEntity(payload.entityId()); + if (entity == null && player.getId() == payload.entityId()) { + entity = player; + } + if (entity == null) { + return; + } + + AntarchyGravityApi.applySyncedState( + entity, + payload.direction(), + payload.previousDirection(), + payload.forced(), + payload.transitionDuration(), + payload.transitionRemaining() + ); + } + + private static void handleImpactShake(ImpactShakePayload payload) { + CameraShakeClientState.triggerImpact( + new Vec3(payload.x(), payload.y(), payload.z()), + payload.intensity(), + payload.durationTicks(), + payload.radius() + ); + } + + private static void handleGravityGunScroll(ServerPlayer serverPlayer, GravityGunScrollPayload payload) { + if (!(serverPlayer.getMainHandItem().getItem() instanceof GravityGunItem)) { + return; + } + + GravityGunItem.adjustHeldDistance(serverPlayer.getMainHandItem(), payload.distanceDelta()); + } + + private static void handleDiamondMinecartInput(ServerPlayer serverPlayer, DiamondMinecartInputPayload payload) { + if (!(serverPlayer.getVehicle() instanceof DiamondMinecartEntity cart)) return; + cart.onInputReceived(payload.inputFlags()); + } + + private static void handleBigBerthaModeCycle(ServerPlayer serverPlayer, BigBerthaModeCyclePayload payload) { + if (!(serverPlayer.getMainHandItem().getItem() instanceof BigBerthaItem bigBerthaItem)) { + return; + } + + bigBerthaItem.tryCycleModeWhileCoolingDown(serverPlayer.serverLevel(), serverPlayer, serverPlayer.getMainHandItem()); + } + + private static void handleGravityGunPrimary(ServerPlayer serverPlayer, GravityGunPrimaryPayload payload) { + if (!(serverPlayer.getMainHandItem().getItem() instanceof GravityGunItem gravityGunItem)) { + return; + } + + gravityGunItem.firePrimary(serverPlayer.serverLevel(), serverPlayer, serverPlayer.getMainHandItem()); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/BrutalflyElytraNetworking.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/BrutalflyElytraNetworking.java new file mode 100644 index 00000000..03af6472 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/BrutalflyElytraNetworking.java @@ -0,0 +1,78 @@ +package com.craisinlord.antarchy.forge.network; + +import com.craisinlord.antarchy.content.item.BrutalflyElytraFlightHelper; +import com.craisinlord.antarchy.content.item.BrutalflyElytraItem; +import com.craisinlord.antarchy.content.network.BrutalflyElytraAnimationPayload; +import com.craisinlord.antarchy.content.network.BrutalflyElytraFlapPayload; +import com.craisinlord.antarchy.content.client.BrutalflyElytraClientState; +import net.minecraft.network.protocol.game.ClientboundSetEntityMotionPacket; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.Vec3; + +public final class BrutalflyElytraNetworking { + private BrutalflyElytraNetworking() { + } + + public static void register() { + AntarchyForgeNetworkCore.registerC2S(BrutalflyElytraFlapPayload.class, BrutalflyElytraFlapPayload.STREAM_CODEC, BrutalflyElytraNetworking::handleFlap); + AntarchyForgeNetworkCore.registerS2C(BrutalflyElytraAnimationPayload.class, BrutalflyElytraAnimationPayload.STREAM_CODEC, BrutalflyElytraNetworking::handleAnimation); + } + + private static void handleFlap(ServerPlayer serverPlayer, BrutalflyElytraFlapPayload payload) { + ItemStack chestStack = serverPlayer.getItemBySlot(EquipmentSlot.CHEST); + if (!(chestStack.getItem() instanceof BrutalflyElytraItem)) { + return; + } + if (serverPlayer.isSpectator() || !serverPlayer.isFallFlying() || serverPlayer.isPassenger()) { + return; + } + if (serverPlayer.getCooldowns().isOnCooldown(chestStack.getItem())) { + return; + } + + BrutalflyElytraFlightHelper.FlapTier tier = BrutalflyElytraFlightHelper.resolveFlapTier(payload.chargeTicks()); + if (tier == BrutalflyElytraFlightHelper.FlapTier.FAIL) { + return; + } + + float lift = BrutalflyElytraFlightHelper.liftFor(tier); + float forwardBoost = BrutalflyElytraFlightHelper.forwardBoostFor(tier); + Vec3 look = serverPlayer.getLookAngle(); + Vec3 boost = new Vec3(look.x * forwardBoost, lift, look.z * forwardBoost); + serverPlayer.setDeltaMovement(serverPlayer.getDeltaMovement().add(boost)); + serverPlayer.hasImpulse = true; + serverPlayer.hurtMarked = true; + serverPlayer.resetFallDistance(); + serverPlayer.connection.send(new ClientboundSetEntityMotionPacket(serverPlayer)); + chestStack.hurtAndBreak(1, serverPlayer, p -> p.broadcastBreakEvent(EquipmentSlot.CHEST)); + serverPlayer.getCooldowns().addCooldown(chestStack.getItem(), BrutalflyElytraFlightHelper.FLAP_COOLDOWN_TICKS); + serverPlayer.level().playSound( + null, + serverPlayer.blockPosition(), + SoundEvents.PHANTOM_FLAP, + SoundSource.PLAYERS, + 0.9F, + tier == BrutalflyElytraFlightHelper.FlapTier.PERFECT ? 0.8F : tier == BrutalflyElytraFlightHelper.FlapTier.GOOD ? 0.95F : 1.1F + ); + AntarchyForgeNetworkCore.sendToTrackingEntity( + serverPlayer, + new BrutalflyElytraAnimationPayload( + serverPlayer.getId(), + BrutalflyElytraFlightHelper.animationTicksFor(tier), + lift + ) + ); + } + + private static void handleAnimation(BrutalflyElytraAnimationPayload payload) { + BrutalflyElytraClientState.trigger( + payload.entityId(), + payload.durationTicks(), + payload.strength() + ); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/DorrieJumpNetworking.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/DorrieJumpNetworking.java new file mode 100644 index 00000000..5dfdd026 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/DorrieJumpNetworking.java @@ -0,0 +1,29 @@ +package com.craisinlord.antarchy.forge.network; + +import com.craisinlord.antarchy.content.entity.DorrieEntity; +import com.craisinlord.antarchy.content.network.DorrieChargeJumpPayload; +import com.craisinlord.antarchy.content.network.DorrieJumpInputPayload; +import net.minecraft.server.level.ServerPlayer; + +public final class DorrieJumpNetworking { + private DorrieJumpNetworking() {} + + public static void register() { + AntarchyForgeNetworkCore.registerC2S(DorrieJumpInputPayload.class, DorrieJumpInputPayload.STREAM_CODEC, DorrieJumpNetworking::handleJumpInput); + AntarchyForgeNetworkCore.registerC2S(DorrieChargeJumpPayload.class, DorrieChargeJumpPayload.STREAM_CODEC, DorrieJumpNetworking::handleChargeInput); + } + + private static void handleJumpInput(ServerPlayer player, DorrieJumpInputPayload payload) { + if (!(player.getVehicle() instanceof DorrieEntity dorrie)) return; + dorrie.setPressingJump(payload.pressing()); + } + + private static void handleChargeInput(ServerPlayer player, DorrieChargeJumpPayload payload) { + if (!(player.getVehicle() instanceof DorrieEntity dorrie)) return; + if (payload.pressing()) { + dorrie.startJumpCharge(); + } else { + dorrie.releaseJump(); + } + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/HerculesBeetleNetworking.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/HerculesBeetleNetworking.java new file mode 100644 index 00000000..25a3754a --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/HerculesBeetleNetworking.java @@ -0,0 +1,55 @@ +package com.craisinlord.antarchy.forge.network; + +import com.craisinlord.antarchy.content.client.HerculesBeetleImpactShakeClientState; +import com.craisinlord.antarchy.content.entity.HerculesBeetleEntity; +import com.craisinlord.antarchy.content.network.HerculesBeetleFlightTogglePayload; +import com.craisinlord.antarchy.content.network.HerculesBeetleImpactShakePayload; +import com.craisinlord.antarchy.content.network.HerculesBeetleJumpInputPayload; +import com.craisinlord.antarchy.content.network.HerculesBeetleMountedAttackPayload; +import com.craisinlord.antarchy.content.network.HerculesBeetleMountedChargePayload; +import net.minecraft.server.level.ServerPlayer; + +public final class HerculesBeetleNetworking { + private HerculesBeetleNetworking() { + } + + public static void register() { + AntarchyForgeNetworkCore.registerC2S(HerculesBeetleJumpInputPayload.class, HerculesBeetleJumpInputPayload.STREAM_CODEC, HerculesBeetleNetworking::handleJumpInput); + AntarchyForgeNetworkCore.registerC2S(HerculesBeetleFlightTogglePayload.class, HerculesBeetleFlightTogglePayload.STREAM_CODEC, HerculesBeetleNetworking::handleFlightToggle); + AntarchyForgeNetworkCore.registerC2S(HerculesBeetleMountedAttackPayload.class, HerculesBeetleMountedAttackPayload.STREAM_CODEC, HerculesBeetleNetworking::handleMountedAttack); + AntarchyForgeNetworkCore.registerC2S(HerculesBeetleMountedChargePayload.class, HerculesBeetleMountedChargePayload.STREAM_CODEC, HerculesBeetleNetworking::handleMountedCharge); + AntarchyForgeNetworkCore.registerS2C(HerculesBeetleImpactShakePayload.class, HerculesBeetleImpactShakePayload.STREAM_CODEC, HerculesBeetleNetworking::handleImpactShake); + } + + private static void handleJumpInput(ServerPlayer player, HerculesBeetleJumpInputPayload payload) { + if (player.getVehicle() instanceof HerculesBeetleEntity beetle) { + beetle.setRiderJumpPressed(payload.pressing()); + } + } + + private static void handleMountedAttack(ServerPlayer player, HerculesBeetleMountedAttackPayload payload) { + if (player.getVehicle() instanceof HerculesBeetleEntity beetle) { + beetle.handleMountedRegularAttack(player); + } + } + + private static void handleFlightToggle(ServerPlayer player, HerculesBeetleFlightTogglePayload payload) { + if (player.getVehicle() instanceof HerculesBeetleEntity beetle) { + beetle.toggleMountedFlight(player); + } + } + + private static void handleMountedCharge(ServerPlayer player, HerculesBeetleMountedChargePayload payload) { + if (player.getVehicle() instanceof HerculesBeetleEntity beetle) { + if (payload.pressing()) { + beetle.startMountedCharge(player); + } else { + beetle.releaseMountedCharge(player); + } + } + } + + private static void handleImpactShake(HerculesBeetleImpactShakePayload payload) { + HerculesBeetleImpactShakeClientState.trigger(payload.durationTicks()); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/JumpyBootsNetworking.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/JumpyBootsNetworking.java new file mode 100644 index 00000000..3df45df5 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/JumpyBootsNetworking.java @@ -0,0 +1,76 @@ +package com.craisinlord.antarchy.forge.network; + +import net.minecraftforge.fml.common.Mod; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.item.JumpyBootsHelper; +import com.craisinlord.antarchy.content.item.JumpyBootsItem; +import com.craisinlord.antarchy.content.network.JumpyBootsLaunchPayload; +import net.minecraft.network.protocol.game.ClientboundSetEntityMotionPacket; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.entity.living.LivingFallEvent; + +@Mod.EventBusSubscriber(modid = Antarchy.MODID) +public final class JumpyBootsNetworking { + private JumpyBootsNetworking() { + } + + public static void register() { + AntarchyForgeNetworkCore.registerC2S(JumpyBootsLaunchPayload.class, JumpyBootsLaunchPayload.STREAM_CODEC, JumpyBootsNetworking::handleLaunch); + } + + private static void handleLaunch(ServerPlayer player, JumpyBootsLaunchPayload payload) { + { + if (!JumpyBootsItem.isWearingJumpyBoots(player)) return; + if (player.isSpectator() || player.isPassenger()) return; + + ItemStack boots = player.getItemBySlot(EquipmentSlot.FEET); + if (player.getCooldowns().isOnCooldown(boots.getItem())) return; + + int clampedCharge = Math.min(payload.chargeTicks(), JumpyBootsHelper.CHARGE_TICKS_MAX); + if (clampedCharge <= 0) return; + + float verticalBoost = JumpyBootsHelper.verticalBoostFor(clampedCharge); + Vec3 current = player.getDeltaMovement(); + + double newY = verticalBoost; + double newX = current.x; + double newZ = current.z; + + if (payload.sprinting()) { + Vec3 look = player.getLookAngle(); + newX += look.x * JumpyBootsHelper.SPRINT_FORWARD_BOOST; + newZ += look.z * JumpyBootsHelper.SPRINT_FORWARD_BOOST; + } + + player.setDeltaMovement(newX, newY, newZ); + player.setPos(player.getX(), player.getY() + 0.001, player.getZ()); + player.hasImpulse = true; + player.hurtMarked = true; + player.resetFallDistance(); + player.connection.send(new ClientboundSetEntityMotionPacket(player)); + + player.level().playSound(null, player.blockPosition(), SoundEvents.SLIME_JUMP, SoundSource.PLAYERS, 1.0F, 0.6F + (clampedCharge / (float) JumpyBootsHelper.CHARGE_TICKS_MAX) * 0.6F); + + player.getPersistentData().putLong(JumpyBootsHelper.FALL_PROTECTION_NBT_KEY, player.level().getGameTime() + JumpyBootsHelper.FALL_PROTECTION_TICKS); + + player.getCooldowns().addCooldown(boots.getItem(), JumpyBootsHelper.COOLDOWN_TICKS); + } + } + + @SubscribeEvent + public static void onLivingFall(LivingFallEvent event) { + if (!(event.getEntity() instanceof ServerPlayer player)) return; + if (!JumpyBootsItem.isWearingJumpyBoots(player)) return; + long protectionUntil = player.getPersistentData().getLong(JumpyBootsHelper.FALL_PROTECTION_NBT_KEY); + if (player.level().getGameTime() < protectionUntil) { + event.setDamageMultiplier(event.getDamageMultiplier() * 0.25F); + } + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/MultipartNetworking.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/MultipartNetworking.java new file mode 100644 index 00000000..a5d942ee --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/MultipartNetworking.java @@ -0,0 +1,78 @@ +package com.craisinlord.antarchy.forge.network; + +import com.craisinlord.antarchy.content.entity.multipart.MultipartEntityOwner; +import com.craisinlord.antarchy.content.entity.multipart.network.MultipartAttackPayload; +import com.craisinlord.antarchy.content.entity.multipart.network.MultipartInteractPayload; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +public final class MultipartNetworking { + private MultipartNetworking() { + } + + public static void register() { + AntarchyForgeNetworkCore.registerC2S(MultipartAttackPayload.class, MultipartAttackPayload.STREAM_CODEC, MultipartNetworking::handleAttack); + AntarchyForgeNetworkCore.registerC2S(MultipartInteractPayload.class, MultipartInteractPayload.STREAM_CODEC, MultipartNetworking::handleInteract); + } + + private static void handleAttack(ServerPlayer serverPlayer, MultipartAttackPayload payload) { + { + Entity entity = serverPlayer.serverLevel().getEntity(payload.parentId()); + if (!(entity instanceof MultipartEntityOwner owner)) { + return; + } + + Entity[] parts = owner.antarchy$getMultipartParts(); + if (parts == null) { + parts = owner.antarchy$createMultipartParts(); + owner.antarchy$setMultipartParts(parts); + owner.antarchy$syncMultipartParts(); + } + + if (payload.partIndex() < 0 || payload.partIndex() >= parts.length) { + return; + } + + Entity part = parts[payload.partIndex()]; + if (part == null || part.isRemoved()) { + return; + } + + if (serverPlayer.distanceToSqr(part) > 10000.0D) { + return; + } + + DamageSource source = serverPlayer.level().damageSources().playerAttack(serverPlayer); + owner.antarchy$hurtMultipartPart(part, source, payload.damage()); + } + } + + private static void handleInteract(ServerPlayer serverPlayer, MultipartInteractPayload payload) { + { + Entity entity = serverPlayer.serverLevel().getEntity(payload.parentId()); + if (!(entity instanceof MultipartEntityOwner owner)) { + return; + } + + Entity[] parts = owner.antarchy$getMultipartParts(); + if (parts == null) { + parts = owner.antarchy$createMultipartParts(); + owner.antarchy$setMultipartParts(parts); + owner.antarchy$syncMultipartParts(); + } + + if (payload.partIndex() < 0 || payload.partIndex() >= parts.length) { + return; + } + + Entity part = parts[payload.partIndex()]; + if (part == null || part.isRemoved()) { + return; + } + + InteractionHand hand = payload.handId() == 0 ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND; + owner.antarchy$interactMultipartPart(part, serverPlayer, part.position(), hand); + } + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/ThoraxisWeatherNetworking.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/ThoraxisWeatherNetworking.java new file mode 100644 index 00000000..918f4264 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/network/ThoraxisWeatherNetworking.java @@ -0,0 +1,59 @@ +package com.craisinlord.antarchy.forge.network; + +import com.craisinlord.antarchy.content.client.ThoraxisWeatherClientState; +import com.craisinlord.antarchy.content.weather.ThoraxisWeatherKind; +import com.craisinlord.antarchy.content.weather.ThoraxisWeatherSnapshot; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; + +public final class ThoraxisWeatherNetworking { + private ThoraxisWeatherNetworking() { + } + + public static void register() { + AntarchyForgeNetworkCore.registerS2C( + com.craisinlord.antarchy.content.network.ThoraxisWeatherPayload.class, + com.craisinlord.antarchy.content.network.ThoraxisWeatherPayload.STREAM_CODEC, + ThoraxisWeatherNetworking::handleWeatherPayload + ); + } + + public static void syncLevel(ServerLevel level, ThoraxisWeatherSnapshot snapshot) { + com.craisinlord.antarchy.content.network.ThoraxisWeatherPayload payload = new com.craisinlord.antarchy.content.network.ThoraxisWeatherPayload( + snapshot.dimension(), + snapshot.kind(), + snapshot.expiresAt(), + snapshot.anchor().getX(), + snapshot.anchor().getY(), + snapshot.anchor().getZ() + ); + + for (ServerPlayer player : level.players()) { + AntarchyForgeNetworkCore.sendToPlayer(player, payload); + } + } + + public static void syncPlayer(ServerPlayer player, ThoraxisWeatherSnapshot snapshot) { + com.craisinlord.antarchy.content.network.ThoraxisWeatherPayload payload = new com.craisinlord.antarchy.content.network.ThoraxisWeatherPayload( + snapshot.dimension(), + snapshot.kind(), + snapshot.expiresAt(), + snapshot.anchor().getX(), + snapshot.anchor().getY(), + snapshot.anchor().getZ() + ); + AntarchyForgeNetworkCore.sendToPlayer(player, payload); + } + + private static void handleWeatherPayload(com.craisinlord.antarchy.content.network.ThoraxisWeatherPayload payload) { + ThoraxisWeatherClientState.apply( + new ResourceLocation(payload.dimensionId()), + ThoraxisWeatherKind.byId(payload.weatherId()), + payload.expiresAt(), + payload.anchorX(), + payload.anchorY(), + payload.anchorZ() + ); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeBlocks.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeBlocks.java new file mode 100644 index 00000000..d76ca4db --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeBlocks.java @@ -0,0 +1,673 @@ +package com.craisinlord.antarchy.forge.registry; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.block.*; +import com.craisinlord.antarchy.content.block.entity.AntNestBlockEntity; +import com.craisinlord.antarchy.content.block.entity.CritterCageBlockEntity; +import com.craisinlord.antarchy.content.block.entity.DreamCampfireBlockEntity; +import com.craisinlord.antarchy.content.block.entity.HushweedBlockEntity; +import com.craisinlord.antarchy.content.block.entity.PotentNyxiteBlockEntity; +import com.craisinlord.antarchy.content.block.entity.SeashellBlockEntity; +import com.craisinlord.antarchy.content.block.entity.WaspNestBlockEntity; +import com.craisinlord.antarchy.content.fluid.BileLiquidBlock; +import com.craisinlord.antarchy.content.fluid.LumenLiquidBlock; +import com.craisinlord.antarchy.content.portal.PermanentPortalType; +import com.craisinlord.antarchy.forge.content.block.WildCornBlock; +import com.craisinlord.antarchy.forge.AntarchyWoodTypes; +import com.craisinlord.antarchy.forge.content.fluid.AntiwaterFluidType; +import com.mojang.serialization.MapCodec; +import net.minecraft.core.Direction; +import net.minecraft.core.registries.Registries; +import net.minecraft.util.valueproviders.UniformInt; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockSetType; +import net.minecraft.world.level.material.MapColor; +import net.minecraft.world.level.block.state.properties.WoodType; +import net.minecraft.world.level.material.FlowingFluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fluids.ForgeFlowingFluid; +import net.minecraftforge.registries.RegistryObject; + +public final class AntarchyForgeBlocks { + private static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(Antarchy.MODID); + private static final DeferredRegister> BLOCK_ENTITY_TYPES = DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, Antarchy.MODID); + public static final RegistryObject DUPLICATOR_LOG = BLOCKS.register("duplicator_log", + () -> new DuplicatorLogBlock(BlockBehaviour.Properties.copy(Blocks.OAK_LOG).randomTicks())); + public static final RegistryObject OURANWOOD_LOG = BLOCKS.register("ouranwood_log", + () -> new OuranwoodLogBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_LOG))); + public static final RegistryObject OURANWOOD_WOOD = BLOCKS.register("ouranwood_wood", + () -> new OuranwoodLogBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_WOOD))); + public static final RegistryObject MOSSY_OURANWOOD_LOG = BLOCKS.register("mossy_ouranwood_log", + () -> new OuranwoodLogBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_LOG))); + public static final RegistryObject MOSSY_OURANWOOD_WOOD = BLOCKS.register("mossy_ouranwood_wood", + () -> new OuranwoodLogBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_WOOD))); + public static final RegistryObject STRIPPED_OURANWOOD_LOG = BLOCKS.register("stripped_ouranwood_log", + () -> new OuranwoodLogBlock(BlockBehaviour.Properties.copy(Blocks.STRIPPED_JUNGLE_LOG))); + public static final RegistryObject STRIPPED_OURANWOOD_WOOD = BLOCKS.register("stripped_ouranwood_wood", + () -> new OuranwoodLogBlock(BlockBehaviour.Properties.copy(Blocks.STRIPPED_JUNGLE_WOOD))); + public static final RegistryObject OURANWOOD_PLANKS = BLOCKS.register("ouranwood_planks", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.JUNGLE_PLANKS))); + public static final RegistryObject OURANWOOD_STAIRS = BLOCKS.register("ouranwood_stairs", + () -> new StairBlock(OURANWOOD_PLANKS.get().defaultBlockState(), BlockBehaviour.Properties.copy(Blocks.JUNGLE_STAIRS))); + public static final RegistryObject OURANWOOD_SLAB = BLOCKS.register("ouranwood_slab", + () -> new SlabBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_SLAB))); + public static final RegistryObject OURANWOOD_FENCE = BLOCKS.register("ouranwood_fence", + () -> new FenceBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_FENCE))); + public static final RegistryObject OURANWOOD_FENCE_GATE = BLOCKS.register("ouranwood_fence_gate", + () -> new FenceGateBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_FENCE_GATE), WoodType.JUNGLE)); + public static final RegistryObject OURANWOOD_DOOR = BLOCKS.register("ouranwood_door", + () -> new DoorBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_DOOR), BlockSetType.JUNGLE)); + public static final RegistryObject OURANWOOD_TRAPDOOR = BLOCKS.register("ouranwood_trapdoor", + () -> new TrapDoorBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_TRAPDOOR), BlockSetType.JUNGLE)); + public static final RegistryObject OURANWOOD_PRESSURE_PLATE = BLOCKS.register("ouranwood_pressure_plate", + () -> new PressurePlateBlock(PressurePlateBlock.Sensitivity.EVERYTHING, BlockBehaviour.Properties.copy(Blocks.JUNGLE_PRESSURE_PLATE), BlockSetType.JUNGLE)); + public static final RegistryObject OURANWOOD_BUTTON = BLOCKS.register("ouranwood_button", + () -> new ButtonBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_BUTTON), BlockSetType.JUNGLE, 30, false)); + public static final RegistryObject OURANWOOD_LEAVES = BLOCKS.register("ouranwood_leaves", + () -> new OuranwoodLeavesBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_LEAVES).randomTicks())); + public static final RegistryObject OURANWOOD_ACORN_BLOCK = BLOCKS.register("ouranwood_acorn", + () -> new OuranwoodAcornBlock(BlockBehaviour.Properties.copy(Blocks.OAK_SAPLING).randomTicks().noCollission())); + public static final RegistryObject POTTED_OURANWOOD_ACORN = BLOCKS.register("potted_ouranwood_acorn", + () -> new FlowerPotBlock(OURANWOOD_ACORN_BLOCK.get(), BlockBehaviour.Properties.copy(Blocks.POTTED_DANDELION))); + public static final RegistryObject ORANGE_MILKWEED = BLOCKS.register("orange_milkweed", + () -> new MilkweedBlock(BlockBehaviour.Properties.copy(Blocks.PEONY))); + public static final RegistryObject PINK_MILKWEED = BLOCKS.register("pink_milkweed", + () -> new MilkweedBlock(BlockBehaviour.Properties.copy(Blocks.PEONY))); + public static final RegistryObject CAMELLIA = BLOCKS.register("camellia", + () -> new com.craisinlord.antarchy.content.block.CamelliaBlock(BlockBehaviour.Properties.copy(Blocks.PEONY))); + public static final RegistryObject SPIDER_LILY = BLOCKS.register("spider_lily", + () -> new com.craisinlord.antarchy.content.block.SpiderLilyBlock(BlockBehaviour.Properties.copy(Blocks.POPPY))); + public static final RegistryObject POTTED_SPIDER_LILY = BLOCKS.register("potted_spider_lily", + () -> new FlowerPotBlock(SPIDER_LILY.get(), BlockBehaviour.Properties.copy(Blocks.POTTED_DANDELION))); + public static final RegistryObject GIANT_LILY_PAD = BLOCKS.register("giant_lily_pad", + () -> new GiantLilyPadBlock(BlockBehaviour.Properties.copy(Blocks.LILY_PAD))); + public static final RegistryObject LOTUS = BLOCKS.register("lotus", + () -> new com.craisinlord.antarchy.content.block.LotusBlock(BlockBehaviour.Properties.copy(Blocks.SPORE_BLOSSOM))); + public static final RegistryObject POTTED_LOTUS = BLOCKS.register("potted_lotus", + () -> new FlowerPotBlock(LOTUS.get(), BlockBehaviour.Properties.copy(Blocks.POTTED_DANDELION))); + public static final RegistryObject SEASHELL = BLOCKS.register("seashell", + () -> new SeashellBlock(BlockBehaviour.Properties.copy(Blocks.TURTLE_EGG).noOcclusion())); + public static final RegistryObject CRITTER_CAGE_BLOCK = BLOCKS.register("critter_cage_block", + () -> new CritterCageBlock(BlockBehaviour.Properties.of().strength(5.0F, 6.0F).sound(net.minecraft.world.level.block.SoundType.METAL).noOcclusion())); + public static final RegistryObject OURANWOOD_SIGN = BLOCKS.register("ouranwood_sign", + () -> new StandingSignBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_SIGN), AntarchyWoodTypes.OURANWOOD)); + public static final RegistryObject OURANWOOD_WALL_SIGN = BLOCKS.register("ouranwood_wall_sign", + () -> new WallSignBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_WALL_SIGN), AntarchyWoodTypes.OURANWOOD)); + public static final RegistryObject OURANWOOD_HANGING_SIGN = BLOCKS.register("ouranwood_hanging_sign", + () -> new CeilingHangingSignBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_HANGING_SIGN), AntarchyWoodTypes.OURANWOOD)); + public static final RegistryObject OURANWOOD_WALL_HANGING_SIGN = BLOCKS.register("ouranwood_wall_hanging_sign", + () -> new WallHangingSignBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_WALL_HANGING_SIGN), AntarchyWoodTypes.OURANWOOD)); + public static final RegistryObject PEACH_LOG = BLOCKS.register("peach_log", + () -> new RotatedPillarBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_LOG))); + public static final RegistryObject PEACH_WOOD = BLOCKS.register("peach_wood", + () -> new RotatedPillarBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_WOOD))); + public static final RegistryObject STRIPPED_PEACH_LOG = BLOCKS.register("stripped_peach_log", + () -> new RotatedPillarBlock(BlockBehaviour.Properties.copy(Blocks.STRIPPED_JUNGLE_LOG))); + public static final RegistryObject STRIPPED_PEACH_WOOD = BLOCKS.register("stripped_peach_wood", + () -> new RotatedPillarBlock(BlockBehaviour.Properties.copy(Blocks.STRIPPED_JUNGLE_WOOD))); + public static final RegistryObject PEACH_PLANKS = BLOCKS.register("peach_planks", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.JUNGLE_PLANKS))); + public static final RegistryObject PEACH_STAIRS = BLOCKS.register("peach_stairs", + () -> new StairBlock(PEACH_PLANKS.get().defaultBlockState(), BlockBehaviour.Properties.copy(Blocks.JUNGLE_STAIRS))); + public static final RegistryObject PEACH_SLAB = BLOCKS.register("peach_slab", + () -> new SlabBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_SLAB))); + public static final RegistryObject PEACH_FENCE = BLOCKS.register("peach_fence", + () -> new FenceBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_FENCE))); + public static final RegistryObject PEACH_FENCE_GATE = BLOCKS.register("peach_fence_gate", + () -> new FenceGateBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_FENCE_GATE), WoodType.JUNGLE)); + public static final RegistryObject PEACH_DOOR = BLOCKS.register("peach_door", + () -> new DoorBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_DOOR), BlockSetType.JUNGLE)); + public static final RegistryObject PEACH_TRAPDOOR = BLOCKS.register("peach_trapdoor", + () -> new TrapDoorBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_TRAPDOOR), BlockSetType.JUNGLE)); + public static final RegistryObject PEACH_PRESSURE_PLATE = BLOCKS.register("peach_pressure_plate", + () -> new PressurePlateBlock(PressurePlateBlock.Sensitivity.EVERYTHING, BlockBehaviour.Properties.copy(Blocks.JUNGLE_PRESSURE_PLATE), BlockSetType.JUNGLE)); + public static final RegistryObject PEACH_BUTTON = BLOCKS.register("peach_button", + () -> new ButtonBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_BUTTON), BlockSetType.JUNGLE, 30, false)); + public static final RegistryObject PEACH_LEAVES = BLOCKS.register("peach_leaves", + () -> new PeachLeavesBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_LEAVES).randomTicks())); + public static final RegistryObject PEACH_HANGING_PEACH = BLOCKS.register("hanging_peach", + () -> new HangingPeachBlock(BlockBehaviour.Properties.of().noOcclusion().instabreak())); + public static final RegistryObject PEACH_SAPLING = BLOCKS.register("peach_sapling", + () -> new com.craisinlord.antarchy.content.block.PeachSaplingBlock(BlockBehaviour.Properties.copy(Blocks.OAK_SAPLING).randomTicks().noCollission())); + public static final RegistryObject POTTED_PEACH_SAPLING = BLOCKS.register("potted_peach_sapling", + () -> new FlowerPotBlock(PEACH_SAPLING.get(), BlockBehaviour.Properties.copy(Blocks.POTTED_DANDELION))); + public static final RegistryObject PEACH_SIGN = BLOCKS.register("peach_sign", + () -> new StandingSignBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_SIGN), AntarchyWoodTypes.PEACH)); + public static final RegistryObject PEACH_WALL_SIGN = BLOCKS.register("peach_wall_sign", + () -> new WallSignBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_WALL_SIGN), AntarchyWoodTypes.PEACH)); + public static final RegistryObject PEACH_HANGING_SIGN = BLOCKS.register("peach_hanging_sign", + () -> new CeilingHangingSignBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_HANGING_SIGN), AntarchyWoodTypes.PEACH)); + public static final RegistryObject PEACH_WALL_HANGING_SIGN = BLOCKS.register("peach_wall_hanging_sign", + () -> new WallHangingSignBlock(BlockBehaviour.Properties.copy(Blocks.JUNGLE_WALL_HANGING_SIGN), AntarchyWoodTypes.PEACH)); + public static final RegistryObject DUPLICATOR_SAPLING = BLOCKS.register("duplicator_sapling", + () -> new DuplicatorSaplingBlock(BlockBehaviour.Properties.copy(Blocks.OAK_SAPLING).randomTicks().noCollission())); + public static final RegistryObject DUCT_TAPE = BLOCKS.register("duct_tape", + () -> new DuctTapeBlock(BlockBehaviour.Properties.of() + .strength(0.2F) + .sound(SoundType.WOOL) + .noOcclusion() + .replaceable())); + public static final RegistryObject INFESTED_ROOTED_DIRT = BLOCKS.register("infested_rooted_dirt", + () -> new InfestedRootedDirtBlock(BlockBehaviour.Properties.copy(Blocks.ROOTED_DIRT).randomTicks())); + public static final RegistryObject INFESTED_COARSE_DIRT = BLOCKS.register("infested_coarse_dirt", + () -> new InfestedCoarseDirtBlock(BlockBehaviour.Properties.copy(Blocks.COARSE_DIRT).randomTicks())); + public static final RegistryObject NYXITE = BLOCKS.register("nyxite", + () -> new Block(nyxiteProperties())); + public static final RegistryObject POLISHED_NYXITE = BLOCKS.register("polished_nyxite", + () -> new Block(nyxiteProperties())); + public static final RegistryObject CHISELED_NYXITE = BLOCKS.register("chiseled_nyxite", + () -> new Block(nyxiteProperties())); + public static final RegistryObject NYXITE_BRICKS = BLOCKS.register("nyxite_bricks", + () -> new Block(nyxiteProperties())); + public static final RegistryObject NYXITE_STAIRS = BLOCKS.register("nyxite_stairs", + () -> new StairBlock(NYXITE.get().defaultBlockState(), nyxiteProperties())); + public static final RegistryObject NYXITE_SLAB = BLOCKS.register("nyxite_slab", + () -> new SlabBlock(nyxiteProperties())); + public static final RegistryObject NYXITE_WALL = BLOCKS.register("nyxite_wall", + () -> new WallBlock(nyxiteProperties())); + public static final RegistryObject POLISHED_NYXITE_STAIRS = BLOCKS.register("polished_nyxite_stairs", + () -> new StairBlock(POLISHED_NYXITE.get().defaultBlockState(), nyxiteProperties())); + public static final RegistryObject POLISHED_NYXITE_SLAB = BLOCKS.register("polished_nyxite_slab", + () -> new SlabBlock(nyxiteProperties())); + public static final RegistryObject POLISHED_NYXITE_WALL = BLOCKS.register("polished_nyxite_wall", + () -> new WallBlock(nyxiteProperties())); + public static final RegistryObject POLISHED_NYXITE_PRESSURE_PLATE = BLOCKS.register("polished_nyxite_pressure_plate", + () -> new com.craisinlord.antarchy.content.block.PolishedNyxitePressurePlateBlock(BlockSetType.STONE, BlockBehaviour.Properties.copy(Blocks.STONE_PRESSURE_PLATE))); + public static final RegistryObject POLISHED_NYXITE_BUTTON = BLOCKS.register("polished_nyxite_button", + () -> new ButtonBlock(BlockBehaviour.Properties.copy(Blocks.STONE_BUTTON), BlockSetType.STONE, 20, true)); + public static final RegistryObject NYXITE_BRICK_STAIRS = BLOCKS.register("nyxite_brick_stairs", + () -> new StairBlock(NYXITE_BRICKS.get().defaultBlockState(), nyxiteProperties())); + public static final RegistryObject NYXITE_BRICK_SLAB = BLOCKS.register("nyxite_brick_slab", + () -> new SlabBlock(nyxiteProperties())); + public static final RegistryObject NYXITE_BRICK_WALL = BLOCKS.register("nyxite_brick_wall", + () -> new WallBlock(nyxiteProperties())); + public static final RegistryObject SHELLSTONE = BLOCKS.register("shellstone", + () -> new Block(AntarchyObjects.shellstoneProperties())); + public static final RegistryObject POLISHED_SHELLSTONE = BLOCKS.register("polished_shellstone", + () -> new Block(AntarchyObjects.shellstoneProperties())); + public static final RegistryObject SHELLSTONE_BRICKS = BLOCKS.register("shellstone_bricks", + () -> new Block(AntarchyObjects.shellstoneProperties())); + public static final RegistryObject CHISELED_SHELLSTONE = BLOCKS.register("chiseled_shellstone", + () -> new Block(AntarchyObjects.shellstoneProperties())); + public static final RegistryObject MOSSY_SHELLSTONE_BRICKS = BLOCKS.register("mossy_shellstone_bricks", + () -> new Block(AntarchyObjects.shellstoneProperties())); + public static final RegistryObject CRACKED_SHELLSTONE_BRICKS = BLOCKS.register("cracked_shellstone_bricks", + () -> new Block(AntarchyObjects.shellstoneProperties())); + public static final RegistryObject MOSSY_SHELLSTONE_BRICK_STAIRS = BLOCKS.register("mossy_shellstone_brick_stairs", + () -> new StairBlock(MOSSY_SHELLSTONE_BRICKS.get().defaultBlockState(), AntarchyObjects.shellstoneProperties())); + public static final RegistryObject MOSSY_SHELLSTONE_BRICK_SLAB = BLOCKS.register("mossy_shellstone_brick_slab", + () -> new SlabBlock(AntarchyObjects.shellstoneProperties())); + public static final RegistryObject MOSSY_SHELLSTONE_BRICK_WALL = BLOCKS.register("mossy_shellstone_brick_wall", + () -> new WallBlock(AntarchyObjects.shellstoneProperties())); + public static final RegistryObject SHELLSTONE_STAIRS = BLOCKS.register("shellstone_stairs", + () -> new StairBlock(SHELLSTONE.get().defaultBlockState(), AntarchyObjects.shellstoneProperties())); + public static final RegistryObject SHELLSTONE_SLAB = BLOCKS.register("shellstone_slab", + () -> new SlabBlock(AntarchyObjects.shellstoneProperties())); + public static final RegistryObject SHELLSTONE_WALL = BLOCKS.register("shellstone_wall", + () -> new WallBlock(AntarchyObjects.shellstoneProperties())); + public static final RegistryObject POLISHED_SHELLSTONE_STAIRS = BLOCKS.register("polished_shellstone_stairs", + () -> new StairBlock(POLISHED_SHELLSTONE.get().defaultBlockState(), AntarchyObjects.shellstoneProperties())); + public static final RegistryObject POLISHED_SHELLSTONE_SLAB = BLOCKS.register("polished_shellstone_slab", + () -> new SlabBlock(AntarchyObjects.shellstoneProperties())); + public static final RegistryObject POLISHED_SHELLSTONE_WALL = BLOCKS.register("polished_shellstone_wall", + () -> new WallBlock(AntarchyObjects.shellstoneProperties())); + public static final RegistryObject SHELLSTONE_BRICK_STAIRS = BLOCKS.register("shellstone_brick_stairs", + () -> new StairBlock(SHELLSTONE_BRICKS.get().defaultBlockState(), AntarchyObjects.shellstoneProperties())); + public static final RegistryObject SHELLSTONE_BRICK_SLAB = BLOCKS.register("shellstone_brick_slab", + () -> new SlabBlock(AntarchyObjects.shellstoneProperties())); + public static final RegistryObject SHELLSTONE_BRICK_WALL = BLOCKS.register("shellstone_brick_wall", + () -> new WallBlock(AntarchyObjects.shellstoneProperties())); + public static final RegistryObject TRIFFID_GOO_BLOCK = BLOCKS.register("triffid_goo_block", + () -> new com.craisinlord.antarchy.content.block.TriffidGooBlock(BlockBehaviour.Properties.copy(Blocks.SLIME_BLOCK).noOcclusion().isViewBlocking((s, l, p) -> false).isSuffocating((s, l, p) -> false))); + public static final RegistryObject CLOUD_BLOCK = BLOCKS.register("cloud_block", + () -> new com.craisinlord.antarchy.content.block.CloudBlock( + AntarchyForgeItems::cloudBucketItem, + BlockBehaviour.Properties.copy(Blocks.POWDER_SNOW).noLootTable().noOcclusion() + )); + public static final RegistryObject ELYTHIA_PORTAL = BLOCKS.register("elythia_portal", + () -> new AntDimensionPortalBlock(PermanentPortalType.ELYTHIA, portalProperties())); + public static final RegistryObject THORAXIS_PORTAL = BLOCKS.register("thoraxis_portal", + () -> new AntDimensionPortalBlock(PermanentPortalType.THORAXIS, portalProperties())); + public static final RegistryObject CAVARYN_PORTAL = BLOCKS.register("cavaryn_portal", + () -> new AntDimensionPortalBlock(PermanentPortalType.CAVARYN, portalProperties())); + public static final RegistryObject PALE_NYXITE = BLOCKS.register("pale_nyxite", + () -> new Block(nyxiteProperties())); + public static final RegistryObject NYXITE_SPIKE = BLOCKS.register("nyxite_spike", + () -> new NyxiteSpikeBlock(BlockBehaviour.Properties.copy(Blocks.POINTED_DRIPSTONE))); + public static final RegistryObject CHITEN_SPIKE = BLOCKS.register("chiten_spike", + () -> new ChitenSpikeBlock(BlockBehaviour.Properties.copy(Blocks.POINTED_DRIPSTONE))); + public static final RegistryObject POTENT_NYXITE = BLOCKS.register("potent_nyxite", + () -> new PotentNyxiteBlock( + AntarchyForgeItems::potentNyxiteBlockEntityType, + BlockBehaviour.Properties.copy(Blocks.NETHERRACK).lightLevel(state -> 3) + )); + public static final RegistryObject MYRMITE = BLOCKS.register("myrmite", + () -> new Block(nyxiteProperties())); + public static final RegistryObject BIOMITE = BLOCKS.register("biomite", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.NETHERRACK))); + public static final RegistryObject BIOMITE_TURF = BLOCKS.register("biomite_turf", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.NETHERRACK).lightLevel(state -> 2))); + public static final RegistryObject BIOWART = BLOCKS.register("biowart", + () -> new BiowartBlock(BlockBehaviour.Properties.copy(Blocks.MOSS_BLOCK).lightLevel(state -> 2))); + public static final RegistryObject BIOWART_TENDRILS = BLOCKS.register("biowart_tendrils", + () -> new BiowartTendrilsBlock(BlockBehaviour.Properties.copy(Blocks.MOSS_CARPET).lightLevel(state -> 2).noCollission().noOcclusion())); + public static final RegistryObject MYRMITE_COAL_ORE = BLOCKS.register("myrmite_coal_ore", + () -> createOre(Blocks.COAL_ORE, 0, 2, MapColor.COLOR_GRAY)); + public static final RegistryObject BROODSTONE = BLOCKS.register("broodstone", + () -> new Block(broodstoneProperties())); + public static final RegistryObject POLISHED_BROODSTONE = BLOCKS.register("polished_broodstone", + () -> new Block(broodstoneProperties())); + public static final RegistryObject CHISELED_BROODSTONE = BLOCKS.register("chiseled_broodstone", + () -> new Block(broodstoneProperties())); + public static final RegistryObject BROODSTONE_BRICKS = BLOCKS.register("broodstone_bricks", + () -> new Block(broodstoneProperties())); + public static final RegistryObject BROODSTONE_STAIRS = BLOCKS.register("broodstone_stairs", + () -> new StairBlock(BROODSTONE.get().defaultBlockState(), broodstoneProperties())); + public static final RegistryObject BROODSTONE_SLAB = BLOCKS.register("broodstone_slab", + () -> new SlabBlock(broodstoneProperties())); + public static final RegistryObject BROODSTONE_WALL = BLOCKS.register("broodstone_wall", + () -> new WallBlock(broodstoneProperties())); + public static final RegistryObject POLISHED_BROODSTONE_STAIRS = BLOCKS.register("polished_broodstone_stairs", + () -> new StairBlock(POLISHED_BROODSTONE.get().defaultBlockState(), broodstoneProperties())); + public static final RegistryObject POLISHED_BROODSTONE_SLAB = BLOCKS.register("polished_broodstone_slab", + () -> new SlabBlock(broodstoneProperties())); + public static final RegistryObject POLISHED_BROODSTONE_WALL = BLOCKS.register("polished_broodstone_wall", + () -> new WallBlock(broodstoneProperties())); + public static final RegistryObject BROODSTONE_BRICK_STAIRS = BLOCKS.register("broodstone_brick_stairs", + () -> new StairBlock(BROODSTONE_BRICKS.get().defaultBlockState(), broodstoneProperties())); + public static final RegistryObject BROODSTONE_BRICK_SLAB = BLOCKS.register("broodstone_brick_slab", + () -> new SlabBlock(broodstoneProperties())); + public static final RegistryObject BROODSTONE_BRICK_WALL = BLOCKS.register("broodstone_brick_wall", + () -> new WallBlock(broodstoneProperties())); + public static final RegistryObject BROODSTONE_URANIUM_ORE = BLOCKS.register("broodstone_uranium_ore", + () -> createOre(Blocks.DEEPSLATE_EMERALD_ORE, 4, 8, MapColor.COLOR_YELLOW)); + public static final RegistryObject BROODSTONE_TITANIUM_ORE = BLOCKS.register("broodstone_titanium_ore", + () -> createOre(Blocks.DEEPSLATE_DIAMOND_ORE, 4, 8, MapColor.COLOR_LIGHT_BLUE)); + public static final RegistryObject CHITEN_BLOCK = BLOCKS.register("chiten_block", + () -> new RotatedPillarBlock(BlockBehaviour.Properties.copy(Blocks.BONE_BLOCK).requiresCorrectToolForDrops())); + public static final RegistryObject UMBRAL_MOSS_BLOCK = BLOCKS.register("umbral_moss_block", + () -> new UmbralMossBlock(BlockBehaviour.Properties.copy(Blocks.MOSS_BLOCK))); + public static final RegistryObject UMBRAL_MOSS_CARPET = BLOCKS.register("umbral_moss_carpet", + () -> new UmbralMossCarpetBlock(BlockBehaviour.Properties.copy(Blocks.MOSS_CARPET).noOcclusion())); + public static final RegistryObject AMBER_MOSS_BLOCK = BLOCKS.register("amber_moss_block", + () -> new AmberMossBlock(BlockBehaviour.Properties.copy(Blocks.MOSS_BLOCK))); + public static final RegistryObject AMBER_MOSS_CARPET = BLOCKS.register("amber_moss_carpet", + () -> new UmbralMossCarpetBlock(BlockBehaviour.Properties.copy(Blocks.MOSS_CARPET).noOcclusion())); + public static final RegistryObject AMBER_LICHEN = BLOCKS.register("amber_lichen", + () -> new AmberLichenBlock(BlockBehaviour.Properties.copy(Blocks.GLOW_LICHEN).lightLevel(state -> 4))); + public static final RegistryObject BILE_VEIN = BLOCKS.register("bile_vein", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.NETHERRACK).lightLevel(state -> 2))); + public static final RegistryObject CREEPVINE = BLOCKS.register("creepvine", + () -> new CreepvineBlock(BlockBehaviour.Properties.copy(Blocks.VINE))); + public static final RegistryObject BLUSH_MOSS_BLOCK = BLOCKS.register("blush_moss_block", + () -> new BlushMossBlock(BlockBehaviour.Properties.copy(Blocks.MOSS_BLOCK))); + public static final RegistryObject BLUSH_MOSS_CARPET = BLOCKS.register("blush_moss_carpet", + () -> new BlushMossCarpetBlock(BlockBehaviour.Properties.copy(Blocks.MOSS_CARPET).noOcclusion())); + public static final RegistryObject DREAM_TORCH = BLOCKS.register("dream_torch", + () -> new DreamTorchBlock(BlockBehaviour.Properties.copy(Blocks.SOUL_TORCH))); + public static final RegistryObject DREAM_WALL_TORCH = BLOCKS.register("dream_wall_torch", + () -> new DreamWallTorchBlock(BlockBehaviour.Properties.copy(Blocks.SOUL_WALL_TORCH))); + public static final RegistryObject DREAM_CEILING_TORCH = BLOCKS.register("dream_ceiling_torch", + () -> new com.craisinlord.antarchy.content.block.DreamCeilingTorchBlock(BlockBehaviour.Properties.copy(Blocks.SOUL_TORCH))); + public static final RegistryObject DREAM_LANTERN = BLOCKS.register("dream_lantern", + () -> new LanternBlock(BlockBehaviour.Properties.copy(Blocks.SOUL_LANTERN))); + public static final RegistryObject DREAM_CAMPFIRE = BLOCKS.register("dream_campfire", + () -> new DreamCampfireBlock(BlockBehaviour.Properties.copy(Blocks.SOUL_CAMPFIRE))); + public static final RegistryObject DREAM_FIRE = BLOCKS.register("dream_fire", + () -> new DreamFireBlock(BlockBehaviour.Properties.copy(Blocks.SOUL_FIRE))); + public static final RegistryObject DREAM_CEILING_FIRE = BLOCKS.register("dream_fire_ceiling", + () -> new DreamCeilingFireBlock(BlockBehaviour.Properties.copy(Blocks.SOUL_FIRE))); + public static final RegistryObject BED_BUG_EGG = BLOCKS.register("bed_bug_egg", + () -> new BedBugEggBlock(BlockBehaviour.Properties.of() + .strength(0.15F) + .sound(SoundType.METAL) + .randomTicks() + .noOcclusion() + .noCollission() + .replaceable())); + public static final RegistryObject CREEPING_HORROR_EGG = BLOCKS.register("creeping_horror_egg", + () -> new CreepingHorrorEggBlock(BlockBehaviour.Properties.copy(Blocks.TURTLE_EGG))); + public static final RegistryObject JUMPY_BUG_EGG = BLOCKS.register("jumpy_bug_egg", + () -> new JumpyBugEggBlock(BlockBehaviour.Properties.copy(Blocks.TURTLE_EGG))); + public static final RegistryObject SPIT_BUG_EGG = BLOCKS.register("spit_bug_egg", + () -> new SpitBugEggBlock(BlockBehaviour.Properties.copy(Blocks.TURTLE_EGG))); + public static final RegistryObject JERRY_EGG = BLOCKS.register("jerry_egg", + () -> new JerryEggBlock(BlockBehaviour.Properties.copy(Blocks.TURTLE_EGG).randomTicks())); + public static final RegistryObject LURKING_TERROR_EGG = BLOCKS.register("lurking_terror_egg", + () -> new LurkingTerrorEggBlock(BlockBehaviour.Properties.copy(Blocks.TURTLE_EGG))); + + static { + BiowartBlock.bindTendrils(BIOWART_TENDRILS); + } + public static final RegistryObject WASP_NEST = BLOCKS.register("wasp_nest", + () -> new WaspNestBlock(AntarchyForgeItems::waspNestBlockEntityType, BlockBehaviour.Properties.copy(Blocks.BEE_NEST))); + public static final RegistryObject OURANWOOD_SQUIRREL_NEST = BLOCKS.register("ouranwood_squirrel_nest", + () -> new com.craisinlord.antarchy.content.block.OuranwoodSquirrelNestBlock(BlockBehaviour.Properties.copy(Blocks.COARSE_DIRT).noLootTable())); + public static final RegistryObject BRUTALFLY_COCOON_SPAWNER = BLOCKS.register("brutalfly_cocoon_spawner", + () -> new com.craisinlord.antarchy.content.block.BrutalflyCocoonSpawnerBlock(BlockBehaviour.Properties.of().noCollission().instabreak().noLootTable())); + public static final RegistryObject HUSHWEED = BLOCKS.register("hushweed", + () -> new HushweedBlock(BlockBehaviour.Properties.copy(Blocks.AZALEA).noCollission().noOcclusion())); + public static final RegistryObject HANGING_CREEPROOTS = BLOCKS.register("hanging_creeproots", + () -> new HangingCreeprootsBlock(BlockBehaviour.Properties.copy(Blocks.HANGING_ROOTS))); + public static final RegistryObject MOLTING_VINES = BLOCKS.register("molting_vines", + () -> new MoltingVinesBlock(BlockBehaviour.Properties.copy(Blocks.WEEPING_VINES))); + public static final RegistryObject BILE_BLOCK = BLOCKS.register("bile", + () -> new BileLiquidBlock((FlowingFluid) AntarchyForgeMisc.BILE.get(), BlockBehaviour.Properties.copy(Blocks.WATER).lightLevel(state -> 5).noLootTable())); + public static final RegistryObject ICHOR_BLOCK = BLOCKS.register("ichor", + () -> new LiquidBlock((FlowingFluid) AntarchyForgeMisc.ICHOR.get(), BlockBehaviour.Properties.copy(Blocks.WATER).noLootTable())); + public static final RegistryObject ANTIWATER_BLOCK = BLOCKS.register("antiwater", + () -> new com.craisinlord.antarchy.content.fluid.AntiwaterLiquidBlock((FlowingFluid) AntarchyForgeMisc.ANTIWATER.get(), + BlockBehaviour.Properties.copy(Blocks.WATER).noLootTable())); + public static final RegistryObject LUMEN_BLOCK = BLOCKS.register("lumen", + () -> new LumenLiquidBlock((FlowingFluid) AntarchyForgeMisc.LUMEN.get(), + BlockBehaviour.Properties.copy(Blocks.WATER).lightLevel(state -> 9).noLootTable())); + public static final RegistryObject LUMEN_FROGLIGHT = BLOCKS.register("lumen_froglight", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.OCHRE_FROGLIGHT))); + public static final RegistryObject ROSEATE_FROGLIGHT = BLOCKS.register("roseate_froglight", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.OCHRE_FROGLIGHT))); + public static final RegistryObject RED_ANT_NEST = BLOCKS.register("red_ant_nest", + () -> new AntNestBlock( + AntarchyForgeEntites.RED_ANT, + AntarchyForgeItems::antNestBlockEntityType, + true, + BlockBehaviour.Properties.copy(Blocks.MAGMA_BLOCK).lightLevel(state -> 3).noLootTable() + )); + public static final RegistryObject BROWN_ANT_NEST = BLOCKS.register("brown_ant_nest", + () -> new AntNestBlock(AntarchyForgeEntites.BROWN_ANT, AntarchyForgeItems::antNestBlockEntityType, BlockBehaviour.Properties.copy(Blocks.DIRT).noLootTable())); + public static final RegistryObject RAINBOW_ANT_NEST = BLOCKS.register("rainbow_ant_nest", + () -> new AntNestBlock(AntarchyForgeEntites.RAINBOW_ANT, AntarchyForgeItems::antNestBlockEntityType, BlockBehaviour.Properties.copy(Blocks.DIRT).noLootTable())); + public static final RegistryObject TERMITE_NEST = BLOCKS.register("termite_nest", + () -> new AntNestBlock(AntarchyForgeEntites.TERMITE, AntarchyForgeItems::antNestBlockEntityType, BlockBehaviour.Properties.copy(Blocks.DIRT).noLootTable())); + public static final RegistryObject URANIUM_ORE = BLOCKS.register("uranium_ore", + () -> createOre(Blocks.EMERALD_ORE, 4, 8, MapColor.COLOR_YELLOW)); + public static final RegistryObject DEEPSLATE_URANIUM_ORE = BLOCKS.register("deepslate_uranium_ore", + () -> createOre(Blocks.DEEPSLATE_EMERALD_ORE, 4, 8, MapColor.COLOR_YELLOW)); + public static final RegistryObject TITANIUM_ORE = BLOCKS.register("titanium_ore", + () -> createOre(Blocks.DIAMOND_ORE, 4, 8, MapColor.COLOR_LIGHT_BLUE)); + public static final RegistryObject DEEPSLATE_TITANIUM_ORE = BLOCKS.register("deepslate_titanium_ore", + () -> createOre(Blocks.DEEPSLATE_DIAMOND_ORE, 4, 8, MapColor.COLOR_LIGHT_BLUE)); + public static final RegistryObject BLUESTONE_ORE = BLOCKS.register("bluestone_ore", + () -> new BluestoneOreBlock(BlockBehaviour.Properties.copy(Blocks.REDSTONE_ORE).mapColor(MapColor.COLOR_BLUE))); + public static final RegistryObject BLUESTONE_WIRE = BLOCKS.register("bluestone_wire", + () -> new BluestoneWireBlock(BlockBehaviour.Properties.copy(Blocks.REDSTONE_WIRE).mapColor(MapColor.COLOR_BLUE).noCollission().instabreak())); + public static final RegistryObject BLUESTONE_BLOCK = BLOCKS.register("bluestone_block", + () -> new BluestoneBlock(BlockBehaviour.Properties.copy(Blocks.REDSTONE_BLOCK).mapColor(MapColor.COLOR_BLUE))); + public static final RegistryObject BLUESTONE_REPEATER = BLOCKS.register("bluestone_repeater", + () -> new BluestoneRepeaterBlock(BlockBehaviour.Properties.copy(Blocks.REPEATER).mapColor(MapColor.COLOR_BLUE).noCollission())); + public static final RegistryObject BLUESTONE_COMPARATOR = BLOCKS.register("bluestone_comparator", + () -> new BluestoneComparatorBlock(BlockBehaviour.Properties.copy(Blocks.COMPARATOR).mapColor(MapColor.COLOR_BLUE).noCollission(), AntarchyForgeBlocks::bluestoneComparatorBlockEntityType)); + public static final RegistryObject BLUESTONE_TORCH = BLOCKS.register("bluestone_torch", + () -> new BluestoneTorchBlock(BlockBehaviour.Properties.copy(Blocks.REDSTONE_TORCH).mapColor(MapColor.COLOR_BLUE).lightLevel(state -> state.getValue(BluestoneTorchBlock.LIT) ? 7 : 0).noCollission().instabreak())); + public static final RegistryObject URANIUM_BLOCK = BLOCKS.register("uranium_block", + () -> createStorageBlock(Blocks.EMERALD_BLOCK, MapColor.COLOR_YELLOW)); + public static final RegistryObject TITANIUM_BLOCK = BLOCKS.register("titanium_block", + () -> createStorageBlock(Blocks.DIAMOND_BLOCK, MapColor.COLOR_LIGHT_BLUE)); + public static final RegistryObject RAW_URANIUM_BLOCK = BLOCKS.register("raw_uranium_block", + () -> createRawStorageBlock(Blocks.EMERALD_ORE, MapColor.COLOR_YELLOW)); + public static final RegistryObject RAW_TITANIUM_BLOCK = BLOCKS.register("raw_titanium_block", + () -> createRawStorageBlock(Blocks.DIAMOND_ORE, MapColor.COLOR_LIGHT_BLUE)); + public static final RegistryObject CUT_URANIUM = BLOCKS.register("cut_uranium", + () -> createHorizontalFacingStorageBlock(Blocks.CUT_COPPER, MapColor.COLOR_YELLOW)); + public static final RegistryObject CUT_TITANIUM = BLOCKS.register("cut_titanium", + () -> createHorizontalFacingStorageBlock(Blocks.CUT_COPPER, MapColor.COLOR_LIGHT_BLUE)); + public static final RegistryObject CUT_URANIUM_SLAB = BLOCKS.register("cut_uranium_slab", + () -> new SlabBlock(BlockBehaviour.Properties.copy(Blocks.CUT_COPPER_SLAB).mapColor(MapColor.COLOR_YELLOW))); + public static final RegistryObject CUT_TITANIUM_SLAB = BLOCKS.register("cut_titanium_slab", + () -> new SlabBlock(BlockBehaviour.Properties.copy(Blocks.CUT_COPPER_SLAB).mapColor(MapColor.COLOR_LIGHT_BLUE))); + public static final RegistryObject CUT_URANIUM_STAIRS = BLOCKS.register("cut_uranium_stairs", + () -> new StairBlock(CUT_URANIUM.get().defaultBlockState(), BlockBehaviour.Properties.copy(Blocks.CUT_COPPER_STAIRS).mapColor(MapColor.COLOR_YELLOW))); + public static final RegistryObject CUT_TITANIUM_STAIRS = BLOCKS.register("cut_titanium_stairs", + () -> new StairBlock(CUT_TITANIUM.get().defaultBlockState(), BlockBehaviour.Properties.copy(Blocks.CUT_COPPER_STAIRS).mapColor(MapColor.COLOR_LIGHT_BLUE))); + public static final RegistryObject CHISELED_URANIUM = BLOCKS.register("chiseled_uranium", + () -> createHorizontalFacingStorageBlock(Blocks.CHISELED_STONE_BRICKS, MapColor.COLOR_YELLOW)); + public static final RegistryObject CHISELED_TITANIUM = BLOCKS.register("chiseled_titanium", + () -> createHorizontalFacingStorageBlock(Blocks.CHISELED_STONE_BRICKS, MapColor.COLOR_LIGHT_BLUE)); + public static final RegistryObject URANIUM_BULB = BLOCKS.register("uranium_bulb", + () -> new SignalSavingBulbBlock(BlockBehaviour.Properties.copy(Blocks.REDSTONE_LAMP).mapColor(MapColor.COLOR_YELLOW))); + public static final RegistryObject TITANIUM_BULB = BLOCKS.register("titanium_bulb", + () -> new SignalSavingBulbBlock(BlockBehaviour.Properties.copy(Blocks.REDSTONE_LAMP).mapColor(MapColor.COLOR_LIGHT_BLUE))); + public static final RegistryObject URANIUM_DOOR = BLOCKS.register("uranium_door", + () -> new DoorBlock(BlockBehaviour.Properties.copy(Blocks.IRON_DOOR).mapColor(MapColor.COLOR_YELLOW), BlockSetType.IRON)); + public static final RegistryObject TITANIUM_DOOR = BLOCKS.register("titanium_door", + () -> new DoorBlock(BlockBehaviour.Properties.copy(Blocks.IRON_DOOR).mapColor(MapColor.COLOR_LIGHT_BLUE), BlockSetType.IRON)); + public static final RegistryObject URANIUM_TRAPDOOR = BLOCKS.register("uranium_trapdoor", + () -> new TrapDoorBlock(BlockBehaviour.Properties.copy(Blocks.IRON_TRAPDOOR).mapColor(MapColor.COLOR_YELLOW), BlockSetType.IRON)); + public static final RegistryObject TITANIUM_TRAPDOOR = BLOCKS.register("titanium_trapdoor", + () -> new TrapDoorBlock(BlockBehaviour.Properties.copy(Blocks.IRON_TRAPDOOR).mapColor(MapColor.COLOR_LIGHT_BLUE), BlockSetType.IRON)); + public static final RegistryObject URANIUM_BARS = BLOCKS.register("uranium_bars", + () -> new IronBarsBlock(BlockBehaviour.Properties.copy(Blocks.IRON_BARS).mapColor(MapColor.COLOR_YELLOW))); + public static final RegistryObject TITANIUM_BARS = BLOCKS.register("titanium_bars", + () -> new IronBarsBlock(BlockBehaviour.Properties.copy(Blocks.IRON_BARS).mapColor(MapColor.COLOR_LIGHT_BLUE))); + public static final RegistryObject ANTIMETAL = BLOCKS.register("antimetal", + () -> new RotatedPillarBlock(BlockBehaviour.Properties.copy(Blocks.BASALT))); + public static final RegistryObject POLISHED_ANTIMETAL = BLOCKS.register("polished_antimetal", + () -> new RotatedPillarBlock(BlockBehaviour.Properties.copy(Blocks.POLISHED_BASALT))); + public static final RegistryObject ANTIMETAL_SCAFFOLDING = BLOCKS.register("antimetal_scaffolding", + () -> new com.craisinlord.antarchy.content.block.AntimetalScaffoldingBlock(BlockBehaviour.Properties.copy(Blocks.SCAFFOLDING))); + public static final RegistryObject ANTIMETAL_RAIL = BLOCKS.register("antimetal_rail", + () -> new com.craisinlord.antarchy.content.block.AntimetalRailBlock(BlockBehaviour.Properties.copy(Blocks.RAIL))); + public static final RegistryObject ANTIMETAL_POWERED_RAIL = BLOCKS.register("antimetal_powered_rail", + () -> new com.craisinlord.antarchy.content.block.AntimetalPoweredRailBlock(BlockBehaviour.Properties.copy(Blocks.POWERED_RAIL))); + public static final RegistryObject ANTIMETAL_DETECTOR_RAIL = BLOCKS.register("antimetal_detector_rail", + () -> new com.craisinlord.antarchy.content.block.AntimetalDetectorRailBlock(BlockBehaviour.Properties.copy(Blocks.DETECTOR_RAIL))); + public static final RegistryObject ANTIMETAL_ACTIVATOR_RAIL = BLOCKS.register("antimetal_activator_rail", + () -> new com.craisinlord.antarchy.content.block.AntimetalActivatorRailBlock(BlockBehaviour.Properties.copy(Blocks.ACTIVATOR_RAIL))); + public static final RegistryObject CORNEA_STALK = BLOCKS.register("cornea_stalk", + () -> new CorneaStalkBlock(BlockBehaviour.Properties.copy(Blocks.SWEET_BERRY_BUSH).randomTicks())); + public static final RegistryObject GLOWCAP_MUSHROOM = BLOCKS.register("glowcap_mushroom", + () -> new com.craisinlord.antarchy.content.block.GlowcapMushroomBlock(BlockBehaviour.Properties.copy(Blocks.RED_MUSHROOM).lightLevel(state -> 12).randomTicks())); + public static final RegistryObject POTTED_GLOWCAP_MUSHROOM = BLOCKS.register("potted_glowcap_mushroom", + () -> new FlowerPotBlock(GLOWCAP_MUSHROOM.get(), BlockBehaviour.Properties.copy(Blocks.POTTED_DANDELION).lightLevel(state -> 12))); + public static final RegistryObject GLOWCAP_MUSHROOM_BLOCK = BLOCKS.register("glowcap_mushroom_block", + () -> new net.minecraft.world.level.block.HugeMushroomBlock(BlockBehaviour.Properties.copy(Blocks.RED_MUSHROOM_BLOCK).lightLevel(state -> 13))); + public static final RegistryObject CORN_CROP = BLOCKS.register("corn_crop", + () -> new CornCropBlock(BlockBehaviour.Properties.copy(Blocks.WHEAT).randomTicks().noCollission().noOcclusion())); + public static final RegistryObject WILD_CORN = BLOCKS.register("wild_corn", + () -> new WildCornBlock(BlockBehaviour.Properties.copy(Blocks.WHEAT).noCollission().noOcclusion())); + public static final RegistryObject FALLEN_KING_CROWN = BLOCKS.register("fallen_king_crown", + () -> new Block(BlockBehaviour.Properties.of() + .strength(0.2F) + .sound(SoundType.METAL) + .noOcclusion() + .isSuffocating((state, level, pos) -> false) + .isViewBlocking((state, level, pos) -> false))); + public static final RegistryObject SMALL_BLOOD_CRYSTAL_BUD = BLOCKS.register("small_blood_crystal_bud", + () -> new AmethystClusterBlock(3, 4, BlockBehaviour.Properties.copy(Blocks.SMALL_AMETHYST_BUD))); + public static final RegistryObject MEDIUM_BLOOD_CRYSTAL_BUD = BLOCKS.register("medium_blood_crystal_bud", + () -> new AmethystClusterBlock(4, 3, BlockBehaviour.Properties.copy(Blocks.MEDIUM_AMETHYST_BUD))); + public static final RegistryObject LARGE_BLOOD_CRYSTAL_BUD = BLOCKS.register("large_blood_crystal_bud", + () -> new AmethystClusterBlock(5, 3, BlockBehaviour.Properties.copy(Blocks.LARGE_AMETHYST_BUD))); + public static final RegistryObject BUDDING_BLOOD_CRYSTAL = BLOCKS.register("budding_blood_crystal", + () -> new BuddingBloodCrystalBlock( + BlockBehaviour.Properties.copy(Blocks.BUDDING_AMETHYST), + AntarchyForgeBlocks::smallBloodCrystalBudBlock, + AntarchyForgeBlocks::mediumBloodCrystalBudBlock, + AntarchyForgeBlocks::largeBloodCrystalBudBlock, + AntarchyForgeBlocks::bloodCrystalCrystalBlock + )); + public static final RegistryObject BLOOD_CRYSTAL = BLOCKS.register("blood_crystal_block", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.AMETHYST_BLOCK))); + public static final RegistryObject BLOOD_CRYSTAL_CRYSTAL = BLOCKS.register("blood_crystal_cluster", + () -> new AmethystClusterBlock(7, 3, BlockBehaviour.Properties.copy(Blocks.AMETHYST_CLUSTER))); + public static final RegistryObject DREAM_SAND = BLOCKS.register("dream_sand", + () -> new DreamSandBlock(BlockBehaviour.Properties.copy(Blocks.SAND))); + public static final RegistryObject DREAM_SANDSTONE = BLOCKS.register("dream_sandstone", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.SANDSTONE))); + public static final RegistryObject CHISELED_DREAM_SANDSTONE = BLOCKS.register("chiseled_dream_sandstone", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.CHISELED_SANDSTONE))); + public static final RegistryObject CUT_DREAM_SANDSTONE = BLOCKS.register("cut_dream_sandstone", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.CUT_SANDSTONE))); + public static final RegistryObject SMOOTH_DREAM_SANDSTONE = BLOCKS.register("smooth_dream_sandstone", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.SMOOTH_SANDSTONE))); + public static final RegistryObject DREAM_SANDSTONE_STAIRS = BLOCKS.register("dream_sandstone_stairs", + () -> new StairBlock(DREAM_SANDSTONE.get().defaultBlockState(), BlockBehaviour.Properties.copy(Blocks.SANDSTONE_STAIRS))); + public static final RegistryObject DREAM_SANDSTONE_SLAB = BLOCKS.register("dream_sandstone_slab", + () -> new SlabBlock(BlockBehaviour.Properties.copy(Blocks.SANDSTONE_SLAB))); + public static final RegistryObject DREAM_SANDSTONE_WALL = BLOCKS.register("dream_sandstone_wall", + () -> new WallBlock(BlockBehaviour.Properties.copy(Blocks.SANDSTONE_WALL))); + public static final RegistryObject SMOOTH_DREAM_SANDSTONE_STAIRS = BLOCKS.register("smooth_dream_sandstone_stairs", + () -> new StairBlock(SMOOTH_DREAM_SANDSTONE.get().defaultBlockState(), BlockBehaviour.Properties.copy(Blocks.SMOOTH_SANDSTONE_STAIRS))); + public static final RegistryObject SMOOTH_DREAM_SANDSTONE_SLAB = BLOCKS.register("smooth_dream_sandstone_slab", + () -> new SlabBlock(BlockBehaviour.Properties.copy(Blocks.SMOOTH_SANDSTONE_SLAB))); + public static final RegistryObject CUT_DREAM_SANDSTONE_SLAB = BLOCKS.register("cut_dream_sandstone_slab", + () -> new SlabBlock(BlockBehaviour.Properties.copy(Blocks.CUT_SANDSTONE_SLAB))); + public static final RegistryObject DEAD_STAR_CORAL_BLOCK = BLOCKS.register("dead_star_coral_block", + () -> new Block(BlockBehaviour.Properties.copy(Blocks.TUBE_CORAL_BLOCK))); + public static final RegistryObject DEAD_STAR_CORAL = BLOCKS.register("dead_star_coral", + () -> new net.minecraft.world.level.block.BaseCoralPlantBlock(BlockBehaviour.Properties.copy(Blocks.TUBE_CORAL))); + public static final RegistryObject DEAD_STAR_CORAL_FAN = BLOCKS.register("dead_star_coral_fan", + () -> new net.minecraft.world.level.block.BaseCoralFanBlock(BlockBehaviour.Properties.copy(Blocks.TUBE_CORAL_FAN))); + public static final RegistryObject DEAD_STAR_CORAL_WALL_FAN = BLOCKS.register("dead_star_coral_wall_fan", + () -> new net.minecraft.world.level.block.BaseCoralWallFanBlock(BlockBehaviour.Properties.copy(Blocks.TUBE_CORAL_WALL_FAN))); + public static final RegistryObject STAR_CORAL_BLOCK = BLOCKS.register("star_coral_block", + () -> new com.craisinlord.antarchy.content.block.StarCoralBlock(DEAD_STAR_CORAL_BLOCK.get(), BlockBehaviour.Properties.copy(Blocks.TUBE_CORAL_BLOCK).lightLevel(state -> 8))); + public static final RegistryObject STAR_CORAL = BLOCKS.register("star_coral", + () -> new com.craisinlord.antarchy.content.block.StarCoralPlantBlock(DEAD_STAR_CORAL.get(), BlockBehaviour.Properties.copy(Blocks.TUBE_CORAL).lightLevel(state -> 8))); + public static final RegistryObject STAR_CORAL_FAN = BLOCKS.register("star_coral_fan", + () -> new com.craisinlord.antarchy.content.block.StarCoralFanBlock(DEAD_STAR_CORAL_FAN.get(), BlockBehaviour.Properties.copy(Blocks.TUBE_CORAL_FAN).lightLevel(state -> 8))); + public static final RegistryObject STAR_CORAL_WALL_FAN = BLOCKS.register("star_coral_wall_fan", + () -> new com.craisinlord.antarchy.content.block.StarCoralWallFanBlock(DEAD_STAR_CORAL_WALL_FAN.get(), BlockBehaviour.Properties.copy(Blocks.TUBE_CORAL_WALL_FAN).lightLevel(state -> 8))); + + // Block entity types + public static final RegistryObject> ANT_NEST_BLOCK_ENTITY = BLOCK_ENTITY_TYPES.register("ant_nest", + () -> BlockEntityType.Builder.of( + AntNestBlockEntity::new, + RED_ANT_NEST.get(), + BROWN_ANT_NEST.get(), + RAINBOW_ANT_NEST.get(), + TERMITE_NEST.get() + ).build(null)); + public static final RegistryObject> DREAM_CAMPFIRE_BLOCK_ENTITY = BLOCK_ENTITY_TYPES.register("dream_campfire", + () -> BlockEntityType.Builder.of( + DreamCampfireBlockEntity::new, + DREAM_CAMPFIRE.get() + ).build(null)); + public static final RegistryObject> WASP_NEST_BLOCK_ENTITY = BLOCK_ENTITY_TYPES.register("wasp_nest", + () -> BlockEntityType.Builder.of( + WaspNestBlockEntity::new, + WASP_NEST.get() + ).build(null)); + public static final RegistryObject> HUSHWEED_BLOCK_ENTITY = BLOCK_ENTITY_TYPES.register("hushweed", + () -> BlockEntityType.Builder.of( + HushweedBlockEntity::new, + HUSHWEED.get() + ).build(null)); + public static final RegistryObject> POTENT_NYXITE_BLOCK_ENTITY = BLOCK_ENTITY_TYPES.register("potent_nyxite", + () -> BlockEntityType.Builder.of( + (pos, state) -> new PotentNyxiteBlockEntity(pos, state, AntarchyForgeItems::potentNyxiteBlockEntityType), + POTENT_NYXITE.get() + ).build(null)); + public static final RegistryObject> SEASHELL_BLOCK_ENTITY = BLOCK_ENTITY_TYPES.register("seashell", + () -> BlockEntityType.Builder.of( + SeashellBlockEntity::new, + SEASHELL.get() + ).build(null)); + public static final RegistryObject> CRITTER_CAGE_BLOCK_ENTITY = BLOCK_ENTITY_TYPES.register("critter_cage_block", + () -> BlockEntityType.Builder.of( + CritterCageBlockEntity::new, + CRITTER_CAGE_BLOCK.get() + ).build(null)); + public static final RegistryObject> BLUESTONE_COMPARATOR_BLOCK_ENTITY = BLOCK_ENTITY_TYPES.register("bluestone_comparator", + () -> BlockEntityType.Builder.of( + (pos, state) -> new com.craisinlord.antarchy.content.block.entity.BluestoneComparatorBlockEntity(pos, state, AntarchyForgeBlocks::bluestoneComparatorBlockEntityType), + BLUESTONE_COMPARATOR.get() + ).build(null)); + + private AntarchyForgeBlocks() {} + + public static void register(IEventBus modEventBus) { + BLOCKS.register(modEventBus); + BLOCK_ENTITY_TYPES.register(modEventBus); + } + + static BlockBehaviour.Properties nyxiteProperties() { + return BlockBehaviour.Properties.copy(Blocks.NETHERRACK); + } + + static BlockBehaviour.Properties broodstoneProperties() { + return BlockBehaviour.Properties.copy(Blocks.DEEPSLATE).requiresCorrectToolForDrops(); + } + + private static BlockBehaviour.Properties portalProperties() { + return BlockBehaviour.Properties.of() + .strength(-1.0F) + .noCollission() + .noOcclusion() + .lightLevel(state -> 11) + .noLootTable() + .isSuffocating((state, level, pos) -> false) + .isViewBlocking((state, level, pos) -> false); + } + + private static Block createOre(Block copyFrom, int minExperience, int maxExperience, MapColor mapColor) { + return new DropExperienceBlock(BlockBehaviour.Properties.copy(copyFrom).mapColor(mapColor).requiresCorrectToolForDrops(), UniformInt.of(minExperience, maxExperience)); + } + + static Block createStorageBlock(Block copyFrom, MapColor mapColor) { + return new Block(BlockBehaviour.Properties.copy(copyFrom).mapColor(mapColor).requiresCorrectToolForDrops()); + } + + static Block createHorizontalFacingStorageBlock(Block copyFrom, MapColor mapColor) { + return new SimpleHorizontalFacingBlock(BlockBehaviour.Properties.copy(copyFrom).mapColor(mapColor).requiresCorrectToolForDrops()); + } + + static Block createRawStorageBlock(Block copyFrom, MapColor mapColor) { + return new Block(BlockBehaviour.Properties.copy(copyFrom).mapColor(mapColor).requiresCorrectToolForDrops()); + } + + private static Block smallBloodCrystalBudBlock() { + return SMALL_BLOOD_CRYSTAL_BUD.get(); + } + + private static Block mediumBloodCrystalBudBlock() { + return MEDIUM_BLOOD_CRYSTAL_BUD.get(); + } + + private static Block largeBloodCrystalBudBlock() { + return LARGE_BLOOD_CRYSTAL_BUD.get(); + } + + private static Block bloodCrystalCrystalBlock() { + return BLOOD_CRYSTAL_CRYSTAL.get(); + } + + private static BlockEntityType bluestoneComparatorBlockEntityType() { + return BLUESTONE_COMPARATOR_BLOCK_ENTITY.get(); + } + + + private static final class SimpleHorizontalFacingBlock extends HorizontalDirectionalBlock { + private SimpleHorizontalFacingBlock(BlockBehaviour.Properties properties) { + super(properties); + registerDefaultState(stateDefinition.any().setValue(FACING, Direction.NORTH)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING); + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext context) { + return defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()); + } + + @Override + public BlockState rotate(BlockState state, Rotation rotation) { + return state.setValue(FACING, rotation.rotate(state.getValue(FACING))); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return state.rotate(mirror.getRotation(state.getValue(FACING))); + } + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeCreativeModeTabs.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeCreativeModeTabs.java new file mode 100644 index 00000000..63482d2b --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeCreativeModeTabs.java @@ -0,0 +1,61 @@ +package com.craisinlord.antarchy.forge.registry; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.creative.CreativeTabContents; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.item.*; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; +import net.minecraftforge.registries.RegistryObject; + +public class AntarchyForgeCreativeModeTabs { + private AntarchyForgeCreativeModeTabs() {} + + private static final DeferredRegister CREATIVE_MODE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, Antarchy.MODID); + + public static void register(IEventBus modEventBus) { + CREATIVE_MODE_TABS.register(modEventBus); + modEventBus.addListener(AntarchyForgeCreativeModeTabs::buildCreativeTabs); + } + + public static final RegistryObject ANTARCHY_TAB = CREATIVE_MODE_TABS.register("antarchy", + () -> CreativeModeTab.builder() + .title(net.minecraft.network.chat.Component.translatable("itemGroup.antarchy.antarchy")) + .icon(() -> new ItemStack(AntarchyForgeItems.BIG_BERTHA.get())) + .displayItems((parameters, output) -> {}) + .build()); + + static void buildCreativeTabs(BuildCreativeModeTabContentsEvent event) { + if (event.getTabKey() == ANTARCHY_TAB.getKey()) { + CreativeTabContents.populateAntarchyTab(new CreativeTabContents.AntarchyTabOutput() { + @Override + public void accept(net.minecraft.world.level.ItemLike item) { + event.accept(item); + } + + @Override + public void accept(ItemStack stack) { + event.accept(stack); + } + }); + return; + } + CreativeTabContents.populateNeoForgeVanillaTab(event.getTabKey(), event.getParameters().holders(), + new CreativeTabContents.NeoForgeVanillaTabOutput() { + @Override + public void accept(net.minecraft.world.level.ItemLike item) { + event.accept(item); + } + + @Override + public void accept(ItemStack stack) { + event.accept(stack); + } + + @Override + public void insertAfter(net.minecraft.world.level.ItemLike anchor, net.minecraft.world.level.ItemLike item) { + event.getEntries().putAfter(new ItemStack(anchor), new ItemStack(item), CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); + } + }); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeEntites.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeEntites.java new file mode 100644 index 00000000..ff542140 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeEntites.java @@ -0,0 +1,416 @@ +package com.craisinlord.antarchy.forge.registry; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.entity.AppleCowEntityVariants.AppleCow; +import com.craisinlord.antarchy.content.entity.AppleCowEntityVariants.EnchantedGoldenAppleCow; +import com.craisinlord.antarchy.content.entity.AppleCowEntityVariants.GoldenAppleCow; +import com.craisinlord.antarchy.content.entity.cloud_shark.CloudSharkEntity; +import com.craisinlord.antarchy.content.entity.BedBugEntity; +import com.craisinlord.antarchy.content.entity.BomberEntity; +import com.craisinlord.antarchy.content.entity.ButterflyEntity; +import com.craisinlord.antarchy.content.entity.CaterpillarEntity; +import com.craisinlord.antarchy.content.entity.DiamondMinecartEntity; +import com.craisinlord.antarchy.content.entity.DrTrayaurusEntity; +import com.craisinlord.antarchy.content.entity.EasterBunnyEntity; +import com.craisinlord.antarchy.content.entity.EmperorScorpionEntity; +import com.craisinlord.antarchy.content.entity.ElkaEntity; +import com.craisinlord.antarchy.content.entity.OuranwoodDeerEntity; +import com.craisinlord.antarchy.content.entity.glimmer.GlimmerEntity; +import com.craisinlord.antarchy.content.entity.HushProjectileEntity; +import com.craisinlord.antarchy.content.entity.CritterCageProjectileEntity; +import com.craisinlord.antarchy.content.entity.HerculesBeetleEntity; +import com.craisinlord.antarchy.content.entity.JerryEntity; +import com.craisinlord.antarchy.content.entity.JumpyBugEntity; +import com.craisinlord.antarchy.content.entity.AlphaMantisEntity; +import com.craisinlord.antarchy.content.entity.RollyPollyEntity; +import com.craisinlord.antarchy.content.entity.MantisEntity; +import com.craisinlord.antarchy.content.entity.MissileSquidEntity; +import com.craisinlord.antarchy.content.entity.OctopusBombEntity; +import com.craisinlord.antarchy.content.entity.MolevoreEntity; +import com.craisinlord.antarchy.content.entity.MolewormEntity; +import com.craisinlord.antarchy.content.entity.OuranwoodBoatEntity; +import com.craisinlord.antarchy.content.entity.OuranwoodChestBoatEntity; +import com.craisinlord.antarchy.content.entity.PeachBoatEntity; +import com.craisinlord.antarchy.content.entity.PeachChestBoatEntity; +import com.craisinlord.antarchy.content.entity.ReverieEntity; +import com.craisinlord.antarchy.content.entity.ScorpionEntity; +import com.craisinlord.antarchy.content.entity.SizeRayProjectileEntity; +import com.craisinlord.antarchy.content.entity.SpitBugEntity; +import com.craisinlord.antarchy.content.entity.SpitBugProjectileEntity; +import com.craisinlord.antarchy.content.entity.StinkBugEntity; +import com.craisinlord.antarchy.content.entity.TriffidEntity; +import com.craisinlord.antarchy.content.entity.UpwardFallingBlockEntity; +import com.craisinlord.antarchy.content.entity.WaspEntity; +import com.craisinlord.antarchy.content.entity.ant.BaseAntEntity; +import com.craisinlord.antarchy.content.entity.ant.BrownAntEntity; +import com.craisinlord.antarchy.content.entity.ant.RainbowAntEntity; +import com.craisinlord.antarchy.content.entity.ant.RedAntEntity; +import com.craisinlord.antarchy.content.entity.ant.TermiteEntity; +import com.craisinlord.antarchy.content.entity.basilisk.BasiliskEntity; +import com.craisinlord.antarchy.content.entity.brutalfly.BrutalflyEntity; +import com.craisinlord.antarchy.content.entity.brutalfly.BrutalflyOrbEntity; +import com.craisinlord.antarchy.content.entity.flying_squirrel.FlyingSquirrelEntity; +import com.craisinlord.antarchy.content.entity.kraken.KrakenEntity; +import com.craisinlord.antarchy.content.entity.kraken.KrakensGraspThrownTrident; +import com.craisinlord.antarchy.content.entity.kraken.TentacleEntity; +import com.craisinlord.antarchy.content.entity.lucid.LucidBoltEntity; +import com.craisinlord.antarchy.content.entity.lucid.LucidEntity; +import com.craisinlord.antarchy.content.entity.lucid.LucidEyeProjectileEntity; +import com.craisinlord.antarchy.content.entity.nightmare.NightmareEntity; +import com.craisinlord.antarchy.content.entity.CheepEntity; +import com.craisinlord.antarchy.content.entity.CreepingHorrorEntity; +import com.craisinlord.antarchy.content.entity.DorrieEntity; +import com.craisinlord.antarchy.content.entity.LurkingTerrorEntity; +import com.craisinlord.antarchy.content.entity.ToreterrorEntity; +import com.craisinlord.antarchy.content.entity.WaterBombEntity; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.entity.animal.Cow; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.registries.RegistryObject; +import net.minecraftforge.fml.ModList; + +public final class AntarchyForgeEntites { + private static final DeferredRegister> ENTITY_TYPES = DeferredRegister.create(Registries.ENTITY_TYPE, Antarchy.MODID); + + public static final boolean CREATE_LOADED = isModLoaded("create"); + + private static boolean isModLoaded(String modId) { + try { + return ModList.get().isLoaded(modId); + } catch (Throwable ignored) { + return false; + } + } + + public static final RegistryObject> RED_ANT = ENTITY_TYPES.register("red_ant", + () -> buildAntType(RedAntEntity::new, MobCategory.CREATURE, "red_ant")); + public static final RegistryObject> BROWN_ANT = ENTITY_TYPES.register("brown_ant", + () -> buildAntType(BrownAntEntity::new, MobCategory.CREATURE, "brown_ant")); + public static final RegistryObject> RAINBOW_ANT = ENTITY_TYPES.register("rainbow_ant", + () -> buildAntType(RainbowAntEntity::new, MobCategory.CREATURE, "rainbow_ant")); + public static final RegistryObject> TERMITE = ENTITY_TYPES.register("termite", + () -> buildAntType(TermiteEntity::new, MobCategory.CREATURE, "termite")); + public static final RegistryObject> MOLEWORM = ENTITY_TYPES.register("moleworm", + () -> EntityType.Builder.of(MolewormEntity::new, MobCategory.MONSTER) + .sized(0.4F, 0.3F) + .clientTrackingRange(8) + .build("moleworm")); + public static final RegistryObject> MANTIS = ENTITY_TYPES.register("mantis", + () -> EntityType.Builder.of(MantisEntity::new, MobCategory.MONSTER) + .sized(3.125F, 2.5F) + .clientTrackingRange(8) + .build("mantis")); + public static final RegistryObject> ALPHA_MANTIS = ENTITY_TYPES.register("alpha_mantis", + () -> EntityType.Builder.of(AlphaMantisEntity::new, MobCategory.MONSTER) + .sized(4.25F, 3.35F) + .clientTrackingRange(10) + .build("alpha_mantis")); + public static final RegistryObject> ROLLY_POLLY = ENTITY_TYPES.register("rolly_polly", + () -> EntityType.Builder.of(RollyPollyEntity::new, MobCategory.CREATURE) + .sized(0.95F, 0.85F) + .clientTrackingRange(10) + .build("rolly_polly")); + public static final RegistryObject> OURANWOOD_BOAT_ENTITY = ENTITY_TYPES.register("ouranwood_boat", + () -> EntityType.Builder.of(OuranwoodBoatEntity::new, MobCategory.MISC) + .sized(1.375F, 0.5625F) + .clientTrackingRange(10) + .updateInterval(10) + .build("ouranwood_boat")); + public static final RegistryObject> OURANWOOD_CHEST_BOAT_ENTITY = ENTITY_TYPES.register("ouranwood_chest_boat", + () -> EntityType.Builder.of(OuranwoodChestBoatEntity::new, MobCategory.MISC) + .sized(1.375F, 0.5625F) + .clientTrackingRange(10) + .updateInterval(10) + .build("ouranwood_chest_boat")); + public static final RegistryObject> PEACH_BOAT_ENTITY = ENTITY_TYPES.register("peach_boat", + () -> EntityType.Builder.of(PeachBoatEntity::new, MobCategory.MISC) + .sized(1.375F, 0.5625F) + .clientTrackingRange(10) + .updateInterval(10) + .build("peach_boat")); + public static final RegistryObject> PEACH_CHEST_BOAT_ENTITY = ENTITY_TYPES.register("peach_chest_boat", + () -> EntityType.Builder.of(PeachChestBoatEntity::new, MobCategory.MISC) + .sized(1.375F, 0.5625F) + .clientTrackingRange(10) + .updateInterval(10) + .build("peach_chest_boat")); + public static final RegistryObject> MOLEVORE = ENTITY_TYPES.register("molevore", + () -> EntityType.Builder.of(MolevoreEntity::new, MobCategory.MONSTER) + .sized(1.95F, 1.1F) + .clientTrackingRange(10) + .build("molevore")); + public static final RegistryObject> TRIFFID = ENTITY_TYPES.register("triffid", + () -> EntityType.Builder.of(TriffidEntity::new, MobCategory.MONSTER) + .sized(2.0F, 5.0F) + .clientTrackingRange(10) + .build("triffid")); + public static final RegistryObject> BED_BUG = ENTITY_TYPES.register("bed_bug", + () -> EntityType.Builder.of(BedBugEntity::new, MobCategory.CREATURE) + .sized(1.15F, 0.8F) + .clientTrackingRange(8) + .build("bed_bug")); + public static final RegistryObject> STINK_BUG = ENTITY_TYPES.register("stink_bug", + () -> EntityType.Builder.of(StinkBugEntity::new, MobCategory.CREATURE) + .sized(0.35F, 0.2F) + .clientTrackingRange(8) + .build("stink_bug")); + public static final RegistryObject> WASP = ENTITY_TYPES.register("wasp", + () -> EntityType.Builder.of(WaspEntity::new, MobCategory.MONSTER) + .sized(0.8625F, 1.365F) + .clientTrackingRange(8) + .build("wasp")); + public static final RegistryObject> BOMBER = ENTITY_TYPES.register("bomber", + () -> EntityType.Builder.of(BomberEntity::new, MobCategory.MONSTER) + .sized(0.55F, 0.75F) + .clientTrackingRange(8) + .build("bomber")); + public static final RegistryObject> JUMPY_BUG = ENTITY_TYPES.register("jumpy_bug", + () -> EntityType.Builder.of(JumpyBugEntity::new, MobCategory.MONSTER) + .sized(3.0F, 6.0F) + .clientTrackingRange(8) + .build("jumpy_bug")); + public static final RegistryObject> SPIT_BUG = ENTITY_TYPES.register("spit_bug", + () -> EntityType.Builder.of(SpitBugEntity::new, MobCategory.MONSTER) + .sized(2.5F, 3.0F) + .clientTrackingRange(10) + .build("spit_bug")); + public static final RegistryObject> SPIT_BUG_PROJECTILE = ENTITY_TYPES.register("spit_bug_projectile", + () -> EntityType.Builder.of(SpitBugProjectileEntity::new, MobCategory.MISC) + .sized(0.5F, 0.5F) + .clientTrackingRange(8) + .updateInterval(1) + .build("spit_bug_projectile")); + public static final RegistryObject> SHRINK_RAY_PROJECTILE = ENTITY_TYPES.register("shrink_ray_projectile", + () -> EntityType.Builder.of(SizeRayProjectileEntity::createShrink, MobCategory.MISC) + .sized(0.5F, 0.5F) + .clientTrackingRange(8) + .updateInterval(1) + .build("shrink_ray_projectile")); + public static final RegistryObject> GROWTH_RAY_PROJECTILE = ENTITY_TYPES.register("growth_ray_projectile", + () -> EntityType.Builder.of(SizeRayProjectileEntity::createGrowth, MobCategory.MISC) + .sized(0.5F, 0.5F) + .clientTrackingRange(8) + .updateInterval(1) + .build("growth_ray_projectile")); + public static final RegistryObject> DIAMOND_MINECART = ENTITY_TYPES.register("diamond_minecart", + () -> EntityType.Builder.of((entityType, level) -> new DiamondMinecartEntity(entityType, level, AntarchyForgeItems.diamondMinecartItem()), MobCategory.MISC) + .sized(0.98F, 0.7F) + .clientTrackingRange(8) + .build("diamond_minecart")); + public static final RegistryObject> EASTER_BUNNY = ENTITY_TYPES.register("easter_bunny", + () -> EntityType.Builder.of(EasterBunnyEntity::new, MobCategory.CREATURE) + .sized(0.5F, 1.0F) + .clientTrackingRange(8) + .build("easter_bunny")); + public static final RegistryObject> FLYING_SQUIRREL = ENTITY_TYPES.register("flying_squirrel", + () -> EntityType.Builder.of(FlyingSquirrelEntity::new, MobCategory.CREATURE) + .sized(0.6F, 0.7F) + .clientTrackingRange(8) + .build("flying_squirrel")); + public static final RegistryObject> CATERPILLAR = ENTITY_TYPES.register("caterpillar", + () -> EntityType.Builder.of(CaterpillarEntity::new, MobCategory.CREATURE) + .sized(0.8775F, 0.585F) + .clientTrackingRange(8) + .build("caterpillar")); + public static final RegistryObject> BUTTERFLY = ENTITY_TYPES.register("butterfly", + () -> EntityType.Builder.of(ButterflyEntity::new, MobCategory.AMBIENT) + .sized(1.125F, 0.6875F) + .clientTrackingRange(8) + .build("butterfly")); + public static final RegistryObject> REVERIE = ENTITY_TYPES.register("reverie", + () -> EntityType.Builder.of(ReverieEntity::new, MobCategory.AMBIENT) + .sized(0.7F, 0.7F) + .clientTrackingRange(8) + .build("reverie")); + public static final RegistryObject> BRUTALFLY = ENTITY_TYPES.register("brutalfly", + () -> EntityType.Builder.of(BrutalflyEntity::new, MobCategory.MONSTER) + .sized(2.4F, 2.1F) + .clientTrackingRange(12) + .build("brutalfly")); + public static final RegistryObject> APPLE_COW = ENTITY_TYPES.register("apple_cow", + () -> buildCowType(AppleCow::new, "apple_cow")); + public static final RegistryObject> GOLDEN_APPLE_COW = ENTITY_TYPES.register("golden_apple_cow", + () -> buildCowType(GoldenAppleCow::new, "golden_apple_cow")); + public static final RegistryObject> ENCHANTED_GOLDEN_APPLE_COW = ENTITY_TYPES.register("enchanted_golden_apple_cow", + () -> buildCowType(EnchantedGoldenAppleCow::new, "enchanted_golden_apple_cow")); + public static final RegistryObject> DR_TRAYAURUS = ENTITY_TYPES.register("dr_trayaurus", + () -> EntityType.Builder.of(DrTrayaurusEntity::new, MobCategory.MISC) + .sized(0.6F, 1.95F) + .clientTrackingRange(10) + .build("dr_trayaurus")); + public static final RegistryObject> CLOUD_SHARK = ENTITY_TYPES.register("cloud_shark", + () -> EntityType.Builder.of(CloudSharkEntity::new, MobCategory.MONSTER) + .sized(2.4F, 0.9F) + .clientTrackingRange(10) + .build("cloud_shark")); + public static final RegistryObject> KRAKEN = ENTITY_TYPES.register("kraken", + () -> EntityType.Builder.of(KrakenEntity::new, MobCategory.MONSTER) + .sized(11.4F, 39.0F) + .clientTrackingRange(12) + .build("kraken")); + public static final RegistryObject> MISSILE_SQUID = ENTITY_TYPES.register("missile_squid", + () -> EntityType.Builder.of(MissileSquidEntity::new, MobCategory.MONSTER) + .sized(1.62F, 3.18F) + .clientTrackingRange(10) + .build("missile_squid")); + public static final RegistryObject> OCTOPUS_BOMB = ENTITY_TYPES.register("octopus_bomb", + () -> EntityType.Builder.of(OctopusBombEntity::new, MobCategory.WATER_CREATURE) + .sized(2.4F, 2.9F) + .clientTrackingRange(10) + .build("octopus_bomb")); + public static final RegistryObject> NIGHTMARE = ENTITY_TYPES.register("nightmare", + () -> EntityType.Builder.of(NightmareEntity::new, MobCategory.MONSTER) + .sized(3.2F, 3.8F) + .clientTrackingRange(12) + .build("nightmare")); + public static final RegistryObject> LUCID = ENTITY_TYPES.register("lucid", + () -> EntityType.Builder.of(LucidEntity::new, MobCategory.MONSTER) + .sized(2.0F, 2.0F) + .clientTrackingRange(10) + .build("lucid")); + public static final RegistryObject> LUCID_BOLT = ENTITY_TYPES.register("lucid_bolt", + () -> EntityType.Builder.of(LucidBoltEntity::new, MobCategory.MISC) + .sized(0.3F, 0.3F) + .clientTrackingRange(8) + .updateInterval(1) + .build("lucid_bolt")); + + public static final RegistryObject> KRAKENS_GRASP_TRIDENT = ENTITY_TYPES.register("krakens_grasp_trident", + () -> EntityType.Builder.of(KrakensGraspThrownTrident::new, MobCategory.MISC) + .sized(0.5F, 0.5F) + .clientTrackingRange(8) + .updateInterval(1) + .fireImmune() + .build("krakens_grasp_trident")); + + public static final RegistryObject> TENTACLE = ENTITY_TYPES.register("tentacle", + () -> EntityType.Builder.of(TentacleEntity::new, MobCategory.MISC) + .sized(1.2F, 4.5F) + .clientTrackingRange(10) + .build("tentacle")); + + public static final RegistryObject> SCORPION = ENTITY_TYPES.register("scorpion", + () -> EntityType.Builder.of(ScorpionEntity::new, MobCategory.MONSTER) + .sized(1.5F, 1.0F) + .clientTrackingRange(8) + .build("scorpion")); + public static final RegistryObject> BASILISK = ENTITY_TYPES.register("basilisk", + () -> EntityType.Builder.of(BasiliskEntity::new, MobCategory.MONSTER) + .sized(3.0F, 3.5F) + .clientTrackingRange(14) + .build("basilisk")); + public static final RegistryObject> EMPEROR_SCORPION = ENTITY_TYPES.register("emperor_scorpion", + () -> EntityType.Builder.of(EmperorScorpionEntity::new, MobCategory.MONSTER) + .sized(6.0F, 3.0F) + .clientTrackingRange(12) + .build("emperor_scorpion")); + public static final RegistryObject> LUCID_PEARL_PROJECTILE = ENTITY_TYPES.register("lucid_pearl_projectile", + () -> EntityType.Builder.of(LucidEyeProjectileEntity::new, MobCategory.MISC) + .sized(0.25F, 0.25F) + .clientTrackingRange(8) + .updateInterval(1) + .build("lucid_pearl_projectile")); + public static final RegistryObject> CRITTER_CAGE_PROJECTILE = ENTITY_TYPES.register("critter_cage_projectile", + () -> EntityType.Builder.of(CritterCageProjectileEntity::new, MobCategory.MISC) + .sized(0.25F, 0.25F) + .clientTrackingRange(8) + .updateInterval(1) + .build("critter_cage_projectile")); + public static final RegistryObject> HUSH_PROJECTILE = ENTITY_TYPES.register("hush_projectile", + () -> EntityType.Builder.of(HushProjectileEntity::new, MobCategory.MISC) + .sized(0.35F, 0.35F) + .clientTrackingRange(8) + .updateInterval(1) + .build("hush_projectile")); + public static final RegistryObject> BRUTALFLY_ORB = ENTITY_TYPES.register("brutalfly_orb", + () -> EntityType.Builder.of(BrutalflyOrbEntity::new, MobCategory.MISC) + .sized(0.75F, 0.75F) + .clientTrackingRange(10) + .updateInterval(1) + .build("brutalfly_orb")); + public static final RegistryObject> TORETERROR = ENTITY_TYPES.register("toreterror", + () -> EntityType.Builder.of(ToreterrorEntity::new, MobCategory.MONSTER) + .sized(2.0F, 3.0F) + .clientTrackingRange(14) + .build("toreterror")); + public static final RegistryObject> WATER_BOMB = ENTITY_TYPES.register("water_bomb", + () -> EntityType.Builder.of(WaterBombEntity::new, MobCategory.MISC) + .sized(0.4F, 0.4F) + .clientTrackingRange(8) + .updateInterval(1) + .build("water_bomb")); + public static final RegistryObject> CREEPING_HORROR = ENTITY_TYPES.register("creeping_horror", + () -> EntityType.Builder.of(CreepingHorrorEntity::new, MobCategory.MONSTER) + .sized(1.3F, 1.5F) + .clientTrackingRange(10) + .build("creeping_horror")); + public static final RegistryObject> LURKING_TERROR = ENTITY_TYPES.register("lurking_terror", + () -> EntityType.Builder.of(LurkingTerrorEntity::new, MobCategory.MONSTER) + .sized(1.3F, 1.5F) + .clientTrackingRange(10) + .build("lurking_terror")); + public static final RegistryObject> JERRY = ENTITY_TYPES.register("jerry", + () -> EntityType.Builder.of(JerryEntity::new, MobCategory.MONSTER) + .sized(1.4F, 1.4F) + .clientTrackingRange(10) + .build("jerry")); + public static final RegistryObject> CHEEP = ENTITY_TYPES.register("cheep", + () -> EntityType.Builder.of(CheepEntity::new, MobCategory.WATER_AMBIENT) + .sized(1.0F, 1.2F) + .clientTrackingRange(8) + .build("cheep")); + public static final RegistryObject> DORRIE = ENTITY_TYPES.register("dorrie", + () -> EntityType.Builder.of(DorrieEntity::new, MobCategory.CREATURE) + .sized(1.6F, 1.4F) + .clientTrackingRange(10) + .build("dorrie")); + public static final RegistryObject> HERCULES_BEETLE = ENTITY_TYPES.register("hercules_beetle", + () -> EntityType.Builder.of(HerculesBeetleEntity::new, MobCategory.MONSTER) + .sized(3.0F, 4.0F) + .clientTrackingRange(12) + .build("hercules_beetle")); + public static final RegistryObject> OURANWOOD_DEER = ENTITY_TYPES.register("ouranwood_deer", + () -> EntityType.Builder.of(OuranwoodDeerEntity::new, MobCategory.CREATURE) + .sized(1.125F, 1.75F) + .clientTrackingRange(8) + .build("ouranwood_deer")); + public static final RegistryObject> GLIMMER = ENTITY_TYPES.register("glimmer", + () -> EntityType.Builder.of(GlimmerEntity::new, MobCategory.CREATURE) + .sized(0.9F, 1.4F) + .clientTrackingRange(8) + .build("glimmer")); + public static final RegistryObject> ELKA = ENTITY_TYPES.register("elka", + () -> EntityType.Builder.of(ElkaEntity::new, MobCategory.CREATURE) + .sized(2.2F, 3.5F) + .clientTrackingRange(10) + .build("elka")); + public static final RegistryObject> UPWARD_FALLING_BLOCK = ENTITY_TYPES.register("upward_falling_block", + () -> EntityType.Builder.of( + UpwardFallingBlockEntity::new, MobCategory.MISC) + .sized(0.98F, 0.98F) + .clientTrackingRange(10) + .updateInterval(1) + .build("upward_falling_block")); + + private AntarchyForgeEntites() {} + + public static void register(IEventBus modEventBus) { + ENTITY_TYPES.register(modEventBus); + } + + static EntityType buildAntType(EntityType.EntityFactory factory, MobCategory category, String name) { + return EntityType.Builder.of(factory, category) + .sized(0.6375F, 0.2125F) + .clientTrackingRange(8) + .build(name); + } + + static EntityType buildCowType(EntityType.EntityFactory factory, String name) { + return EntityType.Builder.of(factory, MobCategory.CREATURE) + .sized(0.9F, 1.4F) + .clientTrackingRange(10) + .build(name); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeEntityAttributes.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeEntityAttributes.java new file mode 100644 index 00000000..b469c0b0 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeEntityAttributes.java @@ -0,0 +1,98 @@ +package com.craisinlord.antarchy.forge.registry; + +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.entity.*; +import com.craisinlord.antarchy.content.entity.CreepingHorrorEntity; +import com.craisinlord.antarchy.content.entity.LurkingTerrorEntity; +import com.craisinlord.antarchy.content.entity.basilisk.BasiliskEntity; +import com.craisinlord.antarchy.content.entity.brutalfly.BrutalflyEntity; +import com.craisinlord.antarchy.content.entity.cloud_shark.CloudSharkEntity; +import com.craisinlord.antarchy.content.entity.flying_squirrel.FlyingSquirrelEntity; +import com.craisinlord.antarchy.content.entity.kraken.KrakenEntity; +import com.craisinlord.antarchy.content.entity.kraken.TentacleEntity; +import com.craisinlord.antarchy.content.entity.lucid.LucidEntity; +import com.craisinlord.antarchy.content.entity.nightmare.NightmareEntity; +import com.craisinlord.antarchy.content.entity.ToreterrorEntity; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.animal.Cow; +import net.minecraft.world.entity.animal.Rabbit; +import net.minecraft.world.entity.npc.Villager; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.event.entity.EntityAttributeCreationEvent; + +public class AntarchyForgeEntityAttributes { + private AntarchyForgeEntityAttributes() {} + + public static void register(IEventBus modEventBus) { + modEventBus.addListener(AntarchyForgeEntityAttributes::registerEntityAttributes); + } + + static void registerEntityAttributes(EntityAttributeCreationEvent event) { + AttributeSupplier rabbitAttributes = Rabbit.createAttributes().build(); + event.put(AntarchyForgeEntites.EASTER_BUNNY.get(), rabbitAttributes); + event.put(AntarchyForgeEntites.FLYING_SQUIRREL.get(), FlyingSquirrelEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.CATERPILLAR.get(), CaterpillarEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.BUTTERFLY.get(), ButterflyEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.REVERIE.get(), ReverieEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.BRUTALFLY.get(), BrutalflyEntity.createAttributes().build()); + + AttributeSupplier cowAttributes = Cow.createAttributes().build(); + event.put(AntarchyForgeEntites.APPLE_COW.get(), cowAttributes); + event.put(AntarchyForgeEntites.GOLDEN_APPLE_COW.get(), cowAttributes); + event.put(AntarchyForgeEntites.ENCHANTED_GOLDEN_APPLE_COW.get(), cowAttributes); + event.put(AntarchyForgeEntites.TERMITE.get(), buildAntAttributes( + AntarchySettings.termiteHealth(), + AntarchySettings.termiteMovementSpeed(), + AntarchySettings.termiteAttackDamage() + ).build()); + event.put(AntarchyForgeEntites.ROLLY_POLLY.get(), RollyPollyEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.DR_TRAYAURUS.get(), Villager.createAttributes().build()); + event.put(AntarchyForgeEntites.CLOUD_SHARK.get(), CloudSharkEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.KRAKEN.get(), KrakenEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.MISSILE_SQUID.get(), MissileSquidEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.OCTOPUS_BOMB.get(), OctopusBombEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.TENTACLE.get(), TentacleEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.NIGHTMARE.get(), NightmareEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.BED_BUG.get(), BedBugEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.STINK_BUG.get(), StinkBugEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.WASP.get(), WaspEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.BOMBER.get(), BomberEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.JUMPY_BUG.get(), JumpyBugEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.SPIT_BUG.get(), SpitBugEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.MANTIS.get(), MantisEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.ALPHA_MANTIS.get(), AlphaMantisEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.TRIFFID.get(), TriffidEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.LUCID.get(), LucidEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.SCORPION.get(), ScorpionEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.BASILISK.get(), BasiliskEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.EMPEROR_SCORPION.get(), EmperorScorpionEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.TORETERROR.get(), ToreterrorEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.CREEPING_HORROR.get(), CreepingHorrorEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.LURKING_TERROR.get(), LurkingTerrorEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.JERRY.get(), JerryEntity.createAttributes().build()); + + AttributeSupplier redAntAttributes = buildAntAttributes(AntarchySettings.redAntHealth(), AntarchySettings.redAntMovementSpeed(), AntarchySettings.redAntAttackDamage()).build(); + AttributeSupplier brownAntAttributes = buildAntAttributes(AntarchySettings.brownAntHealth(), AntarchySettings.brownAntMovementSpeed(), AntarchySettings.brownAntAttackDamage()).build(); + AttributeSupplier rainbowAntAttributes = buildAntAttributes(AntarchySettings.rainbowAntHealth(), AntarchySettings.rainbowAntMovementSpeed(), AntarchySettings.rainbowAntAttackDamage()).build(); + event.put(AntarchyForgeEntites.RED_ANT.get(), redAntAttributes); + event.put(AntarchyForgeEntites.BROWN_ANT.get(), brownAntAttributes); + event.put(AntarchyForgeEntites.RAINBOW_ANT.get(), rainbowAntAttributes); + event.put(AntarchyForgeEntites.MOLEWORM.get(), MolewormEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.MOLEVORE.get(), MolevoreEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.CHEEP.get(), com.craisinlord.antarchy.content.entity.CheepEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.DORRIE.get(), com.craisinlord.antarchy.content.entity.DorrieEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.HERCULES_BEETLE.get(), com.craisinlord.antarchy.content.entity.HerculesBeetleEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.OURANWOOD_DEER.get(), com.craisinlord.antarchy.content.entity.OuranwoodDeerEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.GLIMMER.get(), com.craisinlord.antarchy.content.entity.glimmer.GlimmerEntity.createAttributes().build()); + event.put(AntarchyForgeEntites.ELKA.get(), ElkaEntity.createAttributes().build()); + } + + private static AttributeSupplier.Builder buildAntAttributes(double health, double speed, double attackDamage) { + return net.minecraft.world.entity.Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, health) + .add(Attributes.MOVEMENT_SPEED, speed) + .add(Attributes.ATTACK_DAMAGE, attackDamage); + } + +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeEvents.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeEvents.java new file mode 100644 index 00000000..555613f8 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeEvents.java @@ -0,0 +1,1304 @@ +package com.craisinlord.antarchy.forge.registry; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.AntarchySoundEvents; +import com.craisinlord.antarchy.content.recipe.CustomBrewingRecipes; +import com.craisinlord.antarchy.content.block.DuctTapeBlock; +import com.craisinlord.antarchy.content.dispenser.RpoLauncherDispenseBehavior; +import com.craisinlord.antarchy.content.dispenser.SizeRayDispenseBehavior; +import com.craisinlord.antarchy.content.dispenser.SquidzookaDispenseBehavior; +import com.craisinlord.antarchy.content.dispenser.WaterCannonDispenseBehavior; +import com.craisinlord.antarchy.content.dispenser.AntimetalMinecartDispenseBehavior; +import com.craisinlord.antarchy.content.fluid.AntarchyFluidChecks; +import com.craisinlord.antarchy.content.bloodglass.BloodglassAccess; +import com.craisinlord.antarchy.content.entity.*; +import com.craisinlord.antarchy.content.entity.kraken.KrakenEntity; +import com.craisinlord.antarchy.content.entity.lucid.LucidBoltEntity; +import com.craisinlord.antarchy.content.entity.lucid.LucidEntity; +import com.craisinlord.antarchy.content.entity.lucid.LucidEyeProjectileEntity; +import com.craisinlord.antarchy.content.entity.multipart.MultipartFramework; +import com.craisinlord.antarchy.content.entity.trades.DrTrayaurusTradeManager; +import com.craisinlord.antarchy.content.horde.CavarynHordeManager; +import com.craisinlord.antarchy.content.item.*; +import com.craisinlord.antarchy.content.item.ultimate.UltimateGearHelper; +import com.craisinlord.antarchy.content.movement.DreamSandLowGravityAccess; +import com.craisinlord.antarchy.content.AntarchyTags; +import com.craisinlord.antarchy.content.portal.PermanentPortalManager; +import com.craisinlord.antarchy.forge.AntarchyForgeFluidTypes; +import com.craisinlord.antarchy.forge.entity.multipart.MultipartPartEntity; +import com.craisinlord.antarchy.forge.network.AntarchyGravityNetworking; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.damagesource.DamageTypes; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.animal.Rabbit; +import net.minecraft.world.entity.monster.Enemy; +import net.minecraft.world.entity.player.Player; +import net.minecraft.tags.FluidTags; +import net.minecraft.world.item.*; +import net.minecraft.world.item.alchemy.Potions; +import net.minecraftforge.common.brewing.BrewingRecipe; +import net.minecraft.world.level.block.ComposterBlock; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.RotatedPillarBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.phys.AABB; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.common.ToolActions; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.ForgeMod; +import net.minecraft.world.entity.npc.VillagerProfession; +import net.minecraft.world.entity.npc.VillagerTrades; +import net.minecraft.world.item.trading.MerchantOffer; +import net.minecraftforge.event.AddReloadListenerEvent; +import net.minecraftforge.event.entity.EntityAttributeModificationEvent; +import net.minecraftforge.event.entity.living.*; +import net.minecraftforge.event.entity.player.AttackEntityEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.event.level.BlockEvent; +import net.minecraftforge.event.entity.living.LivingEvent; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.event.village.VillagerTradesEvent; +import net.minecraftforge.event.village.WandererTradesEvent; +import com.craisinlord.antarchy.content.item.MinersDreamExcavationManager; +import net.minecraftforge.fluids.FluidInteractionRegistry; +import com.craisinlord.antarchy.forge.network.AntarchyForgeNetworkCore; + +public final class AntarchyForgeEvents { + private AntarchyForgeEvents() {} + + public static void register(IEventBus modEventBus) { + modEventBus.addListener(AntarchyForgeEvents::onCommonSetup); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::onMissileSquidDeath); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::onPermanentPortalSacrifice); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::onLivingBreathe); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleNaturalRabbitReplacement); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleBlockToolModification); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::onMobEffectApplicable); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::onInvertedEffectRemoved); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::onInvertedEffectExpired); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleUltimateBowDamage); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleUltimateCrossbowDamage); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleNightmareArmorDoubleDamage); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleScorpionWhipAttackEntity); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleAttitudeAdjusterAttackEntity); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleScorpionWhipLeftClickBlock); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleScorpionWhipRightClickBlock); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleScorpionWhipRightClickItem); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleParalyzedAttackEntity); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleParalyzedLeftClickBlock); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleParalyzedRightClickBlock); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleParalyzedRightClickItem); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleParalyzedEntityInteract); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleParalyzedEntityInteractSpecific); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleDreamSandJump); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::tickDreadAndIchor); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::tickScorpionWhips); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::tickDreamSandLowGravity); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::tickMinersDreamExcavations); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleAntiwaterDamage); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleAntiwaterFall); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleDreamSandFall); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleBloodCrystalBootsFall); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleBloodglassShield); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleBloodCrystalArmorEquip); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleBloodglassWardApplied); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleBloodglassWardRemoved); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleBloodglassWardExpired); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::tickBloodglassRecharge); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleBloodglassPlayerDeath); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleBloodglassRespawn); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleBloodglassLogin); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleCavarynHordeKill); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleCavarynHordeBlockBreak); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::tickCavarynHordes); + modEventBus.addListener(AntarchyForgeEvents::modifyEntityAttributes); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::tickOverheadInversion); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::tickDuctTapeStickiness); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleDreadDeath); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleFallenKingCrownKill); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleDreadBedSleep); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleStartTracking); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::handleDreamSandLogout); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::registerReloadListeners); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::onVillagerTrades); + MinecraftForge.EVENT_BUS.addListener(AntarchyForgeEvents::onWandererTrades); + } + + static void onVillagerTrades(VillagerTradesEvent event) { + if (event.getType() == VillagerProfession.FARMER) { + event.getTrades().get(1).add(emeraldForItems(AntarchyObjects.CORN.get(), 20, 16, 2)); + } else if (event.getType() == VillagerProfession.BUTCHER) { + event.getTrades().get(1).add(emeraldForItems(AntarchyObjects.COOKED_CORNDOG.get(), 5, 16, 2)); + } + } + + static void onWandererTrades(WandererTradesEvent event) { + event.getGenericTrades().add(itemsForEmerald(AntarchyObjects.CORN_SEEDS.get(), 1, 3, 12, 2)); + } + + private static VillagerTrades.ItemListing emeraldForItems(Item item, int count, int maxUses, int villagerXp) { + return (trader, random) -> new MerchantOffer(new ItemStack(item, count), new ItemStack(Items.EMERALD), maxUses, villagerXp, 0.05F); + } + + private static VillagerTrades.ItemListing itemsForEmerald(Item item, int emeraldCost, int count, int maxUses, int villagerXp) { + return (trader, random) -> new MerchantOffer(new ItemStack(Items.EMERALD, emeraldCost), new ItemStack(item, count), maxUses, villagerXp, 0.05F); + } + + public static void onMissileSquidDeath(LivingDeathEvent event) { + if (event.getEntity() instanceof MissileSquidEntity missileSquid) { + if (missileSquid.isSpawnedByKraken()) return; + } else if (event.getEntity().getType() != EntityType.SQUID) { + return; + } + if (!(event.getEntity().level() instanceof ServerLevel serverLevel)) return; + if (!(event.getEntity().getKillCredit() instanceof Player killer)) return; + + boolean requireBadOmen = AntarchySettings.krakenRequireBadOmenToSummon(); + int badOmenLevel = badOmenLevel(killer); + if (requireBadOmen && badOmenLevel <= 0) return; + + BlockPos deathPos = event.getEntity().blockPosition(); + + if (AntarchySettings.krakenSquidSpawnEnabled()) { + int chanceDenominator = requireBadOmen ? Math.max(1, 100 / badOmenLevel) : 100; + if (serverLevel.random.nextInt(chanceDenominator) == 0) { + spawnKrakens(serverLevel, deathPos, 1); + } + } + + if (AntarchySettings.krakenMassSpawnEnabled() && serverLevel.random.nextInt(500) == 0) { + spawnKrakens(serverLevel, deathPos, 10); + } + } + + static void handleCavarynHordeKill(LivingDeathEvent event) { + if (event.getEntity().getKillCredit() instanceof ServerPlayer player) { + CavarynHordeManager.recordMobKill(player, event.getEntity()); + } + } + + static void handleCavarynHordeBlockBreak(BlockEvent.BreakEvent event) { + if (event.getPlayer() instanceof ServerPlayer player) { + CavarynHordeManager.recordBlockBreak(player, event.getState(), event.getPos()); + } + } + + static void tickCavarynHordes(TickEvent.ServerTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + for (ServerLevel level : event.getServer().getAllLevels()) { + CavarynHordeManager.tick(level); + } + } + + private static int badOmenLevel(Player player) { + MobEffectInstance effect = player.getEffect(MobEffects.BAD_OMEN); + return effect != null ? effect.getAmplifier() + 1 : 0; + } + + public static void onPermanentPortalSacrifice(LivingDeathEvent event) { + PermanentPortalManager.handleSacrifice(event.getEntity()); + } + + public static void onLivingBreathe(LivingBreatheEvent event) { + if (!(event.getEntity() instanceof Player)) { + return; + } + + if (event.getEntity().getEyeInFluidType() != AntarchyForgeFluidTypes.ANTIWATER_TYPE.get()) { + return; + } + + event.setConsumeAirAmount(event.getConsumeAirAmount() * 2); + } + + private static void spawnKrakens(ServerLevel level, BlockPos origin, int count) { + for (int i = 0; i < count; i++) { + BlockPos spawnPos = findKrakenSpawnPos(level, origin); + KrakenEntity kraken = AntarchyObjects.KRAKEN.get().create(level); + if (kraken == null) continue; + kraken.moveTo(spawnPos.getX() + 0.5D, spawnPos.getY() + 1.0D, spawnPos.getZ() + 0.5D, + level.random.nextFloat() * 360.0F, 0.0F); + kraken.finalizeSpawn(level, level.getCurrentDifficultyAt(spawnPos), MobSpawnType.EVENT, null, null); + level.addFreshEntity(kraken); + } + } + + private static BlockPos findKrakenSpawnPos(ServerLevel level, BlockPos origin) { + for (int attempt = 0; attempt < 20; attempt++) { + BlockPos candidate = origin.offset( + level.random.nextInt(33) - 16, + level.random.nextInt(9) - 4, + level.random.nextInt(33) - 16 + ); + if (level.getFluidState(candidate).is(FluidTags.WATER)) { + return candidate; + } + } + return origin.above(3); + } + + static void registerReloadListeners(AddReloadListenerEvent event) { + event.addListener(new DrTrayaurusTradeManager()); + } + static void handleDreamSandLogout(PlayerEvent.PlayerLoggedOutEvent event) { + clearDreamSandLowGravity(event.getEntity()); + } + private static void clearDreamSandLowGravity(LivingEntity livingEntity) { + DreamSandLowGravityAccess access = dreamSandAccess(livingEntity); + access.antarchy$setDreamSandLowGravityActive(false); + access.antarchy$setDreamSandLowGravityTicksRemaining(0); + access.antarchy$setDreamSandLandingGraceTicks(0); + } + private static DreamSandLowGravityAccess dreamSandAccess(LivingEntity livingEntity) { + return (DreamSandLowGravityAccess) livingEntity; + } + + static void handleStartTracking(PlayerEvent.StartTracking event) { + if (event.getTarget().level().isClientSide()) { + return; + } + + AntarchyGravityNetworking.syncEntity(event.getTarget()); + } + + private static final String DREAD_BED_BUG_NEXT_SPAWN_KEY = Antarchy.MODID + ":dread_bed_bug_next_spawn"; + private static final int DREAD_BED_BUG_SPAWN_COOLDOWN_TICKS = 6000; + static void handleDreadBedSleep(net.minecraftforge.event.entity.player.PlayerSleepInBedEvent event) { + if (!event.getEntity().hasEffect(AntarchyForgeMisc.DREAD.get())) { + return; + } + Player player = event.getEntity(); + player.displayClientMessage(net.minecraft.network.chat.Component.translatable("message.antarchy.dread_too_scared_to_sleep"), true); + event.setResult(net.minecraft.world.entity.player.Player.BedSleepingProblem.OTHER_PROBLEM); + + if (!(player.level() instanceof net.minecraft.server.level.ServerLevel level)) return; + long gameTime = level.getGameTime(); + long nextSpawnTime = player.getPersistentData().getLong(DREAD_BED_BUG_NEXT_SPAWN_KEY); + if (nextSpawnTime > gameTime) { + return; + } + + net.minecraft.core.BlockPos bedPos = event.getPos(); + com.craisinlord.antarchy.content.entity.BedBugEntity bedBug = AntarchyObjects.BED_BUG.get().create(level); + if (bedBug == null) { + return; + } + + player.getPersistentData().putLong(DREAD_BED_BUG_NEXT_SPAWN_KEY, gameTime + DREAD_BED_BUG_SPAWN_COOLDOWN_TICKS); + bedBug.moveTo(bedPos.getX() + 0.5D, bedPos.getY() + 0.5D, bedPos.getZ() + 0.5D, + level.random.nextFloat() * 360.0F, 0.0F); + bedBug.finalizeSpawn(level, level.getCurrentDifficultyAt(bedPos), + net.minecraft.world.entity.MobSpawnType.EVENT, null, null); + level.addFreshEntity(bedBug); + } + + static void handleNaturalRabbitReplacement(MobSpawnEvent.PositionCheck event) { + if (!AntarchySettings.easterBunnyEnabled()) { + return; + } + if (event.getSpawnType() != MobSpawnType.NATURAL || !(event.getEntity() instanceof Rabbit rabbit)) { + return; + } + if (rabbit instanceof EasterBunnyEntity) { + return; + } + + int chancePercent = AntarchySettings.easterBunnyNaturalSpawnChancePercent(); + if (chancePercent <= 0 || event.getLevel().getRandom().nextInt(100) >= chancePercent) { + return; + } + + ServerLevel level = (ServerLevel) event.getLevel(); + EasterBunnyEntity easterBunny = AntarchyForgeEntites.EASTER_BUNNY.get().create(level); + if (easterBunny == null) { + return; + } + + easterBunny.moveTo(event.getX(), event.getY(), event.getZ(), rabbit.getYRot(), rabbit.getXRot()); + easterBunny.finalizeSpawn(level, level.getCurrentDifficultyAt(event.getEntity().blockPosition()), MobSpawnType.NATURAL, null, null); + level.addFreshEntity(easterBunny); + event.setResult(net.minecraftforge.eventbus.api.Event.Result.DENY); + } + + static void tickDuctTapeStickiness(LivingEvent.LivingTickEvent event) { + DuctTapeBlock.tickStuckEntity(event.getEntity()); + } + + static void handleDreadDeath(LivingDeathEvent event) { + LivingEntity entity = event.getEntity(); + clearDreamSandLowGravity(entity); + if (!entity.hasEffect(AntarchyForgeMisc.DREAD.get())) { + return; + } + + entity.removeEffect(AntarchyForgeMisc.DREAD.get()); + } + + static void handleFallenKingCrownKill(LivingDeathEvent event) { + if (!(event.getEntity() instanceof Enemy)) { + return; + } + + Entity attacker = event.getSource().getEntity(); + if (!(attacker instanceof Player player) || player.level().isClientSide()) { + return; + } + + if (!player.getItemBySlot(net.minecraft.world.entity.EquipmentSlot.HEAD).is(AntarchyForgeItems.FALLEN_KING_CROWN.get())) { + return; + } + + player.addEffect(new MobEffectInstance(MobEffects.HERO_OF_THE_VILLAGE, 6000, 0, false, true, true)); + } + + private static final int ANTIMETAL_INVERTED_REFRESH_TICKS = 20; + + static void tickOverheadInversion(LivingEvent.LivingTickEvent event) { + LivingEntity livingEntity = event.getEntity(); + if (livingEntity.level().isClientSide()) { + return; + } + if (livingEntity instanceof Player player && player.isSpectator()) { + return; + } + if (!isDirectlyBelowAntimetal(livingEntity)) { + return; + } + + MobEffectInstance existingInverted = livingEntity.getEffect(AntarchyForgeMisc.INVERTED.get()); + if (existingInverted == null || existingInverted.getDuration() <= 5) { + livingEntity.addEffect(new MobEffectInstance(AntarchyForgeMisc.INVERTED.get(), ANTIMETAL_INVERTED_REFRESH_TICKS, 0, false, false, false)); + spawnAntimetalInversionParticles(livingEntity); + } + } + + private static boolean isInOrBelowAntimetalScaffolding(LivingEntity entity) { + AABB bounds = entity.getBoundingBox().deflate(1.0E-3D); + int minX = net.minecraft.util.Mth.floor(bounds.minX); + int maxX = net.minecraft.util.Mth.floor(bounds.maxX); + int minY = net.minecraft.util.Mth.floor(bounds.minY); + int maxY = net.minecraft.util.Mth.floor(bounds.maxY); + int minZ = net.minecraft.util.Mth.floor(bounds.minZ); + int maxZ = net.minecraft.util.Mth.floor(bounds.maxZ); + + for (int x = minX; x <= maxX; x++) { + for (int z = minZ; z <= maxZ; z++) { + for (int y = minY; y <= maxY; y++) { + if (entity.level().getBlockState(new net.minecraft.core.BlockPos(x, y, z)) + .getBlock() instanceof com.craisinlord.antarchy.content.block.AntimetalScaffoldingBlock) { + return true; + } + } + net.minecraft.core.BlockPos abovePos = new net.minecraft.core.BlockPos(x, maxY + 1, z); + if (entity.level().getBlockState(abovePos) + .getBlock() instanceof com.craisinlord.antarchy.content.block.AntimetalScaffoldingBlock) { + return true; + } + } + } + return false; + } + + private static boolean isDirectlyBelowAntimetal(LivingEntity entity) { + AABB bounds = entity.getBoundingBox().deflate(1.0E-3D); + + int minX = net.minecraft.util.Mth.floor(bounds.minX); + int maxX = net.minecraft.util.Mth.floor(bounds.maxX); + int minY = net.minecraft.util.Mth.floor(bounds.minY); + int maxY = net.minecraft.util.Mth.floor(bounds.maxY); + int minZ = net.minecraft.util.Mth.floor(bounds.minZ); + int maxZ = net.minecraft.util.Mth.floor(bounds.maxZ); + + for (int x = minX; x <= maxX; x++) { + for (int y = minY; y <= maxY; y++) { + for (int z = minZ; z <= maxZ; z++) { + net.minecraft.core.BlockPos crystalPos = new net.minecraft.core.BlockPos(x, y + 1, z); + if (entity.level().getBlockState(crystalPos).is(AntarchyForgeBlocks.ANTIMETAL.get()) + || entity.level().getBlockState(crystalPos).is(AntarchyForgeBlocks.POLISHED_ANTIMETAL.get())) { + return true; + } + } + } + } + + return false; + } + + private static void spawnAntimetalInversionParticles(LivingEntity entity) { + if (!(entity.level() instanceof ServerLevel serverLevel)) { + return; + } + + double x = entity.getX(); + double y = entity.getBoundingBox().maxY + 0.1D; + double z = entity.getZ(); + serverLevel.sendParticles( + new net.minecraft.core.particles.DustParticleOptions(new org.joml.Vector3f(1.0F, 0.1F, 0.1F), 1.0F), + x, + y, + z, + 6, + 0.2D, + 0.05D, + 0.2D, + 0.0D + ); + } + + static void modifyEntityAttributes(EntityAttributeModificationEvent event) { + event.add(EntityType.PLAYER, AntarchyForgeMisc.BLOODGLASS_MAX_HEARTS.get()); + event.add(EntityType.PLAYER, AntarchyForgeMisc.DOUBLE_DAMAGE_CHANCE.get()); + } + + static void handleBloodglassPlayerDeath(LivingDeathEvent event) { + if (!(event.getEntity() instanceof ServerPlayer sp)) return; + BloodglassAccess access = (BloodglassAccess) sp; + access.antarchy$setArmorShieldsActive(0); + access.antarchy$setArmorShieldLostCount(0); + access.antarchy$setArmorRechargeTimer(0); + access.antarchy$setAppleShieldsActive(0); + access.antarchy$setAppleShieldLostCount(0); + access.antarchy$setAppleRechargeTimer(0); + syncBloodglass(sp); + } + + static void handleBloodglassRespawn(PlayerEvent.PlayerRespawnEvent event) { + if (!(event.getEntity() instanceof ServerPlayer sp)) return; + BloodglassAccess access = (BloodglassAccess) sp; + int bcCount = 0; + for (net.minecraft.world.entity.EquipmentSlot slot : new net.minecraft.world.entity.EquipmentSlot[]{ + net.minecraft.world.entity.EquipmentSlot.HEAD, + net.minecraft.world.entity.EquipmentSlot.CHEST, + net.minecraft.world.entity.EquipmentSlot.LEGS, + net.minecraft.world.entity.EquipmentSlot.FEET}) { + if (sp.getItemBySlot(slot).getItem() instanceof BloodCrystalArmorItem) bcCount++; + } + int shields = Math.min(bcCount, AntarchySettings.bloodCrystalHardMaxShields()); + access.antarchy$setArmorShieldsActive(shields); + access.antarchy$setArmorShieldLostCount(0); + access.antarchy$setArmorRechargeTimer(0); + syncBloodglass(sp); + } + + static void handleBloodglassLogin(PlayerEvent.PlayerLoggedInEvent event) { + if (!(event.getEntity() instanceof ServerPlayer sp)) return; + BloodglassAccess access = (BloodglassAccess) sp; + if (sp.hasEffect(AntarchyForgeMisc.BLOODGLASS_WARD.get())) { + net.minecraft.world.effect.MobEffectInstance effect = sp.getEffect(AntarchyForgeMisc.BLOODGLASS_WARD.get()); + if (effect != null) { + int cap = Math.max(0, AntarchySettings.bloodCrystalHardMaxShields() + - access.antarchy$getArmorShieldsActive() + - access.antarchy$getArmorShieldLostCount()); + int shieldCount = Math.min(effect.getAmplifier() + 1, cap); + access.antarchy$setAppleShieldsActive(shieldCount); + access.antarchy$setAppleShieldLostCount(0); + access.antarchy$setAppleRechargeTimer(0); + } + } + syncBloodglass(sp); + } + + private static void syncBloodglass(ServerPlayer player) { + BloodglassAccess access = (BloodglassAccess) player; + AntarchyForgeNetworkCore.sendToPlayer(player, + new com.craisinlord.antarchy.content.network.BloodglassStatePayload( + access.antarchy$getTotalShieldsActive(), + access.antarchy$getTotalShieldsMax() + ) + ); + } + + static void handleBloodglassWardApplied(MobEffectEvent.Added event) { + if (event.getEffectInstance().getEffect() != AntarchyForgeMisc.BLOODGLASS_WARD.get()) return; + if (!(event.getEntity() instanceof Player player)) return; + if (player.level().isClientSide()) return; + + BloodglassAccess access = (BloodglassAccess) player; + int targetCap = Math.min( + event.getEffectInstance().getAmplifier() + 1, + Math.max(0, AntarchySettings.bloodCrystalHardMaxShields() + - access.antarchy$getArmorShieldsActive() - access.antarchy$getArmorShieldLostCount()) + ); + int currentCap = access.antarchy$getAppleShieldsActive() + access.antarchy$getAppleShieldLostCount(); + // Only grant newly-added capacity (e.g. first application, or a higher amplifier). + // A mere duration refresh of an already-active ward must not reset shields that are + // already lost, nor restart their recharge timer. + if (targetCap > currentCap) { + access.antarchy$setAppleShieldsActive(access.antarchy$getAppleShieldsActive() + (targetCap - currentCap)); + syncBloodglass((ServerPlayer) player); + } + } + + private static void clearAppleShields(Player player) { + BloodglassAccess access = (BloodglassAccess) player; + access.antarchy$setAppleShieldsActive(0); + access.antarchy$setAppleShieldLostCount(0); + access.antarchy$setAppleRechargeTimer(0); + if (player instanceof ServerPlayer sp) syncBloodglass(sp); + } + + static void handleBloodglassWardRemoved(MobEffectEvent.Remove event) { + if (event.getEffect() != AntarchyForgeMisc.BLOODGLASS_WARD.get()) return; + if (!(event.getEntity() instanceof Player player)) return; + if (player.level().isClientSide()) return; + clearAppleShields(player); + } + + static void handleBloodglassWardExpired(MobEffectEvent.Expired event) { + if (event.getEffectInstance().getEffect() != AntarchyForgeMisc.BLOODGLASS_WARD.get()) return; + if (!(event.getEntity() instanceof Player player)) return; + if (player.level().isClientSide()) return; + clearAppleShields(player); + } + + static void tickBloodglassRecharge(TickEvent.PlayerTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + Player player = event.player; + if (player.level().isClientSide()) return; + + BloodglassAccess access = (BloodglassAccess) player; + boolean changed = false; + int hardCap = AntarchySettings.bloodCrystalHardMaxShields(); + + if (access.antarchy$getArmorShieldLostCount() > 0) { + int timer = access.antarchy$getArmorRechargeTimer(); + if (timer > 1) { + access.antarchy$setArmorRechargeTimer(timer - 1); + } else if (timer == 1) { + int currentTotal = access.antarchy$getTotalShieldsActive(); + if (currentTotal < hardCap) { + access.antarchy$setArmorShieldsActive(access.antarchy$getArmorShieldsActive() + 1); + access.antarchy$setArmorShieldLostCount(access.antarchy$getArmorShieldLostCount() - 1); + changed = true; + } + if (access.antarchy$getArmorShieldLostCount() > 0) { + access.antarchy$setArmorRechargeTimer(AntarchySettings.bloodCrystalArmorShieldRechargeTicks()); + } else { + access.antarchy$setArmorRechargeTimer(0); + } + } + } + + if (access.antarchy$getAppleShieldLostCount() > 0 && player.hasEffect(AntarchyForgeMisc.BLOODGLASS_WARD.get())) { + int timer = access.antarchy$getAppleRechargeTimer(); + if (timer > 1) { + access.antarchy$setAppleRechargeTimer(timer - 1); + } else if (timer == 1) { + int currentTotal = access.antarchy$getTotalShieldsActive(); + if (currentTotal < hardCap) { + access.antarchy$setAppleShieldsActive(access.antarchy$getAppleShieldsActive() + 1); + access.antarchy$setAppleShieldLostCount(access.antarchy$getAppleShieldLostCount() - 1); + changed = true; + } + if (access.antarchy$getAppleShieldLostCount() > 0) { + access.antarchy$setAppleRechargeTimer(AntarchySettings.bloodCrystalAppleShieldRechargeTicks()); + } else { + access.antarchy$setAppleRechargeTimer(0); + } + } + } + + if (changed && player instanceof ServerPlayer sp) { + syncBloodglass(sp); + sp.playNotifySound( + net.minecraft.sounds.SoundEvents.AMETHYST_BLOCK_CHIME, + net.minecraft.sounds.SoundSource.PLAYERS, 0.6f, 1.6f); + } + } + static void handleBloodCrystalArmorEquip(LivingEquipmentChangeEvent event) { + if (!(event.getEntity() instanceof Player player)) return; + if (player.level().isClientSide()) return; + + net.minecraft.world.entity.EquipmentSlot slot = event.getSlot(); + if (slot != net.minecraft.world.entity.EquipmentSlot.HEAD + && slot != net.minecraft.world.entity.EquipmentSlot.CHEST + && slot != net.minecraft.world.entity.EquipmentSlot.LEGS + && slot != net.minecraft.world.entity.EquipmentSlot.FEET) return; + + boolean fromIsBC = event.getFrom().getItem() instanceof BloodCrystalArmorItem; + boolean toIsBC = event.getTo().getItem() instanceof BloodCrystalArmorItem; + + BloodglassAccess access = (BloodglassAccess) player; + + if (fromIsBC && !toIsBC) { + // Unequipped BC armor, remove one shield slot + if (access.antarchy$getArmorShieldsActive() > 0) { + access.antarchy$setArmorShieldsActive(access.antarchy$getArmorShieldsActive() - 1); + } else if (access.antarchy$getArmorShieldLostCount() > 0) { + access.antarchy$setArmorShieldLostCount(access.antarchy$getArmorShieldLostCount() - 1); + if (access.antarchy$getArmorShieldLostCount() == 0) { + access.antarchy$setArmorRechargeTimer(0); + } + } + } else if (!fromIsBC && toIsBC) { + // Newly equipped BC armor,only add if not already accounted for (by respawn init) + int bcPieces = countBCArmorPieces(player); + int currentTotal = access.antarchy$getArmorShieldsActive() + access.antarchy$getArmorShieldLostCount(); + if (currentTotal < bcPieces) { + access.antarchy$setArmorShieldLostCount(access.antarchy$getArmorShieldLostCount() + 1); + access.antarchy$setArmorRechargeTimer(AntarchySettings.bloodCrystalArmorShieldRechargeTicks()); + } + } else if (fromIsBC) { + // BC armor replaced with another BC armor (or same after re-equip sequence) + // Remove old shield, start recharging new one and reset timer + if (access.antarchy$getArmorShieldsActive() > 0) { + access.antarchy$setArmorShieldsActive(access.antarchy$getArmorShieldsActive() - 1); + } else if (access.antarchy$getArmorShieldLostCount() > 0) { + access.antarchy$setArmorShieldLostCount(access.antarchy$getArmorShieldLostCount() - 1); + } + access.antarchy$setArmorShieldLostCount(access.antarchy$getArmorShieldLostCount() + 1); + access.antarchy$setArmorRechargeTimer(AntarchySettings.bloodCrystalArmorShieldRechargeTicks()); + } + + syncBloodglass((ServerPlayer) player); + } + + private static int countBCArmorPieces(Player player) { + int count = 0; + for (net.minecraft.world.entity.EquipmentSlot slot : new net.minecraft.world.entity.EquipmentSlot[]{ + net.minecraft.world.entity.EquipmentSlot.HEAD, + net.minecraft.world.entity.EquipmentSlot.CHEST, + net.minecraft.world.entity.EquipmentSlot.LEGS, + net.minecraft.world.entity.EquipmentSlot.FEET}) { + if (player.getItemBySlot(slot).getItem() instanceof BloodCrystalArmorItem) count++; + } + return count; + } + + static void handleBloodCrystalBootsFall(LivingFallEvent event) { + if (!(event.getEntity() instanceof Player player)) return; + if (!com.craisinlord.antarchy.content.gravity.AntarchyGravityApi.isGravityInverted(player)) return; + if (!(player.getItemBySlot(net.minecraft.world.entity.EquipmentSlot.FEET).getItem() instanceof BloodCrystalArmorItem)) return; + event.setCanceled(true); + } + + static void handleBloodglassShield(LivingHurtEvent event) { + if (!(event.getEntity() instanceof Player player)) return; + if (player.level().isClientSide()) return; + + if (event.getAmount() <= 1.0f) return; + + if (event.getSource().is(AntarchyTags.DamageType.BYPASSES_BLOODGLASS)) return; + + BloodglassAccess access = (BloodglassAccess) player; + int totalActive = access.antarchy$getTotalShieldsActive(); + if (totalActive <= 0) return; + + // Consume apple shields first, then armor shields + if (access.antarchy$getAppleShieldsActive() > 0) { + access.antarchy$setAppleShieldsActive(access.antarchy$getAppleShieldsActive() - 1); + access.antarchy$setAppleShieldLostCount(access.antarchy$getAppleShieldLostCount() + 1); + if (access.antarchy$getAppleRechargeTimer() == 0) { + access.antarchy$setAppleRechargeTimer(AntarchySettings.bloodCrystalAppleShieldRechargeTicks()); + } + } else { + access.antarchy$setArmorShieldsActive(access.antarchy$getArmorShieldsActive() - 1); + access.antarchy$setArmorShieldLostCount(access.antarchy$getArmorShieldLostCount() + 1); + if (access.antarchy$getArmorRechargeTimer() == 0) { + access.antarchy$setArmorRechargeTimer(AntarchySettings.bloodCrystalArmorShieldRechargeTicks()); + } + } + + event.setCanceled(true); + + net.minecraft.server.level.ServerLevel serverLevel = (net.minecraft.server.level.ServerLevel) player.level(); + + serverLevel.broadcastEntityEvent(player, (byte) 2); + + serverLevel.playSound(null, player.blockPosition(), + net.minecraft.sounds.SoundEvents.GLASS_BREAK, + net.minecraft.sounds.SoundSource.PLAYERS, 1.0f, 1.0f); + + serverLevel.sendParticles( + new net.minecraft.core.particles.DustParticleOptions( + new org.joml.Vector3f(0.85f, 0.18f, 0.38f), 1.2f), + player.getX(), player.getEyeY(), player.getZ(), + 35, 0.35, 0.55, 0.35, 0.12); + + syncBloodglass((ServerPlayer) player); + } + static void handleUltimateBowDamage(LivingHurtEvent event) { + if (!UltimateGearHelper.isUltimateBowArrow(event.getSource().getDirectEntity())) { + return; + } + + LivingEntity target = event.getEntity(); + if (target instanceof Player player) { + event.setAmount(0.0F); + player.invulnerableTime = 0; + player.clearFire(); + player.heal((float) AntarchySettings.ultimateBowPlayerHeal()); + return; + } + + // Shared item code now scales arrow base damage directly so attribute and projectile + // modifiers stay in the damage pipeline. Leave non-player hits untouched here. + } + + static void handleUltimateCrossbowDamage(LivingHurtEvent event) { + if (!UltimateGearHelper.isUltimateCrossbowProjectile(event.getSource().getDirectEntity())) { + return; + } + } + + + + static void handleNightmareArmorDoubleDamage(LivingHurtEvent event) { + net.minecraft.world.damagesource.DamageSource source = event.getSource(); + if (!(source.getEntity() instanceof net.minecraft.world.entity.LivingEntity attacker)) return; + if (!attacker.getAttributes().hasAttribute(AntarchyForgeMisc.DOUBLE_DAMAGE_CHANCE.get())) return; + double chance = attacker.getAttributeValue(AntarchyForgeMisc.DOUBLE_DAMAGE_CHANCE.get()); + if (chance <= 0.0) return; + if (attacker.getRandom().nextDouble() < chance) { + event.setAmount(event.getAmount() * 2.0F); + LivingEntity victim = event.getEntity(); + if (victim.level() instanceof ServerLevel serverLevel) { + serverLevel.playSound(null, victim.blockPosition(), + AntarchySoundEvents.NIGHTMARE_BITE.get(), + net.minecraft.sounds.SoundSource.PLAYERS, 0.9f, 0.85f + victim.getRandom().nextFloat() * 0.3f); + serverLevel.sendParticles( + new net.minecraft.core.particles.DustParticleOptions(new org.joml.Vector3f(0.55f, 0.0f, 0.05f), 1.4f), + victim.getX(), victim.getY() + victim.getBbHeight() * 0.5, victim.getZ(), + 30, 0.4, 0.5, 0.4, 0.15); + } + } + } + + private static boolean isWearingFullNightmareArmor(Player player) { + for (ItemStack stack : player.getArmorSlots()) { + if (!(stack.getItem() instanceof NightmareArmorItem)) return false; + } + return true; + } + + static void handleAntiwaterDamage(LivingHurtEvent event) { + if (!event.getSource().is(DamageTypes.FALL)) { + return; + } + + LivingEntity livingEntity = event.getEntity(); + if (!intersectsAntiwater(livingEntity, livingEntity.getBoundingBox().inflate(0.05D))) { + return; + } + + event.setCanceled(true); + } + + static void handleScorpionWhipAttackEntity(AttackEntityEvent event) { + if (!(event.getEntity() instanceof ServerPlayer player)) { + return; + } + + if (!(player.getMainHandItem().getItem() instanceof ScorpionWhipItem) || !(event.getTarget() instanceof LivingEntity target)) { + return; + } + + if (ScorpionWhipTetherManager.hasTether(player)) { + event.setCanceled(true); + if (ScorpionWhipTetherManager.isTetheredTo(player, target)) { + player.resetAttackStrengthTicker(); + } + } + } + + static void handleAttitudeAdjusterAttackEntity(AttackEntityEvent event) { + if (!(event.getEntity() instanceof ServerPlayer player)) { + return; + } + if (!(player.getMainHandItem().getItem() instanceof AttitudeAdjusterItem) || player.getAttackStrengthScale(0.5F) < 0.95F) { + return; + } + AttitudeAdjusterSlamManager.markSpecialHit(player); + } + + static void handleScorpionWhipLeftClickBlock(PlayerInteractEvent.LeftClickBlock event) { + if (!(event.getEntity() instanceof ServerPlayer player)) { + return; + } + if (!(player.getMainHandItem().getItem() instanceof ScorpionWhipItem) || !ScorpionWhipTetherManager.hasTether(player)) { + return; + } + event.setCanceled(true); + } + + static void handleScorpionWhipRightClickBlock(PlayerInteractEvent.RightClickBlock event) { + if (!(event.getEntity() instanceof ServerPlayer player)) { + return; + } + if (!(player.getMainHandItem().getItem() instanceof ScorpionWhipItem)) { + return; + } + if (!ScorpionWhipTetherManager.hasTether(player)) { + return; + } + if (ScorpionWhipTetherManager.pullAndDetach(player)) { + event.setCanceled(true); + event.setCancellationResult(InteractionResult.SUCCESS); + } + } + + static void handleScorpionWhipRightClickItem(PlayerInteractEvent.RightClickItem event) { + if (!(event.getEntity() instanceof ServerPlayer player)) { + return; + } + if (!(player.getMainHandItem().getItem() instanceof ScorpionWhipItem)) { + return; + } + if (!ScorpionWhipTetherManager.hasTether(player)) { + return; + } + if (ScorpionWhipTetherManager.pullAndDetach(player)) { + event.setCanceled(true); + event.setCancellationResult(InteractionResult.SUCCESS); + } + } + + static void handleParalyzedAttackEntity(AttackEntityEvent event) { + if (isParalyzed(event.getEntity())) { + event.setCanceled(true); + } + } + + static void handleParalyzedLeftClickBlock(PlayerInteractEvent.LeftClickBlock event) { + if (isParalyzed(event.getEntity())) { + event.setCanceled(true); + } + } + + static void handleParalyzedRightClickBlock(PlayerInteractEvent.RightClickBlock event) { + if (isParalyzed(event.getEntity())) { + event.setCancellationResult(InteractionResult.FAIL); + event.setCanceled(true); + } + } + + static void handleParalyzedRightClickItem(PlayerInteractEvent.RightClickItem event) { + if (isParalyzed(event.getEntity())) { + event.setCancellationResult(InteractionResult.FAIL); + event.setCanceled(true); + } + } + + static void handleParalyzedEntityInteract(PlayerInteractEvent.EntityInteract event) { + if (isParalyzed(event.getEntity())) { + event.setCancellationResult(InteractionResult.FAIL); + event.setCanceled(true); + } + } + + static void handleParalyzedEntityInteractSpecific(PlayerInteractEvent.EntityInteractSpecific event) { + if (isParalyzed(event.getEntity())) { + event.setCancellationResult(InteractionResult.FAIL); + event.setCanceled(true); + } + } + + private static boolean isParalyzed(Player player) { + return player.hasEffect(AntarchyForgeMisc.PARALYZED.get()); + } + + static void handleDreamSandJump(LivingEvent.LivingJumpEvent event) { + LivingEntity livingEntity = event.getEntity(); + if (!AntarchySettings.dreamSandEnabled() || isDreamSandLowGravityBlacklisted(livingEntity)) { + clearDreamSandLowGravity(livingEntity); + } else if (isStandingOnDreamSand(livingEntity)) { + livingEntity.setDeltaMovement( + livingEntity.getDeltaMovement().x, + livingEntity.getDeltaMovement().y * AntarchySettings.dreamSandJumpVelocityMultiplier(), + livingEntity.getDeltaMovement().z + ); + DreamSandLowGravityAccess access = dreamSandAccess(livingEntity); + access.antarchy$setDreamSandLowGravityActive(true); + access.antarchy$setDreamSandLowGravityTicksRemaining((int) Math.max(1L, Math.round(AntarchySettings.dreamSandEffectDurationSeconds() * 20.0D))); + access.antarchy$setDreamSandLandingGraceTicks(0); + } + + } + + static void tickDreadAndIchor(TickEvent.PlayerTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + Player player = event.player; + if (player.level().isClientSide()) { + return; + } + if (player.isInFluidType(AntarchyForgeFluidTypes.ICHOR_TYPE.get()) && AntarchySettings.ichorWitherEnabled()) { + player.addEffect(new MobEffectInstance(MobEffects.WITHER, 40, 0, false, true, true)); + } + } + + static void tickScorpionWhips(TickEvent.PlayerTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + if (event.player instanceof ServerPlayer player) { + ScorpionWhipTetherManager.tick(player); + } + } + + static void tickMinersDreamExcavations(TickEvent.ServerTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + for (ServerLevel level : event.getServer().getAllLevels()) { + AttitudeAdjusterSlamManager.tick(level); + MinersDreamExcavationManager.tick(level); + } + } + + static void tickDreamSandLowGravity(LivingEvent.LivingTickEvent event) { + LivingEntity livingEntity = event.getEntity(); + + DreamSandLowGravityAccess access = dreamSandAccess(livingEntity); + int landingGraceTicks = access.antarchy$getDreamSandLandingGraceTicks(); + if (landingGraceTicks > 0) { + access.antarchy$setDreamSandLandingGraceTicks(landingGraceTicks - 1); + } + + if (!AntarchySettings.dreamSandEnabled() || isDreamSandLowGravityBlacklisted(livingEntity) || !access.antarchy$isDreamSandLowGravityActive()) { + return; + } + + int remainingTicks = access.antarchy$getDreamSandLowGravityTicksRemaining(); + if (remainingTicks > 0) { + access.antarchy$setDreamSandLowGravityTicksRemaining(remainingTicks - 1); + } + if (access.antarchy$getDreamSandLowGravityTicksRemaining() <= 0) { + clearDreamSandLowGravity(livingEntity); + return; + } + + if (isOnSolidGround(livingEntity)) { + access.antarchy$setDreamSandLowGravityActive(false); + access.antarchy$setDreamSandLowGravityTicksRemaining(0); + access.antarchy$setDreamSandLandingGraceTicks(2); + } else if (!livingEntity.onGround() && livingEntity.getDeltaMovement().y < 0.0D) { + livingEntity.setDeltaMovement( + livingEntity.getDeltaMovement().x, + livingEntity.getDeltaMovement().y * AntarchySettings.dreamSandGravityMultiplier(), + livingEntity.getDeltaMovement().z + ); + } + } + + private static boolean isOnSolidGround(LivingEntity livingEntity) { + return livingEntity.onGround() && livingEntity.getBlockStateOn().blocksMotion(); + } + + private static boolean isStandingOnDreamSand(LivingEntity livingEntity) { + return livingEntity.level().getBlockState(livingEntity.getOnPosLegacy()).is(AntarchyForgeBlocks.DREAM_SAND.get()); + } + + static void handleAntiwaterFall(LivingFallEvent event) { + LivingEntity livingEntity = event.getEntity(); + if (intersectsAntiwater(livingEntity, livingEntity.getBoundingBox().inflate(0.05D))) { + event.setCanceled(true); + } + } + + static void handleDreamSandFall(LivingFallEvent event) { + LivingEntity livingEntity = event.getEntity(); + DreamSandLowGravityAccess access = dreamSandAccess(livingEntity); + if (!AntarchySettings.dreamSandEnabled() + || isDreamSandLowGravityBlacklisted(livingEntity) + || (!access.antarchy$isDreamSandLowGravityActive() && access.antarchy$getDreamSandLandingGraceTicks() <= 0)) { + return; + } + + event.setCanceled(true); + } + + private static boolean isDreamSandLowGravityBlacklisted(LivingEntity livingEntity) { + return livingEntity.getType().is(AntarchyTags.Entities.DREAM_SAND_LOW_GRAVITY_BLACKLIST); + } + + + private static boolean intersectsAntiwater(Entity entity, AABB box) { + BlockPos.MutableBlockPos cursor = new BlockPos.MutableBlockPos(); + BlockPos min = BlockPos.containing(box.minX, box.minY, box.minZ); + BlockPos max = BlockPos.containing(box.maxX, box.maxY, box.maxZ); + for (int x = min.getX(); x <= max.getX(); x++) { + for (int y = min.getY(); y <= max.getY(); y++) { + for (int z = min.getZ(); z <= max.getZ(); z++) { + cursor.set(x, y, z); + FluidState fluidState = entity.level().getFluidState(cursor); + if (AntarchyFluidChecks.isAntiwater(fluidState)) { + return true; + } + } + } + } + return false; + } + + static void onInvertedEffectExpired(MobEffectEvent.Expired event) { + if (event.getEffectInstance() == null) return; + if (event.getEffectInstance().getEffect() != AntarchyForgeMisc.INVERTED.get()) return; + LivingEntity entity = event.getEntity(); + if (!entity.level().isClientSide()) { + com.craisinlord.antarchy.content.gravity.AntarchyGravityApi.setGravityDirection( + entity, + com.craisinlord.antarchy.content.gravity.AntarchyGravityDirection.DOWN, + new com.craisinlord.antarchy.content.gravity.AntarchyGravityTransition(12)); + if (entity instanceof Player player) { + notifyNearbyReveriesOfInversionChange(player); + } + } + } + + private static void notifyNearbyReveriesOfInversionChange(Player player) { + for (ReverieEntity reverie : player.level().getEntitiesOfClass( + ReverieEntity.class, + player.getBoundingBox().inflate(48.0D) + )) { + reverie.syncFocusInversionState(); + } + } + + private static void addPotionMix(net.minecraft.world.item.alchemy.Potion input, Item ingredient, net.minecraft.world.item.alchemy.Potion output) { + net.minecraftforge.common.brewing.BrewingRecipeRegistry.addRecipe(new net.minecraftforge.common.brewing.IBrewingRecipe() { + @Override + public boolean isInput(ItemStack stack) { + return stack.is(Items.POTION) && net.minecraft.world.item.alchemy.PotionUtils.getPotion(stack) == input; + } + + @Override + public boolean isIngredient(ItemStack stack) { + return stack.is(ingredient); + } + + @Override + public ItemStack getOutput(ItemStack input1, ItemStack ingredient1) { + return net.minecraft.world.item.alchemy.PotionUtils.setPotion(new ItemStack(input1.getItem()), output); + } + }); + } + + static void registerBrewingRecipes() { + net.minecraft.tags.TagKey rootsTag = net.minecraft.tags.TagKey.create( + net.minecraft.core.registries.Registries.ITEM, + net.minecraft.resources.ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "roots") + ); + net.minecraftforge.common.brewing.BrewingRecipeRegistry.addRecipe(new BrewingRecipe( + net.minecraft.world.item.crafting.Ingredient.of(Items.POTION), + net.minecraft.world.item.crafting.Ingredient.of(AntarchyForgeItems.CORN.get()), + new ItemStack(AntarchyForgeItems.HIGH_FRUCTOSE_CORN_SYRUP.get()) + ) { + @Override + public boolean isInput(ItemStack stack) { + return stack.is(Items.POTION) && net.minecraft.world.item.alchemy.PotionUtils.getPotion(stack) == net.minecraft.world.item.alchemy.Potions.WATER; + } + + @Override + public boolean isIngredient(ItemStack stack) { + return stack.is(AntarchyForgeItems.CORN.get()); + } + + @Override + public ItemStack getOutput(ItemStack input, ItemStack ingredient) { + return CustomBrewingRecipes.getOutput(input, ingredient); + } + }); + net.minecraftforge.common.brewing.BrewingRecipeRegistry.addRecipe(new BrewingRecipe( + net.minecraft.world.item.crafting.Ingredient.of(AntarchyForgeItems.HIGH_FRUCTOSE_CORN_SYRUP.get()), + net.minecraft.world.item.crafting.Ingredient.of(rootsTag), + new ItemStack(AntarchyForgeItems.ROOT_BEER.get()) + ) { + @Override + public boolean isInput(ItemStack stack) { + return stack.is(AntarchyForgeItems.HIGH_FRUCTOSE_CORN_SYRUP.get()); + } + + @Override + public boolean isIngredient(ItemStack stack) { + return stack.is(rootsTag); + } + + @Override + public ItemStack getOutput(ItemStack input, ItemStack ingredient) { + return CustomBrewingRecipes.getOutput(input, ingredient); + } + }); + addPotionMix(Potions.AWKWARD, AntarchyForgeItems.LUCID_EYE.get(), AntarchyForgeMisc.INVERSION.get()); + addPotionMix(AntarchyForgeMisc.INVERSION.get(), Items.REDSTONE, AntarchyForgeMisc.LONG_INVERSION.get()); + addPotionMix(Potions.AWKWARD, AntarchyForgeItems.STINK_BUG.get(), AntarchyForgeMisc.STINKY_POTION.get()); + addPotionMix(AntarchyForgeMisc.STINKY_POTION.get(), Items.REDSTONE, AntarchyForgeMisc.LONG_STINKY.get()); + addPotionMix(Potions.AWKWARD, AntarchyForgeItems.BASILISK_FANG.get(), AntarchyForgeMisc.PARALYSIS.get()); + addPotionMix(AntarchyForgeMisc.PARALYSIS.get(), Items.REDSTONE, AntarchyForgeMisc.LONG_PARALYSIS.get()); + addPotionMix(Potions.AWKWARD, AntarchyForgeItems.MOLEWORM_ITEM.get(), AntarchyForgeMisc.HASTE.get()); + addPotionMix(AntarchyForgeMisc.HASTE.get(), Items.GLOWSTONE_DUST, AntarchyForgeMisc.STRONG_HASTE.get()); + addPotionMix(Potions.AWKWARD, AntarchyForgeItems.CLOUD_SHARK_FIN.get(), Potions.SLOW_FALLING); + addPotionMix(Potions.AWKWARD, AntarchyForgeItems.JUMPY_BUG_LEG.get(), Potions.LEAPING); + addPotionMix(Potions.AWKWARD, AntarchyForgeItems.CORNEA_EAR.get(), Potions.NIGHT_VISION); + addPotionMix(Potions.AWKWARD, AntarchyForgeItems.URANIUM_NUGGET.get(), AntarchyForgeMisc.SHRINKING.get()); + addPotionMix(AntarchyForgeMisc.SHRINKING.get(), Items.GLOWSTONE_DUST, AntarchyForgeMisc.STRONG_SHRINKING.get()); + addPotionMix(AntarchyForgeMisc.STRONG_SHRINKING.get(), Items.GLOWSTONE_DUST, AntarchyForgeMisc.EXTREME_SHRINKING.get()); + addPotionMix(Potions.AWKWARD, AntarchyForgeItems.TITANIUM_NUGGET.get(), AntarchyForgeMisc.GROWING.get()); + addPotionMix(AntarchyForgeMisc.GROWING.get(), Items.GLOWSTONE_DUST, AntarchyForgeMisc.STRONG_GROWING.get()); + addPotionMix(AntarchyForgeMisc.STRONG_GROWING.get(), Items.GLOWSTONE_DUST, AntarchyForgeMisc.EXTREME_GROWING.get()); + } + + static void onMobEffectApplicable(MobEffectEvent.Applicable event) { + if (event.getEffectInstance() == null) { + return; + } + + if (event.getEffectInstance().getEffect() == AntarchyForgeMisc.DREAD.get() && !(event.getEntity() instanceof Player)) { + event.setResult(net.minecraftforge.eventbus.api.Event.Result.DENY); + return; + } + + if (event.getEntity() instanceof Player player && isWearingFullNightmareArmor(player) + && (event.getEffectInstance().getEffect() == net.minecraft.world.effect.MobEffects.WITHER + || event.getEffectInstance().getEffect() == AntarchyForgeMisc.DREAD.get())) { + event.setResult(net.minecraftforge.eventbus.api.Event.Result.DENY); + return; + } + + if (event.getEntity().getType().is(AntarchyTags.Entities.INVERTED_IMMUNE) + && event.getEffectInstance().getEffect() == AntarchyForgeMisc.INVERTED.get()) { + event.setResult(net.minecraftforge.eventbus.api.Event.Result.DENY); + return; + } + + if (event.getEntity().getType().is(AntarchyTags.Entities.SIZE_CHANGING_IMMUNE) + && (event.getEffectInstance().getEffect() == AntarchyForgeMisc.SHRINKING_EFFECT.get() || event.getEffectInstance().getEffect() == AntarchyForgeMisc.GROWTH_EFFECT.get())) { + event.setResult(net.minecraftforge.eventbus.api.Event.Result.DENY); + return; + } + + if (event.getEntity().getType().is(AntarchyTags.Entities.PARALYSIS_IMMUNE) + && event.getEffectInstance().getEffect() == AntarchyForgeMisc.PARALYZED.get()) { + event.setResult(net.minecraftforge.eventbus.api.Event.Result.DENY); + return; + } + + if (event.getEntity() instanceof Player player + && event.getEffectInstance().getEffect() == AntarchyForgeMisc.INVERTED.get() + && !player.hasEffect(AntarchyForgeMisc.INVERTED.get())) { + notifyNearbyReveriesOfInversionChange(player); + } + } + + + static void onInvertedEffectRemoved(MobEffectEvent.Remove event) { + if (event.getEffect() != AntarchyForgeMisc.INVERTED.get()) return; + LivingEntity entity = event.getEntity(); + if (!entity.level().isClientSide()) { + com.craisinlord.antarchy.content.gravity.AntarchyGravityApi.setGravityDirection( + entity, + com.craisinlord.antarchy.content.gravity.AntarchyGravityDirection.DOWN, + new com.craisinlord.antarchy.content.gravity.AntarchyGravityTransition(12)); + if (entity instanceof Player player) { + notifyNearbyReveriesOfInversionChange(player); + } + } + } + + static void handleBlockToolModification(BlockEvent.BlockToolModificationEvent event) { + if (event.getToolAction() != net.minecraftforge.common.ToolActions.AXE_STRIP) { + return; + } + + BlockState state = event.getState(); + if (!state.hasProperty(RotatedPillarBlock.AXIS)) { + return; + } + + if (state.is(AntarchyForgeBlocks.OURANWOOD_LOG.get())) { + event.setFinalState(AntarchyForgeBlocks.STRIPPED_OURANWOOD_LOG.get().defaultBlockState().setValue(RotatedPillarBlock.AXIS, state.getValue(RotatedPillarBlock.AXIS))); + return; + } + + if (state.is(AntarchyForgeBlocks.MOSSY_OURANWOOD_LOG.get())) { + event.setFinalState(AntarchyForgeBlocks.STRIPPED_OURANWOOD_LOG.get().defaultBlockState().setValue(RotatedPillarBlock.AXIS, state.getValue(RotatedPillarBlock.AXIS))); + return; + } + + if (state.is(AntarchyForgeBlocks.OURANWOOD_WOOD.get())) { + event.setFinalState(AntarchyForgeBlocks.STRIPPED_OURANWOOD_WOOD.get().defaultBlockState().setValue(RotatedPillarBlock.AXIS, state.getValue(RotatedPillarBlock.AXIS))); + return; + } + + if (state.is(AntarchyForgeBlocks.MOSSY_OURANWOOD_WOOD.get())) { + event.setFinalState(AntarchyForgeBlocks.STRIPPED_OURANWOOD_WOOD.get().defaultBlockState().setValue(RotatedPillarBlock.AXIS, state.getValue(RotatedPillarBlock.AXIS))); + return; + } + + if (state.is(AntarchyForgeBlocks.PEACH_LOG.get())) { + event.setFinalState(AntarchyForgeBlocks.STRIPPED_PEACH_LOG.get().defaultBlockState().setValue(RotatedPillarBlock.AXIS, state.getValue(RotatedPillarBlock.AXIS))); + return; + } + + if (state.is(AntarchyForgeBlocks.PEACH_WOOD.get())) { + event.setFinalState(AntarchyForgeBlocks.STRIPPED_PEACH_WOOD.get().defaultBlockState().setValue(RotatedPillarBlock.AXIS, state.getValue(RotatedPillarBlock.AXIS))); + } + } + + static void onCommonSetup(FMLCommonSetupEvent event) { + BloodCrystalShardItem.SYNC_BLOODGLASS = AntarchyForgeEvents::syncBloodglass; + event.enqueueWork(() -> { + registerBrewingRecipes(); + DispenserBlock.registerBehavior(AntarchyForgeItems.SHRINK_RAY.get(), new SizeRayDispenseBehavior()); + DispenserBlock.registerBehavior(AntarchyForgeItems.GROWTH_RAY.get(), new SizeRayDispenseBehavior()); + DispenserBlock.registerBehavior(AntarchyForgeItems.SQUIDZOOKA.get(), new SquidzookaDispenseBehavior()); + DispenserBlock.registerBehavior(AntarchyForgeItems.RPO_LAUNCHER.get(), new RpoLauncherDispenseBehavior()); + DispenserBlock.registerBehavior(AntarchyForgeItems.WATER_CANNON.get(), new WaterCannonDispenseBehavior()); + AntimetalMinecartDispenseBehavior antimetalMinecartDispenseBehavior = new AntimetalMinecartDispenseBehavior(); + DispenserBlock.registerBehavior(Items.MINECART, antimetalMinecartDispenseBehavior); + DispenserBlock.registerBehavior(Items.CHEST_MINECART, antimetalMinecartDispenseBehavior); + DispenserBlock.registerBehavior(Items.FURNACE_MINECART, antimetalMinecartDispenseBehavior); + DispenserBlock.registerBehavior(Items.TNT_MINECART, antimetalMinecartDispenseBehavior); + DispenserBlock.registerBehavior(Items.HOPPER_MINECART, antimetalMinecartDispenseBehavior); + DispenserBlock.registerBehavior(Items.COMMAND_BLOCK_MINECART, antimetalMinecartDispenseBehavior); + LucidEyeProjectileEntity.defaultItemSupplier = () -> AntarchyForgeItems.LUCID_PEARL.get(); + LucidEntity.invertedEffectSupplier = () -> AntarchyForgeMisc.INVERTED.get(); + FluidInteractionRegistry.addInteraction( + AntarchyForgeFluidTypes.ANTIWATER_TYPE.get(), + new FluidInteractionRegistry.InteractionInformation( + ForgeMod.WATER_TYPE.get(), + fluidState -> fluidState.isSource() + ? AntarchyForgeBlocks.ANTIMETAL.get().defaultBlockState() + : AntarchyForgeBlocks.NYXITE.get().defaultBlockState() + ) + ); + LucidEntity.boltEntityTypeSupplier = () -> AntarchyForgeEntites.LUCID_BOLT.get(); + LucidBoltEntity.invertedEffectSupplier = () -> AntarchyForgeMisc.INVERTED.get(); + LucidEyeProjectileEntity.invertedEffectSupplier = () -> AntarchyForgeMisc.INVERTED.get(); + MultipartFramework.bootstrap( + (owner, partIndex, spec) -> new MultipartPartEntity((Entity) owner, owner, partIndex, spec), + new MultipartFramework.NetworkBridge() { + @Override + public void sendAttack(java.util.UUID parentId, int partIndex, float damage) { + AntarchyForgeNetworkCore.sendToServer( + new com.craisinlord.antarchy.content.entity.multipart.network.MultipartAttackPayload(parentId, partIndex, damage) + ); + } + + @Override + public void sendInteract(java.util.UUID parentId, int partIndex, int handId) { + AntarchyForgeNetworkCore.sendToServer( + new com.craisinlord.antarchy.content.entity.multipart.network.MultipartInteractPayload(parentId, partIndex, handId) + ); + } + } + ); + ComposterBlock.COMPOSTABLES.put(AntarchyForgeBlocks.UMBRAL_MOSS_BLOCK.get().asItem(), 0.65f); + ComposterBlock.COMPOSTABLES.put(AntarchyForgeBlocks.UMBRAL_MOSS_CARPET.get().asItem(), 0.3f); + ComposterBlock.COMPOSTABLES.put(AntarchyForgeBlocks.BLUSH_MOSS_BLOCK.get().asItem(), 0.65f); + ComposterBlock.COMPOSTABLES.put(AntarchyForgeBlocks.BLUSH_MOSS_CARPET.get().asItem(), 0.3f); + ComposterBlock.COMPOSTABLES.put(AntarchyForgeBlocks.HUSHWEED.get().asItem(), 0.65f); + ComposterBlock.COMPOSTABLES.put(AntarchyForgeItems.CORNEA_EAR.get(), 0.65f); + ComposterBlock.COMPOSTABLES.put(AntarchyForgeBlocks.PEACH_LEAVES.get().asItem(), 0.3f); + ComposterBlock.COMPOSTABLES.put(AntarchyForgeItems.PEACH_SAPLING_ITEM.get(), 0.3f); + ComposterBlock.COMPOSTABLES.put(AntarchyForgeItems.CORN.get(), 0.65f); + ComposterBlock.COMPOSTABLES.put(AntarchyForgeItems.CORN_SEEDS.get(), 0.3f); + ComposterBlock.COMPOSTABLES.put(AntarchyForgeItems.PEACH.get(), 0.65f); + }); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeItems.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeItems.java new file mode 100644 index 00000000..4cb22e0c --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeItems.java @@ -0,0 +1,1012 @@ +package com.craisinlord.antarchy.forge.registry; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.block.entity.AntNestBlockEntity; +import com.craisinlord.antarchy.content.block.entity.PotentNyxiteBlockEntity; +import com.craisinlord.antarchy.content.block.entity.WaspNestBlockEntity; +import com.craisinlord.antarchy.content.entity.SizeRayProjectileEntity; +import com.craisinlord.antarchy.content.item.*; +import com.craisinlord.antarchy.content.item.BloodCrystalArmorItem; +import com.craisinlord.antarchy.content.item.BloodCrystalAppleItem; +import com.craisinlord.antarchy.content.item.BloodCrystalKatanaItem; +import com.craisinlord.antarchy.content.item.BloodCrystalShardItem; +import com.craisinlord.antarchy.content.item.ultimate.*; +import com.craisinlord.antarchy.content.item.NightmareArmorItem; +import com.craisinlord.antarchy.content.item.PrimordialArmorItem; +import com.craisinlord.antarchy.content.item.JumpyBootsItem; +import com.craisinlord.antarchy.content.item.WaterCannonItem; +import com.craisinlord.antarchy.content.item.NightmareSwordItem; +import com.craisinlord.antarchy.content.item.LucidEyeItem; +import com.craisinlord.antarchy.content.item.LucidPearlItem; +import com.craisinlord.antarchy.content.item.OuranwoodBoatOnlyItem; +import com.craisinlord.antarchy.content.item.OuranwoodChestBoatItem; +import com.craisinlord.antarchy.content.item.RainbowSugarItem; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.food.FoodProperties; +import net.minecraft.world.item.*; +import net.minecraft.world.item.PlaceOnWaterBlockItem; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.common.ForgeSpawnEggItem; +import net.minecraftforge.registries.RegistryObject; +import net.minecraft.sounds.SoundEvents; + +import java.util.Collection; +import java.util.EnumMap; +import java.util.List; + +public final class AntarchyForgeItems { + static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(Antarchy.MODID); + + private static final java.util.Map BASE_DURABILITY = java.util.Map.of( + ArmorItem.Type.BOOTS, 13, + ArmorItem.Type.LEGGINGS, 15, + ArmorItem.Type.CHESTPLATE, 16, + ArmorItem.Type.HELMET, 11 + ); + + private static int armorDurability(ArmorItem.Type type, int multiplier) { + return BASE_DURABILITY.get(type) * multiplier; + } + + private static ArmorMaterial armorMaterial( + int durabilityMultiplier, + java.util.Map defense, + int enchantmentValue, + net.minecraft.sounds.SoundEvent equipSound, + java.util.function.Supplier repairIngredient, + float toughness, + float knockbackResistance, + String name + ) { + return new ArmorMaterial() { + @Override + public int getDurabilityForType(ArmorItem.Type type) { + return BASE_DURABILITY.get(type) * durabilityMultiplier; + } + + @Override + public int getDefenseForType(ArmorItem.Type type) { + return defense.getOrDefault(type, 0); + } + + @Override + public int getEnchantmentValue() { + return enchantmentValue; + } + + @Override + public net.minecraft.sounds.SoundEvent getEquipSound() { + return equipSound; + } + + @Override + public Ingredient getRepairIngredient() { + return repairIngredient.get(); + } + + @Override + public String getName() { + return new ResourceLocation(Antarchy.MODID, name).toString(); + } + + @Override + public float getToughness() { + return toughness; + } + + @Override + public float getKnockbackResistance() { + return knockbackResistance; + } + }; + } + + // Tier constants + public static final Tier ULTIMATE_TIER = new SimpleToolTier( + 3072, + 10.5F, + 0.0F, + Tiers.NETHERITE.getLevel(), + 25, + AntarchyForgeItems::ultimateRepairIngredient + ); + public static final Tier BLOOD_CRYSTAL_KATANA_TIER = new SimpleToolTier( + 1200, + 8.0F, + 0.0F, + Tiers.DIAMOND.getLevel(), + 18, + AntarchyForgeItems::bloodCrystalRepairIngredient + ); + public static final Tier ATTITUDE_ADJUSTER_TIER = new SimpleToolTier( + 3072, + 7.0F, + 0.0F, + Tiers.NETHERITE.getLevel(), + 18, + () -> Ingredient.of(AntarchyForgeItems.HERCULES_HORN.get()) + ); + + public static final RegistryObject NIGHTMARE_SCALE = ITEMS.registerSimpleItem("nightmare_scale", new Item.Properties().rarity(Rarity.RARE).fireResistant()); + + private static final ArmorMaterial ULTIMATE_ARMOR_MATERIAL = armorMaterial( + 40, createUltimateArmorDefense(), 10, SoundEvents.ARMOR_EQUIP_DIAMOND, + AntarchyForgeItems::ultimateRepairIngredient, 2.0F, + (float) AntarchySettings.ultimateArmorKnockbackResistance(), "ultimate_armor"); + private static final ArmorMaterial NIGHTMARE_ARMOR_MATERIAL = armorMaterial( + 37, createNightmareArmorDefense(), 10, SoundEvents.ARMOR_EQUIP_NETHERITE, + () -> Ingredient.of(NIGHTMARE_SCALE.get()), 3.0F, + (float) AntarchySettings.nightmareArmorKnockbackResistance(), "nightmare_armor"); + private static final ArmorMaterial BLOOD_CRYSTAL_ARMOR_MATERIAL = armorMaterial( + 33, createBloodCrystalArmorDefense(), 30, SoundEvents.ARMOR_EQUIP_DIAMOND, + AntarchyForgeItems::bloodCrystalRepairIngredient, 0.0F, 0.0F, "blood_crystal"); + private static final ArmorMaterial MOGGLES_ARMOR_MATERIAL = armorMaterial( + 25, createMogglesArmorDefense(), 12, SoundEvents.ARMOR_EQUIP_GOLD, + () -> Ingredient.of(Items.GOLD_INGOT), 0.0F, 0.0F, "moggles"); + public static final RegistryObject PRIMORDIAL_SCUTE = ITEMS.registerSimpleItem("primordial_scute", + new Item.Properties().rarity(Rarity.UNCOMMON)); + private static final ArmorMaterial PRIMORDIAL_ARMOR_MATERIAL = armorMaterial( + 33, createPrimordialArmorDefense(), 15, SoundEvents.ARMOR_EQUIP_NETHERITE, + () -> Ingredient.of(PRIMORDIAL_SCUTE.get()), 3.0F, 0.1F, "primordial"); + private static final ArmorMaterial JUMPY_BOOTS_ARMOR_MATERIAL = armorMaterial( + 37, createJumpyBootsDefense(), 15, SoundEvents.ARMOR_EQUIP_NETHERITE, + () -> Ingredient.of(Items.NETHERITE_BOOTS), 3.0F, 0.1F, "jumpy_boots"); + private static final ArmorMaterial FALLEN_KING_CROWN_ARMOR_MATERIAL = armorMaterial( + 25, createFallenKingCrownDefense(), 25, SoundEvents.ARMOR_EQUIP_GOLD, + () -> Ingredient.of(Items.GOLD_INGOT), 0.0F, 0.0F, "fallen_king_crown"); + + // Block items + public static final RegistryObject DUPLICATOR_LOG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.DUPLICATOR_LOG); + public static final RegistryObject OURANWOOD_LOG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.OURANWOOD_LOG); + public static final RegistryObject OURANWOOD_WOOD_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.OURANWOOD_WOOD); + public static final RegistryObject MOSSY_OURANWOOD_LOG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.MOSSY_OURANWOOD_LOG); + public static final RegistryObject MOSSY_OURANWOOD_WOOD_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.MOSSY_OURANWOOD_WOOD); + public static final RegistryObject STRIPPED_OURANWOOD_LOG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.STRIPPED_OURANWOOD_LOG); + public static final RegistryObject STRIPPED_OURANWOOD_WOOD_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.STRIPPED_OURANWOOD_WOOD); + public static final RegistryObject OURANWOOD_PLANKS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.OURANWOOD_PLANKS); + public static final RegistryObject OURANWOOD_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.OURANWOOD_STAIRS); + public static final RegistryObject OURANWOOD_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.OURANWOOD_SLAB); + public static final RegistryObject OURANWOOD_FENCE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.OURANWOOD_FENCE); + public static final RegistryObject OURANWOOD_FENCE_GATE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.OURANWOOD_FENCE_GATE); + public static final RegistryObject OURANWOOD_DOOR_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.OURANWOOD_DOOR); + public static final RegistryObject OURANWOOD_TRAPDOOR_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.OURANWOOD_TRAPDOOR); + public static final RegistryObject OURANWOOD_PRESSURE_PLATE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.OURANWOOD_PRESSURE_PLATE); + public static final RegistryObject OURANWOOD_BUTTON_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.OURANWOOD_BUTTON); + public static final RegistryObject OURANWOOD_LEAVES_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.OURANWOOD_LEAVES); + public static final RegistryObject OURANWOOD_ACORN = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.OURANWOOD_ACORN_BLOCK); + public static final RegistryObject PEACH_LOG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.PEACH_LOG); + public static final RegistryObject PEACH_WOOD_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.PEACH_WOOD); + public static final RegistryObject STRIPPED_PEACH_LOG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.STRIPPED_PEACH_LOG); + public static final RegistryObject STRIPPED_PEACH_WOOD_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.STRIPPED_PEACH_WOOD); + public static final RegistryObject PEACH_PLANKS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.PEACH_PLANKS); + public static final RegistryObject PEACH_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.PEACH_STAIRS); + public static final RegistryObject PEACH_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.PEACH_SLAB); + public static final RegistryObject PEACH_FENCE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.PEACH_FENCE); + public static final RegistryObject PEACH_FENCE_GATE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.PEACH_FENCE_GATE); + public static final RegistryObject PEACH_DOOR_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.PEACH_DOOR); + public static final RegistryObject PEACH_TRAPDOOR_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.PEACH_TRAPDOOR); + public static final RegistryObject PEACH_PRESSURE_PLATE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.PEACH_PRESSURE_PLATE); + public static final RegistryObject PEACH_BUTTON_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.PEACH_BUTTON); + public static final RegistryObject PEACH_LEAVES_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.PEACH_LEAVES); + public static final RegistryObject PEACH_SAPLING_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.PEACH_SAPLING); + public static final RegistryObject ORANGE_MILKWEED_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.ORANGE_MILKWEED); + public static final RegistryObject PINK_MILKWEED_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.PINK_MILKWEED); + public static final RegistryObject CAMELLIA_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.CAMELLIA); + public static final RegistryObject SPIDER_LILY_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.SPIDER_LILY); + public static final RegistryObject GIANT_LILY_PAD_ITEM = ITEMS.register("giant_lily_pad", + () -> new com.craisinlord.antarchy.content.item.GiantLilyPadItem(AntarchyForgeBlocks.GIANT_LILY_PAD.get(), new Item.Properties())); + public static final RegistryObject SEASHELL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.SEASHELL); + public static final RegistryObject LOTUS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.LOTUS); + public static final RegistryObject OURANWOOD_SIGN_ITEM = ITEMS.register("ouranwood_sign", + () -> new net.minecraft.world.item.SignItem(new Item.Properties().stacksTo(16), AntarchyForgeBlocks.OURANWOOD_SIGN.get(), AntarchyForgeBlocks.OURANWOOD_WALL_SIGN.get())); + public static final RegistryObject OURANWOOD_HANGING_SIGN_ITEM = ITEMS.register("ouranwood_hanging_sign", + () -> new net.minecraft.world.item.HangingSignItem(AntarchyForgeBlocks.OURANWOOD_HANGING_SIGN.get(), AntarchyForgeBlocks.OURANWOOD_WALL_HANGING_SIGN.get(), new Item.Properties().stacksTo(16))); + public static final RegistryObject OURANWOOD_BOAT = ITEMS.register("ouranwood_boat", + () -> new OuranwoodBoatOnlyItem(AntarchyForgeEntites.OURANWOOD_BOAT_ENTITY, new Item.Properties().stacksTo(1))); + public static final RegistryObject OURANWOOD_CHEST_BOAT = ITEMS.register("ouranwood_chest_boat", + () -> new OuranwoodChestBoatItem(AntarchyForgeEntites.OURANWOOD_CHEST_BOAT_ENTITY, new Item.Properties().stacksTo(1))); + public static final RegistryObject PEACH_SIGN_ITEM = ITEMS.register("peach_sign", + () -> new net.minecraft.world.item.SignItem(new Item.Properties().stacksTo(16), AntarchyForgeBlocks.PEACH_SIGN.get(), AntarchyForgeBlocks.PEACH_WALL_SIGN.get())); + public static final RegistryObject PEACH_HANGING_SIGN_ITEM = ITEMS.register("peach_hanging_sign", + () -> new net.minecraft.world.item.HangingSignItem(AntarchyForgeBlocks.PEACH_HANGING_SIGN.get(), AntarchyForgeBlocks.PEACH_WALL_HANGING_SIGN.get(), new Item.Properties().stacksTo(16))); + public static final RegistryObject PEACH_BOAT = ITEMS.register("peach_boat", + () -> new PeachBoatOnlyItem(AntarchyForgeEntites.PEACH_BOAT_ENTITY, new Item.Properties().stacksTo(1))); + public static final RegistryObject PEACH_CHEST_BOAT = ITEMS.register("peach_chest_boat", + () -> new PeachChestBoatItem(AntarchyForgeEntites.PEACH_CHEST_BOAT_ENTITY, new Item.Properties().stacksTo(1))); + public static final RegistryObject CRITTER_CAGE = ITEMS.register("critter_cage", + () -> new CritterCageItem(new Item.Properties().stacksTo(16))); + public static final RegistryObject DUPLICATOR_SAPLING_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.DUPLICATOR_SAPLING); + public static final RegistryObject RED_ANT_NEST_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.RED_ANT_NEST); + public static final RegistryObject BROWN_ANT_NEST_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.BROWN_ANT_NEST); + public static final RegistryObject RAINBOW_ANT_NEST_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.RAINBOW_ANT_NEST); + public static final RegistryObject TERMITE_NEST_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.TERMITE_NEST); + public static final RegistryObject URANIUM_ORE_ITEM = ITEMS.register("uranium_ore", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.URANIUM_ORE.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject DEEPSLATE_URANIUM_ORE_ITEM = ITEMS.register("deepslate_uranium_ore", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.DEEPSLATE_URANIUM_ORE.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject TITANIUM_ORE_ITEM = ITEMS.register("titanium_ore", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.TITANIUM_ORE.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject DEEPSLATE_TITANIUM_ORE_ITEM = ITEMS.register("deepslate_titanium_ore", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.DEEPSLATE_TITANIUM_ORE.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject BLUESTONE_DUST = ITEMS.register("bluestone", + () -> new BluestoneDustItem(AntarchyForgeBlocks.BLUESTONE_WIRE.get(), new Item.Properties())); + public static final RegistryObject BLUESTONE_ORE_ITEM = ITEMS.register("bluestone_ore", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.BLUESTONE_ORE.get(), new Item.Properties())); + public static final RegistryObject BLUESTONE_BLOCK_ITEM = ITEMS.register("bluestone_block", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.BLUESTONE_BLOCK.get(), new Item.Properties())); + public static final RegistryObject BLUESTONE_REPEATER_ITEM = ITEMS.register("bluestone_repeater", + () -> new CeilingPlacementTooltipBlockItem(AntarchyForgeBlocks.BLUESTONE_REPEATER.get(), new Item.Properties())); + public static final RegistryObject BLUESTONE_COMPARATOR_ITEM = ITEMS.register("bluestone_comparator", + () -> new CeilingPlacementTooltipBlockItem(AntarchyForgeBlocks.BLUESTONE_COMPARATOR.get(), new Item.Properties())); + public static final RegistryObject BLUESTONE_TORCH_ITEM = ITEMS.register("bluestone_torch", + () -> new CeilingPlacementTooltipBlockItem(AntarchyForgeBlocks.BLUESTONE_TORCH.get(), new Item.Properties())); + public static final RegistryObject URANIUM_BLOCK_ITEM = ITEMS.register("uranium_block", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.URANIUM_BLOCK.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject TITANIUM_BLOCK_ITEM = ITEMS.register("titanium_block", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.TITANIUM_BLOCK.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject RAW_URANIUM_BLOCK_ITEM = ITEMS.register("raw_uranium_block", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.RAW_URANIUM_BLOCK.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject RAW_TITANIUM_BLOCK_ITEM = ITEMS.register("raw_titanium_block", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.RAW_TITANIUM_BLOCK.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject CUT_URANIUM_ITEM = ITEMS.register("cut_uranium", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.CUT_URANIUM.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject CUT_TITANIUM_ITEM = ITEMS.register("cut_titanium", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.CUT_TITANIUM.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject CUT_URANIUM_SLAB_ITEM = ITEMS.register("cut_uranium_slab", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.CUT_URANIUM_SLAB.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject CUT_TITANIUM_SLAB_ITEM = ITEMS.register("cut_titanium_slab", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.CUT_TITANIUM_SLAB.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject CUT_URANIUM_STAIRS_ITEM = ITEMS.register("cut_uranium_stairs", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.CUT_URANIUM_STAIRS.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject CUT_TITANIUM_STAIRS_ITEM = ITEMS.register("cut_titanium_stairs", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.CUT_TITANIUM_STAIRS.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject CHISELED_URANIUM_ITEM = ITEMS.register("chiseled_uranium", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.CHISELED_URANIUM.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject CHISELED_TITANIUM_ITEM = ITEMS.register("chiseled_titanium", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.CHISELED_TITANIUM.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject URANIUM_BULB_ITEM = ITEMS.register("uranium_bulb", + () -> new com.craisinlord.antarchy.content.item.SignalSavingBulbItem(AntarchyForgeBlocks.URANIUM_BULB.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject TITANIUM_BULB_ITEM = ITEMS.register("titanium_bulb", + () -> new com.craisinlord.antarchy.content.item.SignalSavingBulbItem(AntarchyForgeBlocks.TITANIUM_BULB.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject URANIUM_DOOR_ITEM = ITEMS.register("uranium_door", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.URANIUM_DOOR.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject TITANIUM_DOOR_ITEM = ITEMS.register("titanium_door", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.TITANIUM_DOOR.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject URANIUM_TRAPDOOR_ITEM = ITEMS.register("uranium_trapdoor", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.URANIUM_TRAPDOOR.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject TITANIUM_TRAPDOOR_ITEM = ITEMS.register("titanium_trapdoor", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.TITANIUM_TRAPDOOR.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject URANIUM_BARS_ITEM = ITEMS.register("uranium_bars", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.URANIUM_BARS.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject TITANIUM_BARS_ITEM = ITEMS.register("titanium_bars", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.TITANIUM_BARS.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject ANTIMETAL_ITEM = ITEMS.register("antimetal", + () -> new AntimetalBlockItem(AntarchyForgeBlocks.ANTIMETAL.get(), new Item.Properties())); + public static final RegistryObject POLISHED_ANTIMETAL_ITEM = ITEMS.register("polished_antimetal", + () -> new AntimetalBlockItem(AntarchyForgeBlocks.POLISHED_ANTIMETAL.get(), new Item.Properties())); + public static final RegistryObject ANTIMETAL_SCAFFOLDING_ITEM = ITEMS.register("antimetal_scaffolding", + () -> new AntimetalScaffoldingItem(AntarchyForgeBlocks.ANTIMETAL_SCAFFOLDING.get(), new Item.Properties())); + public static final RegistryObject ANTIMETAL_RAIL_ITEM = ITEMS.register("antimetal_rail", + () -> new CeilingPlacementTooltipBlockItem(AntarchyForgeBlocks.ANTIMETAL_RAIL.get(), new Item.Properties())); + public static final RegistryObject ANTIMETAL_POWERED_RAIL_ITEM = ITEMS.register("antimetal_powered_rail", + () -> new CeilingPlacementTooltipBlockItem(AntarchyForgeBlocks.ANTIMETAL_POWERED_RAIL.get(), new Item.Properties())); + public static final RegistryObject ANTIMETAL_DETECTOR_RAIL_ITEM = ITEMS.register("antimetal_detector_rail", + () -> new CeilingPlacementTooltipBlockItem(AntarchyForgeBlocks.ANTIMETAL_DETECTOR_RAIL.get(), new Item.Properties())); + public static final RegistryObject ANTIMETAL_ACTIVATOR_RAIL_ITEM = ITEMS.register("antimetal_activator_rail", + () -> new CeilingPlacementTooltipBlockItem(AntarchyForgeBlocks.ANTIMETAL_ACTIVATOR_RAIL.get(), new Item.Properties())); + public static final RegistryObject SMALL_BLOOD_CRYSTAL_BUD_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.SMALL_BLOOD_CRYSTAL_BUD); + public static final RegistryObject MEDIUM_BLOOD_CRYSTAL_BUD_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.MEDIUM_BLOOD_CRYSTAL_BUD); + public static final RegistryObject LARGE_BLOOD_CRYSTAL_BUD_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.LARGE_BLOOD_CRYSTAL_BUD); + public static final RegistryObject BUDDING_BLOOD_CRYSTAL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.BUDDING_BLOOD_CRYSTAL); + public static final RegistryObject BLOOD_CRYSTAL_ITEM = ITEMS.register("blood_crystal_block", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.BLOOD_CRYSTAL.get(), new Item.Properties())); + public static final RegistryObject BLOOD_CRYSTAL_CRYSTAL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.BLOOD_CRYSTAL_CRYSTAL); + public static final RegistryObject DREAM_SAND_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.DREAM_SAND); + public static final RegistryObject DREAM_SANDSTONE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.DREAM_SANDSTONE); + public static final RegistryObject CHISELED_DREAM_SANDSTONE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.CHISELED_DREAM_SANDSTONE); + public static final RegistryObject CUT_DREAM_SANDSTONE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.CUT_DREAM_SANDSTONE); + public static final RegistryObject SMOOTH_DREAM_SANDSTONE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.SMOOTH_DREAM_SANDSTONE); + public static final RegistryObject DREAM_SANDSTONE_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.DREAM_SANDSTONE_STAIRS); + public static final RegistryObject DREAM_SANDSTONE_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.DREAM_SANDSTONE_SLAB); + public static final RegistryObject DREAM_SANDSTONE_WALL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.DREAM_SANDSTONE_WALL); + public static final RegistryObject SMOOTH_DREAM_SANDSTONE_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.SMOOTH_DREAM_SANDSTONE_STAIRS); + public static final RegistryObject SMOOTH_DREAM_SANDSTONE_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.SMOOTH_DREAM_SANDSTONE_SLAB); + public static final RegistryObject CUT_DREAM_SANDSTONE_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.CUT_DREAM_SANDSTONE_SLAB); + public static final RegistryObject DEAD_STAR_CORAL_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.DEAD_STAR_CORAL_BLOCK); + public static final RegistryObject DEAD_STAR_CORAL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.DEAD_STAR_CORAL); + public static final RegistryObject DEAD_STAR_CORAL_FAN_ITEM = ITEMS.register("dead_star_coral_fan", + () -> new StandingAndWallBlockItem(AntarchyForgeBlocks.DEAD_STAR_CORAL_FAN.get(), AntarchyForgeBlocks.DEAD_STAR_CORAL_WALL_FAN.get(), new Item.Properties(), net.minecraft.core.Direction.UP)); + public static final RegistryObject STAR_CORAL_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.STAR_CORAL_BLOCK); + public static final RegistryObject STAR_CORAL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.STAR_CORAL); + public static final RegistryObject STAR_CORAL_FAN_ITEM = ITEMS.register("star_coral_fan", + () -> new StandingAndWallBlockItem(AntarchyForgeBlocks.STAR_CORAL_FAN.get(), AntarchyForgeBlocks.STAR_CORAL_WALL_FAN.get(), new Item.Properties(), net.minecraft.core.Direction.UP)); + public static final RegistryObject DUCT_TAPE_ITEM = ITEMS.register("duct_tape", + () -> new DuctTapeBlockItem(AntarchyForgeBlocks.DUCT_TAPE.get(), new Item.Properties().stacksTo(1))); + public static final RegistryObject INFESTED_ROOTED_DIRT_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.INFESTED_ROOTED_DIRT); + public static final RegistryObject INFESTED_COARSE_DIRT_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.INFESTED_COARSE_DIRT); + public static final RegistryObject NYXITE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.NYXITE); + public static final RegistryObject MYRMITE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.MYRMITE); + public static final RegistryObject BIOMITE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.BIOMITE); + public static final RegistryObject BIOMITE_TURF_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.BIOMITE_TURF); + public static final RegistryObject BIOWART_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.BIOWART); + public static final RegistryObject BIOWART_TENDRILS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.BIOWART_TENDRILS); + public static final RegistryObject BROODSTONE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.BROODSTONE); + public static final RegistryObject POLISHED_BROODSTONE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.POLISHED_BROODSTONE); + public static final RegistryObject CHISELED_BROODSTONE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.CHISELED_BROODSTONE); + public static final RegistryObject BROODSTONE_BRICKS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.BROODSTONE_BRICKS); + public static final RegistryObject BROODSTONE_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.BROODSTONE_STAIRS); + public static final RegistryObject BROODSTONE_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.BROODSTONE_SLAB); + public static final RegistryObject BROODSTONE_WALL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.BROODSTONE_WALL); + public static final RegistryObject POLISHED_BROODSTONE_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.POLISHED_BROODSTONE_STAIRS); + public static final RegistryObject POLISHED_BROODSTONE_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.POLISHED_BROODSTONE_SLAB); + public static final RegistryObject POLISHED_BROODSTONE_WALL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.POLISHED_BROODSTONE_WALL); + public static final RegistryObject BROODSTONE_BRICK_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.BROODSTONE_BRICK_STAIRS); + public static final RegistryObject BROODSTONE_BRICK_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.BROODSTONE_BRICK_SLAB); + public static final RegistryObject BROODSTONE_BRICK_WALL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.BROODSTONE_BRICK_WALL); + public static final RegistryObject MYRMITE_COAL_ORE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.MYRMITE_COAL_ORE); + public static final RegistryObject BROODSTONE_URANIUM_ORE_ITEM = ITEMS.register("broodstone_uranium_ore", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.BROODSTONE_URANIUM_ORE.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject BROODSTONE_TITANIUM_ORE_ITEM = ITEMS.register("broodstone_titanium_ore", + () -> new net.minecraft.world.item.BlockItem(AntarchyForgeBlocks.BROODSTONE_TITANIUM_ORE.get(), new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject POLISHED_NYXITE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.POLISHED_NYXITE); + public static final RegistryObject CHISELED_NYXITE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.CHISELED_NYXITE); + public static final RegistryObject NYXITE_BRICKS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.NYXITE_BRICKS); + public static final RegistryObject CHITEN_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.CHITEN_BLOCK); + public static final RegistryObject NYXITE_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.NYXITE_STAIRS); + public static final RegistryObject NYXITE_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.NYXITE_SLAB); + public static final RegistryObject NYXITE_WALL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.NYXITE_WALL); + public static final RegistryObject POLISHED_NYXITE_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.POLISHED_NYXITE_STAIRS); + public static final RegistryObject POLISHED_NYXITE_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.POLISHED_NYXITE_SLAB); + public static final RegistryObject POLISHED_NYXITE_WALL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.POLISHED_NYXITE_WALL); + public static final RegistryObject POLISHED_NYXITE_PRESSURE_PLATE_ITEM = ITEMS.register("polished_nyxite_pressure_plate", + () -> new CeilingCompatiblePlacementTooltipBlockItem(AntarchyForgeBlocks.POLISHED_NYXITE_PRESSURE_PLATE.get(), new Item.Properties())); + public static final RegistryObject POLISHED_NYXITE_BUTTON_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.POLISHED_NYXITE_BUTTON); + public static final RegistryObject NYXITE_BRICK_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.NYXITE_BRICK_STAIRS); + public static final RegistryObject NYXITE_BRICK_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.NYXITE_BRICK_SLAB); + public static final RegistryObject NYXITE_BRICK_WALL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.NYXITE_BRICK_WALL); + public static final RegistryObject SHELLSTONE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.SHELLSTONE); + public static final RegistryObject POLISHED_SHELLSTONE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.POLISHED_SHELLSTONE); + public static final RegistryObject SHELLSTONE_BRICKS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.SHELLSTONE_BRICKS); + public static final RegistryObject CHISELED_SHELLSTONE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.CHISELED_SHELLSTONE); + public static final RegistryObject MOSSY_SHELLSTONE_BRICKS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.MOSSY_SHELLSTONE_BRICKS); + public static final RegistryObject CRACKED_SHELLSTONE_BRICKS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.CRACKED_SHELLSTONE_BRICKS); + public static final RegistryObject MOSSY_SHELLSTONE_BRICK_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.MOSSY_SHELLSTONE_BRICK_STAIRS); + public static final RegistryObject MOSSY_SHELLSTONE_BRICK_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.MOSSY_SHELLSTONE_BRICK_SLAB); + public static final RegistryObject MOSSY_SHELLSTONE_BRICK_WALL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.MOSSY_SHELLSTONE_BRICK_WALL); + public static final RegistryObject SHELLSTONE_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.SHELLSTONE_STAIRS); + public static final RegistryObject SHELLSTONE_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.SHELLSTONE_SLAB); + public static final RegistryObject SHELLSTONE_WALL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.SHELLSTONE_WALL); + public static final RegistryObject POLISHED_SHELLSTONE_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.POLISHED_SHELLSTONE_STAIRS); + public static final RegistryObject POLISHED_SHELLSTONE_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.POLISHED_SHELLSTONE_SLAB); + public static final RegistryObject POLISHED_SHELLSTONE_WALL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.POLISHED_SHELLSTONE_WALL); + public static final RegistryObject SHELLSTONE_BRICK_STAIRS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.SHELLSTONE_BRICK_STAIRS); + public static final RegistryObject SHELLSTONE_BRICK_SLAB_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.SHELLSTONE_BRICK_SLAB); + public static final RegistryObject SHELLSTONE_BRICK_WALL_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.SHELLSTONE_BRICK_WALL); + public static final RegistryObject TRIFFID_GOO_BLOCK_ITEM = ITEMS.register("triffid_goo_block", + () -> new com.craisinlord.antarchy.content.item.TriffidGooBlockItem(AntarchyForgeBlocks.TRIFFID_GOO_BLOCK.get(), new Item.Properties())); + public static final RegistryObject PALE_NYXITE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.PALE_NYXITE); + public static final RegistryObject NYXITE_SPIKE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.NYXITE_SPIKE); + public static final RegistryObject CHITEN_SPIKE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.CHITEN_SPIKE); + public static final RegistryObject POTENT_NYXITE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.POTENT_NYXITE); + public static final RegistryObject UMBRAL_MOSS_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.UMBRAL_MOSS_BLOCK); + public static final RegistryObject UMBRAL_MOSS_CARPET_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.UMBRAL_MOSS_CARPET); + public static final RegistryObject AMBER_MOSS_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.AMBER_MOSS_BLOCK); + public static final RegistryObject AMBER_MOSS_CARPET_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.AMBER_MOSS_CARPET); + public static final RegistryObject AMBER_LICHEN_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.AMBER_LICHEN); + public static final RegistryObject BILE_VEIN_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.BILE_VEIN); + public static final RegistryObject CREEPVINE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.CREEPVINE); + public static final RegistryObject BLUSH_MOSS_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.BLUSH_MOSS_BLOCK); + public static final RegistryObject BLUSH_MOSS_CARPET_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.BLUSH_MOSS_CARPET); + public static final RegistryObject DREAM_TORCH_ITEM = ITEMS.register("dream_torch", + () -> new com.craisinlord.antarchy.content.item.DreamTorchItem(AntarchyForgeBlocks.DREAM_TORCH.get(), AntarchyForgeBlocks.DREAM_WALL_TORCH.get(), AntarchyForgeBlocks.DREAM_CEILING_TORCH.get(), new Item.Properties())); + public static final RegistryObject DREAM_LANTERN_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.DREAM_LANTERN); + public static final RegistryObject DREAM_CAMPFIRE_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.DREAM_CAMPFIRE); + public static final RegistryObject LUMEN_FROGLIGHT_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.LUMEN_FROGLIGHT); + public static final RegistryObject ROSEATE_FROGLIGHT_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.ROSEATE_FROGLIGHT); + public static final RegistryObject BED_BUG_EGG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.BED_BUG_EGG); + public static final RegistryObject CREEPING_HORROR_EGG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.CREEPING_HORROR_EGG); + public static final RegistryObject JUMPY_BUG_EGG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.JUMPY_BUG_EGG); + public static final RegistryObject SPIT_BUG_EGG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.SPIT_BUG_EGG); + public static final RegistryObject JERRY_EGG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.JERRY_EGG); + public static final RegistryObject LURKING_TERROR_EGG_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.LURKING_TERROR_EGG); + public static final RegistryObject WASP_NEST_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.WASP_NEST); + public static final RegistryObject HUSHWEED_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.HUSHWEED); + public static final RegistryObject HANGING_CREEPROOTS_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.HANGING_CREEPROOTS); + public static final RegistryObject GLOWCAP_MUSHROOM_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.GLOWCAP_MUSHROOM); + public static final RegistryObject GLOWCAP_MUSHROOM_BLOCK_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.GLOWCAP_MUSHROOM_BLOCK); + public static final RegistryObject MOLTING_VINES_ITEM = ITEMS.registerSimpleBlockItem(AntarchyForgeBlocks.MOLTING_VINES); + public static final RegistryObject BILE_BUCKET = ITEMS.register("bile_bucket", + () -> new BucketItem(AntarchyForgeMisc.BILE.get(), new Item.Properties().craftRemainder(Items.BUCKET).stacksTo(1))); + public static final RegistryObject ICHOR_BUCKET = ITEMS.register("ichor_bucket", + () -> new BucketItem(AntarchyForgeMisc.ICHOR.get(), new Item.Properties().craftRemainder(Items.BUCKET).stacksTo(1))); + public static final RegistryObject ANTIWATER_BUCKET = ITEMS.register("antiwater_bucket", + () -> new BucketItem(AntarchyForgeMisc.ANTIWATER.get(), new Item.Properties().craftRemainder(Items.BUCKET).stacksTo(1))); + public static final RegistryObject LUMEN_BUCKET = ITEMS.register("lumen_bucket", + () -> new BucketItem(AntarchyForgeMisc.LUMEN.get(), new Item.Properties().craftRemainder(Items.BUCKET).stacksTo(1))); + public static final RegistryObject CLOUD_BUCKET = ITEMS.register("cloud_bucket", + () -> new com.craisinlord.antarchy.content.item.CloudBucketItem(AntarchyForgeBlocks.CLOUD_BLOCK.get(), new Item.Properties().craftRemainder(Items.BUCKET))); + public static final RegistryObject BLOOD_CRYSTAL_SHARD = ITEMS.register("blood_crystal_shard", + () -> new BloodCrystalShardItem(new Item.Properties())); + public static final RegistryObject BLOOD_CRYSTAL_APPLE = ITEMS.register("blood_crystal_apple", + () -> new BloodCrystalAppleItem(new Item.Properties() + .rarity(Rarity.RARE) + .food(new FoodProperties.Builder() + .nutrition(4) + .saturationMod(1.2f) + .effect(() -> new MobEffectInstance(net.minecraft.world.effect.MobEffects.REGENERATION, 100, 1), 1.0f) + .alwaysEat() + .build()))); + public static final RegistryObject BLOOD_CRYSTAL_HELMET = ITEMS.register("blood_crystal_helmet", + () -> new BloodCrystalArmorItem(BLOOD_CRYSTAL_ARMOR_MATERIAL, ArmorItem.Type.HELMET, new Item.Properties().rarity(Rarity.RARE))); + public static final RegistryObject BLOOD_CRYSTAL_CHESTPLATE = ITEMS.register("blood_crystal_chestplate", + () -> new BloodCrystalArmorItem(BLOOD_CRYSTAL_ARMOR_MATERIAL, ArmorItem.Type.CHESTPLATE, new Item.Properties().rarity(Rarity.RARE))); + public static final RegistryObject BLOOD_CRYSTAL_LEGGINGS = ITEMS.register("blood_crystal_leggings", + () -> new BloodCrystalArmorItem(BLOOD_CRYSTAL_ARMOR_MATERIAL, ArmorItem.Type.LEGGINGS, new Item.Properties().rarity(Rarity.RARE))); + public static final RegistryObject BLOOD_CRYSTAL_BOOTS = ITEMS.register("blood_crystal_boots", + () -> new BloodCrystalArmorItem(BLOOD_CRYSTAL_ARMOR_MATERIAL, ArmorItem.Type.BOOTS, new Item.Properties().rarity(Rarity.RARE))); + public static final RegistryObject BLOOD_CRYSTAL_KATANA = ITEMS.register("blood_crystal_katana", + () -> new BloodCrystalKatanaItem( + BLOOD_CRYSTAL_KATANA_TIER, + new Item.Properties().stacksTo(1).durability(1200).rarity(Rarity.RARE), + AntarchySettings.bloodCrystalKatanaAttackDamage(), + -2.2F + )); + public static final RegistryObject MANTIS_CLAW = ITEMS.register("mantis_claw", + () -> new MantisClawItem(Tiers.IRON, new Item.Properties().stacksTo(1).durability(50).rarity(Rarity.UNCOMMON))); + public static final RegistryObject HERCULES_HORN = ITEMS.registerSimpleItem("hercules_horn", new Item.Properties().rarity(Rarity.UNCOMMON)); + public static final RegistryObject KING_SCALE = ITEMS.register("king_scale", + () -> new MobComingSoonTooltipItem(new Item.Properties().rarity(Rarity.RARE))); + public static final RegistryObject QUEEN_SCALE = ITEMS.register("queen_scale", + () -> new MobComingSoonTooltipItem(new Item.Properties().rarity(Rarity.RARE))); + public static final RegistryObject CHITEN = ITEMS.registerSimpleItem("chiten", new Item.Properties().rarity(Rarity.UNCOMMON)); + public static final RegistryObject JERRY_NUCLEUS = ITEMS.register("jerry_nucleus", + () -> new com.craisinlord.antarchy.content.item.JerryNucleusItem(new Item.Properties().rarity(Rarity.UNCOMMON) + .food(new FoodProperties.Builder() + .nutrition(2) + .saturationMod(0.1F) + .build()))); + public static final RegistryObject CARAPACE = ITEMS.registerSimpleItem("carapace", new Item.Properties().rarity(Rarity.UNCOMMON)); + public static final RegistryObject STINK_BUG = ITEMS.registerSimpleItem("stink_bug", new Item.Properties().rarity(Rarity.UNCOMMON)); + public static final RegistryObject JUMPY_BUG_LEG = ITEMS.registerSimpleItem("jumpy_bug_leg", new Item.Properties().rarity(Rarity.UNCOMMON)); + public static final RegistryObject JUMPY_BOOTS = ITEMS.register("jumpy_boots", + () -> new JumpyBootsItem(JUMPY_BOOTS_ARMOR_MATERIAL, new Item.Properties().stacksTo(1).rarity(Rarity.UNCOMMON).fireResistant().durability(armorDurability(ArmorItem.Type.BOOTS, 37)))); + public static final RegistryObject BRUTALFLY_WING = ITEMS.registerSimpleItem("brutalfly_wing", new Item.Properties().rarity(Rarity.UNCOMMON)); + public static final RegistryObject BRUTALFLY_ELYTRA = ITEMS.register("brutalfly_elytra", + () -> new BrutalflyElytraItem(new Item.Properties().rarity(Rarity.UNCOMMON).durability(480))); + public static final RegistryObject CORNEA_EAR = ITEMS.register("cornea_ear", + () -> new CorneaEarItem(new Item.Properties() + .rarity(Rarity.UNCOMMON) + .food(new FoodProperties.Builder() + .nutrition(2) + .saturationMod(0.4F) + .build()))); + public static final RegistryObject CORN = ITEMS.register("corn", + () -> new Item(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(3) + .saturationMod(0.6F) + .build()))); + public static final RegistryObject CORN_SEEDS = ITEMS.register("corn_seeds", + () -> new ItemNameBlockItem(AntarchyForgeBlocks.CORN_CROP.get(), new Item.Properties())); + public static final RegistryObject RAW_VENISON = ITEMS.register("raw_venison", + () -> new Item(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(2) + .saturationMod(0.3F) + .build()))); + public static final RegistryObject BROODFRUIT = ITEMS.register("broodfruit", + () -> new Item(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(2) + .saturationMod(0.1F) + .effect(() -> new MobEffectInstance(MobEffects.DAMAGE_BOOST, 100, 0), 1.0F) + .build()))); + public static final RegistryObject RAW_BUG_MEAT = ITEMS.register("raw_bug_meat", + () -> new Item(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(4) + .saturationMod(0.1F) + .effect(() -> new MobEffectInstance(MobEffects.HUNGER, 600), 0.8F) + .build()))); + public static final RegistryObject COOKED_BUG_MEAT = ITEMS.register("cooked_bug_meat", + () -> new Item(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(8) + .saturationMod(0.8F) + .build()))); + public static final RegistryObject COOKED_VENISON = ITEMS.register("cooked_venison", + () -> new Item(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(6) + .saturationMod(0.8F) + .build()))); + public static final RegistryObject PEACH = ITEMS.register("peach", + () -> new PeachItem()); + public static final RegistryObject PEACH_PIE = ITEMS.register("peach_pie", + () -> new Item(new Item.Properties() + .stacksTo(64) + .food(new FoodProperties.Builder() + .nutrition(8) + .saturationMod(0.3F) + .build()))); + public static final RegistryObject CORNBREAD = ITEMS.register("cornbread", + () -> new Item(new Item.Properties() + .stacksTo(64) + .food(new FoodProperties.Builder() + .nutrition(8) + .saturationMod(0.9F) + .build()))); + public static final RegistryObject POPCORN = ITEMS.register("popcorn", + () -> new Item(new Item.Properties() + .stacksTo(64) + .food(new FoodProperties.Builder() + .nutrition(1) + .saturationMod(0.1F) + .build()))); + public static final RegistryObject RAW_CORNDOG = ITEMS.register("raw_corndog", + () -> new Item(new Item.Properties() + .stacksTo(64) + .food(new FoodProperties.Builder() + .nutrition(8) + .saturationMod(0.7F) + .build()))); + public static final RegistryObject COOKED_CORNDOG = ITEMS.register("cooked_corndog", + () -> new Item(new Item.Properties() + .stacksTo(64) + .food(new FoodProperties.Builder() + .nutrition(14) + .saturationMod(1.1F) + .build()))); + public static final RegistryObject HIGH_FRUCTOSE_CORN_SYRUP = ITEMS.register("high_fructose_corn_syrup", + () -> new HighFructoseCornSyrupItem(new Item.Properties() + .stacksTo(16) + .food(new FoodProperties.Builder() + .nutrition(0) + .saturationMod(0.0F) + .alwaysEat() + .build()))); + public static final RegistryObject ROOT_BEER = ITEMS.register("root_beer", + () -> new RootBeerItem(new Item.Properties() + .stacksTo(16) + .food(new FoodProperties.Builder() + .nutrition(4) + .saturationMod(0.4F) + .effect(() -> new MobEffectInstance(MobEffects.REGENERATION, 100, 0), 1.0F) + .alwaysEat() + .build()))); + public static final RegistryObject TRIFFID_GOO = ITEMS.registerSimpleItem("triffid_goo", + new Item.Properties().rarity(Rarity.UNCOMMON)); + public static final RegistryObject VORTEX_EYE = ITEMS.register("vortex_eye", + () -> new MobComingSoonTooltipItem(new Item.Properties().rarity(Rarity.RARE))); + public static final RegistryObject RAW_URANIUM_SCRAP = ITEMS.registerSimpleItem("raw_uranium_scrap", new Item.Properties().rarity(Rarity.UNCOMMON)); + public static final RegistryObject RAW_TITANIUM_SCRAP = ITEMS.registerSimpleItem("raw_titanium_scrap", new Item.Properties().rarity(Rarity.UNCOMMON)); + public static final RegistryObject RAW_URANIUM = ITEMS.registerSimpleItem("raw_uranium", new Item.Properties().rarity(Rarity.UNCOMMON)); + public static final RegistryObject RAW_TITANIUM = ITEMS.registerSimpleItem("raw_titanium", new Item.Properties().rarity(Rarity.UNCOMMON)); + public static final RegistryObject MUD_PIE = ITEMS.register("mud_pie", + () -> new Item(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(10) + .saturationMod(0.9F) + .effect(() -> new MobEffectInstance(MobEffects.CONFUSION, 200), 1.0F) + .build()))); + public static final RegistryObject RAINBOW_SUGAR = ITEMS.register("rainbow_sugar", + () -> new RainbowSugarItem(new Item.Properties() + .rarity(Rarity.UNCOMMON) + .food(new FoodProperties.Builder().nutrition(1).saturationMod(0.0F).alwaysEat().build()))); + public static final RegistryObject URANIUM_NUGGET = ITEMS.registerSimpleItem("uranium_nugget", new Item.Properties().rarity(Rarity.UNCOMMON)); + public static final RegistryObject TITANIUM_NUGGET = ITEMS.registerSimpleItem("titanium_nugget", new Item.Properties().rarity(Rarity.UNCOMMON)); + public static final RegistryObject URANIUM_INGOT = ITEMS.registerSimpleItem("uranium_ingot", new Item.Properties().rarity(Rarity.UNCOMMON).fireResistant()); + public static final RegistryObject TITANIUM_INGOT = ITEMS.registerSimpleItem("titanium_ingot", new Item.Properties().rarity(Rarity.UNCOMMON).fireResistant()); + public static final RegistryObject MOLEVORE_NOSE = ITEMS.registerSimpleItem("molevore_nose", new Item.Properties().rarity(Rarity.RARE)); + public static final RegistryObject MOLEWORM_ITEM = ITEMS.register("moleworm", + () -> new Item(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(1) + .saturationMod(0.0F) + .effect(() -> new MobEffectInstance(MobEffects.HUNGER, 600), 0.8F) + .build()))); + public static final RegistryObject CLOUD_SHARK_FIN = ITEMS.registerSimpleItem("cloud_shark_fin", new Item.Properties().rarity(Rarity.UNCOMMON)); + public static final RegistryObject CLOUD_SHARK_FIN_SOUP = ITEMS.register("cloud_shark_fin_soup", + () -> new CloudSharkFinSoupItem(new Item.Properties() + .stacksTo(1) + .craftRemainder(Items.BOWL) + .food(new FoodProperties.Builder() + .nutrition(10) + .saturationMod(0.8F) + .effect(() -> new MobEffectInstance(MobEffects.DAMAGE_BOOST, 600, 0), 1.0F) + .effect(() -> new MobEffectInstance(MobEffects.SLOW_FALLING, 600, 0), 1.0F) + .build()))); + public static final RegistryObject KRAKEN_TOOTH = ITEMS.register("kraken_tooth", + () -> new Item(new Item.Properties().rarity(Rarity.RARE))); + public static final RegistryObject BASILISK_FANG = ITEMS.registerSimpleItem("basilisk_fang", new Item.Properties().rarity(Rarity.RARE)); + public static final RegistryObject BASILISK_DAGGER = ITEMS.register("basilisk_dagger", + () -> new BasiliskDaggerItem(Tiers.IRON, new Item.Properties().rarity(Rarity.RARE), 4, -1.8F)); + public static final RegistryObject EMPEROR_SCORPION_STINGER = ITEMS.registerSimpleItem("emperor_scorpion_stinger", new Item.Properties().rarity(Rarity.RARE)); + public static final RegistryObject SCORPION_WHIP = ITEMS.register("scorpion_whip", + () -> new ScorpionWhipItem(Tiers.IRON, new Item.Properties().rarity(Rarity.RARE).durability(384))); + public static final RegistryObject MOGGLES = ITEMS.register("moggles", + () -> new MogglesItem(MOGGLES_ARMOR_MATERIAL, new Item.Properties().rarity(Rarity.RARE).stacksTo(1))); + public static final RegistryObject FALLEN_KING_CROWN = ITEMS.register("fallen_king_crown", + () -> new com.craisinlord.antarchy.content.item.FallenKingCrownItem( + FALLEN_KING_CROWN_ARMOR_MATERIAL, + new Item.Properties().rarity(Rarity.RARE) + )); + public static final RegistryObject ULTIMATE_HELMET = ITEMS.register("ultimate_helmet", + () -> new UltimateArmorItem(ULTIMATE_ARMOR_MATERIAL, ArmorItem.Type.HELMET, + new Item.Properties().rarity(Rarity.EPIC).fireResistant().durability(armorDurability(ArmorItem.Type.HELMET, 41)))); + public static final RegistryObject ULTIMATE_CHESTPLATE = ITEMS.register("ultimate_chestplate", + () -> new UltimateArmorItem(ULTIMATE_ARMOR_MATERIAL, ArmorItem.Type.CHESTPLATE, + new Item.Properties().rarity(Rarity.EPIC).fireResistant().durability(armorDurability(ArmorItem.Type.CHESTPLATE, 41)))); + public static final RegistryObject ULTIMATE_LEGGINGS = ITEMS.register("ultimate_leggings", + () -> new UltimateArmorItem(ULTIMATE_ARMOR_MATERIAL, ArmorItem.Type.LEGGINGS, + new Item.Properties().rarity(Rarity.EPIC).fireResistant().durability(armorDurability(ArmorItem.Type.LEGGINGS, 41)))); + public static final RegistryObject ULTIMATE_BOOTS = ITEMS.register("ultimate_boots", + () -> new UltimateArmorItem(ULTIMATE_ARMOR_MATERIAL, ArmorItem.Type.BOOTS, + new Item.Properties().rarity(Rarity.EPIC).fireResistant().durability(armorDurability(ArmorItem.Type.BOOTS, 41)))); + public static final RegistryObject ULTIMATE_SWORD = ITEMS.register("ultimate_sword", + () -> new UltimateSwordItem(ULTIMATE_TIER, + new Item.Properties().stacksTo(1).rarity(Rarity.EPIC).fireResistant(), + AntarchySettings::ultimateSwordAttackDamage, -2.4F)); + public static final RegistryObject ULTIMATE_PICKAXE = ITEMS.register("ultimate_pickaxe", + () -> new UltimatePickaxeItem(ULTIMATE_TIER, + new Item.Properties().stacksTo(1).rarity(Rarity.EPIC).fireResistant(), + AntarchySettings::ultimatePickaxeAttackDamage, -2.8F)); + public static final RegistryObject ULTIMATE_AXE = ITEMS.register("ultimate_axe", + () -> new UltimateAxeItem(ULTIMATE_TIER, + new Item.Properties().stacksTo(1).rarity(Rarity.EPIC).fireResistant(), + AntarchySettings::ultimateAxeAttackDamage, -3.0F)); + public static final RegistryObject ULTIMATE_SHOVEL = ITEMS.register("ultimate_shovel", + () -> new UtlimateShovelItem(ULTIMATE_TIER, + new Item.Properties().stacksTo(1).rarity(Rarity.EPIC).fireResistant(), + AntarchySettings::ultimateShovelAttackDamage, -3.0F)); + public static final RegistryObject ULTIMATE_HOE = ITEMS.register("ultimate_hoe", + () -> new UltimateHoeItem(ULTIMATE_TIER, + new Item.Properties().stacksTo(1).rarity(Rarity.EPIC).fireResistant(), + AntarchySettings::ultimateHoeAttackDamage, 0.0F)); + public static final RegistryObject ULTIMATE_BOW = ITEMS.register("ultimate_bow", + () -> new UltimateBowItem(new Item.Properties().stacksTo(1).durability(768).rarity(Rarity.EPIC).fireResistant())); + public static final RegistryObject ULTIMATE_CROSSBOW = ITEMS.register("ultimate_crossbow", + () -> new UltimateCrossbowItem(new Item.Properties().stacksTo(1).durability(1024).rarity(Rarity.EPIC).fireResistant())); + public static final RegistryObject NIGHTMARE_HELMET = ITEMS.register("nightmare_helmet", + () -> new NightmareArmorItem(NIGHTMARE_ARMOR_MATERIAL, ArmorItem.Type.HELMET, + new Item.Properties().rarity(Rarity.EPIC).fireResistant().durability(armorDurability(ArmorItem.Type.HELMET, 41)))); + public static final RegistryObject NIGHTMARE_CHESTPLATE = ITEMS.register("nightmare_chestplate", + () -> new NightmareArmorItem(NIGHTMARE_ARMOR_MATERIAL, ArmorItem.Type.CHESTPLATE, + new Item.Properties().rarity(Rarity.EPIC).fireResistant().durability(armorDurability(ArmorItem.Type.CHESTPLATE, 41)))); + public static final RegistryObject NIGHTMARE_LEGGINGS = ITEMS.register("nightmare_leggings", + () -> new NightmareArmorItem(NIGHTMARE_ARMOR_MATERIAL, ArmorItem.Type.LEGGINGS, + new Item.Properties().rarity(Rarity.EPIC).fireResistant().durability(armorDurability(ArmorItem.Type.LEGGINGS, 41)))); + public static final RegistryObject NIGHTMARE_BOOTS = ITEMS.register("nightmare_boots", + () -> new NightmareArmorItem(NIGHTMARE_ARMOR_MATERIAL, ArmorItem.Type.BOOTS, + new Item.Properties().rarity(Rarity.EPIC).fireResistant().durability(armorDurability(ArmorItem.Type.BOOTS, 41)))); + public static final RegistryObject NIGHTMARE_SWORD = ITEMS.register("nightmare_sword", + () -> new NightmareSwordItem(ULTIMATE_TIER, + new Item.Properties().stacksTo(1).rarity(Rarity.EPIC).fireResistant(), -2.4F)); + public static final RegistryObject SHRINK_RAY = ITEMS.register("shrink_ray", + () -> new SizeRayItem( + new Item.Properties().stacksTo(1).durability(512).rarity(Rarity.RARE).fireResistant(), + AntarchyForgeEntites.SHRINK_RAY_PROJECTILE, + SizeRayProjectileEntity.SizeRayType.SHRINK, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "geo/shrink_ray.geo.json"), + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/models/item/shrink_ray.png"), + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "animations/shrink_ray.animation.json"), + "shrink_ray_active" + ) { + @Override + public void initializeClient(java.util.function.Consumer consumer) { + consumer.accept(AntarchyGeoItemExtensions.sizeRay(this)); + } + }); + public static final RegistryObject GROWTH_RAY = ITEMS.register("growth_ray", + () -> new SizeRayItem( + new Item.Properties().stacksTo(1).durability(512).rarity(Rarity.RARE).fireResistant(), + AntarchyForgeEntites.GROWTH_RAY_PROJECTILE, + SizeRayProjectileEntity.SizeRayType.GROWTH, + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "geo/growth_ray.geo.json"), + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/models/item/growth_ray.png"), + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "animations/growth_ray.animation.json"), + "growth_ray_active" + ) { + @Override + public void initializeClient(java.util.function.Consumer consumer) { + consumer.accept(AntarchyGeoItemExtensions.sizeRay(this)); + } + }); + public static final RegistryObject GRAVITY_GUN = ITEMS.register("gravity_gun", + () -> new GravityGunItem(new Item.Properties().stacksTo(1).durability(512).rarity(Rarity.RARE).fireResistant()) { + @Override + public void initializeClient(java.util.function.Consumer consumer) { + consumer.accept(AntarchyGeoItemExtensions.crossbowHold(this)); + } + }); + // Temporarily disabled: keeping the code but not registering the item for now. + // public static final RegistryObject MINERS_DREAM = ITEMS.register("miners_dream", + // () -> new MinersDreamItem(new Item.Properties().stacksTo(1).rarity(Rarity.RARE))); + public static final RegistryObject SQUIDZOOKA = ITEMS.register("squidzooka", + () -> new SquidzookaItem(new Item.Properties().stacksTo(1).durability(384).rarity(Rarity.RARE)) { + @Override + public void initializeClient(java.util.function.Consumer consumer) { + consumer.accept(AntarchyGeoItemExtensions.crossbowHold(this)); + } + }); + public static final RegistryObject RPO_LAUNCHER = ITEMS.register("rpo_launcher", + () -> new RpoLauncherItem(new Item.Properties().stacksTo(1).durability(384).rarity(Rarity.RARE)) { + @Override + public void initializeClient(java.util.function.Consumer consumer) { + consumer.accept(AntarchyGeoItemExtensions.crossbowHold(this)); + } + }); + public static final RegistryObject BATTLE_AXE = ITEMS.register("battle_axe", + () -> new BattleAxeItem(Tiers.NETHERITE, + new Item.Properties().stacksTo(1).rarity(Rarity.RARE).fireResistant(), + AntarchySettings::battleAxeAttackDamage, -3.1F) { + @Override + public void initializeClient(java.util.function.Consumer consumer) { + consumer.accept(AntarchyGeoItemExtensions.plain(this)); + } + }); + public static final RegistryObject ATTITUDE_ADJUSTER = ITEMS.register("attitude_adjuster", + () -> new AttitudeAdjusterItem(ATTITUDE_ADJUSTER_TIER, + new Item.Properties().stacksTo(1).durability(ATTITUDE_ADJUSTER_TIER.getUses()).rarity(Rarity.EPIC).fireResistant())); + public static final RegistryObject DIAMOND_MINECART_ITEM = ITEMS.register("diamond_minecart", + () -> new DiamondMinecartItem(AntarchyForgeEntites.DIAMOND_MINECART, new Item.Properties().stacksTo(1).rarity(Rarity.RARE))); + public static final RegistryObject REVERIE_BOTTLE = ITEMS.register("reverie_bottle", + () -> new ReverieBottleItem(new Item.Properties().stacksTo(1).rarity(Rarity.RARE))); + public static final RegistryObject BIG_BERTHA_BLADE = ITEMS.registerSimpleItem("big_bertha_blade", + new Item.Properties().rarity(Rarity.EPIC).fireResistant()); + public static final RegistryObject BIG_BERTHA_HANDLE = ITEMS.registerSimpleItem("big_bertha_handle", + new Item.Properties().rarity(Rarity.EPIC).fireResistant()); + public static final RegistryObject BIG_BERTHA_HILT = ITEMS.registerSimpleItem("big_bertha_hilt", + new Item.Properties().rarity(Rarity.EPIC).fireResistant()); + public static final RegistryObject BIG_BERTHA = ITEMS.register("big_bertha", + () -> new BigBerthaItem(Tiers.NETHERITE, + new Item.Properties().stacksTo(1).rarity(Rarity.EPIC).fireResistant()) { + @Override + public void initializeClient(java.util.function.Consumer consumer) { + consumer.accept(AntarchyGeoItemExtensions.plain(this)); + } + }); + + public static final RegistryObject KRAKEN_TENTACLE = ITEMS.registerSimpleItem("kraken_tentacle", + new Item.Properties().rarity(Rarity.RARE)); + + public static final RegistryObject KRAKENS_GRASP = ITEMS.register("krakens_grasp", + () -> new KrakensGraspItem( + new Item.Properties().stacksTo(1).durability(250).rarity(Rarity.EPIC).fireResistant())); + + // Spawn eggs + public static final RegistryObject EASTER_BUNNY_SPAWN_EGG = ITEMS.register("easter_bunny_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.EASTER_BUNNY, 0xFFF2B2, 0xFF85B5, new Item.Properties())); + public static final RegistryObject DORRIE_SPAWN_EGG = ITEMS.register("dorrie_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.DORRIE, 0x6F8CFF, 0xD2F2FF, new Item.Properties())); + public static final RegistryObject OURANWOOD_DEER_SPAWN_EGG = ITEMS.register("ouranwood_deer_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.OURANWOOD_DEER, 0x8A6D4B, 0xE8D9B5, new Item.Properties())); + public static final RegistryObject GLIMMER_SPAWN_EGG = ITEMS.register("glimmer_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.GLIMMER, 0x7DFFFF, 0x2AC7D0, new Item.Properties())); + public static final RegistryObject ELKA_SPAWN_EGG = ITEMS.register("elka_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.ELKA, 0x6B2FA0, 0xFFFFFF, new Item.Properties())); + public static final RegistryObject SPIRIT_APPLE = ITEMS.register("spirit_apple", + () -> new com.craisinlord.antarchy.content.item.SpiritAppleItem(new Item.Properties() + .food(new FoodProperties.Builder() + .nutrition(4) + .saturationMod(0.3F) + .build()))); + public static final RegistryObject GLIMMER_BOTTLE = ITEMS.register("glimmer_bottle", + com.craisinlord.antarchy.content.item.GlimmerBottleItem::new); + public static final RegistryObject FLYING_SQUIRREL_SPAWN_EGG = ITEMS.register("flying_squirrel_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.FLYING_SQUIRREL, 0x7D6649, 0xDCC59C, new Item.Properties())); + public static final RegistryObject CATERPILLAR_SPAWN_EGG = ITEMS.register("caterpillar_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.CATERPILLAR, 0xA8D96A, 0xF4E04D, new Item.Properties())); + public static final RegistryObject BUTTERFLY_SPAWN_EGG = ITEMS.register("butterfly_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.BUTTERFLY, 0x7A4A1E, 0xFF7A00, new Item.Properties())); + public static final RegistryObject REVERIE_SPAWN_EGG = ITEMS.register("reverie_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.REVERIE, 0xF2F2F2, 0xBFC3C7, new Item.Properties())); + public static final RegistryObject BRUTALFLY_SPAWN_EGG = ITEMS.register("brutalfly_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.BRUTALFLY, 0x4A2214, 0xFF8A1D, new Item.Properties().rarity(Rarity.EPIC))); + public static final RegistryObject RED_ANT_SPAWN_EGG = ITEMS.register("red_ant_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.RED_ANT, 0xA31818, 0x2B0909, new Item.Properties())); + public static final RegistryObject BROWN_ANT_SPAWN_EGG = ITEMS.register("brown_ant_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.BROWN_ANT, 0x6A4320, 0x26160A, new Item.Properties())); + public static final RegistryObject RAINBOW_ANT_SPAWN_EGG = ITEMS.register("rainbow_ant_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.RAINBOW_ANT, 0x56D4F0, 0xF66DBB, new Item.Properties())); + public static final RegistryObject TERMITE_SPAWN_EGG = ITEMS.register("termite_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.TERMITE, 0xD4B96A, 0xFF6B1A, new Item.Properties())); + public static final RegistryObject MOLEWORM_SPAWN_EGG = ITEMS.register("moleworm_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.MOLEWORM, 0xB8B8B8, 0x8A623A, new Item.Properties())); + public static final RegistryObject MANTIS_SPAWN_EGG = ITEMS.register("mantis_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.MANTIS, 0xF8F8F2, 0x63B44A, new Item.Properties())); + public static final RegistryObject ALPHA_MANTIS_SPAWN_EGG = ITEMS.register("alpha_mantis_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.ALPHA_MANTIS, 0x8FDD6C, 0x2F5D22, new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject ROLLY_POLLY_SPAWN_EGG = ITEMS.register("rolly_polly_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.ROLLY_POLLY, 0x7284A3, 0xBCC8DB, new Item.Properties())); + public static final RegistryObject MOLEVORE_SPAWN_EGG = ITEMS.register("molevore_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.MOLEVORE, 0x4A4A4A, 0x6B4A2B, new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject TRIFFID_SPAWN_EGG = ITEMS.register("triffid_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.TRIFFID, 0x4C8F3A, 0xFF2FB3, new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject APPLE_COW_SPAWN_EGG = ITEMS.register("apple_cow_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.APPLE_COW, 0xFF1A1A, 0x32FF32, new Item.Properties())); + public static final RegistryObject GOLDEN_APPLE_COW_SPAWN_EGG = ITEMS.register("golden_apple_cow_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.GOLDEN_APPLE_COW, 0xFFE14A, 0x32FF32, new Item.Properties())); + public static final RegistryObject ENCHANTED_GOLDEN_APPLE_COW_SPAWN_EGG = ITEMS.register("enchanted_golden_apple_cow_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.ENCHANTED_GOLDEN_APPLE_COW, 0x7040B6, 0xFFE14A, new Item.Properties())); + public static final RegistryObject DR_TRAYAURUS_SPAWN_EGG = ITEMS.register("dr_trayaurus_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.DR_TRAYAURUS, 0xB7A27B, 0x4A3D29, new Item.Properties())); + public static final RegistryObject WASP_SPAWN_EGG = ITEMS.register("wasp_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.WASP, 0x111111, 0xF1D800, new Item.Properties())); + public static final RegistryObject BOMBER_SPAWN_EGG = ITEMS.register("bomber_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.BOMBER, 0x7A7A7A, 0xB32020, new Item.Properties())); + public static final RegistryObject JUMPY_BUG_SPAWN_EGG = ITEMS.register("jumpy_bug_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.JUMPY_BUG, 0x0A1636, 0x8A3E00, new Item.Properties())); + public static final RegistryObject SPIT_BUG_SPAWN_EGG = ITEMS.register("spit_bug_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.SPIT_BUG, 0x6B4A2B, 0x7ED957, new Item.Properties())); + public static final RegistryObject STINK_BUG_SPAWN_EGG = ITEMS.register("stink_bug_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.STINK_BUG, 0x111111, 0xFF7A00, new Item.Properties())); + public static final RegistryObject CLOUD_SHARK_SPAWN_EGG = ITEMS.register("cloud_shark_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.CLOUD_SHARK, 0xDDEAF4, 0x7F96A8, new Item.Properties())); + public static final RegistryObject KRAKEN_SPAWN_EGG = ITEMS.register("kraken_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.KRAKEN, 0x163C53, 0x4F8E99, new Item.Properties().rarity(Rarity.EPIC))); + public static final RegistryObject MISSILE_SQUID_SPAWN_EGG = ITEMS.register("missile_squid_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.MISSILE_SQUID, 0xD88FA7, 0x8D5269, new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject OCTOPUS_BOMB_SPAWN_EGG = ITEMS.register("octopus_bomb_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.OCTOPUS_BOMB, 0xC882C8, 0x5C1A7A, new Item.Properties().rarity(Rarity.UNCOMMON))); + public static final RegistryObject NIGHTMARE_SPAWN_EGG = ITEMS.register("nightmare_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.NIGHTMARE, 0x22121C, 0xB51B2D, new Item.Properties().rarity(Rarity.RARE))); + public static final RegistryObject BED_BUG_SPAWN_EGG = ITEMS.register("bed_bug_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.BED_BUG, 0x3B2218, 0x611111, new Item.Properties())); + public static final RegistryObject LUCID_SPAWN_EGG = ITEMS.register("lucid_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.LUCID, 0xE53935, 0xF4D03F, new Item.Properties().rarity(Rarity.RARE))); + public static final RegistryObject SCORPION_SPAWN_EGG = ITEMS.register("scorpion_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.SCORPION, 0xA8D8FF, 0xE04B5A, new Item.Properties())); + public static final RegistryObject BASILISK_SPAWN_EGG = ITEMS.register("basilisk_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.BASILISK, 0x4A7C40, 0xD4A040, new Item.Properties())); + public static final RegistryObject EMPEROR_SCORPION_SPAWN_EGG = ITEMS.register("emperor_scorpion_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.EMPEROR_SCORPION, 0x3A3242, 0xD8CDB4, new Item.Properties())); + public static final RegistryObject LUCID_EYE = ITEMS.register("lucid_eye", + () -> new LucidEyeItem(new Item.Properties().stacksTo(16).rarity(Rarity.UNCOMMON))); + public static final RegistryObject LUCID_PEARL = ITEMS.register("lucid_pearl", + () -> new LucidPearlItem( + new Item.Properties().stacksTo(16).rarity(Rarity.UNCOMMON), + AntarchyForgeEntites.LUCID_PEARL_PROJECTILE + )); + public static final RegistryObject WATER_CANNON = ITEMS.register("water_cannon", + () -> new WaterCannonItem(new Item.Properties().stacksTo(1).durability(192).rarity(Rarity.RARE)) { + @Override + public void initializeClient(java.util.function.Consumer consumer) { + consumer.accept(AntarchyGeoItemExtensions.crossbowHold(this)); + } + }); + public static final RegistryObject PRIMORDIAL_HELMET = ITEMS.register("primordial_helmet", + () -> new PrimordialArmorItem(PRIMORDIAL_ARMOR_MATERIAL, ArmorItem.Type.HELMET, new Item.Properties().stacksTo(1).rarity(Rarity.RARE).fireResistant())); + public static final RegistryObject PRIMORDIAL_CHESTPLATE = ITEMS.register("primordial_chestplate", + () -> new PrimordialArmorItem(PRIMORDIAL_ARMOR_MATERIAL, ArmorItem.Type.CHESTPLATE, new Item.Properties().stacksTo(1).rarity(Rarity.RARE).fireResistant())); + public static final RegistryObject PRIMORDIAL_LEGGINGS = ITEMS.register("primordial_leggings", + () -> new PrimordialArmorItem(PRIMORDIAL_ARMOR_MATERIAL, ArmorItem.Type.LEGGINGS, new Item.Properties().stacksTo(1).rarity(Rarity.RARE).fireResistant())); + public static final RegistryObject PRIMORDIAL_BOOTS = ITEMS.register("primordial_boots", + () -> new PrimordialArmorItem(PRIMORDIAL_ARMOR_MATERIAL, ArmorItem.Type.BOOTS, new Item.Properties().stacksTo(1).rarity(Rarity.RARE).fireResistant())); + public static final RegistryObject CREEPING_HORROR_SPAWN_EGG = ITEMS.register("creeping_horror_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.CREEPING_HORROR, 0x6B3A1F, 0x6B0000, new Item.Properties())); + public static final RegistryObject LURKING_TERROR_SPAWN_EGG = ITEMS.register("lurking_terror_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.LURKING_TERROR, 0x2D5A1B, 0x8B0000, new Item.Properties())); + public static final RegistryObject HERCULES_BEETLE_SPAWN_EGG = ITEMS.register("hercules_beetle_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.HERCULES_BEETLE, 0x6B1F2A, 0xD4AF37, new Item.Properties().rarity(Rarity.RARE))); + public static final RegistryObject JERRY_SPAWN_EGG = ITEMS.register("jerry_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.JERRY, 0x6D2232, 0x8ED34A, new Item.Properties())); + public static final RegistryObject TORETERROR_SPAWN_EGG = ITEMS.register("toreterror_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.TORETERROR, 0x90EE90, 0x5C4033, new Item.Properties().rarity(Rarity.EPIC))); + public static final RegistryObject CHEEP_SPAWN_EGG = ITEMS.register("cheep_spawn_egg", + () -> new ForgeSpawnEggItem(AntarchyForgeEntites.CHEEP, 0xAA22FF, 0x22FF44, new Item.Properties())); + public static final RegistryObject CHEEP_ITEM = ITEMS.register("cheep", + () -> new Item(new Item.Properties() + .food(new net.minecraft.world.food.FoodProperties.Builder() + .nutrition(2) + .saturationMod(0.1F) + .build()))); + private AntarchyForgeItems() {} + + public static Collection> getItemEntries() { + return ITEMS.getEntries(); + } + + public static void register(IEventBus modEventBus) { + ITEMS.register(modEventBus); + } + + static Item cloudBucketItem() { + return CLOUD_BUCKET.get(); + } + + static Item diamondMinecartItem() { + return DIAMOND_MINECART_ITEM.get(); + } + + static BlockEntityType potentNyxiteBlockEntityType() { + return AntarchyForgeBlocks.POTENT_NYXITE_BLOCK_ENTITY.get(); + } + + static BlockEntityType antNestBlockEntityType() { + return AntarchyForgeBlocks.ANT_NEST_BLOCK_ENTITY.get(); + } + + static BlockEntityType waspNestBlockEntityType() { + return AntarchyForgeBlocks.WASP_NEST_BLOCK_ENTITY.get(); + } + + static Ingredient ultimateRepairIngredient() { + return Ingredient.of(TITANIUM_INGOT.get()); + } + + static Ingredient bloodCrystalRepairIngredient() { + return Ingredient.of(BuiltInRegistries.ITEM.getOptional(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "blood_crystal_shard")) + .orElse(Items.AIR)); + } + + private static EnumMap createUltimateArmorDefense() { + EnumMap defense = new EnumMap<>(ArmorItem.Type.class); + defense.put(ArmorItem.Type.BOOTS, 6); + defense.put(ArmorItem.Type.LEGGINGS, 12); + defense.put(ArmorItem.Type.CHESTPLATE, 16); + defense.put(ArmorItem.Type.HELMET, 6); + return defense; + } + + private static EnumMap createNightmareArmorDefense() { + EnumMap defense = new EnumMap<>(ArmorItem.Type.class); + defense.put(ArmorItem.Type.BOOTS, 4); + defense.put(ArmorItem.Type.LEGGINGS, 9); + defense.put(ArmorItem.Type.CHESTPLATE, 11); + defense.put(ArmorItem.Type.HELMET, 4); + return defense; + } + + private static EnumMap createBloodCrystalArmorDefense() { + EnumMap defense = new EnumMap<>(ArmorItem.Type.class); + defense.put(ArmorItem.Type.BOOTS, 2); + defense.put(ArmorItem.Type.LEGGINGS, 5); + defense.put(ArmorItem.Type.CHESTPLATE, 6); + defense.put(ArmorItem.Type.HELMET, 2); + return defense; + } + + private static EnumMap createMogglesArmorDefense() { + EnumMap defense = new EnumMap<>(ArmorItem.Type.class); + defense.put(ArmorItem.Type.BOOTS, 0); + defense.put(ArmorItem.Type.LEGGINGS, 0); + defense.put(ArmorItem.Type.CHESTPLATE, 0); + defense.put(ArmorItem.Type.HELMET, 2); + return defense; + } + + private static EnumMap createPrimordialArmorDefense() { + EnumMap defense = new EnumMap<>(ArmorItem.Type.class); + defense.put(ArmorItem.Type.BOOTS, 3); + defense.put(ArmorItem.Type.LEGGINGS, 6); + defense.put(ArmorItem.Type.CHESTPLATE, 8); + defense.put(ArmorItem.Type.HELMET, 3); + return defense; + } + + private static EnumMap createFallenKingCrownDefense() { + EnumMap defense = new EnumMap<>(ArmorItem.Type.class); + defense.put(ArmorItem.Type.BOOTS, 0); + defense.put(ArmorItem.Type.LEGGINGS, 0); + defense.put(ArmorItem.Type.CHESTPLATE, 0); + defense.put(ArmorItem.Type.HELMET, 2); + return defense; + } + + private static EnumMap createJumpyBootsDefense() { + EnumMap defense = new EnumMap<>(ArmorItem.Type.class); + defense.put(ArmorItem.Type.BOOTS, 3); + defense.put(ArmorItem.Type.LEGGINGS, 0); + defense.put(ArmorItem.Type.CHESTPLATE, 0); + defense.put(ArmorItem.Type.HELMET, 0); + return defense; + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeMisc.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeMisc.java new file mode 100644 index 00000000..b6f3e524 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeMisc.java @@ -0,0 +1,410 @@ +package com.craisinlord.antarchy.forge.registry; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.content.client.particle.InvertedGeyserBaseParticleOptions; +import com.craisinlord.antarchy.content.client.particle.InvertedGeyserParticleOptions; +import com.craisinlord.antarchy.content.effect.DreadMobEffect; +import com.craisinlord.antarchy.content.effect.GoopedMobEffect; +import com.craisinlord.antarchy.content.effect.GrowthMobEffect; +import com.craisinlord.antarchy.content.effect.InvertedMobEffect; +import com.craisinlord.antarchy.content.effect.ParalyzedMobEffect; +import com.craisinlord.antarchy.content.effect.ShrinkMobEffect; +import com.craisinlord.antarchy.content.effect.StinkyMobEffect; +import com.craisinlord.antarchy.content.recipe.AmericanizeRecipe; +import com.craisinlord.antarchy.content.worldgen.ants.BrownAntNestFeature; +import com.craisinlord.antarchy.content.worldgen.ants.RainbowAntNestFeature; +import com.craisinlord.antarchy.content.worldgen.ants.RedAntNestFeature; +import com.craisinlord.antarchy.content.worldgen.ants.TermiteNestFeature; +import com.craisinlord.antarchy.content.worldgen.cavaryn.CavarynBileCystFeature; +import com.craisinlord.antarchy.content.worldgen.cavaryn.CavarynBileVeinFeature; +import com.craisinlord.antarchy.content.worldgen.cavaryn.CavarynCreepvineFeature; +import com.craisinlord.antarchy.content.worldgen.cavaryn.CavarynEggPatchFeature; +import com.craisinlord.antarchy.content.worldgen.cavaryn.CavarynWallAmberMossFeature; +import com.craisinlord.antarchy.content.worldgen.cavaryn.HangingCreeprootsFeature; +import com.craisinlord.antarchy.content.worldgen.cavaryn.ChitenSpikeConfiguration; +import com.craisinlord.antarchy.content.worldgen.cavaryn.ChitenSpikeFeature; +import com.craisinlord.antarchy.content.worldgen.cavaryn.MoltingVinesFeature; +import com.craisinlord.antarchy.content.worldgen.ocean.SeashellFeature; +import com.craisinlord.antarchy.content.worldgen.elythia.*; +import com.craisinlord.antarchy.forge.worldgen.CornPatchFeature; +import com.craisinlord.antarchy.forge.worldgen.LumenLilyPadFeature; +import com.craisinlord.antarchy.content.worldgen.thoraxis.*; +import com.craisinlord.antarchy.forge.content.fluid.AntiwaterFluid; +import net.minecraft.core.Holder; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.flag.FeatureFlags; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.alchemy.Potion; +import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.levelgen.DensityFunction; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.configurations.SimpleBlockConfiguration; +import net.minecraft.world.level.material.Fluid; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fluids.ForgeFlowingFluid; +import net.minecraftforge.fluids.FluidType; +import net.minecraftforge.registries.RegistryObject; +import net.minecraftforge.registries.ForgeRegistries; + +public final class AntarchyForgeMisc { + private static final DeferredRegister MOB_EFFECTS = DeferredRegister.create(Registries.MOB_EFFECT, Antarchy.MODID); + private static final DeferredRegister POTIONS = DeferredRegister.create(Registries.POTION, Antarchy.MODID); + private static final DeferredRegister FLUID_TYPES = DeferredRegister.create(ForgeRegistries.Keys.FLUID_TYPES, Antarchy.MODID); + private static final DeferredRegister FLUIDS = DeferredRegister.create(Registries.FLUID, Antarchy.MODID); + private static final DeferredRegister> PARTICLE_TYPES = DeferredRegister.create(Registries.PARTICLE_TYPE, Antarchy.MODID); + private static final DeferredRegister> FEATURES = DeferredRegister.create(Registries.FEATURE, Antarchy.MODID); + private static final DeferredRegister> BIOME_SOURCES = DeferredRegister.create(Registries.BIOME_SOURCE, Antarchy.MODID); + private static final DeferredRegister> DENSITY_FUNCTION_TYPES = DeferredRegister.create(Registries.DENSITY_FUNCTION_TYPE, Antarchy.MODID); + private static final DeferredRegister ATTRIBUTES = DeferredRegister.create(Registries.ATTRIBUTE, Antarchy.MODID); + private static final DeferredRegister> MENU_TYPES = DeferredRegister.create(Registries.MENU, Antarchy.MODID); + private static final DeferredRegister FROG_VARIANTS = + DeferredRegister.create(Registries.FROG_VARIANT, Antarchy.MODID); + public static final RegistryObject ELYTHIA_FROG_VARIANT = FROG_VARIANTS.register( + "elythia", + () -> new net.minecraft.world.entity.animal.FrogVariant(com.craisinlord.antarchy.content.entity.ElythiaFrog.TEXTURE) + ); + private static final DeferredRegister> RECIPE_SERIALIZERS = + DeferredRegister.create(Registries.RECIPE_SERIALIZER, Antarchy.MODID); + + public static final RegistryObject> AMERICANIZE_SERIALIZER = + RECIPE_SERIALIZERS.register("americanize", () -> AmericanizeRecipe.SERIALIZER); + + public static final RegistryObject SCALE = ATTRIBUTES.register( + "scale", + () -> new net.minecraft.world.entity.ai.attributes.RangedAttribute("attribute.antarchy.scale", 1.0, 0.0625, 16.0).setSyncable(true) + ); + public static final RegistryObject DOUBLE_DAMAGE_CHANCE = ATTRIBUTES.register( + "double_damage_chance", + () -> new net.minecraft.world.entity.ai.attributes.RangedAttribute("attribute.antarchy.double_damage_chance", 0.0, 0.0, 1.0).setSyncable(true) + ); + public static final RegistryObject BLOODGLASS_MAX_HEARTS = ATTRIBUTES.register( + "bloodglass_max_hearts", + () -> new net.minecraft.world.entity.ai.attributes.RangedAttribute("attribute.antarchy.bloodglass_max_hearts", 0.0, 0.0, 8.0).setSyncable(true) + ); + public static final RegistryObject> DORRIE_INVENTORY_MENU = MENU_TYPES.register( + "dorrie_inventory", + () -> new MenuType<>(com.craisinlord.antarchy.content.menu.DorrieInventoryMenu::new, FeatureFlags.DEFAULT_FLAGS) + ); + + // Mob effects + public static final RegistryObject DREAD = MOB_EFFECTS.register("dread", DreadMobEffect::new); + public static final RegistryObject PARALYZED = MOB_EFFECTS.register("paralyzed", ParalyzedMobEffect::new); + public static final RegistryObject INVERTED = MOB_EFFECTS.register("inverted", InvertedMobEffect::new); + public static final RegistryObject STINKY = MOB_EFFECTS.register("stinky", StinkyMobEffect::new); + public static final RegistryObject GOOPED = MOB_EFFECTS.register("gooped", GoopedMobEffect::new); + public static final RegistryObject BLOODGLASS_WARD = MOB_EFFECTS.register("bloodglass_ward", com.craisinlord.antarchy.content.effect.BloodglassWardEffect::new); + public static final RegistryObject SHRINKING_EFFECT = MOB_EFFECTS.register("shrinking", ShrinkMobEffect::new); + public static final RegistryObject GROWTH_EFFECT = MOB_EFFECTS.register("growth", GrowthMobEffect::new); + + // Potions + public static final RegistryObject INVERSION = POTIONS.register("inversion", + () -> new Potion(new MobEffectInstance(mobEffectHolder(INVERTED), 600))); + public static final RegistryObject LONG_INVERSION = POTIONS.register("long_inversion", + () -> new Potion("inversion", new MobEffectInstance(mobEffectHolder(INVERTED), 2400))); + public static final RegistryObject STINKY_POTION = POTIONS.register("stinky", + () -> new Potion(new MobEffectInstance(mobEffectHolder(STINKY), 1200))); + public static final RegistryObject LONG_STINKY = POTIONS.register("long_stinky", + () -> new Potion("stinky", new MobEffectInstance(mobEffectHolder(STINKY), 2400))); + public static final RegistryObject PARALYSIS = POTIONS.register("paralysis", + () -> new Potion(new MobEffectInstance(mobEffectHolder(PARALYZED), 200))); + public static final RegistryObject LONG_PARALYSIS = POTIONS.register("long_paralysis", + () -> new Potion("paralysis", new MobEffectInstance(mobEffectHolder(PARALYZED), 400))); + public static final RegistryObject HASTE = POTIONS.register("haste", + () -> new Potion(new MobEffectInstance(MobEffects.DIG_SPEED, 1200, 0))); + public static final RegistryObject STRONG_HASTE = POTIONS.register("strong_haste", + () -> new Potion("haste", new MobEffectInstance(MobEffects.DIG_SPEED, 600, 1))); + public static final RegistryObject SHRINKING = POTIONS.register("shrinking", + () -> new Potion(new MobEffectInstance(mobEffectHolder(SHRINKING_EFFECT), 1200, 0))); + public static final RegistryObject STRONG_SHRINKING = POTIONS.register("strong_shrinking", + () -> new Potion("shrinking", new MobEffectInstance(mobEffectHolder(SHRINKING_EFFECT), 900, 1))); + public static final RegistryObject EXTREME_SHRINKING = POTIONS.register("extreme_shrinking", + () -> new Potion("shrinking", new MobEffectInstance(mobEffectHolder(SHRINKING_EFFECT), 600, 2))); + public static final RegistryObject GROWING = POTIONS.register("growing", + () -> new Potion(new MobEffectInstance(mobEffectHolder(GROWTH_EFFECT), 1200, 0))); + public static final RegistryObject STRONG_GROWING = POTIONS.register("strong_growing", + () -> new Potion("growing", new MobEffectInstance(mobEffectHolder(GROWTH_EFFECT), 900, 1))); + public static final RegistryObject EXTREME_GROWING = POTIONS.register("extreme_growing", + () -> new Potion("growing", new MobEffectInstance(mobEffectHolder(GROWTH_EFFECT), 600, 2))); + + // Fluids + public static final RegistryObject BILE = FLUIDS.register("bile", + () -> new ForgeFlowingFluid.Source(bileProperties())); + public static final RegistryObject FLOWING_BILE = FLUIDS.register("flowing_bile", + () -> new ForgeFlowingFluid.Flowing(bileProperties())); + public static final RegistryObject ICHOR = FLUIDS.register("ichor", + () -> new ForgeFlowingFluid.Source(ichorProperties())); + public static final RegistryObject FLOWING_ICHOR = FLUIDS.register("flowing_ichor", + () -> new ForgeFlowingFluid.Flowing(ichorProperties())); + public static final RegistryObject ANTIWATER = FLUIDS.register("antiwater", + () -> new AntiwaterFluid.Source(antiwaterProperties())); + public static final RegistryObject FLOWING_ANTIWATER = FLUIDS.register("flowing_antiwater", + () -> new AntiwaterFluid.Flowing(antiwaterProperties())); + public static final RegistryObject LUMEN = FLUIDS.register("lumen", + () -> new ForgeFlowingFluid.Source(lumenProperties())); + public static final RegistryObject FLOWING_LUMEN = FLUIDS.register("flowing_lumen", + () -> new ForgeFlowingFluid.Flowing(lumenProperties())); + + // Particle types + public static final RegistryObject DREAM_FIRE_FLAME = PARTICLE_TYPES.register("dream_fire_flame", + AntarchyForgeMisc::simpleParticleType); + public static final RegistryObject STINKY_GAS = PARTICLE_TYPES.register("stinky_gas", + AntarchyForgeMisc::simpleParticleType); + public static final RegistryObject STINKY_FLY = PARTICLE_TYPES.register("stinky_fly", + AntarchyForgeMisc::simpleParticleType); + public static final RegistryObject PEACH_LEAVES_PARTICLE = PARTICLE_TYPES.register("peach_leaves_particle", + AntarchyForgeMisc::simpleParticleType); + public static final RegistryObject LOTUS_POLLEN = PARTICLE_TYPES.register("lotus_pollen", + AntarchyForgeMisc::simpleParticleType); + public static final RegistryObject HYPNOTIC_GAS = PARTICLE_TYPES.register("hypnotic_gas", + AntarchyForgeMisc::simpleParticleType); + public static final RegistryObject HYPNOTIC_GAS_CLOUD = PARTICLE_TYPES.register("hypnotic_gas_cloud", + AntarchyForgeMisc::simpleParticleType); + public static final RegistryObject HYPNOTIC_GAS_DOWN = PARTICLE_TYPES.register("hypnotic_gas_down", + AntarchyForgeMisc::simpleParticleType); + public static final RegistryObject HYPNOTIC_GAS_CLOUD_DOWN = PARTICLE_TYPES.register("hypnotic_gas_cloud_down", + AntarchyForgeMisc::simpleParticleType); + public static final RegistryObject FIREFLY = PARTICLE_TYPES.register("firefly", + AntarchyForgeMisc::simpleParticleType); + public static final RegistryObject ORANGE_ASH = PARTICLE_TYPES.register("orange_ash", + AntarchyForgeMisc::simpleParticleType); + public static final RegistryObject> INVERTED_GEYSER_BASE = PARTICLE_TYPES.register("inverted_geyser_base", + () -> particleType(InvertedGeyserBaseParticleOptions.deserializer())); + public static final RegistryObject> INVERTED_GEYSER_PLUME = PARTICLE_TYPES.register("inverted_geyser_plume", + () -> particleType(InvertedGeyserParticleOptions.deserializer())); + public static final RegistryObject> INVERTED_GEYSER_POOF = PARTICLE_TYPES.register("inverted_geyser_poof", + () -> particleType(InvertedGeyserBaseParticleOptions.deserializer())); + public static final RegistryObject> INVERTED_GEYSER_ERUPTION = PARTICLE_TYPES.register("inverted_geyser_eruption", + () -> particleType(InvertedGeyserParticleOptions.deserializer())); + + // Features + public static final RegistryObject RED_ANT_NEST_FEATURE = FEATURES.register("red_ant_nest", + () -> new RedAntNestFeature(SimpleBlockConfiguration.CODEC)); + public static final RegistryObject BROWN_ANT_NEST_FEATURE = FEATURES.register("brown_ant_nest", + () -> new BrownAntNestFeature(SimpleBlockConfiguration.CODEC)); + public static final RegistryObject RAINBOW_ANT_NEST_FEATURE = FEATURES.register("rainbow_ant_nest", + () -> new RainbowAntNestFeature(SimpleBlockConfiguration.CODEC)); + public static final RegistryObject TERMITE_NEST_FEATURE = FEATURES.register("termite_nest", + () -> new TermiteNestFeature(SimpleBlockConfiguration.CODEC)); + public static final RegistryObject OURANWOOD_LARGE_TREE = FEATURES.register("ouranwood_large_tree", + () -> new OuranwoodTreeFeature(OuranwoodTreeConfiguration.CODEC)); + public static final RegistryObject OURANWOOD_YOUNG_TREE = FEATURES.register("ouranwood_young_tree", + () -> new OuranwoodTreeFeature(OuranwoodTreeConfiguration.CODEC)); + public static final RegistryObject OURANWOOD_MEDIUM_TREE = FEATURES.register("ouranwood_medium_tree", + () -> new OuranwoodTreeFeature(OuranwoodTreeConfiguration.CODEC)); + public static final RegistryObject OURANWOOD_COCOON_TREE = FEATURES.register("ouranwood_cocoon_tree", + () -> new OuranwoodCocoonTreeFeature(OuranwoodTreeConfiguration.CODEC)); + public static final RegistryObject PEACH_TREE_FEATURE = FEATURES.register("peach_tree", + () -> new PeachTreeFeature(PeachTreeConfiguration.CODEC)); + public static final RegistryObject PEACH_LARGE_TREE_FEATURE = FEATURES.register("peach_large_tree", + () -> new PeachTreeFeature(PeachTreeConfiguration.CODEC)); + public static final RegistryObject ELYTHIA_FOREST_FLORA = FEATURES.register("elythia_forest_flora", + () -> new ElythiaFloraFeature(NoneFeatureConfiguration.CODEC, ElythiaFloraFeature.Variant.FOREST)); + public static final RegistryObject ELYTHIA_MEADOW_FLORA = FEATURES.register("elythia_meadow_flora", + () -> new ElythiaFloraFeature(NoneFeatureConfiguration.CODEC, ElythiaFloraFeature.Variant.MEADOW)); + public static final RegistryObject PEACH_FOREST_FLORA = FEATURES.register("peach_forest_flora", + () -> new ElythiaFloraFeature(NoneFeatureConfiguration.CODEC, ElythiaFloraFeature.Variant.PEACH_FOREST)); + public static final RegistryObject FLOWER_FOREST_MILKWEED = FEATURES.register("flower_forest_milkweed", + () -> new ElythiaFloraFeature(NoneFeatureConfiguration.CODEC, ElythiaFloraFeature.Variant.FLOWER_FOREST_MILKWEED)); + public static final RegistryObject CORN_PATCH = FEATURES.register("corn_patch", + () -> new CornPatchFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject STAR_CORAL_PATCH = FEATURES.register("star_coral_patch", + () -> new com.craisinlord.antarchy.content.worldgen.ocean.StarCoralPatchFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject SEASHELL_PATCH = FEATURES.register("seashell_patch", + () -> new SeashellFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject ELYTHIA_BUTTERFLY_FIELDS_FLORA = FEATURES.register("butterfly_fields_flora", + () -> new ElythiaFloraFeature(NoneFeatureConfiguration.CODEC, ElythiaFloraFeature.Variant.BUTTERFLY_FIELDS)); + public static final RegistryObject ELYTHIA_SURFACE_COVER = FEATURES.register("elythia_surface_cover", + () -> new ElythiaSurfaceCoverFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject ELYTHIA_UNDERGROUND = FEATURES.register("elythia_underground", + () -> new ElythiaUndergroundFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject BRUTALFLY_COCOON = FEATURES.register("brutalfly_cocoon", + () -> new BrutalflyCocoonFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject ELYTHIA_MOLEWORM_TUNNELS = FEATURES.register("elythia_moleworm_tunnels", + () -> new MolewormTunnelsFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject ELYTHIA_MOLEWORM_CAVE_ENTRANCES = FEATURES.register("elythia_moleworm_cave_entrances", + () -> new MolewormCaveEntranceFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject ELYTHIA_MOLEWORM_WARRENS = FEATURES.register("elythia_moleworm_warrens", + () -> new MolewormWarrensFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject ELYTHIA_MOLEWORM_SURFACE_MOUNDS = FEATURES.register("elythia_moleworm_surface_mounds", + () -> new MolewormSurfaceMoundsFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject TRIFFID_PATCH = FEATURES.register("triffid_patch", + () -> new TriffidPatchFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject ELYTHIA_POND = FEATURES.register("elythia_pond", + () -> new ElythiaPondFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject LUMEN_POOL = FEATURES.register("lumen_pools", + () -> new LumenPoolFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject LUMEN_LILY_PADS = FEATURES.register("lumen_lily_pads", + () -> new LumenLilyPadFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject GIANT_LILY_PAD_PATCH = FEATURES.register("giant_lily_pad_patch", + () -> new com.craisinlord.antarchy.content.worldgen.elythia.GiantLilyPadPatchFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject GIANT_LILY_PAD_PATCH_PEACH_FOREST = FEATURES.register("giant_lily_pad_patch_peach_forest", + () -> new com.craisinlord.antarchy.content.worldgen.elythia.GiantLilyPadPatchFeature(NoneFeatureConfiguration.CODEC, 0.12F)); + public static final RegistryObject LUMEN_STREAM = FEATURES.register("lumen_streams", + () -> new LumenStreamFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject LUMEN_SPIRE = FEATURES.register("lumen_spires", + () -> new LumenSpireFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject ELYTHIA_TUFF_BOULDER = FEATURES.register("elythia_tuff_boulder", + () -> new ElythiaTuffBoulderFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject ELYTHIA_LARGE_TUFF_BOULDER = FEATURES.register("elythia_large_tuff_boulder", + () -> new ElythiaLargeTuffBoulderFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject PEACH_FOREST_MOSSY_BOULDER = FEATURES.register("peach_forest_mossy_boulder", + () -> new PeachForestMossyBoulderFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject PEACH_FOREST_POND = FEATURES.register("peach_forest_pond", + () -> new PeachForestPondFeature(PeachForestPondConfiguration.CODEC)); + public static final RegistryObject ELYTHIA_CORAL_SPIKE = FEATURES.register("elythia_coral_spike", + () -> new CoralSpikeFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject FALLEN_OURANWOOD_TREE = FEATURES.register("fallen_ouranwood_tree", + () -> new com.craisinlord.antarchy.content.worldgen.elythia.FallenOuranwoodFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject FUNGAL_MUSHROOM = FEATURES.register("fungal_mushroom", + () -> new com.craisinlord.antarchy.content.worldgen.elythia.FungalMushroomFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject THORAXIS_FISSURE = FEATURES.register("thoraxis_fissure", + () -> new ThoraxisFissureFeature(ThoraxisFissureConfiguration.CODEC)); + public static final RegistryObject THORAXIS_RIB_COLUMNS = FEATURES.register("thoraxis_rib_columns", + () -> new ThoraxisRibColumnsFeature(ThoraxisRibColumnsConfiguration.CODEC)); + public static final RegistryObject THORAXIS_SPIKE = FEATURES.register("thoraxis_spike", + () -> new ThoraxisSpikeFeature(ThoraxisSpikeConfiguration.CODEC)); + public static final RegistryObject NYXITE_SPIKES = FEATURES.register("nyxite_spikes", + () -> new NyxiteSpikeFeature(NyxiteSpikeConfiguration.CODEC)); + public static final RegistryObject CAVARYN_CHITEN_SPIKES = FEATURES.register("cavaryn_chiten_spikes", + () -> new ChitenSpikeFeature(ChitenSpikeConfiguration.CODEC)); + public static final RegistryObject CAVARYN_BILE_VEINS = FEATURES.register("cavaryn_bile_veins", + () -> new CavarynBileVeinFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject CAVARYN_BILE_CYSTS = FEATURES.register("cavaryn_bile_cysts", + () -> new CavarynBileCystFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject CAVARYN_CREEPVINE = FEATURES.register("cavaryn_creepvine", + () -> new CavarynCreepvineFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject HANGING_CREEPROOTS = FEATURES.register("hanging_creeproots", + () -> new HangingCreeprootsFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject MOLTING_VINES = FEATURES.register("molting_vines", + () -> new MoltingVinesFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject GROUND_MOLTING_VINES = FEATURES.register("ground_molting_vines", + () -> new com.craisinlord.antarchy.content.worldgen.cavaryn.GroundMoltingVinesFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject JUMPY_BUG_EGG_CEILING = FEATURES.register("jumpy_bug_egg_ceiling", + () -> new com.craisinlord.antarchy.content.worldgen.cavaryn.JumpyBugEggCeilingFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject SPIT_BUG_EGG_PATCH = FEATURES.register("spit_bug_egg_patch", + () -> new com.craisinlord.antarchy.content.worldgen.cavaryn.SpitBugEggPatchFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject ROLLY_CAVES_GIANT_CAVERN = FEATURES.register("rolly_caves_giant_cavern", + () -> new com.craisinlord.antarchy.content.worldgen.cavaryn.RollyCavesGiantCavernFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject CAVARYN_WALL_AMBER_MOSS = FEATURES.register("cavaryn_wall_amber_moss", + () -> new CavarynWallAmberMossFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject ANTIWATER_SPRINGS = FEATURES.register("antiwater_springs", + () -> new AntiwaterSpringsFeature(AntiwaterSpringsConfiguration.CODEC)); + public static final RegistryObject POTENT_NYXITE_FEATURE = FEATURES.register("potent_nyxite", + () -> new PotentNyxiteFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject THORAXIS_BLOOD_CRYSTAL_SPIRES = FEATURES.register("thoraxis_blood_crystal_spires", + () -> new ThoraxisBloodCrystalFeature(ThoraxisBloodCrystalConfiguration.CODEC)); + public static final RegistryObject CLOUD_SEA_CALCITE_BANKS = FEATURES.register("cloud_sea_calcite_banks", + () -> new CloudSeaCalciteFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject BED_BUG_NEST = FEATURES.register("bed_bug_nest", + () -> new BedBugNestFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject BED_BUG_SURFACE_CLUSTER = FEATURES.register("bed_bug_surface_cluster", + () -> new BedBugSurfaceClusterFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject CAVARYN_TERROR_EGG_PATCH = FEATURES.register("cavaryn_terror_egg_patch", + () -> new CavarynEggPatchFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject HUGE_GLOWCAP_MUSHROOM = FEATURES.register("huge_glowcap_mushroom", + () -> new com.craisinlord.antarchy.content.worldgen.mushroom.GlowcapHugeMushroomFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject HUGE_GLOWCAP_MUSHROOM_WORLDGEN = FEATURES.register("huge_glowcap_mushroom_worldgen", + () -> new com.craisinlord.antarchy.content.worldgen.mushroom.GlowcapHugeMushroomWorldgenFeature(NoneFeatureConfiguration.CODEC)); + public static final RegistryObject THORAXIS_ANTIWATER_POOL = FEATURES.register("thoraxis_antiwater_pool", + () -> new ThoraxisAntiwaterPoolFeature(ThoraxisAntiwaterPoolConfiguration.CODEC)); + public static final RegistryObject LUCID_ANTIWATER_POOL = FEATURES.register("lucid_antiwater_pool", + () -> new LucidAntiwaterPoolFeature(ThoraxisAntiwaterPoolConfiguration.CODEC)); + public static final RegistryObject THORAXIS_DUNE = FEATURES.register("thoraxis_dune", + () -> new ThoraxisDuneFeature(ThoraxisDuneConfiguration.CODEC)); + + // Biome sources + public static final RegistryObject> ELYTHIA_BIOME_SOURCE = BIOME_SOURCES.register("elythia_biome_source", + () -> ElythiaBiomeSource.CODEC.codec()); + public static final RegistryObject> THORAXIS_BIOME_SOURCE = BIOME_SOURCES.register("thoraxis_biome_source", + () -> ThoraxisBiomeSource.CODEC.codec()); + + // Density function + public static final RegistryObject> ELYTHIA_RIVER_CARVE = DENSITY_FUNCTION_TYPES.register("elythia_river_carve", + () -> ElythiaRiverCarveFunction.KEY_CODEC.codec()); + + private AntarchyForgeMisc() {} + + public static MobEffect mobEffectHolder(RegistryObject effect) { + return effect.get(); + } + + public static Holder attributeHolder(RegistryObject attribute) { + return BuiltInRegistries.ATTRIBUTE.wrapAsHolder(attribute.get()); + } + + public static void register(IEventBus modEventBus) { + MOB_EFFECTS.register(modEventBus); + POTIONS.register(modEventBus); + FLUID_TYPES.register(modEventBus); + FLUIDS.register(modEventBus); + PARTICLE_TYPES.register(modEventBus); + FEATURES.register(modEventBus); + BIOME_SOURCES.register(modEventBus); + DENSITY_FUNCTION_TYPES.register(modEventBus); + ATTRIBUTES.register(modEventBus); + MENU_TYPES.register(modEventBus); + FROG_VARIANTS.register(modEventBus); + RECIPE_SERIALIZERS.register(modEventBus); + } + + + static ForgeFlowingFluid.Properties ichorProperties() { + return new ForgeFlowingFluid.Properties(com.craisinlord.antarchy.forge.AntarchyForgeFluidTypes.ICHOR_TYPE, ICHOR, FLOWING_ICHOR) + .bucket(() -> AntarchyForgeItems.ICHOR_BUCKET.get()) + .block(() -> AntarchyForgeBlocks.ICHOR_BLOCK.get()) + .slopeFindDistance(4) + .levelDecreasePerBlock(1) + .tickRate(5); + } + + static ForgeFlowingFluid.Properties bileProperties() { + return new ForgeFlowingFluid.Properties(com.craisinlord.antarchy.forge.AntarchyForgeFluidTypes.BILE_TYPE, BILE, FLOWING_BILE) + .bucket(() -> AntarchyForgeItems.BILE_BUCKET.get()) + .block(() -> AntarchyForgeBlocks.BILE_BLOCK.get()) + .slopeFindDistance(4) + .levelDecreasePerBlock(1) + .tickRate(5); + } + + static ForgeFlowingFluid.Properties antiwaterProperties() { + return new ForgeFlowingFluid.Properties(com.craisinlord.antarchy.forge.AntarchyForgeFluidTypes.ANTIWATER_TYPE, ANTIWATER, FLOWING_ANTIWATER) + .bucket(() -> AntarchyForgeItems.ANTIWATER_BUCKET.get()) + .block(() -> AntarchyForgeBlocks.ANTIWATER_BLOCK.get()) + .slopeFindDistance(4) + .levelDecreasePerBlock(1) + .tickRate(5); + } + + static ForgeFlowingFluid.Properties lumenProperties() { + return new ForgeFlowingFluid.Properties(com.craisinlord.antarchy.forge.AntarchyForgeFluidTypes.LUMEN_TYPE, LUMEN, FLOWING_LUMEN) + .bucket(() -> AntarchyForgeItems.LUMEN_BUCKET.get()) + .block(() -> AntarchyForgeBlocks.LUMEN_BLOCK.get()) + .slopeFindDistance(4) + .levelDecreasePerBlock(1) + .tickRate(5); + } + + private static SimpleParticleType simpleParticleType() { + return new SimpleParticleType(true) { + }; + } + + private static ParticleType particleType( + net.minecraft.core.particles.ParticleOptions.Deserializer deserializer + ) { + return new ParticleType<>(false, deserializer) { + @Override + public com.mojang.serialization.Codec codec() { + return null; + } + }; + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgePayloadHandlers.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgePayloadHandlers.java new file mode 100644 index 00000000..2e78d7ea --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgePayloadHandlers.java @@ -0,0 +1,43 @@ +package com.craisinlord.antarchy.forge.registry; + +import com.craisinlord.antarchy.content.network.BloodCrystalKatanaTrailPayload; +import com.craisinlord.antarchy.forge.network.AntarchyForgeNetworkCore; +import com.craisinlord.antarchy.forge.network.AntarchyGravityNetworking; +import com.craisinlord.antarchy.forge.network.BrutalflyElytraNetworking; +import com.craisinlord.antarchy.forge.network.DorrieJumpNetworking; +import com.craisinlord.antarchy.forge.network.HerculesBeetleNetworking; +import com.craisinlord.antarchy.forge.network.JumpyBootsNetworking; +import com.craisinlord.antarchy.forge.network.MultipartNetworking; + +public class AntarchyForgePayloadHandlers { + private AntarchyForgePayloadHandlers() {} + + public static void register() { + AntarchyGravityNetworking.register(); + BrutalflyElytraNetworking.register(); + JumpyBootsNetworking.register(); + DorrieJumpNetworking.register(); + HerculesBeetleNetworking.register(); + AntarchyForgeNetworkCore.registerS2C( + com.craisinlord.antarchy.content.network.BloodglassStatePayload.class, + com.craisinlord.antarchy.content.network.BloodglassStatePayload.STREAM_CODEC, + payload -> com.craisinlord.antarchy.content.client.BloodglassClientState.update(payload.shieldsActive(), payload.shieldsMax()) + ); + AntarchyForgeNetworkCore.registerS2C( + BloodCrystalKatanaTrailPayload.class, + BloodCrystalKatanaTrailPayload.STREAM_CODEC, + payload -> com.craisinlord.antarchy.content.client.BloodCrystalKatanaTrailClientState.trigger(payload.entityId(), payload.durationTicks()) + ); + AntarchyForgeNetworkCore.registerS2C( + com.craisinlord.antarchy.content.network.ScorpionWhipTetherPayload.class, + com.craisinlord.antarchy.content.network.ScorpionWhipTetherPayload.STREAM_CODEC, + payload -> com.craisinlord.antarchy.content.client.ScorpionWhipTetherClientState.update(payload.playerId(), payload.targetId()) + ); + AntarchyForgeNetworkCore.registerS2C( + com.craisinlord.antarchy.content.network.HordeIntensityPayload.class, + com.craisinlord.antarchy.content.network.HordeIntensityPayload.STREAM_CODEC, + payload -> com.craisinlord.antarchy.content.client.HordeClientState.update(payload.intensity()) + ); + MultipartNetworking.register(); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeSounds.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeSounds.java new file mode 100644 index 00000000..cbccc46a --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeSounds.java @@ -0,0 +1,188 @@ +package com.craisinlord.antarchy.forge.registry; + +import com.craisinlord.antarchy.Antarchy; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.registries.RegistryObject; + +public final class AntarchyForgeSounds { + private static final DeferredRegister SOUND_EVENTS = DeferredRegister.create(Registries.SOUND_EVENT, Antarchy.MODID); + + public static final RegistryObject SQUIDZOOKA_FIRE = registerSoundEvent("squidzooka_fire"); + public static final RegistryObject SHRINK_RAY_SOUND = registerSoundEvent("shrink_ray"); + public static final RegistryObject GROWTH_RAY_SOUND = registerSoundEvent("growth_ray"); + public static final RegistryObject SIZE_RAY_CHARGE = registerSoundEvent("size_ray_charge"); + public static final RegistryObject ANT_AMBIENT = registerSoundEvent("ant_ambient"); + public static final RegistryObject ANT_IDLE = registerSoundEvent("ant_idle"); + public static final RegistryObject ANT_HURT = registerSoundEvent("ant_hurt"); + public static final RegistryObject ANT_BITE = registerSoundEvent("ant_bite"); + public static final RegistryObject ANT_GATHER = registerSoundEvent("ant_gather"); + public static final RegistryObject ANT_NEST = registerSoundEvent("ant_nest"); + public static final RegistryObject CLOUD_SHARK_BITE = registerSoundEvent("cloud_shark_bite"); + public static final RegistryObject CLOUD_SHARK_IDLE = registerSoundEvent("cloud_shark_idle"); + public static final RegistryObject CLOUD_SHARK_HURT = registerSoundEvent("cloud_shark_hurt"); + public static final RegistryObject CLOUD_SHARK_DEATH = registerSoundEvent("cloud_shark_death"); + public static final RegistryObject CLOUD_SHARK_FLY = registerSoundEvent("cloud_shark_fly"); + public static final RegistryObject CATERPILLAR_IDLE = registerSoundEvent("caterpillar_idle"); + public static final RegistryObject CATERPILLAR_HURT = registerSoundEvent("caterpillar_hurt"); + public static final RegistryObject CATERPILLAR_CRAWL = registerSoundEvent("caterpillar_crawl"); + public static final RegistryObject BUTTERFLY_HURT = registerSoundEvent("butterfly_hurt"); + public static final RegistryObject BRUTALFLY_IDLE = registerSoundEvent("brutalfly_idle"); + public static final RegistryObject BRUTALFLY_DEATH = registerSoundEvent("brutalfly_death"); + public static final RegistryObject ELYTHIA_FIREFLY_AMBIENT = registerSoundEvent("ambient.elythia.firefly"); + public static final RegistryObject MISSILE_SQUID_AMBIENT = registerSoundEvent("missile_squid_ambient"); + public static final RegistryObject MISSILE_SQUID_HURT = registerSoundEvent("missile_squid_hurt"); + public static final RegistryObject MISSILE_SQUID_DEATH = registerSoundEvent("missile_squid_death"); + public static final RegistryObject MISSILE_SQUID_ATTACK = registerSoundEvent("missile_squid_attack"); + public static final RegistryObject KRAKEN_FLYING_LOOP = registerSoundEvent("kraken_flying_loop"); + public static final RegistryObject KRAKEN_FLYING_SIDEWAYS_LOOP = registerSoundEvent("kraken_flying_sideways_loop"); + public static final RegistryObject KRAKEN_ATTACK = registerSoundEvent("kraken_attack"); + public static final RegistryObject KRAKEN_SPIN = registerSoundEvent("kraken_spin"); + public static final RegistryObject KRAKEN_ROAR = registerSoundEvent("kraken_roar"); + public static final RegistryObject KRAKEN_SUMMON = registerSoundEvent("kraken_summon"); + public static final RegistryObject KRAKEN_HURT = registerSoundEvent("kraken_hurt"); + public static final RegistryObject KRAKEN_DEATH = registerSoundEvent("kraken_death"); + public static final RegistryObject BASILISK_IDLE_LOOP = registerSoundEvent("basilisk_idle_loop"); + public static final RegistryObject BASILISK_SLITHER_LOOP = registerSoundEvent("basilisk_slither_loop"); + public static final RegistryObject BASILISK_BITE = registerSoundEvent("basilisk_bite"); + public static final RegistryObject BASILISK_HISS = registerSoundEvent("basilisk_hiss"); + public static final RegistryObject BASILISK_HURT = registerSoundEvent("basilisk_hurt"); + public static final RegistryObject BASILISK_DEATH = registerSoundEvent("basilisk_death"); + public static final RegistryObject THORAXIS_NIGHTMARE_WASTES_AMBIENT = registerSoundEvent("thoraxis_nightmare_wastes_ambient"); + public static final RegistryObject THORAXIS_NIGHTMARE_WASTES_ADDITIONS = registerSoundEvent("thoraxis_nightmare_wastes_additions"); + public static final RegistryObject THORAXIS_NIGHTMARE_WASTES_MOOD = registerSoundEvent("thoraxis_nightmare_wastes_mood"); + public static final RegistryObject THORAXIS_DREAM_DUNES_AMBIENT = registerSoundEvent("thoraxis_dream_dunes_ambient"); + public static final RegistryObject THORAXIS_DREAM_DUNES_ADDITIONS = registerSoundEvent("thoraxis_dream_dunes_additions"); + public static final RegistryObject THORAXIS_DREAM_DUNES_MOOD = registerSoundEvent("thoraxis_dream_dunes_mood"); + public static final RegistryObject THORAXIS_LUCID_POOLS_AMBIENT = registerSoundEvent("thoraxis_lucid_pools_ambient"); + public static final RegistryObject THORAXIS_LUCID_POOLS_ADDITIONS = registerSoundEvent("thoraxis_lucid_pools_additions"); + public static final RegistryObject THORAXIS_LUCID_POOLS_MOOD = registerSoundEvent("thoraxis_lucid_pools_mood"); + public static final RegistryObject LUCID_AMBIENT = registerSoundEvent("lucid_ambient"); + public static final RegistryObject LUCID_FLYING = registerSoundEvent("lucid_flying"); + public static final RegistryObject LUCID_ATTACK = registerSoundEvent("lucid_attack"); + public static final RegistryObject LUCID_BOLT_SOUND = registerSoundEvent("lucid_bolt"); + public static final RegistryObject LUCID_HURT = registerSoundEvent("lucid_hurt"); + public static final RegistryObject LUCID_DEATH = registerSoundEvent("lucid_death"); + public static final RegistryObject REVERIE_IDLE = registerSoundEvent("reverie_idle"); + public static final RegistryObject REVERIE_HURT = registerSoundEvent("reverie_hurt"); + public static final RegistryObject REVERIE_WORRY = registerSoundEvent("reverie_worry"); + public static final RegistryObject REVERIE_SAVE = registerSoundEvent("reverie_save"); + public static final RegistryObject REVERIE_JOIN_PLAYER = registerSoundEvent("reverie_join_player"); + public static final RegistryObject REVERIE_ALERT = registerSoundEvent("reverie_alert"); + public static final RegistryObject FLYING_SQUIRREL_IDLE = registerSoundEvent("flying_squirrel_idle"); + public static final RegistryObject FLYING_SQUIRREL_BEG = registerSoundEvent("flying_squirrel_beg"); + public static final RegistryObject FLYING_SQUIRREL_NUT = registerSoundEvent("flying_squirrel_nut"); + public static final RegistryObject FLYING_SQUIRREL_GLIDE_LOOP = registerSoundEvent("flying_squirrel_glide_loop"); + public static final RegistryObject FLYING_SQUIRREL_HURT = registerSoundEvent("flying_squirrel_hurt"); + public static final RegistryObject FLYING_SQUIRREL_DEATH = registerSoundEvent("flying_squirrel_death"); + public static final RegistryObject NIGHTMARE_IDLE = registerSoundEvent("nightmare_idle"); + public static final RegistryObject NIGHTMARE_HURT = registerSoundEvent("nightmare_hurt"); + public static final RegistryObject NIGHTMARE_ROAR = registerSoundEvent("nightmare_roar"); + public static final RegistryObject NIGHTMARE_DEATH = registerSoundEvent("nightmare_death"); + public static final RegistryObject NIGHTMARE_BITE = registerSoundEvent("nightmare_bite"); + public static final RegistryObject NIGHTMARE_FLAP = registerSoundEvent("nightmare_flap"); + public static final RegistryObject TRIFFID_ATTACK = registerSoundEvent("triffid_attack"); + public static final RegistryObject TRIFFID_GRAB = registerSoundEvent("triffid_grab"); + public static final RegistryObject TRIFFID_HURT = registerSoundEvent("triffid_hurt"); + public static final RegistryObject TRIFFID_DEATH = registerSoundEvent("triffid_death"); + public static final RegistryObject TRIFFID_HISS = registerSoundEvent("triffid_hiss"); + public static final RegistryObject TRIFFID_GROWL = registerSoundEvent("triffid_growl"); + public static final RegistryObject MANTIS_AMBIENT = registerSoundEvent("mantis_ambient"); + public static final RegistryObject MANTIS_HURT = registerSoundEvent("mantis_hurt"); + public static final RegistryObject MANTIS_ATTACK = registerSoundEvent("mantis_attack"); + public static final RegistryObject MANTIS_FLY_LOOP = registerSoundEvent("mantis_fly_loop"); + public static final RegistryObject GRAVITY_GUN_PICKUP = registerSoundEvent("gravity_gun_pickup"); + public static final RegistryObject GRAVITY_GUN_DROP = registerSoundEvent("gravity_gun_drop"); + public static final RegistryObject GRAVITY_GUN_HOLD_LOOP = registerSoundEvent("gravity_gun_hold_loop"); + public static final RegistryObject GRAVITY_GUN_LAUNCH = registerSoundEvent("gravity_gun_launch"); + public static final RegistryObject GRAVITY_GUN_DRYFIRE = registerSoundEvent("gravity_gun_dryfire"); + public static final RegistryObject BED_BUG_AMBIENT = registerSoundEvent("bed_bug_ambient"); + public static final RegistryObject BED_BUG_HURT = registerSoundEvent("bed_bug_hurt"); + public static final RegistryObject BED_BUG_ATTACK = registerSoundEvent("bed_bug_attack"); + public static final RegistryObject WASP_IDLE = registerSoundEvent("wasp_idle"); + public static final RegistryObject WASP_HURT = registerSoundEvent("wasp_hurt"); + public static final RegistryObject WASP_ATTACK = registerSoundEvent("wasp_attack"); + public static final RegistryObject WASP_DEATH = registerSoundEvent("wasp_death"); + public static final RegistryObject SCORPION_AMBIENT = registerSoundEvent("scorpion_ambient"); + public static final RegistryObject SCORPION_HURT = registerSoundEvent("scorpion_hurt"); + public static final RegistryObject SCORPION_ATTACK = registerSoundEvent("scorpion_attack"); + public static final RegistryObject EMPEROR_SCORPION_AMBIENT = registerSoundEvent("emperor_scorpion_ambient"); + public static final RegistryObject EMPEROR_SCORPION_HURT = registerSoundEvent("emperor_scorpion_hurt"); + public static final RegistryObject EMPEROR_SCORPION_ATTACK = registerSoundEvent("emperor_scorpion_attack"); + public static final RegistryObject EMPEROR_SCORPION_ROAR = registerSoundEvent("emperor_scorpion_roar"); + public static final RegistryObject MOLEWORM_AMBIENT = registerSoundEvent("moleworm_ambient"); + public static final RegistryObject MOLEWORM_HURT = registerSoundEvent("moleworm_hurt"); + public static final RegistryObject MOLEWORM_ATTACK = registerSoundEvent("moleworm_attack"); + public static final RegistryObject MOLEWORM_DIG = registerSoundEvent("moleworm_dig"); + public static final RegistryObject MOLEVORE_AMBIENT = registerSoundEvent("molevore_ambient"); + public static final RegistryObject MOLEVORE_HURT = registerSoundEvent("molevore_hurt"); + public static final RegistryObject MOLEVORE_ATTACK = registerSoundEvent("molevore_attack"); + public static final RegistryObject MOLEVORE_DIG = registerSoundEvent("molevore_dig"); + public static final RegistryObject BOMBER_WALK = registerSoundEvent("bomber_walk"); + public static final RegistryObject BOMBER_KNOCK = registerSoundEvent("bomber_knock"); + public static final RegistryObject BOMBER_EXPLODE = registerSoundEvent("bomber_explode"); + public static final RegistryObject TORETERROR_IDLE = registerSoundEvent("toreterror_idle"); + public static final RegistryObject TORETERROR_HURT = registerSoundEvent("toreterror_hurt"); + public static final RegistryObject TORETERROR_DEATH = registerSoundEvent("toreterror_death"); + public static final RegistryObject TORETERROR_BOMBER_FIRE = registerSoundEvent("toreterror_bomber_fire"); + public static final RegistryObject TORETERROR_SPIN = registerSoundEvent("toreterror_spin"); + public static final RegistryObject TORETERROR_RICOCHET = registerSoundEvent("toreterror_ricochet"); + public static final RegistryObject WATER_CANNON_FIRE = registerSoundEvent("water_cannon_fire"); + public static final RegistryObject TORETERROR_JUMP_UP = registerSoundEvent("toreterror_jump_up"); + public static final RegistryObject TORETERROR_JUMP_LAND = registerSoundEvent("toreterror_jump_land"); + public static final RegistryObject STINKY_FLY = registerSoundEvent("stinky_fly"); + public static final RegistryObject STINK_BUG_FART = registerSoundEvent("stink_bug_fart"); + public static final RegistryObject STINK_BUG_IDLE = registerSoundEvent("stink_bug_idle"); + public static final RegistryObject CAVARYN_HEARTBEAT = registerSoundEvent("cavaryn_heartbeat"); + public static final RegistryObject ROLLY_POLLY_IDLE = registerSoundEvent("rolly_polly_idle"); + public static final RegistryObject ROLLY_POLLY_WHEEL_MODE = registerSoundEvent("rolly_polly_wheel_mode"); + public static final RegistryObject ROLLY_POLLY_NORMAL_MODE = registerSoundEvent("rolly_polly_normal_mode"); + public static final RegistryObject ROLLY_POLLY_ROLL = registerSoundEvent("rolly_polly_roll"); + public static final RegistryObject CREEPING_HORROR_GROWL = registerSoundEvent("creeping_horror_growl"); + public static final RegistryObject CREEPING_HORROR_HURT = registerSoundEvent("creeping_horror_hurt"); + public static final RegistryObject CREEPING_HORROR_BITE = registerSoundEvent("creeping_horror_bite"); + public static final RegistryObject LURKING_TERROR_SNARL = registerSoundEvent("lurking_terror_snarl"); + public static final RegistryObject LURKING_TERROR_HURT = registerSoundEvent("lurking_terror_hurt"); + public static final RegistryObject LURKING_TERROR_BITE = registerSoundEvent("lurking_terror_bite"); + public static final RegistryObject LURKING_TERROR_FLY_LOOP = registerSoundEvent("lurking_terror_fly_loop"); + public static final RegistryObject HERCULES_BEETLE_IDLE = registerSoundEvent("hercules_beetle_idle"); + public static final RegistryObject HERCULES_BEETLE_HURT = registerSoundEvent("hercules_beetle_hurt"); + public static final RegistryObject HERCULES_BEETLE_ATTACK = registerSoundEvent("hercules_beetle_attack"); + public static final RegistryObject HERCULES_BEETLE_CRY = registerSoundEvent("hercules_beetle_cry"); + public static final RegistryObject HERCULES_BEETLE_CHARGE_START = registerSoundEvent("hercules_beetle_charge_start"); + public static final RegistryObject HERCULES_BEETLE_KNOCKED_DOWN = registerSoundEvent("hercules_beetle_knocked_down"); + public static final RegistryObject JUMPY_BUG_IDLE = registerSoundEvent("jumpy_bug_idle"); + public static final RegistryObject SPIT_BUG_IDLE = registerSoundEvent("spit_bug_idle"); + public static final RegistryObject JUMPY_BUG_HURT = registerSoundEvent("jumpy_bug_hurt"); + public static final RegistryObject JUMPY_BUG_JUMP = registerSoundEvent("jumpy_bug_jump"); + public static final RegistryObject SPIT_BUG_HURT = registerSoundEvent("spit_bug_hurt"); + public static final RegistryObject SPIT_BUG_SPIT = registerSoundEvent("spit_bug_spit"); + public static final RegistryObject BRUTALFLY_SPIT = registerSoundEvent("brutalfly_spit"); + public static final RegistryObject JERRY_YOUNG_IDLE = registerSoundEvent("jerry_young_idle"); + public static final RegistryObject JERRY_YOUNG_HURT = registerSoundEvent("jerry_young_hurt"); + public static final RegistryObject JERRY_YOUNG_DEATH = registerSoundEvent("jerry_young_death"); + public static final RegistryObject JERRY_YOUNG_ATTACK = registerSoundEvent("jerry_young_attack"); + public static final RegistryObject JERRY_ADULT_IDLE = registerSoundEvent("jerry_adult_idle"); + public static final RegistryObject JERRY_ADULT_HURT = registerSoundEvent("jerry_adult_hurt"); + public static final RegistryObject JERRY_ADULT_DEATH = registerSoundEvent("jerry_adult_death"); + public static final RegistryObject JERRY_ADULT_ATTACK = registerSoundEvent("jerry_adult_attack"); + public static final RegistryObject DUCT_TAPE_USE = registerSoundEvent("duct_tape_use"); + public static final RegistryObject POTENT_NYXITE_HYPNOTIC_GAS = registerSoundEvent("potent_nyxite_hypnotic_gas"); + public static final RegistryObject POTENT_NYXITE_GEYSER_ERUPTION_START = registerSoundEvent("potent_nyxite_geyser_eruption_start"); + public static final RegistryObject POTENT_NYXITE_GEYSER_ERUPTION_ACTIVE = registerSoundEvent("potent_nyxite_geyser_eruption_active"); + public static final RegistryObject POTENT_NYXITE_GEYSER_CONTINUOUS_START = registerSoundEvent("potent_nyxite_geyser_continuous_start"); + public static final RegistryObject POTENT_NYXITE_GEYSER_CONTINUOUS_ACTIVE = registerSoundEvent("potent_nyxite_geyser_continuous_active"); + + private AntarchyForgeSounds() {} + + public static void register(IEventBus modEventBus) { + SOUND_EVENTS.register(modEventBus); + } + + private static RegistryObject registerSoundEvent(String path) { + return SOUND_EVENTS.register(path, + () -> SoundEvent.createVariableRangeEvent(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, path))); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeSpawnPlacements.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeSpawnPlacements.java new file mode 100644 index 00000000..ada4a3ff --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyForgeSpawnPlacements.java @@ -0,0 +1,63 @@ +package com.craisinlord.antarchy.forge.registry; + +import com.craisinlord.antarchy.content.entity.*; +import net.minecraft.world.entity.animal.AbstractFish; +import com.craisinlord.antarchy.content.entity.basilisk.BasiliskEntity; +import com.craisinlord.antarchy.content.entity.cloud_shark.CloudSharkEntity; +import com.craisinlord.antarchy.content.entity.flying_squirrel.FlyingSquirrelEntity; +import com.craisinlord.antarchy.content.entity.kraken.KrakenEntity; +import com.craisinlord.antarchy.content.entity.lucid.LucidEntity; +import com.craisinlord.antarchy.content.entity.nightmare.NightmareEntity; +import net.minecraft.world.entity.animal.Cow; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.event.entity.SpawnPlacementRegisterEvent; + +public class AntarchyForgeSpawnPlacements { + private AntarchyForgeSpawnPlacements() {} + + public static void register(IEventBus modEventBus) { + modEventBus.addListener(AntarchyForgeSpawnPlacements::registerSpawnPlacements); + } + + static void registerSpawnPlacements(SpawnPlacementRegisterEvent event) { + event.register(AntarchyForgeEntites.FLYING_SQUIRREL.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING, FlyingSquirrelEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.CATERPILLAR.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, CaterpillarEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.BUTTERFLY.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ButterflyEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.REVERIE.get(), net.minecraft.world.entity.SpawnPlacements.Type.NO_RESTRICTIONS, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ReverieEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.BRUTALFLY.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Monster::checkMonsterSpawnRules, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.APPLE_COW.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Cow::checkAnimalSpawnRules, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.GOLDEN_APPLE_COW.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Cow::checkAnimalSpawnRules, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.ENCHANTED_GOLDEN_APPLE_COW.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Cow::checkAnimalSpawnRules, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.CLOUD_SHARK.get(), net.minecraft.world.entity.SpawnPlacements.Type.NO_RESTRICTIONS, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, CloudSharkEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.WASP.get(), net.minecraft.world.entity.SpawnPlacements.Type.NO_RESTRICTIONS, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, WaspEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.BOMBER.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, BomberEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.JUMPY_BUG.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, JumpyBugEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.SPIT_BUG.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, SpitBugEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.KRAKEN.get(), net.minecraft.world.entity.SpawnPlacements.Type.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, KrakenEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.MISSILE_SQUID.get(), net.minecraft.world.entity.SpawnPlacements.Type.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, MissileSquidEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.OCTOPUS_BOMB.get(), net.minecraft.world.entity.SpawnPlacements.Type.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, OctopusBombEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.NIGHTMARE.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, NightmareEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.MOLEWORM.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, MolewormEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.MANTIS.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, MantisEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.ALPHA_MANTIS.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, AlphaMantisEntity::checkAlphaMantisSpawnRules, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.MOLEVORE.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, MolevoreEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.BED_BUG.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, BedBugEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.STINK_BUG.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, StinkBugEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.LUCID.get(), net.minecraft.world.entity.SpawnPlacements.Type.NO_RESTRICTIONS, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, LucidEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.SCORPION.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, ScorpionEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.BASILISK.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, BasiliskEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.EMPEROR_SCORPION.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, EmperorScorpionEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.CREEPING_HORROR.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, CreepingHorrorEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.LURKING_TERROR.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, LurkingTerrorEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.JERRY.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, JerryEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.TERMITE.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.Animal::checkAnimalSpawnRules, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.ROLLY_POLLY.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, com.craisinlord.antarchy.content.entity.RollyPollyEntity::canSpawn, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.CHEEP.get(), net.minecraft.world.entity.SpawnPlacements.Type.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, AbstractFish::checkSurfaceWaterAnimalSpawnRules, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.DORRIE.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.Animal::checkAnimalSpawnRules, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.OURANWOOD_DEER.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.Animal::checkAnimalSpawnRules, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.GLIMMER.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, com.craisinlord.antarchy.content.entity.glimmer.GlimmerEntity::checkGlimmerSpawnRules, SpawnPlacementRegisterEvent.Operation.OR); + event.register(AntarchyForgeEntites.ELKA.get(), net.minecraft.world.entity.SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, net.minecraft.world.entity.animal.Animal::checkAnimalSpawnRules, SpawnPlacementRegisterEvent.Operation.OR); + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyGeoItemExtensions.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyGeoItemExtensions.java new file mode 100644 index 00000000..2b245e88 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/AntarchyGeoItemExtensions.java @@ -0,0 +1,59 @@ +package com.craisinlord.antarchy.forge.registry; + +import com.craisinlord.antarchy.content.client.AntarchyGeoItem; +import com.craisinlord.antarchy.content.client.AntarchyGeoItemRenderer; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; + +public final class AntarchyGeoItemExtensions { + private AntarchyGeoItemExtensions() {} + + private static BlockEntityWithoutLevelRenderer geoRendererOf(Item item) { + return ((AntarchyGeoItemRenderer) ((AntarchyGeoItem) item).getRenderProvider().get()).getCustomRenderer(); + } + + public static IClientItemExtensions plain(Item item) { + return new IClientItemExtensions() { + @Override + public BlockEntityWithoutLevelRenderer getCustomRenderer() { + return geoRendererOf(item); + } + }; + } + + public static IClientItemExtensions crossbowHold(Item item) { + return new IClientItemExtensions() { + @Override + public BlockEntityWithoutLevelRenderer getCustomRenderer() { + return geoRendererOf(item); + } + + @Override + public HumanoidModel.ArmPose getArmPose(LivingEntity entityLiving, InteractionHand hand, ItemStack itemStack) { + return HumanoidModel.ArmPose.CROSSBOW_HOLD; + } + }; + } + + public static IClientItemExtensions sizeRay(Item item) { + return new IClientItemExtensions() { + @Override + public BlockEntityWithoutLevelRenderer getCustomRenderer() { + return geoRendererOf(item); + } + + @Override + public HumanoidModel.ArmPose getArmPose(LivingEntity entityLiving, InteractionHand hand, ItemStack itemStack) { + if (entityLiving.isUsingItem() && entityLiving.getUsedItemHand() == hand) { + return HumanoidModel.ArmPose.CROSSBOW_HOLD; + } + return null; + } + }; + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/DeferredRegister.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/DeferredRegister.java new file mode 100644 index 00000000..6fd19719 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/registry/DeferredRegister.java @@ -0,0 +1,78 @@ +package com.craisinlord.antarchy.forge.registry; + +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.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.registries.RegistryObject; + +import java.util.Collection; +import java.util.function.Supplier; + +public class DeferredRegister { + private final net.minecraftforge.registries.DeferredRegister delegate; + + protected DeferredRegister(net.minecraftforge.registries.DeferredRegister delegate) { + this.delegate = delegate; + } + + public static DeferredRegister create(ResourceKey> registryKey, String modId) { + return new DeferredRegister<>(net.minecraftforge.registries.DeferredRegister.create(registryKey, modId)); + } + + public static Items createItems(String modId) { + return new Items(net.minecraftforge.registries.DeferredRegister.create(Registries.ITEM, modId)); + } + + public static Blocks createBlocks(String modId) { + return new Blocks(net.minecraftforge.registries.DeferredRegister.create(Registries.BLOCK, modId)); + } + + public RegistryObject register(String name, Supplier supplier) { + return this.delegate.register(name, supplier); + } + + public void register(IEventBus modEventBus) { + this.delegate.register(modEventBus); + } + + public Collection> getEntries() { + return this.delegate.getEntries(); + } + + public TagKey createTagKey(String name) { + return this.delegate.createTagKey(name); + } + + public static final class Items extends DeferredRegister { + private Items(net.minecraftforge.registries.DeferredRegister delegate) { + super(delegate); + } + + public RegistryObject registerSimpleItem(String name) { + return this.registerSimpleItem(name, new Item.Properties()); + } + + public RegistryObject registerSimpleItem(String name, Item.Properties properties) { + return this.register(name, () -> new Item(properties)); + } + + public RegistryObject registerSimpleBlockItem(RegistryObject block) { + return this.register(block.getId().getPath(), () -> new BlockItem(block.get(), new Item.Properties())); + } + + public RegistryObject registerSimpleBlockItem(RegistryObject block, Item.Properties properties) { + return this.register(block.getId().getPath(), () -> new BlockItem(block.get(), properties)); + } + } + + public static final class Blocks extends DeferredRegister { + private Blocks(net.minecraftforge.registries.DeferredRegister delegate) { + super(delegate); + } + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/worldgen/CornPatchFeature.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/worldgen/CornPatchFeature.java new file mode 100644 index 00000000..dbdd2799 --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/worldgen/CornPatchFeature.java @@ -0,0 +1,62 @@ +package com.craisinlord.antarchy.forge.worldgen; + +import com.craisinlord.antarchy.content.block.CornCropBlock; +import com.craisinlord.antarchy.forge.registry.AntarchyForgeBlocks; +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; + +public final class CornPatchFeature extends Feature { + public CornPatchFeature(Codec codec) { + super(codec); + } + + @Override + public boolean place(FeaturePlaceContext context) { + WorldGenLevel level = context.level(); + RandomSource random = context.random(); + BlockPos origin = context.origin(); + Block wildCorn = AntarchyForgeBlocks.WILD_CORN.get(); + int radius = 4 + random.nextInt(3); + int targetPlacements = 10 + random.nextInt(11); + int attempts = targetPlacements * 4; + int placed = 0; + + for (int i = 0; i < attempts && placed < targetPlacements; i++) { + int x = origin.getX() + random.nextInt(radius * 2 + 1) - radius; + int z = origin.getZ() + random.nextInt(radius * 2 + 1) - radius; + int surfaceY = level.getHeight(Heightmap.Types.WORLD_SURFACE_WG, x, z); + BlockPos lowerPos = new BlockPos(x, surfaceY, z); + BlockPos upperPos = lowerPos.above(); + + if (!level.getBlockState(lowerPos.below()).is(Blocks.GRASS_BLOCK)) { + continue; + } + if (!level.getBlockState(lowerPos).canBeReplaced() || !level.getBlockState(upperPos).canBeReplaced()) { + continue; + } + + BlockState lowerState = wildCorn.defaultBlockState() + .setValue(CornCropBlock.AGE, 3) + .setValue(CornCropBlock.HALF, DoubleBlockHalf.LOWER); + BlockState upperState = wildCorn.defaultBlockState() + .setValue(CornCropBlock.AGE, 3) + .setValue(CornCropBlock.HALF, DoubleBlockHalf.UPPER); + + level.setBlock(lowerPos, lowerState, 2); + level.setBlock(upperPos, upperState, 2); + placed++; + } + + return placed > 0; + } +} diff --git a/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/worldgen/LumenLilyPadFeature.java b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/worldgen/LumenLilyPadFeature.java new file mode 100644 index 00000000..fb1aa6eb --- /dev/null +++ b/forge-1.20.1/src/main/java/com/craisinlord/antarchy/forge/worldgen/LumenLilyPadFeature.java @@ -0,0 +1,52 @@ +package com.craisinlord.antarchy.forge.worldgen; + +import com.craisinlord.antarchy.content.AntarchyTags; +import com.mojang.serialization.Codec; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; + +public final class LumenLilyPadFeature extends Feature { + public LumenLilyPadFeature(Codec codec) { + super(codec); + } + + @Override + public boolean place(FeaturePlaceContext context) { + WorldGenLevel level = context.level(); + RandomSource random = context.random(); + BlockPos origin = context.origin(); + boolean placedAny = false; + + for (int i = 0; i < 24; i++) { + int x = origin.getX() + random.nextInt(17) - 8; + int z = origin.getZ() + random.nextInt(17) - 8; + int surfaceY = level.getHeight(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, x, z) - 1; + BlockPos fluidPos = new BlockPos(x, surfaceY, z); + if (!level.getFluidState(fluidPos).is(AntarchyTags.Fluids.LUMEN) || !level.getFluidState(fluidPos).isSource()) { + continue; + } + + BlockPos padPos = fluidPos.above(); + if (!level.isEmptyBlock(padPos)) { + continue; + } + + BlockState lilyPad = Blocks.LILY_PAD.defaultBlockState(); + if (!lilyPad.canSurvive(level, padPos)) { + continue; + } + + level.setBlock(padPos, lilyPad, 2); + placedAny = true; + } + + return placedAny; + } +} diff --git a/forge-1.20.1/src/main/resources/META-INF/mods.toml b/forge-1.20.1/src/main/resources/META-INF/mods.toml new file mode 100644 index 00000000..4dba59d6 --- /dev/null +++ b/forge-1.20.1/src/main/resources/META-INF/mods.toml @@ -0,0 +1,30 @@ +modLoader="javafml" +loaderVersion="${loader_version_range}" +license="${mod_license}" + +[[mods]] +modId="${mod_id}" +version="${version}" +displayName="${mod_name}" +authors="${mod_authors}" +description='''${mod_description}''' +displayTest="MATCH_VERSION" + +[[dependencies.${mod_id}]] + modId="forge" + mandatory=true + versionRange="${forge_version_range}" + ordering="NONE" + side="BOTH" +[[dependencies.${mod_id}]] + modId="minecraft" + mandatory=true + versionRange="${minecraft_version_range}" + ordering="NONE" + side="BOTH" + +[[mixins]] + config="antarchy-common.mixins.json" + +[[mixins]] + config="antarchy-forge.mixins.json" diff --git a/forge-1.20.1/src/main/resources/antarchy-forge.mixins.json b/forge-1.20.1/src/main/resources/antarchy-forge.mixins.json new file mode 100644 index 00000000..7b2955b0 --- /dev/null +++ b/forge-1.20.1/src/main/resources/antarchy-forge.mixins.json @@ -0,0 +1,23 @@ +{ + "required": true, + "package": "com.craisinlord.antarchy.forge.mixins", + "refmap": "antarchy-forge.mixins.refmap.json", + "compatibilityLevel": "JAVA_17", + "mixins": [ + "entity.MultipartEntityBridgeMixin", + "entity.MultipartEntityLevelRegistryMixin", + "entity.ParalyzedMobFreezeMixin", + "infinity.ConfigGenInvocationMixin", + "item.BucketItemThoraxisWaterMixin", + "level.ClientLevelPartEntitiesAccessor", + "level.LevelStemDiagnosticMixin", + "level.ServerLevelPartEntitiesAccessor" + ], + "client": [ + "client.LiquidBlockRendererMixin" + ], + "injectors": { + "defaultRequire": 1 + }, + "minVersion": "0.8" +}