From a566c7ffcdcb47d9d720db5e28f5c53da4c19511 Mon Sep 17 00:00:00 2001 From: craisinlord Date: Tue, 22 Sep 2026 21:28:35 -0500 Subject: [PATCH] Giant frying pan Many fixes Boogaloo prep Underside eye stars and moon Commanded vfx effect icons fabric crash fixes --- CHANGELOG.md | 30 +++ build.gradle | 14 +- .../compat/infinity/InfinityCompatBridge.java | 5 + .../config/AntarchyConfigCatalog.java | 1 + .../antarchy/config/AntarchySettings.java | 21 +++ .../antarchy/content/AntarchyObjects.java | 18 ++ .../block/entity/UnderVaultBlockEntity.java | 1 + .../client/ContractionAfterimages.java | 18 +- .../renderer/GiantFryingPanRenderer.java | 50 +++++ .../renderer/RoyalIndicatorRenderer.java | 54 ++++-- .../TemporalContractionAfterimageLayer.java | 4 +- .../renderer/TemporalContractionGeoLayer.java | 4 +- .../ThoraxisUndersideSkyRenderer.java | 94 ++++++---- .../client/screen/GiantFryingPanScreen.java | 24 +++ .../content/creative/CreativeTabContents.java | 3 + .../content/effect/BleedingMobEffect.java | 22 +++ .../content/effect/BloodMoonMobEffect.java | 10 + .../entity/portal/DimensionalTearEntity.java | 19 +- .../royal/beam/RoyalBeamController.java | 15 +- .../entity/royal/beam/RoyalBeamSettings.java | 10 + .../content/item/BloodGodsBladeItem.java | 93 ++++++++++ .../content/item/GiantFryingPanItem.java | 150 +++++++++++++++ .../content/item/GiantFryingPanStorage.java | 174 ++++++++++++++++++ .../item/RoyalGuardianSwordAbilities.java | 7 +- .../content/item/RoyalGuardianSwordItem.java | 35 +++- .../content/item/TemporalTunerItem.java | 86 +++++++++ .../content/menu/GiantFryingPanMenu.java | 54 ++++++ .../network/TemporalTunerScrollPayload.java | 19 ++ .../portal/CrossDimensionTravelApi.java | 116 ++++++++++++ .../content/time/TemporalTunerAccess.java | 7 + .../content/time/TimeDilationManager.java | 27 ++- .../AlexsCavesDepthChargeMixin.java | 3 +- .../time/LivingEntityTimeDilationMixin.java | 2 +- .../mixins/time/PlayerTemporalTunerMixin.java | 37 ++++ .../resources/antarchy-common.mixins.json | 1 + .../antarchy/geo/giant_frying_pan.geo.json | 110 +++++++++++ .../antarchy/items/blood_gods_blade.json | 6 + .../resources/assets/antarchy/lang/en_us.json | 16 ++ .../models/item/blood_gods_blade.json | 6 + .../models/item/giant_frying_pan_gui.json | 7 + .../models/item/giant_frying_pan_held.json | 90 +++++++++ .../antarchy/models/item/temporal_tuner.json | 6 + .../textures/block/ichor/ichor_flowing.png | Bin 0 -> 9037 bytes .../block/ichor/ichor_flowing.png.mcmeta | 6 + .../textures/block/ichor/ichor_still.png | Bin 0 -> 4330 bytes .../block/ichor/ichor_still.png.mcmeta | 6 + .../textures/environment/eye_moon.png | Bin 0 -> 1002 bytes .../textures/environment/eye_star1.png | Bin 0 -> 270 bytes .../textures/environment/eye_star2.png | Bin 0 -> 219 bytes .../textures/environment/eye_star3.png | Bin 0 -> 181 bytes .../textures/environment/eye_star4.png | Bin 0 -> 176 bytes .../textures/environment/eye_star5.png | Bin 0 -> 140 bytes .../textures/item/blood_gods_blade.png | Bin 0 -> 489 bytes .../antarchy/textures/item/bug_spray.png | Bin 335 -> 509 bytes .../textures/item/bug_spray_spraying.png | Bin 348 -> 509 bytes .../giant_frying_pan_in_hand.png | Bin 0 -> 395 bytes .../giant_frying_pan_in_hand_full.png | Bin 0 -> 477 bytes .../giant_frying_pan_model.png | Bin 0 -> 4208 bytes .../antarchy/textures/item/temporal_tuner.png | Bin 0 -> 544 bytes .../textures/mob_effect/commanded.png | Bin 312 -> 369 bytes .../textures/mob_effect/contracted.png | Bin 227 -> 440 bytes .../antarchy/textures/mob_effect/dilated.png | Bin 227 -> 447 bytes .../textures/vfx/commanded_vfx_side.png | Bin 0 -> 192 bytes .../temple_of_technoblade/treasure.json | 5 + .../antarchy/recipe/giant_frying_pan.json | 21 +++ .../data/antarchy/recipe/temporal_tuner.json | 24 +++ .../tags/item/enchantable/durability.json | 2 + .../tags/item/enchantable/weapon.json | 2 + .../data/minecraft/tags/item/swords.json | 2 + .../fabric/AntarchyFabricContent.java | 3 + .../fabric/client/AntarchyFabricClient.java | 3 + .../client/AntarchyFabricClientBootstrap.java | 5 +- .../client/GravityGunClientHandler.java | 16 +- .../client/SeparateLargeItemModels.java | 49 +++++ .../client/SeparateLargeItemModelsMixin.java | 32 ++++ .../AntarchyFabricClientNetworking.java | 11 +- .../network/AntarchyFabricNetworking.java | 25 +-- .../fabric/registry/AntarchyFabricItems.java | 8 + .../fabric/registry/AntarchyFabricMisc.java | 6 + .../resources/antarchy-fabric.mixins.json | 1 + .../models/item/giant_frying_pan.json | 3 + .../item/royal_assailant_staff_gui.json | 7 + gradle.properties | 2 +- .../AntarchyConfigModuleNeoforge.java | 1 + .../antarchy/neoforge/AntarchyNeoforge.java | 3 + .../neoforge/AntarchyToolsConfig.java | 3 + .../neoforge/NeoForgeInfinityCompat.java | 30 +++ .../client/AntarchyNeoForgeClient.java | 8 +- .../client/GravityGunClientHandler.java | 17 +- .../mixins/infinity/PortalCreatorInvoker.java | 15 ++ .../network/AntarchyGravityNetworking.java | 15 ++ .../registry/AntarchyNeoforgeItems.java | 11 ++ .../registry/AntarchyNeoforgeMisc.java | 8 + .../resources/antarchy-neoforge.mixins.json | 1 + .../models/item/giant_frying_pan.json | 25 +++ 95 files changed, 1738 insertions(+), 107 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/GiantFryingPanRenderer.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/screen/GiantFryingPanScreen.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/BleedingMobEffect.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/BloodMoonMobEffect.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BloodGodsBladeItem.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/GiantFryingPanItem.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/GiantFryingPanStorage.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/TemporalTunerItem.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/menu/GiantFryingPanMenu.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/TemporalTunerScrollPayload.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/portal/CrossDimensionTravelApi.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/content/time/TemporalTunerAccess.java create mode 100644 common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/time/PlayerTemporalTunerMixin.java create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/geo/giant_frying_pan.geo.json create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/items/blood_gods_blade.json create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/models/item/blood_gods_blade.json create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/models/item/giant_frying_pan_gui.json create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/models/item/giant_frying_pan_held.json create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/models/item/temporal_tuner.json create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/textures/block/ichor/ichor_flowing.png create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/textures/block/ichor/ichor_flowing.png.mcmeta create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/textures/block/ichor/ichor_still.png create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/textures/block/ichor/ichor_still.png.mcmeta create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_moon.png create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_star1.png create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_star2.png create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_star3.png create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_star4.png create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_star5.png create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/textures/item/blood_gods_blade.png create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/textures/item/giant_frying_pan/giant_frying_pan_in_hand.png create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/textures/item/giant_frying_pan/giant_frying_pan_in_hand_full.png create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/textures/item/giant_frying_pan/giant_frying_pan_model.png create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/textures/item/temporal_tuner.png create mode 100644 common-1.21.1/src/main/resources/assets/antarchy/textures/vfx/commanded_vfx_side.png create mode 100644 common-1.21.1/src/main/resources/data/antarchy/recipe/giant_frying_pan.json create mode 100644 common-1.21.1/src/main/resources/data/antarchy/recipe/temporal_tuner.json create mode 100644 fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/SeparateLargeItemModels.java create mode 100644 fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/SeparateLargeItemModelsMixin.java create mode 100644 fabric-1.21.1/src/main/resources/assets/antarchy/models/item/giant_frying_pan.json create mode 100644 fabric-1.21.1/src/main/resources/assets/antarchy/models/item/royal_assailant_staff_gui.json create mode 100644 neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/mixins/infinity/PortalCreatorInvoker.java create mode 100644 neoforge-1.21.1/src/main/resources/assets/antarchy/models/item/giant_frying_pan.json diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..e75bdb99 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,30 @@ +# Changelog + +## Unreleased + +### Added + +- Restored Elythia Cloud Sea biome selection through a lightweight custom biome source. +- Added explicit Architectury API dependency declarations and installation documentation. +- Added Russian localization credit for suheckii. + +### Changed + +- Elythia Cloud Sea selection now begins at the distinct high-altitude threshold of Y=250. +- Permanent portal destination searches now use dimension-type coordinate scaling and a wider active-portal search radius. +- Permanent portal frames now include their corner blocks. +- Fabric keybinding conflict handling now synchronizes both held state and press-edge state for sprint when it shares a key with Antarchy mount actions. +- Removed terrain-height variance requirements from the Tiger’s Eye shrine so it can generate in Cavaryn’s irregular underground terrain. + +### Fixed + +- Queen boss music now uses a server-synchronized combat state so it can start reliably on clients during the fight. +- NeoForge creative-tab population now ignores non-vanilla namespaces when augmenting vanilla tabs. + +### Verification pending + +- Fresh-world Cloud Sea and Stratoshark generation. +- Permanent portal linking in both directions and complete frame detection. +- Queen music start, stop, restart, and reconnect behavior. +- Fabric toggle sprint while riding Dorrie or Hercules Beetle with shared keybindings. +- Tiger’s Eye shrine generation and `/locate structure antarchy:tigers_eye_shrine` in a fresh Cavaryn world. diff --git a/build.gradle b/build.gradle index 5769b7b2..a4973bb6 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,19 @@ allprojects { group = rootProject.maven_group repositories { + // CurseForge Maven artifacts must be resolved from CurseMaven. The + // Fabric repository does not proxy these coordinates reliably and can + // prevent Gradle from reaching the working repository. + maven { + name = "CurseMaven" + url = "https://www.cursemaven.com" + metadataSources { + artifact() + } + content { + includeGroupByRegex "curse\\.maven" + } + } maven { url "https://maven.fabricmc.net/" } maven { url "https://maven.neoforged.net/releases" } maven { url "https://maven.architectury.dev/" } @@ -36,7 +49,6 @@ allprojects { maven { url "https://maven.shedaniel.me" } maven { url "https://maven.terraformersmc.com/releases/" } maven { url "https://jitpack.io" } - maven { url "https://www.cursemaven.com" } maven { url "https://api.modrinth.com/maven/" } maven { url "https://maven.blamejared.com" } } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/compat/infinity/InfinityCompatBridge.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/compat/infinity/InfinityCompatBridge.java index 72e7e9ae..07432a22 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/compat/infinity/InfinityCompatBridge.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/compat/infinity/InfinityCompatBridge.java @@ -4,6 +4,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.MinecraftServer; import net.minecraft.util.RandomSource; public interface InfinityCompatBridge { @@ -26,6 +27,10 @@ public interface InfinityCompatBridge { return InfinityWarpResult.REJECTED; } + default InfinityWarpResult requestDimensionCreation(MinecraftServer server, ResourceLocation dimensionId) { + return InfinityWarpResult.REJECTED; + } + /** * Converts an already-ignited vanilla Nether portal frame at {@code anyPortalBlockPos} into a real, permanent * Infinite Dimensions portal to {@code dimensionId}, generating the dimension first if it doesn't exist yet. diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/config/AntarchyConfigCatalog.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/config/AntarchyConfigCatalog.java index c4aeb24e..123e04b1 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/config/AntarchyConfigCatalog.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/config/AntarchyConfigCatalog.java @@ -156,6 +156,7 @@ public final class AntarchyConfigCatalog { private static boolean isToolSetting(String name) { return name.equals("sizeChangingRaysEnabled") || name.startsWith("sizeRay") + || name.startsWith("temporalTuner") || name.equals("shrinkingPotionDelta") || name.equals("growthPotionDelta") || name.startsWith("ultimate") diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java index 0d030a03..29c639df 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/config/AntarchySettings.java @@ -30,6 +30,8 @@ public final class AntarchySettings { private static double sizeRayMinScale = 0.1D; private static double sizeRayMaxScale = 10.0D; private static double sizeRayDeltaPerHit = 0.25D; + private static double temporalTunerMinRate = 0.1D; + private static double temporalTunerMaxRate = 3.0D; private static double shrinkingPotionDelta = 0.3D; private static double growthPotionDelta = 0.5D; private static double antDanceRadius = 5.0D; @@ -229,6 +231,7 @@ public final class AntarchySettings { private static double royalAssailantLeggingsDoubleDamageChance = 0.07D; private static double royalAssailantBootsDoubleDamageChance = 0.05D; private static double royalGuardianSwordAttackDamage = 111.0D; + private static double giantFryingPanAttackDamage = 80.0D; private static double royalGuardianSwordAttackSpeed = -2.5D; private static int royalGuardianSwordElementalCooldownTicks = 120; private static double royalGuardianSwordFirePrimaryDamage = 22.0D; @@ -758,6 +761,14 @@ public final class AntarchySettings { return sizeRayDeltaPerHit; } + public static double temporalTunerMinRate() { + return temporalTunerMinRate; + } + + public static double temporalTunerMaxRate() { + return temporalTunerMaxRate; + } + public static double shrinkingPotionDelta() { return shrinkingPotionDelta; } @@ -1385,6 +1396,14 @@ public final class AntarchySettings { sizeRayDeltaPerHit = value; } + public static void setTemporalTunerMinRate(double value) { + temporalTunerMinRate = value; + } + + public static void setTemporalTunerMaxRate(double value) { + temporalTunerMaxRate = value; + } + public static void setShrinkingPotionDelta(double value) { shrinkingPotionDelta = value; } @@ -2041,6 +2060,8 @@ public final class AntarchySettings { public static double royalGuardianSwordAttackDamage() { return royalGuardianSwordAttackDamage; } public static void setRoyalGuardianSwordAttackDamage(double v) { royalGuardianSwordAttackDamage = v; } + public static double giantFryingPanAttackDamage() { return giantFryingPanAttackDamage; } + public static void setGiantFryingPanAttackDamage(double v) { giantFryingPanAttackDamage = v; } public static double royalGuardianSwordAttackSpeed() { return royalGuardianSwordAttackSpeed; } public static void setRoyalGuardianSwordAttackSpeed(double v) { royalGuardianSwordAttackSpeed = v; } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/AntarchyObjects.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/AntarchyObjects.java index c4c16d7f..4db97dd6 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/AntarchyObjects.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/AntarchyObjects.java @@ -210,6 +210,8 @@ public final class AntarchyObjects { @SuppressWarnings("unchecked") public static Supplier> ROYAL_JUDGMENT_MENU = (Supplier>) UNBOUND; @SuppressWarnings("unchecked") + public static Supplier> GIANT_FRYING_PAN_MENU = (Supplier>) UNBOUND; + @SuppressWarnings("unchecked") public static Supplier CHEEP_ITEM = (Supplier) UNBOUND; @SuppressWarnings("unchecked") public static Supplier DUPLICATOR_LOG = (Supplier) UNBOUND; @@ -321,6 +323,10 @@ public final class AntarchyObjects { public static Supplier> GLIMMERING_EFFECT = (Supplier>) UNBOUND; public static Supplier> ROYAL_VITALITY_PENALTY_EFFECT = (Supplier>) UNBOUND; @SuppressWarnings("unchecked") + public static Supplier> BLEEDING_EFFECT = (Supplier>) UNBOUND; + @SuppressWarnings("unchecked") + public static Supplier> BLOOD_MOON_EFFECT = (Supplier>) UNBOUND; + @SuppressWarnings("unchecked") public static Supplier LUMEN = (Supplier) UNBOUND; @SuppressWarnings("unchecked") public static Supplier FLOWING_LUMEN = (Supplier) UNBOUND; @@ -824,6 +830,14 @@ public final class AntarchyObjects { ROYAL_VITALITY_PENALTY_EFFECT = supplier; } + public static void setBleedingEffect(Supplier> supplier) { + BLEEDING_EFFECT = supplier; + } + + public static void setBloodMoonEffect(Supplier> supplier) { + BLOOD_MOON_EFFECT = supplier; + } + public static void setElka(Supplier> supplier) { ELKA = supplier; } @@ -916,6 +930,10 @@ public final class AntarchyObjects { ROYAL_JUDGMENT_MENU = supplier; } + public static void setGiantFryingPanMenu(Supplier> supplier) { + GIANT_FRYING_PAN_MENU = supplier; + } + public static void setAmericanComponent(Supplier> supplier) { AMERICAN_COMPONENT = supplier; } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/UnderVaultBlockEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/UnderVaultBlockEntity.java index 83cf27eb..d9ba2465 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/UnderVaultBlockEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/block/entity/UnderVaultBlockEntity.java @@ -78,6 +78,7 @@ public final class UnderVaultBlockEntity extends BlockEntity { @Override protected void loadAdditional(CompoundTag tag, net.minecraft.core.HolderLookup.Provider registries) { vaultData.loadCustomOnly(tag, registries); + vaultData.setConfig(createConfig()); } @Override diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/ContractionAfterimages.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/ContractionAfterimages.java index 99daa251..b842cbf3 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/ContractionAfterimages.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/ContractionAfterimages.java @@ -1,6 +1,8 @@ package com.craisinlord.antarchy.content.client; import com.craisinlord.antarchy.content.effect.RoyalEffectHooks; +import com.craisinlord.antarchy.content.item.TemporalTunerItem; +import com.craisinlord.antarchy.content.time.TimeDilationApi; import java.util.ArrayDeque; import java.util.Deque; import java.util.Iterator; @@ -22,22 +24,19 @@ public final class ContractionAfterimages { } public static void tick(ClientLevel level) { - Holder holder = RoyalEffectHooks.contractedHolder(); int now = (int) (level.getGameTime() & 0x7fffffffL); Iterator>> iterator = HISTORY.entrySet().iterator(); while (iterator.hasNext()) { LivingEntity tracked = iterator.next().getKey(); - if (tracked == null || holder == null || tracked.isRemoved() || !tracked.isAlive() - || !tracked.hasEffect(holder)) { + if (tracked == null || tracked.isRemoved() || !tracked.isAlive() || !isActive(tracked)) { iterator.remove(); } } } public static void observe(LivingEntity living) { - Holder holder = RoyalEffectHooks.contractedHolder(); - if (holder == null || living.isInvisible() || !living.hasEffect(holder)) { + if (!isActive(living)) { return; } int now = (int) (living.level().getGameTime() & 0x7fffffffL); @@ -52,6 +51,15 @@ public final class ContractionAfterimages { return HISTORY.get(entity); } + public static boolean isActive(LivingEntity living) { + Holder holder = RoyalEffectHooks.contractedHolder(); + boolean contracted = holder != null && living.hasEffect(holder); + boolean tuned = living instanceof net.minecraft.world.entity.player.Player player + && TemporalTunerItem.isAvailable(player) + && TimeDilationApi.getRate(living) > 1.0D; + return !living.isInvisible() && (contracted || tuned); + } + public static float fade(Sample sample, int now) { float elapsed = now - sample.recordedTick; return Math.max(0.0F, 1.0F - elapsed / SAMPLE_LIFETIME_TICKS); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/GiantFryingPanRenderer.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/GiantFryingPanRenderer.java new file mode 100644 index 00000000..3d49a973 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/GiantFryingPanRenderer.java @@ -0,0 +1,50 @@ +package com.craisinlord.antarchy.content.client.renderer; + +import com.craisinlord.antarchy.content.item.GiantFryingPanItem; +import com.craisinlord.antarchy.content.item.GiantFryingPanStorage; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.model.GeoModel; +import software.bernie.geckolib.renderer.GeoItemRenderer; + +public final class GiantFryingPanRenderer extends GeoItemRenderer { + public GiantFryingPanRenderer(GeoModel model) { + super(model); + } + + @Override + public void actuallyRender( + PoseStack poseStack, + GiantFryingPanItem animatable, + BakedGeoModel model, + net.minecraft.client.renderer.RenderType renderType, + MultiBufferSource bufferSource, + com.mojang.blaze3d.vertex.VertexConsumer buffer, + boolean isReRender, + float partialTick, + int packedLight, + int packedOverlay, + int colour + ) { + super.actuallyRender(poseStack, animatable, model, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, colour); + if (isReRender || this.renderPerspective == ItemDisplayContext.GUI) return; + ItemStack pan = this.getCurrentItemStack(); + if (!(Minecraft.getInstance().player instanceof net.minecraft.world.entity.player.Player player)) return; + GiantFryingPanStorage storage = new GiantFryingPanStorage(pan, player); + for (int slot = 0; slot < GiantFryingPanStorage.SLOT_COUNT; slot++) { + ItemStack stack = storage.getItem(slot); + if (stack.isEmpty()) continue; + int row = slot / 3; + int column = slot % 3; + poseStack.pushPose(); + poseStack.translate((column - 1) * 0.42D, 1.72D, (row - 1) * 0.42D); + poseStack.scale(0.24F, 0.24F, 0.24F); + Minecraft.getInstance().getItemRenderer().renderStatic(stack, ItemDisplayContext.FIXED, packedLight, packedOverlay, poseStack, bufferSource, Minecraft.getInstance().level, 0); + poseStack.popPose(); + } + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/RoyalIndicatorRenderer.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/RoyalIndicatorRenderer.java index 6c6c3e44..c730774a 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/RoyalIndicatorRenderer.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/RoyalIndicatorRenderer.java @@ -3,10 +3,15 @@ package com.craisinlord.antarchy.content.client.renderer; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.RenderType; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.LivingEntity; public final class RoyalIndicatorRenderer { + private static final ResourceLocation COMMANDED_CROWN_TEXTURE = ResourceLocation.fromNamespaceAndPath( + com.craisinlord.antarchy.Antarchy.MODID, "textures/vfx/commanded_vfx_side.png"); + private RoyalIndicatorRenderer() { } @@ -25,7 +30,7 @@ public final class RoyalIndicatorRenderer { if (commanded) { ring(lines, pose, radius, spin, 0.95F, 0.63F, 0.10F, 0.95F, 36); - crownPoints(lines, pose, radius, spin, 1.0F, 0.80F, 0.22F, 0.95F); + crownTexture(poseStack, buffers, LightTexture.FULL_BRIGHT, radius, spin); } if (judged) { float markY = commanded ? -0.13F : 0.08F; @@ -48,23 +53,38 @@ public final class RoyalIndicatorRenderer { } } - private static void crownPoints(VertexConsumer out, PoseStack.Pose pose, float radius, float rotation, - float r, float g, float b, float a) { - final int spikes = 5; - float innerRadius = radius * 0.72F; - for (int i = 0; i < spikes; i++) { - double outerAngle = rotation + Math.PI * 2.0D * i / spikes; - double innerAngle = rotation + Math.PI * 2.0D * (i + 0.5D) / spikes; - float outerX = (float) Math.cos(outerAngle) * radius; - float outerZ = (float) Math.sin(outerAngle) * radius; - float innerX = (float) Math.cos(innerAngle) * innerRadius; - float innerZ = (float) Math.sin(innerAngle) * innerRadius; - float nextOuterX = (float) Math.cos(rotation + Math.PI * 2.0D * (i + 1) / spikes) * radius; - float nextOuterZ = (float) Math.sin(rotation + Math.PI * 2.0D * (i + 1) / spikes) * radius; - line(out, pose, outerX, 0.0F, outerZ, innerX, 0.34F, innerZ, r, g, b, a); - line(out, pose, innerX, 0.34F, innerZ, nextOuterX, 0.0F, nextOuterZ, r, g, b, a); - line(out, pose, outerX, 0.0F, outerZ, nextOuterX, 0.0F, nextOuterZ, r, g, b, a); + private static void crownTexture(PoseStack poseStack, MultiBufferSource buffers, int packedLight, + float radius, float rotation) { + VertexConsumer crown = buffers.getBuffer(RenderType.entityTranslucentEmissive(COMMANDED_CROWN_TEXTURE)); + float halfWidth = radius * 0.78F; + float bottom = 0.02F; + float top = 0.40F; + + poseStack.pushPose(); + poseStack.mulPose(com.mojang.math.Axis.YP.rotation(rotation)); + for (int side = 0; side < 4; side++) { + poseStack.pushPose(); + poseStack.mulPose(com.mojang.math.Axis.YP.rotationDegrees(side * 90.0F)); + PoseStack.Pose pose = poseStack.last(); + quad(crown, pose, -halfWidth, bottom, halfWidth, top, halfWidth, packedLight); + poseStack.popPose(); } + poseStack.popPose(); + } + + private static void quad(VertexConsumer out, PoseStack.Pose pose, float left, float bottom, + float right, float top, float depth, int packedLight) { + out.addVertex(pose, left, bottom, depth).setUv(0.0F, 1.0F).setOverlay(0).setLight(packedLight).setNormal(pose, 0.0F, 0.0F, 1.0F); + out.addVertex(pose, right, bottom, depth).setUv(1.0F, 1.0F).setOverlay(0).setLight(packedLight).setNormal(pose, 0.0F, 0.0F, 1.0F); + out.addVertex(pose, right, top, depth).setUv(1.0F, 0.0F).setOverlay(0).setLight(packedLight).setNormal(pose, 0.0F, 0.0F, 1.0F); + out.addVertex(pose, left, top, depth).setUv(0.0F, 0.0F).setOverlay(0).setLight(packedLight).setNormal(pose, 0.0F, 0.0F, 1.0F); + + // Emit the reverse winding as well. The crown is viewed from every angle, and + // a single-sided quad can vanish when the renderer's culling state rejects it. + out.addVertex(pose, left, top, depth).setUv(0.0F, 0.0F).setOverlay(0).setLight(packedLight).setNormal(pose, 0.0F, 0.0F, -1.0F); + out.addVertex(pose, right, top, depth).setUv(1.0F, 0.0F).setOverlay(0).setLight(packedLight).setNormal(pose, 0.0F, 0.0F, -1.0F); + out.addVertex(pose, right, bottom, depth).setUv(1.0F, 1.0F).setOverlay(0).setLight(packedLight).setNormal(pose, 0.0F, 0.0F, -1.0F); + out.addVertex(pose, left, bottom, depth).setUv(0.0F, 1.0F).setOverlay(0).setLight(packedLight).setNormal(pose, 0.0F, 0.0F, -1.0F); } private static void brackets(VertexConsumer out, PoseStack.Pose pose, float radius, float rotation) { diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/TemporalContractionAfterimageLayer.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/TemporalContractionAfterimageLayer.java index 542e3048..ad099e6a 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/TemporalContractionAfterimageLayer.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/TemporalContractionAfterimageLayer.java @@ -1,7 +1,6 @@ package com.craisinlord.antarchy.content.client.renderer; import com.craisinlord.antarchy.content.client.ContractionAfterimages; -import com.craisinlord.antarchy.content.effect.RoyalEffectHooks; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import java.util.Deque; @@ -30,8 +29,7 @@ public final class TemporalContractionAfterimageLayer samples = ContractionAfterimages.samples(entity); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/TemporalContractionGeoLayer.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/TemporalContractionGeoLayer.java index 60100f40..20a13df8 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/TemporalContractionGeoLayer.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/TemporalContractionGeoLayer.java @@ -1,7 +1,6 @@ package com.craisinlord.antarchy.content.client.renderer; import com.craisinlord.antarchy.content.client.ContractionAfterimages; -import com.craisinlord.antarchy.content.effect.RoyalEffectHooks; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import java.util.Deque; @@ -32,8 +31,7 @@ public final class TemporalContractionGeoLayer extends MultiBufferSource bufferSource, @Nullable VertexConsumer buffer, float partialTick, int packedLight, int packedOverlay) { if (!(animatable instanceof Entity entity) || !(entity instanceof LivingEntity living) - || living.isInvisible() || RoyalEffectHooks.contractedHolder() == null - || !living.hasEffect(RoyalEffectHooks.contractedHolder())) { + || !ContractionAfterimages.isActive(living)) { return; } Deque samples = ContractionAfterimages.samples(living); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/ThoraxisUndersideSkyRenderer.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/ThoraxisUndersideSkyRenderer.java index 757abd53..2c21aba8 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/ThoraxisUndersideSkyRenderer.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/renderer/ThoraxisUndersideSkyRenderer.java @@ -31,8 +31,16 @@ public final class ThoraxisUndersideSkyRenderer { Registries.DIMENSION, ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "thoraxis") ); - private static final ResourceLocation SUN_TEXTURE = ResourceLocation.withDefaultNamespace("textures/environment/sun.png"); + private static final ResourceLocation SUN_TEXTURE = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/environment/eye_moon.png"); private static final ResourceLocation MOON_TEXTURE = ResourceLocation.withDefaultNamespace("textures/environment/moon_phases.png"); + private static final ResourceLocation[] EYE_STAR_TEXTURES = { + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/environment/eye_star1.png"), + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/environment/eye_star2.png"), + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/environment/eye_star3.png"), + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/environment/eye_star4.png"), + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "textures/environment/eye_star5.png") + }; + private static final float[] EYE_STAR_SCALES = {1.0F, 0.86F, 0.72F, 0.58F, 0.46F}; private static final float SKY_RADIUS = 100.0F; private static final float BODY_SIZE = 32.0F; private static final float SKY_RED = 0.015F; @@ -40,7 +48,7 @@ public final class ThoraxisUndersideSkyRenderer { private static final float SKY_BLUE = 0.035F; @org.jetbrains.annotations.Nullable - private static VertexBuffer redStarBuffer = null; + private static VertexBuffer[] eyeStarBuffers = null; private ThoraxisUndersideSkyRenderer() { } @@ -73,37 +81,57 @@ public final class ThoraxisUndersideSkyRenderer { float timeOfDay = 0.72F + partialTick * 0.0F; renderCelestialBodies(poseStack.last().pose(), projectionMatrix, timeOfDay); - renderRedStars(poseStack.last().pose(), projectionMatrix); + renderEyeStars(poseStack.last().pose(), projectionMatrix); RenderSystem.depthMask(true); } - private static void renderRedStars(Matrix4f modelViewMatrix, Matrix4f projectionMatrix) { - if (redStarBuffer == null) { - redStarBuffer = buildRedStarBuffer(); + private static void renderEyeStars(Matrix4f modelViewMatrix, Matrix4f projectionMatrix) { + if (eyeStarBuffers == null) { + eyeStarBuffers = buildEyeStarBuffers(); } RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - RenderSystem.setShaderColor(0.95F, 0.95F, 0.95F, 0.95F); - redStarBuffer.bind(); - redStarBuffer.drawWithShader(modelViewMatrix, projectionMatrix, GameRenderer.getPositionColorShader()); - VertexBuffer.unbind(); + RenderSystem.blendFuncSeparate( + GlStateManager.SourceFactor.ONE, + GlStateManager.DestFactor.ONE, + GlStateManager.SourceFactor.ONE, + GlStateManager.DestFactor.ZERO + ); + RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.setShaderColor(1.0F, 0.015F, 0.02F, 1.0F); + RenderSystem.backupProjectionMatrix(); + RenderSystem.setProjectionMatrix(projectionMatrix, VertexSorting.DISTANCE_TO_ORIGIN); + + for (int i = 0; i < eyeStarBuffers.length; i++) { + RenderSystem.setShaderTexture(0, EYE_STAR_TEXTURES[i]); + eyeStarBuffers[i].bind(); + eyeStarBuffers[i].drawWithShader(modelViewMatrix, projectionMatrix, GameRenderer.getPositionTexShader()); + VertexBuffer.unbind(); + } + RenderSystem.restoreProjectionMatrix(); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + RenderSystem.defaultBlendFunc(); RenderSystem.disableBlend(); } - private static VertexBuffer buildRedStarBuffer() { - Random random = new Random(552031L); - BufferBuilder builder = Tesselator.getInstance().begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + private static VertexBuffer[] buildEyeStarBuffers() { + VertexBuffer[] buffers = new VertexBuffer[EYE_STAR_TEXTURES.length]; + for (int textureIndex = 0; textureIndex < EYE_STAR_TEXTURES.length; textureIndex++) { + Random random = new Random(552031L); + BufferBuilder builder = Tesselator.getInstance().begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); + + for (int i = 0; i < 1800; i++) { + double x = random.nextFloat() * 2.0F - 1.0F; + double y = random.nextFloat() * 2.0F - 1.0F; + double z = random.nextFloat() * 2.0F - 1.0F; + double size = (0.52F + random.nextFloat() * 0.36F) * EYE_STAR_SCALES[textureIndex]; + double rot = random.nextDouble() * Math.PI * 2.0D; + double lenSq = x * x + y * y + z * z; + if (i % EYE_STAR_TEXTURES.length != textureIndex || lenSq >= 1.0D || lenSq <= 0.01D) { + continue; + } - for (int i = 0; i < 1800; i++) { - double x = random.nextFloat() * 2.0F - 1.0F; - double y = random.nextFloat() * 2.0F - 1.0F; - double z = random.nextFloat() * 2.0F - 1.0F; - double size = 0.13F + random.nextFloat() * 0.12F; - double lenSq = x * x + y * y + z * z; - if (lenSq < 1.0D && lenSq > 0.01D) { double len = 1.0D / Math.sqrt(lenSq); x *= len; y *= len; @@ -117,12 +145,8 @@ public final class ThoraxisUndersideSkyRenderer { double pitch = Math.atan2(Math.sqrt(x * x + z * z), y); double sinPitch = Math.sin(pitch); double cosPitch = Math.cos(pitch); - double rot = random.nextDouble() * Math.PI * 2.0D; double sinRot = Math.sin(rot); double cosRot = Math.cos(rot); - float red = 0.75F + random.nextFloat() * 0.25F; - float green = 0.02F + random.nextFloat() * 0.05F; - float blue = 0.04F + random.nextFloat() * 0.08F; for (int j = 0; j < 4; j++) { double u = (j & 2) - 1; @@ -133,24 +157,26 @@ public final class ThoraxisUndersideSkyRenderer { double qy = -px * cosPitch; double rx = qy * sinYaw - py * cosYaw; double ry = py * sinYaw + qy * cosYaw; + float quadU = (j == 0 || j == 1) ? 0.0F : 1.0F; + float quadV = (j == 0 || j == 3) ? 0.0F : 1.0F; builder.addVertex((float) (sx + rx * size), (float) (sy + qx * size), (float) (sz + ry * size)) - .setColor(red, green, blue, 1.0F); + .setUv(quadU, quadV); } } - } - MeshData mesh = builder.buildOrThrow(); - VertexBuffer buffer = new VertexBuffer(VertexBuffer.Usage.STATIC); - buffer.bind(); - buffer.upload(mesh); - VertexBuffer.unbind(); - return buffer; + MeshData mesh = builder.buildOrThrow(); + buffers[textureIndex] = new VertexBuffer(VertexBuffer.Usage.STATIC); + buffers[textureIndex].bind(); + buffers[textureIndex].upload(mesh); + VertexBuffer.unbind(); + } + return buffers; } private static void renderCelestialBodies(Matrix4f modelViewMatrix, Matrix4f projectionMatrix, float timeOfDay) { float t = timeOfDay * 360.0F; renderBodyGlow(modelViewMatrix, projectionMatrix, t, -10.0F, 0xFF1F18, 86.0F); - renderTexturedBody(modelViewMatrix, projectionMatrix, t, -10.0F, 42.0F, 0xFF1F18, SUN_TEXTURE, false, 0, t * 0.6F); + renderTexturedBody(modelViewMatrix, projectionMatrix, t, -10.0F, 42.0F, 0xFF1F18, SUN_TEXTURE, false, 0, t * 0.6F + 90.0F); float moonOrbit = t + 180.0F; renderBodyGlow(modelViewMatrix, projectionMatrix, moonOrbit, 24.0F, 0x8F30FF, 76.0F); diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/screen/GiantFryingPanScreen.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/screen/GiantFryingPanScreen.java new file mode 100644 index 00000000..aa1dfc07 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/client/screen/GiantFryingPanScreen.java @@ -0,0 +1,24 @@ +package com.craisinlord.antarchy.content.client.screen; + +import com.craisinlord.antarchy.content.menu.GiantFryingPanMenu; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; + +public final class GiantFryingPanScreen extends AbstractContainerScreen { + private static final ResourceLocation INVENTORY_TEXTURE = ResourceLocation.withDefaultNamespace("textures/gui/container/inventory.png"); + + public GiantFryingPanScreen(GiantFryingPanMenu menu, Inventory inventory, Component title) { + super(menu, inventory, title); + imageWidth = 176; + imageHeight = 132; + inventoryLabelY = 40; + } + + @Override + protected void renderBg(GuiGraphics graphics, float partialTick, int mouseX, int mouseY) { + graphics.blit(INVENTORY_TEXTURE, leftPos, topPos, 0, 0, imageWidth, imageHeight); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/creative/CreativeTabContents.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/creative/CreativeTabContents.java index 683e8bb0..db3d8685 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/creative/CreativeTabContents.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/creative/CreativeTabContents.java @@ -409,6 +409,7 @@ public final class CreativeTabContents { entry("ultimate_hoe", "tools_and_utilities"), entry("battle_axe", "combat"), entry("big_bertha", "combat"), + entry("giant_frying_pan", "combat"), entry("basilisk_dagger", "combat"), entry("ultimate_helmet", "combat"), entry("ultimate_chestplate", "combat"), @@ -437,6 +438,7 @@ public final class CreativeTabContents { entry("nightmare_leggings", "combat"), entry("nightmare_boots", "combat"), entry("nightmare_sword", "combat"), + entry("blood_gods_blade", "combat"), entry("blood_crystal_katana", "combat"), entry("blood_crystal_helmet", "combat"), entry("blood_crystal_chestplate", "combat"), @@ -490,6 +492,7 @@ public final class CreativeTabContents { entry("mud_pie", "ingredients"), entry("lucid_eye", "ingredients"), entry("blood_crystal_shard", "ingredients"), + entry("temporal_tuner", "ingredients"), entry("tigers_eye", "ingredients"), entry("tigers_eye_block", "building_blocks"), entry("blood_crystal_apple", "ingredients"), diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/BleedingMobEffect.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/BleedingMobEffect.java new file mode 100644 index 00000000..799500a2 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/BleedingMobEffect.java @@ -0,0 +1,22 @@ +package com.craisinlord.antarchy.content.effect; + +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.entity.LivingEntity; + +public final class BleedingMobEffect extends MobEffect { + public BleedingMobEffect() { + super(MobEffectCategory.HARMFUL, 0x8F1020); + } + + @Override + public boolean applyEffectTick(LivingEntity entity, int amplifier) { + entity.hurt(entity.damageSources().magic(), 1.0F + amplifier); + return true; + } + + @Override + public boolean shouldApplyEffectTickThisTick(int duration, int amplifier) { + return duration % 20 == 0; + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/BloodMoonMobEffect.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/BloodMoonMobEffect.java new file mode 100644 index 00000000..c06e1359 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/effect/BloodMoonMobEffect.java @@ -0,0 +1,10 @@ +package com.craisinlord.antarchy.content.effect; + +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectCategory; + +public final class BloodMoonMobEffect extends MobEffect { + public BloodMoonMobEffect() { + super(MobEffectCategory.BENEFICIAL, 0xB51B2D); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/portal/DimensionalTearEntity.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/portal/DimensionalTearEntity.java index f9afee78..7071fc0c 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/portal/DimensionalTearEntity.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/portal/DimensionalTearEntity.java @@ -93,6 +93,7 @@ public class DimensionalTearEntity extends Entity implements GeoEntity { private UUID staffOwnerId; private int staffManticoreCount; private boolean staffManticoreSpawned; + private boolean gauntletVisualOnly; public DimensionalTearEntity(EntityType entityType, Level level) { super(entityType, level); @@ -109,6 +110,12 @@ public class DimensionalTearEntity extends Entity implements GeoEntity { return tear; } + public static DimensionalTearEntity createGauntletVisual(ServerLevel level, Vec3 pos, float yaw, int lifetimeTicks) { + DimensionalTearEntity tear = create(level, pos, yaw, lifetimeTicks); + tear.gauntletVisualOnly = true; + return tear; + } + public static DimensionalTearEntity createQueenManticoreTear(ServerLevel level, Vec3 pos, float yaw, int lifetimeTicks, UUID queenId, int count) { DimensionalTearEntity tear = create(level, pos, yaw, lifetimeTicks); @@ -161,7 +168,15 @@ public class DimensionalTearEntity extends Entity implements GeoEntity { this.setTearState(TearState.NORMAL); } if (this.ageTicks >= this.lifetimeTicks) { - this.removeLinkedPair(); + if (this.gauntletVisualOnly) { + this.discard(); + } else { + this.removeLinkedPair(); + } + return; + } + + if (this.gauntletVisualOnly) { return; } @@ -500,6 +515,7 @@ public class DimensionalTearEntity extends Entity implements GeoEntity { tag.putInt("EventTicks", this.eventTicks); tag.putInt("NextEventTicks", this.nextEventTicks); tag.putInt("PendingEvent", this.pendingEvent.ordinal()); + tag.putBoolean("GauntletVisualOnly", this.gauntletVisualOnly); if (this.linkedTearId != null) { tag.putUUID("LinkedTearId", this.linkedTearId); } @@ -522,6 +538,7 @@ public class DimensionalTearEntity extends Entity implements GeoEntity { int event = tag.getInt("PendingEvent"); TearState[] states = TearState.values(); this.pendingEvent = event >= 0 && event < states.length ? states[event] : TearState.NORMAL; + this.gauntletVisualOnly = tag.getBoolean("GauntletVisualOnly"); if (tag.hasUUID("LinkedTearId")) { this.linkedTearId = tag.getUUID("LinkedTearId"); } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/beam/RoyalBeamController.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/beam/RoyalBeamController.java index 3aa28a7e..cdf14c68 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/beam/RoyalBeamController.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/beam/RoyalBeamController.java @@ -14,6 +14,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntitySelector; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.GameRules; @@ -28,7 +29,7 @@ import org.jetbrains.annotations.Nullable; public final class RoyalBeamController { private static final int INITIAL_TRACKING_DELAY_TICKS = 8; - private final Mob owner; + private final LivingEntity owner; private Vec3 serverTarget; private Vec3 beamEndPosition; private int beamTicks; @@ -39,10 +40,14 @@ public final class RoyalBeamController { private static final int ICE_MUTATIONS_PER_TICK = 3; private static final float ICE_IMPACT_RADIUS = 2.0F; - public RoyalBeamController(Mob owner) { + public RoyalBeamController(LivingEntity owner) { this.owner = owner; } + public RoyalBeamController(Mob owner) { + this((LivingEntity) owner); + } + public boolean isFiring() { return this.beamTicks > 0; } @@ -164,7 +169,9 @@ public final class RoyalBeamController { ) { Vec3 direction = beamEnd.subtract(shootFrom).normalize(); double distance = shootFrom.distanceTo(beamEnd); - DamageSource damageSource = this.owner.damageSources().mobAttack(this.owner); + DamageSource damageSource = this.owner instanceof Player player + ? player.damageSources().playerAttack(player) + : this.owner.damageSources().mobAttack(this.owner); this.damagedThisTick.clear(); boolean pathMutates = terrainMode == RoyalBeamTerrainMode.DESTROY; for (double walked = settings.pathStep(); walked < Math.min(distance, settings.range()); walked += settings.pathStep()) { @@ -224,7 +231,7 @@ public final class RoyalBeamController { for (LivingEntity living : entities) { if (living.is(this.owner) || this.owner.isAlliedTo(living) - || living.getType() == this.owner.getType() + || !(this.owner instanceof Player) && living.getType() == this.owner.getType() || this.owner instanceof RoyalBossEntity royalBoss && !royalBoss.canDamageWithRoyalAttack(living) || living.distanceToSqr(center) > radius * radius || damagedThisTick.contains(living.getId()) diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/beam/RoyalBeamSettings.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/beam/RoyalBeamSettings.java index 240bba9b..24d418b8 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/beam/RoyalBeamSettings.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/entity/royal/beam/RoyalBeamSettings.java @@ -22,6 +22,16 @@ public record RoyalBeamSettings( boolean terrainEnabled, boolean requireLineOfSightForDamage ) { + public static RoyalBeamSettings gauntletPower() { + return new RoyalBeamSettings(64.0D, 0.0D, 2.0D, 18, 4, 50, 0.9F, 1.8F, + 9.0F, 0.8F, 1, 64.0D, 0.8F, 1.8F, 6, 1.0F, 1.0F, 50.0F, true, false); + } + + public static RoyalBeamSettings gauntletInfinity() { + return new RoyalBeamSettings(64.0D, 0.0D, 1.5D, 24, 4, 1200, 1.25F, 2.5F, + 28.0F, 1.8F, 1, 64.0D, 1.0F, 2.0F, 0, 0.0F, 0.0F, 0.0F, false, false); + } + public static RoyalBeamSettings tremorzillaLike(float damage, boolean terrainEnabled) { return new RoyalBeamSettings( 100.0D, diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BloodGodsBladeItem.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BloodGodsBladeItem.java new file mode 100644 index 00000000..acf545fb --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/BloodGodsBladeItem.java @@ -0,0 +1,93 @@ +package com.craisinlord.antarchy.content.item; + +import com.craisinlord.antarchy.content.AntarchyObjects; +import java.util.List; +import net.minecraft.ChatFormatting; +import net.minecraft.core.particles.DustParticleOptions; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.SwordItem; +import net.minecraft.world.item.Tier; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.component.ItemAttributeModifiers; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.AABB; +import org.joml.Vector3f; + +public final class BloodGodsBladeItem extends SwordItem { + private static final int BLEEDING_TICKS = 100; + private static final int BLOOD_MOON_TICKS = 200; + private static final int BLOOD_MOON_MAX_TICKS = 300; + private static final int BLOOD_MOON_COOLDOWN_TICKS = 1200; + private static final double BLOOD_MOON_RADIUS = 12.0D; + private static final DustParticleOptions BLOOD_PARTICLES = new DustParticleOptions(new Vector3f(0.65F, 0.02F, 0.05F), 1.6F); + + private final Tier tier; + private final int attackDamage; + private final float attackSpeed; + + public BloodGodsBladeItem(Tier tier, Item.Properties properties, int attackDamage, float attackSpeed) { + super(tier, properties); + this.tier = tier; + this.attackDamage = attackDamage; + this.attackSpeed = attackSpeed; + } + + @Override + public ItemAttributeModifiers getDefaultAttributeModifiers() { + return SwordItem.createAttributes(this.tier, this.attackDamage, this.attackSpeed); + } + + @Override + public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { + boolean result = super.hurtEnemy(stack, target, attacker); + if (!attacker.level().isClientSide()) { + target.addEffect(new MobEffectInstance(AntarchyObjects.BLEEDING_EFFECT.get(), BLEEDING_TICKS, 0, false, true, true)); + if (attacker instanceof Player player && player.hasEffect(AntarchyObjects.BLOOD_MOON_EFFECT.get())) { + player.heal(1.0F); + if (target.isDeadOrDying()) { + MobEffectInstance bloodMoon = player.getEffect(AntarchyObjects.BLOOD_MOON_EFFECT.get()); + if (bloodMoon != null) { + player.addEffect(new MobEffectInstance(AntarchyObjects.BLOOD_MOON_EFFECT.get(), Math.min(BLOOD_MOON_MAX_TICKS, bloodMoon.getDuration() + 20), bloodMoon.getAmplifier(), false, true, true)); + } + } + } + } + return result; + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + if (player.getCooldowns().isOnCooldown(this)) { + return InteractionResultHolder.fail(stack); + } + if (!level.isClientSide() && level instanceof ServerLevel serverLevel) { + player.getCooldowns().addCooldown(this, BLOOD_MOON_COOLDOWN_TICKS); + player.addEffect(new MobEffectInstance(AntarchyObjects.BLOOD_MOON_EFFECT.get(), BLOOD_MOON_TICKS, 0, false, true, true)); + player.addEffect(new MobEffectInstance(MobEffects.DAMAGE_BOOST, BLOOD_MOON_TICKS, 0, false, false, true)); + for (LivingEntity entity : level.getEntitiesOfClass(LivingEntity.class, player.getBoundingBox().inflate(BLOOD_MOON_RADIUS), entity -> entity != player && entity.isAlive() && !player.isAlliedTo(entity))) { + entity.addEffect(new MobEffectInstance(MobEffects.GLOWING, BLOOD_MOON_TICKS, 0, false, true, true)); + entity.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, BLOOD_MOON_TICKS, 0, false, true, true)); + } + serverLevel.sendParticles(BLOOD_PARTICLES, player.getX(), player.getY() + 1.0D, player.getZ(), 160, 2.5D, 1.2D, 2.5D, 0.08D); + serverLevel.sendParticles(BLOOD_PARTICLES, player.getX(), player.getY() + 8.0D, player.getZ(), 80, 5.0D, 0.2D, 5.0D, 0.02D); + } + return InteractionResultHolder.sidedSuccess(stack, level.isClientSide()); + } + + @Override + public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { + tooltipComponents.add(Component.translatable("tooltip.antarchy.blood_gods_blade.bleeding").withStyle(ChatFormatting.DARK_RED)); + tooltipComponents.add(Component.translatable("tooltip.antarchy.blood_gods_blade.blood_moon").withStyle(ChatFormatting.RED)); + super.appendHoverText(stack, context, tooltipComponents, tooltipFlag); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/GiantFryingPanItem.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/GiantFryingPanItem.java new file mode 100644 index 00000000..457602b9 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/GiantFryingPanItem.java @@ -0,0 +1,150 @@ +package com.craisinlord.antarchy.content.item; + +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.client.model.ResourceBackedGeoItemModel; +import com.craisinlord.antarchy.content.client.renderer.AnimatedHeldItemRenderer; +import com.craisinlord.antarchy.content.client.renderer.GiantFryingPanRenderer; +import java.util.function.Consumer; +import java.util.List; +import net.minecraft.ChatFormatting; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.EquipmentSlotGroup; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.SwordItem; +import net.minecraft.world.item.Tier; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.component.ItemAttributeModifiers; +import net.minecraft.network.chat.Component; +import net.minecraft.world.SimpleMenuProvider; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.animatable.client.GeoRenderProvider; +import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.animation.AnimatableManager; +import software.bernie.geckolib.util.GeckoLibUtil; + +public class GiantFryingPanItem extends SwordItem implements GeoItem { + private static final ResourceLocation MODEL_LOCATION = ResourceLocation.fromNamespaceAndPath("antarchy", "geo/giant_frying_pan.geo.json"); + private static final ResourceLocation TEXTURE_LOCATION = ResourceLocation.fromNamespaceAndPath("antarchy", "textures/item/giant_frying_pan/giant_frying_pan_model.png"); + private static final ResourceLocation ANIMATION_LOCATION = ResourceLocation.fromNamespaceAndPath("antarchy", "animations/static_item.animation.json"); + private static final ResourceLocation REACH_MODIFIER_ID = ResourceLocation.fromNamespaceAndPath("antarchy", "giant_frying_pan_reach"); + private static final ResourceLocation KNOCKBACK_MODIFIER_ID = ResourceLocation.fromNamespaceAndPath("antarchy", "giant_frying_pan_knockback"); + private final Tier tier; + private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this); + + public GiantFryingPanItem(Tier tier, Item.Properties properties) { + super(tier, properties); + this.tier = tier; + GeoItem.registerSyncedAnimatable(this); + } + + @Override + public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltipComponents, TooltipFlag tooltipFlag) { + super.appendHoverText(stack, context, tooltipComponents, tooltipFlag); + tooltipComponents.add(Component.translatable("tooltip.antarchy.giant_frying_pan.insert").withStyle(ChatFormatting.GRAY)); + tooltipComponents.add(Component.translatable("tooltip.antarchy.giant_frying_pan.gui").withStyle(ChatFormatting.GRAY)); + tooltipComponents.add(Component.translatable("tooltip.antarchy.giant_frying_pan.campfire").withStyle(ChatFormatting.DARK_GRAY)); + } + + @Override + public ItemAttributeModifiers getDefaultAttributeModifiers() { + return SwordItem.createAttributes(this.tier, (int) Math.round(AntarchySettings.giantFryingPanAttackDamage()), -3.8F) + .withModifierAdded(Attributes.ENTITY_INTERACTION_RANGE, + new AttributeModifier(REACH_MODIFIER_ID, 6.0D, AttributeModifier.Operation.ADD_VALUE), + EquipmentSlotGroup.MAINHAND) + .withModifierAdded(Attributes.ATTACK_KNOCKBACK, + new AttributeModifier(KNOCKBACK_MODIFIER_ID, 2.0D, AttributeModifier.Operation.ADD_VALUE), + EquipmentSlotGroup.MAINHAND); + } + + @Override + public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { + boolean hurt = super.hurtEnemy(stack, target, attacker); + if (!hurt || attacker.level().isClientSide) { + return hurt; + } + + Vec3 direction = target.position().subtract(attacker.position()).multiply(1.0D, 0.0D, 1.0D); + if (direction.lengthSqr() < 1.0E-4D) { + direction = attacker.getLookAngle().multiply(1.0D, 0.0D, 1.0D); + } + if (direction.lengthSqr() >= 1.0E-4D) { + direction = direction.normalize(); + Vec3 motion = target.getDeltaMovement(); + double x = Math.max(-2.6D, Math.min(2.6D, motion.x + direction.x * 1.8D)); + double z = Math.max(-2.6D, Math.min(2.6D, motion.z + direction.z * 1.8D)); + target.setDeltaMovement(x, motion.y, z); + target.hurtMarked = true; + } + Level level = attacker.level(); + level.playSound(null, target.blockPosition(), SoundEvents.ANVIL_LAND, SoundSource.PLAYERS, 0.8F, 1.25F); + return hurt; + } + + @Override + public void inventoryTick(ItemStack stack, Level level, net.minecraft.world.entity.Entity entity, int slotId, boolean isSelected) { + super.inventoryTick(stack, level, entity, slotId, isSelected); + if (entity instanceof Player player) GiantFryingPanStorage.tick(player, stack, level); + } + + @Override + public net.minecraft.world.InteractionResultHolder use(Level level, Player player, net.minecraft.world.InteractionHand hand) { + ItemStack pan = player.getItemInHand(hand); + if (player.isShiftKeyDown()) { + if (!level.isClientSide) { + player.openMenu(new SimpleMenuProvider( + (containerId, inventory, ignored) -> new com.craisinlord.antarchy.content.menu.GiantFryingPanMenu(containerId, inventory), + Component.translatable("item.antarchy.giant_frying_pan"))); + } + return net.minecraft.world.InteractionResultHolder.sidedSuccess(pan, level.isClientSide); + } + net.minecraft.world.InteractionHand foodHand = hand == net.minecraft.world.InteractionHand.MAIN_HAND + ? net.minecraft.world.InteractionHand.OFF_HAND : net.minecraft.world.InteractionHand.MAIN_HAND; + ItemStack food = player.getItemInHand(foodHand); + if (!GiantFryingPanStorage.isCampfireInput(player, food)) return net.minecraft.world.InteractionResultHolder.pass(pan); + GiantFryingPanStorage storage = new GiantFryingPanStorage(pan, player); + for (int slot = 0; slot < GiantFryingPanStorage.SLOT_COUNT; slot++) { + if (storage.getItem(slot).isEmpty()) { + if (!level.isClientSide) { + storage.setItem(slot, food.copyWithCount(1)); + food.shrink(1); + level.playSound(null, player.blockPosition(), SoundEvents.CAMPFIRE_CRACKLE, SoundSource.PLAYERS, 0.8F, 1.0F); + } + return net.minecraft.world.InteractionResultHolder.sidedSuccess(pan, level.isClientSide); + } + } + return net.minecraft.world.InteractionResultHolder.fail(pan); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.geoCache; + } + + @Override + public void createGeoRenderer(Consumer consumer) { + consumer.accept(new GeoRenderProvider() { + private GiantFryingPanRenderer renderer; + + @Override + public net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer getGeoItemRenderer() { + if (this.renderer == null) { + this.renderer = new GiantFryingPanRenderer(new ResourceBackedGeoItemModel<>(MODEL_LOCATION, TEXTURE_LOCATION, ANIMATION_LOCATION)); + } + return this.renderer; + } + }); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/GiantFryingPanStorage.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/GiantFryingPanStorage.java new file mode 100644 index 00000000..eceeaba4 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/GiantFryingPanStorage.java @@ -0,0 +1,174 @@ +package com.craisinlord.antarchy.content.item; + +import java.util.Optional; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.world.Container; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CampfireCookingRecipe; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.SingleRecipeInput; +import net.minecraft.world.level.Level; + +public final class GiantFryingPanStorage implements Container { + public static final int SLOT_COUNT = 9; + private static final String SLOTS = "antarchy.giant_frying_pan_slots"; + private static final String SLOT = "Slot"; + private static final String ITEM = "Item"; + private static final String TIME = "Time"; + private final ItemStack pan; + private final Player player; + + public GiantFryingPanStorage(ItemStack pan, Player player) { + this.pan = pan; + this.player = player; + } + + public static ItemStack findPan(Player player) { + ItemStack selected = player.getMainHandItem(); + if (selected.getItem() instanceof GiantFryingPanItem) return selected; + ItemStack offhand = player.getOffhandItem(); + if (offhand.getItem() instanceof GiantFryingPanItem) return offhand; + for (ItemStack stack : player.getInventory().items) { + if (stack.getItem() instanceof GiantFryingPanItem) return stack; + } + return ItemStack.EMPTY; + } + + public static int findPanSlot(Player player) { + if (player.getMainHandItem().getItem() instanceof GiantFryingPanItem) return player.getInventory().selected; + if (player.getOffhandItem().getItem() instanceof GiantFryingPanItem) return 40; + for (int i = 0; i < player.getInventory().items.size(); i++) { + if (player.getInventory().items.get(i).getItem() instanceof GiantFryingPanItem) return i; + } + return -1; + } + + public static void tick(Player player, ItemStack pan, Level level) { + if (level.isClientSide || !(pan.getItem() instanceof GiantFryingPanItem)) return; + GiantFryingPanStorage storage = new GiantFryingPanStorage(pan, player); + for (int slot = 0; slot < SLOT_COUNT; slot++) { + ItemStack input = storage.getItem(slot); + if (input.isEmpty()) continue; + Optional> recipe = level.getServer().getRecipeManager().getRecipeFor( + RecipeType.CAMPFIRE_COOKING, new SingleRecipeInput(input), level); + if (recipe.isEmpty()) { + storage.setCookTime(slot, 0); + continue; + } + int time = storage.getCookTime(slot) + 1; + if (time < 600) { + storage.setCookTime(slot, time); + continue; + } + ItemStack cooked = recipe.get().value().assemble(new SingleRecipeInput(input), level.registryAccess()); + input.shrink(1); + storage.setItem(slot, input); + storage.setCookTime(slot, 0); + if (!cooked.isEmpty()) { + var output = new net.minecraft.world.entity.item.ItemEntity(level, player.getX(), player.getY() + 1.2D, player.getZ(), cooked); + output.setDeltaMovement(player.getLookAngle().scale(0.35D).add(0.0D, 0.2D, 0.0D)); + output.setPickUpDelay(10); + level.addFreshEntity(output); + } + } + } + + public static boolean isCampfireInput(Player player, ItemStack stack) { + return !stack.isEmpty() && (player.getServer() == null || player.getServer().getRecipeManager().getRecipeFor( + RecipeType.CAMPFIRE_COOKING, new SingleRecipeInput(stack), player.level()).isPresent()); + } + + private ListTag slotList() { + return pan.getOrDefault(net.minecraft.core.component.DataComponents.CUSTOM_DATA, net.minecraft.world.item.component.CustomData.EMPTY) + .copyTag().getList(SLOTS, Tag.TAG_COMPOUND); + } + + private CompoundTag slotTag(int slot) { + for (Tag raw : slotList()) { + CompoundTag tag = (CompoundTag) raw; + if (tag.getInt(SLOT) == slot) return tag; + } + CompoundTag tag = new CompoundTag(); + tag.putInt(SLOT, slot); + return tag; + } + + private void writeSlot(int slot, ItemStack stack, int cookTime) { + HolderLookup.Provider registries = player.registryAccess(); + net.minecraft.world.item.component.CustomData.update(net.minecraft.core.component.DataComponents.CUSTOM_DATA, pan, root -> { + ListTag list = root.getList(SLOTS, Tag.TAG_COMPOUND); + for (int i = list.size() - 1; i >= 0; i--) { + if (list.getCompound(i).getInt(SLOT) == slot) list.remove(i); + } + if (!stack.isEmpty()) { + CompoundTag tag = new CompoundTag(); + tag.putInt(SLOT, slot); + tag.putInt(TIME, cookTime); + tag.put(ITEM, stack.save(registries)); + list.add(tag); + } + root.put(SLOTS, list); + }); + } + + public int getCookTime(int slot) { + return slotTag(slot).getInt(TIME); + } + + public void setCookTime(int slot, int value) { + ItemStack stack = getItem(slot); + if (!stack.isEmpty()) writeSlot(slot, stack, value); + } + + @Override + public int getContainerSize() { return SLOT_COUNT; } + + @Override + public boolean isEmpty() { + for (int i = 0; i < SLOT_COUNT; i++) if (!getItem(i).isEmpty()) return false; + return true; + } + + @Override + public ItemStack getItem(int slot) { + CompoundTag tag = slotTag(slot); + if (!tag.contains(ITEM, Tag.TAG_COMPOUND)) return ItemStack.EMPTY; + return ItemStack.parseOptional(player.registryAccess(), tag.getCompound(ITEM)); + } + + @Override + public ItemStack removeItem(int slot, int amount) { + ItemStack stack = getItem(slot); + if (stack.isEmpty()) return ItemStack.EMPTY; + ItemStack result = stack.split(amount); + writeSlot(slot, stack, 0); + return result; + } + + @Override + public ItemStack removeItemNoUpdate(int slot) { + ItemStack result = getItem(slot); + writeSlot(slot, ItemStack.EMPTY, 0); + return result; + } + + @Override + public void setItem(int slot, ItemStack stack) { writeSlot(slot, stack, 0); } + + @Override + public void setChanged() { } + + @Override + public boolean stillValid(Player player) { return player.isAlive(); } + + @Override + public void clearContent() { + for (int i = 0; i < SLOT_COUNT; i++) writeSlot(i, ItemStack.EMPTY, 0); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/RoyalGuardianSwordAbilities.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/RoyalGuardianSwordAbilities.java index 9661d1bd..11466afe 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/RoyalGuardianSwordAbilities.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/RoyalGuardianSwordAbilities.java @@ -78,10 +78,15 @@ public final class RoyalGuardianSwordAbilities { || !(swordStack.getItem() instanceof RoyalGuardianSwordItem) || !RoyalGuardianSwordItem.isDischargeReady(swordStack, level.getGameTime())) return; - switch (RoyalGuardianSwordItem.getMode(swordStack)) { + RoyalGuardianSwordItem.Mode mode = RoyalGuardianSwordItem.getMode(swordStack); + if (mode == RoyalGuardianSwordItem.Mode.NONE) return; + + switch (mode) { case FIRE -> fireImpact(level, owner, primary); case FROST -> frostFan(level, owner, primary); case STORM -> chainLightning(level, owner, primary); + case NONE -> { + } } RoyalGuardianSwordItem.startDischargeCooldown(swordStack, level.getGameTime()); } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/RoyalGuardianSwordItem.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/RoyalGuardianSwordItem.java index b386bc66..0a87e176 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/RoyalGuardianSwordItem.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/RoyalGuardianSwordItem.java @@ -94,8 +94,8 @@ public class RoyalGuardianSwordItem extends SwordItem implements GeoItem { private static void setMode(ItemStack stack, Mode mode) { CustomData.update(DataComponents.CUSTOM_DATA, stack, tag -> { - if (mode == Mode.FIRE) tag.remove(MODE_TAG); - else tag.putInt(MODE_TAG, mode.ordinal()); + if (mode == Mode.NONE) tag.remove(MODE_TAG); + else tag.putInt(MODE_TAG, mode.id); }); } @@ -115,8 +115,8 @@ public class RoyalGuardianSwordItem extends SwordItem implements GeoItem { } public static Mode getMode(ItemStack stack) { - int value = stack.getOrDefault(DataComponents.CUSTOM_DATA, CustomData.EMPTY).copyTag().getInt(MODE_TAG); - return Mode.values()[Math.floorMod(value, Mode.values().length)]; + net.minecraft.nbt.CompoundTag tag = stack.getOrDefault(DataComponents.CUSTOM_DATA, CustomData.EMPTY).copyTag(); + return tag.contains(MODE_TAG) ? Mode.fromId(tag.getInt(MODE_TAG)) : Mode.NONE; } public static boolean isDischargeReady(ItemStack stack, long gameTime) { @@ -130,20 +130,37 @@ public class RoyalGuardianSwordItem extends SwordItem implements GeoItem { } public enum Mode { - FIRE("tooltip.antarchy.royal_guardian_sword.mode.fire", "tooltip.antarchy.royal_guardian_sword.fire"), - FROST("tooltip.antarchy.royal_guardian_sword.mode.frost", "tooltip.antarchy.royal_guardian_sword.frost"), - STORM("tooltip.antarchy.royal_guardian_sword.mode.storm", "tooltip.antarchy.royal_guardian_sword.storm"); + NONE(-1, "tooltip.antarchy.royal_guardian_sword.mode.none", "tooltip.antarchy.royal_guardian_sword.none"), + FIRE(0, "tooltip.antarchy.royal_guardian_sword.mode.fire", "tooltip.antarchy.royal_guardian_sword.fire"), + FROST(1, "tooltip.antarchy.royal_guardian_sword.mode.frost", "tooltip.antarchy.royal_guardian_sword.frost"), + STORM(2, "tooltip.antarchy.royal_guardian_sword.mode.storm", "tooltip.antarchy.royal_guardian_sword.storm"); + private final int id; private final String translationKey; private final String tooltipKey; - Mode(String translationKey, String tooltipKey) { + Mode(int id, String translationKey, String tooltipKey) { + this.id = id; this.translationKey = translationKey; this.tooltipKey = tooltipKey; } public Mode next() { - return values()[(this.ordinal() + 1) % values().length]; + return switch (this) { + case NONE -> FIRE; + case FIRE -> FROST; + case FROST -> STORM; + case STORM -> NONE; + }; + } + + private static Mode fromId(int id) { + for (Mode mode : values()) { + if (mode.id == id) { + return mode; + } + } + return NONE; } } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/TemporalTunerItem.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/TemporalTunerItem.java new file mode 100644 index 00000000..642481a2 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/item/TemporalTunerItem.java @@ -0,0 +1,86 @@ +package com.craisinlord.antarchy.content.item; + +import com.craisinlord.antarchy.config.AntarchySettings; +import com.craisinlord.antarchy.content.time.TemporalTunerAccess; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.component.CustomData; +import net.minecraft.core.component.DataComponents; +import net.minecraft.sounds.SoundEvents; + +import java.util.List; + +public final class TemporalTunerItem extends Item { + public static final double STEP = 0.1D; + private static final String RATE_TAG = "TemporalTunerRate"; + + public TemporalTunerItem(Properties properties) { + super(properties.stacksTo(1)); + } + + public static boolean isAvailable(Player player) { + return player.getInventory().contains(stack -> stack.getItem() instanceof TemporalTunerItem) + && (player.getMainHandItem().getItem() instanceof TemporalTunerItem + || player.getOffhandItem().getItem() instanceof TemporalTunerItem + || hasHotbarTuner(player)); + } + + private static boolean hasHotbarTuner(Player player) { + for (int slot = 0; slot < 9; slot++) { + if (player.getInventory().getItem(slot).getItem() instanceof TemporalTunerItem) { + return true; + } + } + return false; + } + + public static double clampRate(double rate) { + return Math.max(AntarchySettings.temporalTunerMinRate(), Math.min(AntarchySettings.temporalTunerMaxRate(), rate)); + } + + public static void adjust(Player player, double delta) { + if (!(player instanceof TemporalTunerAccess access) || !isAvailable(player)) { + return; + } + double previousRate = getRate(player); + double updatedRate = clampRate(previousRate + delta); + access.antarchy$setTemporalTunerRate(updatedRate); + if (Math.abs(updatedRate - previousRate) >= 0.001D) { + player.playSound(SoundEvents.NOTE_BLOCK_HAT.value(), 0.6F, 1.0F); + } + syncTooltipRate(player, getRate(player)); + } + + public static double getRate(Player player) { + return player instanceof TemporalTunerAccess access ? clampRate(access.antarchy$getTemporalTunerRate()) : 1.0D; + } + + public static void syncTooltipRate(Player player, double rate) { + for (int slot = 0; slot < 9; slot++) { + updateStackRate(player.getInventory().getItem(slot), rate); + } + updateStackRate(player.getOffhandItem(), rate); + } + + private static void updateStackRate(ItemStack stack, double rate) { + if (stack.getItem() instanceof TemporalTunerItem) { + CustomData.update(DataComponents.CUSTOM_DATA, stack, tag -> tag.putDouble(RATE_TAG, rate)); + } + } + + @Override + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip, TooltipFlag flag) { + tooltip.add(Component.translatable("tooltip.antarchy.temporal_tuner.description").withStyle(ChatFormatting.RED)); + double rate = stack.getOrDefault(DataComponents.CUSTOM_DATA, CustomData.EMPTY).copyTag().getDouble(RATE_TAG); + if (rate <= 0.0D) { + rate = 1.0D; + } + tooltip.add(Component.translatable("tooltip.antarchy.temporal_tuner.speed", (int) Math.round(rate * 100.0D)).withStyle(ChatFormatting.GRAY)); + tooltip.add(Component.translatable("tooltip.antarchy.temporal_tuner.controls", (int) (AntarchySettings.temporalTunerMinRate() * 100), (int) (AntarchySettings.temporalTunerMaxRate() * 100)).withStyle(ChatFormatting.GRAY)); + tooltip.add(Component.translatable("tooltip.antarchy.temporal_tuner.availability").withStyle(ChatFormatting.RED)); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/menu/GiantFryingPanMenu.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/menu/GiantFryingPanMenu.java new file mode 100644 index 00000000..ae04c49a --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/menu/GiantFryingPanMenu.java @@ -0,0 +1,54 @@ +package com.craisinlord.antarchy.content.menu; + +import com.craisinlord.antarchy.content.AntarchyObjects; +import com.craisinlord.antarchy.content.item.GiantFryingPanItem; +import com.craisinlord.antarchy.content.item.GiantFryingPanStorage; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; + +public final class GiantFryingPanMenu extends AbstractContainerMenu { + private final GiantFryingPanStorage panStorage; + + public GiantFryingPanMenu(int containerId, Inventory inventory) { + super(AntarchyObjects.GIANT_FRYING_PAN_MENU.get(), containerId); + ItemStack pan = GiantFryingPanStorage.findPan(inventory.player); + this.panStorage = new GiantFryingPanStorage(pan, inventory.player); + for (int slot = 0; slot < GiantFryingPanStorage.SLOT_COUNT; slot++) { + this.addSlot(new Slot(panStorage, slot, 8 + slot * 18, 18) { + @Override + public boolean mayPlace(ItemStack stack) { + return GiantFryingPanStorage.isCampfireInput(inventory.player, stack); + } + + @Override + public int getMaxStackSize() { return 1; } + }); + } + for (int row = 0; row < 3; row++) { + for (int col = 0; col < 9; col++) { + this.addSlot(new Slot(inventory, col + row * 9 + 9, 8 + col * 18, 50 + row * 18)); + } + } + for (int col = 0; col < 9; col++) this.addSlot(new Slot(inventory, col, 8 + col * 18, 108)); + } + + @Override + public boolean stillValid(Player player) { return player.isAlive() && !panStorage.isEmpty() || GiantFryingPanStorage.findPan(player).getItem() instanceof GiantFryingPanItem; } + + @Override + public ItemStack quickMoveStack(Player player, int index) { + if (index < 0 || index >= slots.size()) return ItemStack.EMPTY; + Slot slot = slots.get(index); + if (!slot.hasItem()) return ItemStack.EMPTY; + ItemStack original = slot.getItem().copy(); + if (index < GiantFryingPanStorage.SLOT_COUNT) { + if (!moveItemStackTo(slot.getItem(), GiantFryingPanStorage.SLOT_COUNT, slots.size(), true)) return ItemStack.EMPTY; + } else if (!moveItemStackTo(slot.getItem(), 0, GiantFryingPanStorage.SLOT_COUNT, false)) return ItemStack.EMPTY; + if (slot.getItem().isEmpty()) slot.setByPlayer(ItemStack.EMPTY); + else slot.setChanged(); + return original; + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/TemporalTunerScrollPayload.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/TemporalTunerScrollPayload.java new file mode 100644 index 00000000..1d754f82 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/network/TemporalTunerScrollPayload.java @@ -0,0 +1,19 @@ +package com.craisinlord.antarchy.content.network; + +import com.craisinlord.antarchy.Antarchy; +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; + +public record TemporalTunerScrollPayload(double delta) implements CustomPacketPayload { + public static final Type TYPE = new Type<>(ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "temporal_tuner_scroll")); + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.DOUBLE, TemporalTunerScrollPayload::delta, TemporalTunerScrollPayload::new); + + @Override + public Type type() { + return TYPE; + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/portal/CrossDimensionTravelApi.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/portal/CrossDimensionTravelApi.java new file mode 100644 index 00000000..47af4878 --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/portal/CrossDimensionTravelApi.java @@ -0,0 +1,116 @@ +package com.craisinlord.antarchy.content.portal; + +import java.util.LinkedHashSet; +import java.util.Set; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.vehicle.DismountHelper; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.portal.DimensionTransition; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; + +public final class CrossDimensionTravelApi { + private static final int HORIZONTAL_SEARCH_RADIUS = 8; + private static final int VERTICAL_SEARCH_RADIUS = 8; + + private CrossDimensionTravelApi() { + } + + public static boolean transferToSafePosition(Entity entity, ServerLevel destination, BlockPos preferred) { + if (!entity.isAlive() || !(entity.level() instanceof ServerLevel source)) { + return false; + } + Vec3 arrival = findSafePosition(entity, destination, preferred); + if (arrival == null) { + return false; + } + if (entity instanceof ServerPlayer player) { + player.teleportTo(destination, arrival.x, arrival.y, arrival.z, player.getYRot(), player.getXRot()); + player.setPortalCooldown(); + return true; + } + if (source == destination) { + entity.teleportTo(arrival.x, arrival.y, arrival.z); + entity.setPortalCooldown(); + return true; + } + Entity moved = entity.changeDimension(new DimensionTransition( + destination, + arrival, + Vec3.ZERO, + entity.getYRot(), + entity.getXRot(), + DimensionTransition.PLAY_PORTAL_SOUND + )); + if (moved != null) { + moved.setPortalCooldown(); + return true; + } + return false; + } + + @Nullable + public static Vec3 findSafePosition(Entity entity, ServerLevel destination, BlockPos preferred) { + Set candidates = new LinkedHashSet<>(); + candidates.add(preferred); + for (int radius = 0; radius <= HORIZONTAL_SEARCH_RADIUS; radius++) { + for (int x = -radius; x <= radius; x++) { + for (int z = -radius; z <= radius; z++) { + if (radius > 0 && Math.abs(x) != radius && Math.abs(z) != radius) { + continue; + } + BlockPos column = preferred.offset(x, 0, z); + if (destination.hasChunkAt(column)) { + BlockPos surface = destination.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, column); + candidates.add(surface); + candidates.add(surface.above()); + } + for (int y = 0; y <= VERTICAL_SEARCH_RADIUS; y++) { + candidates.add(column.above(y)); + if (y > 0) { + candidates.add(column.below(y)); + } + } + } + } + } + for (BlockPos candidate : candidates) { + if (!isAreaLoaded(destination, candidate)) { + continue; + } + Vec3 safe = DismountHelper.findSafeDismountLocation(entity.getType(), destination, candidate, true); + if (safe != null && isValidPosition(destination, safe)) { + return safe; + } + } + return null; + } + + private static boolean isAreaLoaded(ServerLevel level, BlockPos center) { + if (center.getY() <= level.getMinBuildHeight() || center.getY() >= level.getMaxBuildHeight() - 1 + || !level.getWorldBorder().isWithinBounds(center)) { + return false; + } + for (Direction direction : Direction.values()) { + if (!level.hasChunkAt(center.relative(direction))) { + return false; + } + } + return level.hasChunkAt(center) && level.hasChunkAt(center.above()); + } + + private static boolean isValidPosition(ServerLevel level, Vec3 position) { + BlockPos feet = BlockPos.containing(position); + BlockPos head = feet.above(); + BlockState feetState = level.getBlockState(feet); + BlockState headState = level.getBlockState(head); + return feetState.getFluidState().isEmpty() && headState.getFluidState().isEmpty() + && feetState.getCollisionShape(level, feet).isEmpty() + && headState.getCollisionShape(level, head).isEmpty(); + } +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/time/TemporalTunerAccess.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/time/TemporalTunerAccess.java new file mode 100644 index 00000000..988d615c --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/time/TemporalTunerAccess.java @@ -0,0 +1,7 @@ +package com.craisinlord.antarchy.content.time; + +public interface TemporalTunerAccess { + double antarchy$getTemporalTunerRate(); + + void antarchy$setTemporalTunerRate(double rate); +} diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/time/TimeDilationManager.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/time/TimeDilationManager.java index 67d39367..5663c71b 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/time/TimeDilationManager.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/content/time/TimeDilationManager.java @@ -12,6 +12,8 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.entity.player.Player; +import com.craisinlord.antarchy.content.item.TemporalTunerItem; import com.craisinlord.antarchy.content.effect.DilatedMobEffect; import com.craisinlord.antarchy.content.effect.ContractedMobEffect; import com.craisinlord.antarchy.content.effect.RoyalEffectEligibility; @@ -35,6 +37,9 @@ public final class TimeDilationManager { } } TrackingState tracking = TRACKING.get(level); + for (ServerPlayer player : level.players()) { + trackPotentiallyAffected(player); + } if (activeFields == null && (tracking == null || tracking.entities.isEmpty())) { continue; } @@ -64,13 +69,15 @@ public final class TimeDilationManager { if (!(entity.level() instanceof ServerLevel level) || entity instanceof TimeDilationFieldEntity) { return; } + boolean hasTuner = entity instanceof Player player && TemporalTunerItem.isAvailable(player); + boolean hasEffect = entity instanceof net.minecraft.world.entity.LivingEntity living + && ((RoyalEffectHooks.dilatedHolder() != null && living.hasEffect(RoyalEffectHooks.dilatedHolder())) + || (RoyalEffectHooks.contractedHolder() != null && living.hasEffect(RoyalEffectHooks.contractedHolder()))); if (entity instanceof TimeDilationEntityAccess access && Math.abs(access.antarchy$getTimeDilationRate() - TimeDilationMath.NORMAL_RATE) < 0.001D && Math.abs(access.antarchy$getInheritedTimeDilationRate() - TimeDilationMath.NORMAL_RATE) < 0.001D && Math.abs(TimeDilationApi.getVehicleRate(entity) - TimeDilationMath.NORMAL_RATE) < 0.001D - && (!(entity instanceof net.minecraft.world.entity.LivingEntity living) - || ((RoyalEffectHooks.dilatedHolder() == null || !living.hasEffect(RoyalEffectHooks.dilatedHolder())) - && (RoyalEffectHooks.contractedHolder() == null || !living.hasEffect(RoyalEffectHooks.contractedHolder()))))) { + && !hasTuner && !hasEffect) { return; } TRACKING.computeIfAbsent(level, ignored -> new TrackingState()).entities.add(entity); @@ -165,6 +172,15 @@ public final class TimeDilationManager { effectRate = Math.max(effectRate, ContractedMobEffect.rateForAmplifier(effect.getAmplifier())); } } + double tunerRate = TimeDilationMath.NORMAL_RATE; + if (entity instanceof Player player && player instanceof TemporalTunerAccess tunerAccess) { + if (TemporalTunerItem.isAvailable(player)) { + tunerRate = TemporalTunerItem.getRate(player); + } else { + tunerAccess.antarchy$setTemporalTunerRate(TimeDilationMath.NORMAL_RATE); + TemporalTunerItem.syncTooltipRate(player, TimeDilationMath.NORMAL_RATE); + } + } double inheritedRate = access.antarchy$getInheritedTimeDilationRate(); double vehicleRate = TimeDilationApi.getVehicleRate(entity); if (vehicleRate < TimeDilationMath.NORMAL_RATE) { @@ -190,6 +206,11 @@ public final class TimeDilationManager { } else { fastRate = Math.max(fastRate, effectRate); } + if (tunerRate < TimeDilationMath.NORMAL_RATE) { + slowRate = Math.min(slowRate, tunerRate); + } else { + fastRate = Math.max(fastRate, tunerRate); + } if (inheritedRate < TimeDilationMath.NORMAL_RATE) { slowRate = Math.min(slowRate, inheritedRate); } else { diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/compat/alexscaves/AlexsCavesDepthChargeMixin.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/compat/alexscaves/AlexsCavesDepthChargeMixin.java index 8f0239dc..8b4833a1 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/compat/alexscaves/AlexsCavesDepthChargeMixin.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/compat/alexscaves/AlexsCavesDepthChargeMixin.java @@ -16,7 +16,8 @@ public abstract class AlexsCavesDepthChargeMixin { @ModifyArg( method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/phys/Vec3;add(DDD)Lnet/minecraft/world/phys/Vec3;"), - index = 1 + index = 1, + require = 0 ) private double antarchy$invertManualGravity(double y) { Projectile self = (Projectile) (Object) this; diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/time/LivingEntityTimeDilationMixin.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/time/LivingEntityTimeDilationMixin.java index 6b08ba28..f25f86c1 100644 --- a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/time/LivingEntityTimeDilationMixin.java +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/time/LivingEntityTimeDilationMixin.java @@ -18,7 +18,7 @@ public abstract class LivingEntityTimeDilationMixin { private void antarchy$trackTemporalEffects(CallbackInfo ci) { Entity entity = (Entity) (Object) this; TimeDilationManager.trackPotentiallyAffected(entity); - if (entity.level().isClientSide && RoyalEffectHooks.contractedHolder() != null) { + if (entity.level().isClientSide) { ContractionAfterimages.observe((LivingEntity) entity); } } diff --git a/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/time/PlayerTemporalTunerMixin.java b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/time/PlayerTemporalTunerMixin.java new file mode 100644 index 00000000..59ee57fa --- /dev/null +++ b/common-1.21.1/src/main/java/com/craisinlord/antarchy/mixins/time/PlayerTemporalTunerMixin.java @@ -0,0 +1,37 @@ +package com.craisinlord.antarchy.mixins.time; + +import com.craisinlord.antarchy.content.time.TimeDilationMath; +import com.craisinlord.antarchy.content.time.TemporalTunerAccess; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.player.Player; +import org.spongepowered.asm.mixin.Mixin; +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(Player.class) +public abstract class PlayerTemporalTunerMixin implements TemporalTunerAccess { + @Unique + private double antarchy$temporalTunerRate = TimeDilationMath.NORMAL_RATE; + + @Override + public double antarchy$getTemporalTunerRate() { + return antarchy$temporalTunerRate; + } + + @Override + public void antarchy$setTemporalTunerRate(double rate) { + antarchy$temporalTunerRate = TimeDilationMath.clampRate(rate); + } + + @Inject(method = "addAdditionalSaveData", at = @At("TAIL")) + private void antarchy$saveTemporalTunerRate(CompoundTag tag, CallbackInfo ci) { + tag.putDouble("AntarchyTemporalTunerRate", antarchy$temporalTunerRate); + } + + @Inject(method = "readAdditionalSaveData", at = @At("TAIL")) + private void antarchy$loadTemporalTunerRate(CompoundTag tag, CallbackInfo ci) { + antarchy$temporalTunerRate = TimeDilationMath.clampRate(tag.getDouble("AntarchyTemporalTunerRate")); + } +} diff --git a/common-1.21.1/src/main/resources/antarchy-common.mixins.json b/common-1.21.1/src/main/resources/antarchy-common.mixins.json index 4a2c13e0..790fede3 100644 --- a/common-1.21.1/src/main/resources/antarchy-common.mixins.json +++ b/common-1.21.1/src/main/resources/antarchy-common.mixins.json @@ -107,6 +107,7 @@ "time.EntityDeltaMovementTimeDilationMixin", "time.EntityMoveTimeDilationMixin", "time.EntityTimeDilationStateMixin", + "time.PlayerTemporalTunerMixin", "time.EntityRotationTimeDilationMixin", "time.EntityCrouchTimeDilationMixin", "time.LivingEntityKnockbackTimeDilationMixin", diff --git a/common-1.21.1/src/main/resources/assets/antarchy/geo/giant_frying_pan.geo.json b/common-1.21.1/src/main/resources/assets/antarchy/geo/giant_frying_pan.geo.json new file mode 100644 index 00000000..5c932bef --- /dev/null +++ b/common-1.21.1/src/main/resources/assets/antarchy/geo/giant_frying_pan.geo.json @@ -0,0 +1,110 @@ +{ + "format_version": "1.21.110", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.unknown", + "texture_width": 128, + "texture_height": 128, + "visible_bounds_width": 4, + "visible_bounds_height": 6, + "visible_bounds_offset": [0, 2, 0] + }, + "bones": [ + { + "name": "giant_frying_pan", + "pivot": [0, -2, 0], + "cubes": [ + {"origin": [-1, 0, -1], "size": [2, 20, 2], "uv": [16, 0]} + ] + }, + { + "name": "handle", + "parent": "giant_frying_pan", + "pivot": [0, -2, 0], + "cubes": [ + { + "origin": [-2, -16, -2], + "size": [4, 16, 4], + "uv": { + "north": {"uv": [4, 4], "uv_size": [4, 16]}, + "east": {"uv": [8, 4], "uv_size": [-4, 16]}, + "south": {"uv": [4, 4], "uv_size": [4, 16]}, + "west": {"uv": [8, 4], "uv_size": [-4, 16]}, + "up": {"uv": [4, 0], "uv_size": [4, 4]}, + "down": {"uv": [8, 4], "uv_size": [4, -4]} + } + } + ] + }, + { + "name": "pan_base", + "parent": "giant_frying_pan", + "pivot": [0, 38, 0], + "cubes": [ + { + "origin": [-18, 22, 1], + "size": [36, 36, 2], + "uv": { + "north": {"uv": [0, 22], "uv_size": [36, 36]}, + "east": {"uv": [26, 66], "uv_size": [2, 36]}, + "south": {"uv": [36, 0], "uv_size": [36, 36]}, + "west": {"uv": [28, 66], "uv_size": [2, 36]}, + "up": {"uv": [102, 64], "uv_size": [-36, -2]}, + "down": {"uv": [102, 66], "uv_size": [-36, -2]} + } + }, + { + "origin": [18, 22, -3], + "size": [2, 36, 6], + "uv": { + "north": {"uv": [64, 62], "uv_size": [2, 36]}, + "east": {"uv": [0, 58], "uv_size": [6, 36]}, + "south": {"uv": [24, 66], "uv_size": [2, 36]}, + "west": {"uv": [38, 54], "uv_size": [36, -6], "uv_rotation": 90}, + "up": {"uv": [26, 10], "uv_size": [-2, -6]}, + "down": {"uv": [26, 16], "uv_size": [-2, -6]} + } + }, + { + "origin": [-20, 20, -3], + "size": [40, 2, 6], + "uv": { + "north": {"uv": [24, 60], "uv_size": [40, 2]}, + "east": {"uv": [74, 48], "uv_size": [2, 6], "uv_rotation": 90}, + "south": {"uv": [24, 62], "uv_size": [40, 2]}, + "west": {"uv": [38, 54], "uv_size": [-2, -6], "uv_rotation": 90}, + "up": {"uv": [76, 42], "uv_size": [-40, -6]}, + "down": {"uv": [76, 48], "uv_size": [-40, 6]} + } + }, + { + "origin": [-20, 22, -3], + "size": [2, 36, 6], + "uv": { + "north": {"uv": [30, 66], "uv_size": [2, 36]}, + "east": {"uv": [38, 48], "uv_size": [36, 6], "uv_rotation": 90}, + "south": {"uv": [32, 66], "uv_size": [2, 36]}, + "west": {"uv": [18, 58], "uv_size": [6, 36]}, + "up": {"uv": [26, 22], "uv_size": [-2, -6]}, + "down": {"uv": [28, 10], "uv_size": [-2, -6]} + } + }, + { + "origin": [-20, 58, -3], + "size": [40, 2, 6], + "uv": { + "north": {"uv": [24, 64], "uv_size": [40, 2]}, + "east": {"uv": [36, 48], "uv_size": [2, 6], "uv_rotation": 90}, + "south": {"uv": [64, 60], "uv_size": [40, 2]}, + "west": {"uv": [36, 54], "uv_size": [2, -6], "uv_rotation": 90}, + "up": {"uv": [76, 54], "uv_size": [-40, -6]}, + "down": {"uv": [76, 60], "uv_size": [-40, -6]} + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/common-1.21.1/src/main/resources/assets/antarchy/items/blood_gods_blade.json b/common-1.21.1/src/main/resources/assets/antarchy/items/blood_gods_blade.json new file mode 100644 index 00000000..382f6094 --- /dev/null +++ b/common-1.21.1/src/main/resources/assets/antarchy/items/blood_gods_blade.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "antarchy:item/blood_gods_blade" + } +} diff --git a/common-1.21.1/src/main/resources/assets/antarchy/lang/en_us.json b/common-1.21.1/src/main/resources/assets/antarchy/lang/en_us.json index 2e1666ee..b59e6710 100644 --- a/common-1.21.1/src/main/resources/assets/antarchy/lang/en_us.json +++ b/common-1.21.1/src/main/resources/assets/antarchy/lang/en_us.json @@ -321,6 +321,10 @@ "subtitles.antarchy.mantis_attack": "Mantis snaps", "subtitles.antarchy.mantis_fly_loop": "Mantis wings buzz", "item.antarchy.big_bertha": "Big Bertha", + "item.antarchy.giant_frying_pan": "Giant Frying Pan", + "tooltip.antarchy.giant_frying_pan.insert": "Right-click with food to add it to the pan.", + "tooltip.antarchy.giant_frying_pan.gui": "Shift-right-click to open the cooking slots.", + "tooltip.antarchy.giant_frying_pan.campfire": "Cooks campfire recipes without fuel.", "item.antarchy.bluestone": "Bluestone Dust", "item.antarchy.wasp_nest": "Wasp Nest", "item.antarchy.stink_bug": "Stink Bug", @@ -528,6 +532,11 @@ "item.antarchy.blood_crystal_shard": "Blood Crystal Shard", "item.antarchy.blood_crystal_apple": "Blood Crystal Apple", "item.antarchy.blood_crystal_katana": "Blood Crystal Katana", + "item.antarchy.blood_gods_blade": "Blood God’s Blade", + "tooltip.antarchy.blood_gods_blade.bleeding": "Hits inflict Bleeding", + "tooltip.antarchy.blood_gods_blade.blood_moon": "Right-click: Summon Blood Moon", + "effect.antarchy.bleeding": "Bleeding", + "effect.antarchy.blood_moon": "Blood Moon", "item.antarchy.blood_crystal_helmet": "Blood Crystal Helmet", "item.antarchy.blood_crystal_chestplate": "Blood Crystal Chestplate", "item.antarchy.blood_crystal_leggings": "Blood Crystal Leggings", @@ -548,9 +557,11 @@ "item.antarchy.royal_guardian_sword": "Royal Guardian Sword", "item.antarchy.royal_guardian_shield": "Royal Guardian Shield", "tooltip.antarchy.royal_guardian_sword.mode": "Mode: %s", + "tooltip.antarchy.royal_guardian_sword.mode.none": "None", "tooltip.antarchy.royal_guardian_sword.mode.fire": "Fire", "tooltip.antarchy.royal_guardian_sword.mode.frost": "Frost", "tooltip.antarchy.royal_guardian_sword.mode.storm": "Storm", + "tooltip.antarchy.royal_guardian_sword.none": "Fully charged hits use the sword's normal damage without an elemental discharge.", "tooltip.antarchy.royal_guardian_sword.fire": "Fully charged hits erupt in royal flame, burning the target and nearby enemies.", "tooltip.antarchy.royal_guardian_sword.frost": "Fully charged hits freeze the target and raise a fan of royal ice spikes.", "tooltip.antarchy.royal_guardian_sword.storm": "Fully charged hits call royal lightning that chains between nearby enemies.", @@ -577,6 +588,11 @@ "tooltip.antarchy.mantis_claw.wall_cling": "Dual wield to cling to walls and jump upward.", "item.antarchy.king_scale": "King Scale", "item.antarchy.queen_scale": "Queen Scale", + "item.antarchy.temporal_tuner": "Temporal Tuner", + "tooltip.antarchy.temporal_tuner.description": "Adjusts your personal time dilation.", + "tooltip.antarchy.temporal_tuner.speed": "Current speed: %s%%", + "tooltip.antarchy.temporal_tuner.controls": "Shift + scroll: %s%% to %s%% speed", + "tooltip.antarchy.temporal_tuner.availability": "Resets when removed from your hotbar and offhand.", "item.antarchy.jerry_nucleus": "Jerry Nucleus", "tooltip.antarchy.jerry_nucleus.hatch": "While holding, interact with any bug egg or turtle egg to hatch it instantly.", "key.antarchy.mount_special": "Mount: Special / Charge", diff --git a/common-1.21.1/src/main/resources/assets/antarchy/models/item/blood_gods_blade.json b/common-1.21.1/src/main/resources/assets/antarchy/models/item/blood_gods_blade.json new file mode 100644 index 00000000..e39c9b24 --- /dev/null +++ b/common-1.21.1/src/main/resources/assets/antarchy/models/item/blood_gods_blade.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "antarchy:item/blood_gods_blade" + } +} diff --git a/common-1.21.1/src/main/resources/assets/antarchy/models/item/giant_frying_pan_gui.json b/common-1.21.1/src/main/resources/assets/antarchy/models/item/giant_frying_pan_gui.json new file mode 100644 index 00000000..0eb2284a --- /dev/null +++ b/common-1.21.1/src/main/resources/assets/antarchy/models/item/giant_frying_pan_gui.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "gui_light": "front", + "textures": { + "layer0": "antarchy:item/giant_frying_pan/giant_frying_pan_in_hand" + } +} diff --git a/common-1.21.1/src/main/resources/assets/antarchy/models/item/giant_frying_pan_held.json b/common-1.21.1/src/main/resources/assets/antarchy/models/item/giant_frying_pan_held.json new file mode 100644 index 00000000..dc68f4ad --- /dev/null +++ b/common-1.21.1/src/main/resources/assets/antarchy/models/item/giant_frying_pan_held.json @@ -0,0 +1,90 @@ +{ + "credit": "Made with Blockbench", + "parent": "builtin/entity", + "texture_size": [ + 128, + 128 + ], + "display": { + "thirdperson_righthand": { + "rotation": [ + -25, + -180, + 0 + ], + "translation": [ + 0, + -4, + 3 + ], + "scale": [ + 1.2, + 1.2, + 1.2 + ] + }, + "thirdperson_lefthand": { + "rotation": [ + -25, + -180, + 0 + ], + "translation": [ + 0, + -4, + 3 + ], + "scale": [ + 1.2, + 1.2, + 1.2 + ] + }, + "firstperson_righthand": { + "rotation": [ + -75, + -180, + 15 + ], + "translation": [ + 10, + -5, + 10 + ], + "scale": [ + 0.68, + 0.68, + 0.68 + ] + }, + "firstperson_lefthand": { + "rotation": [ + -75, + -180, + 15 + ], + "translation": [ + 10, + -5, + 10 + ], + "scale": [ + 0.68, + 0.68, + 0.68 + ] + }, + "ground": { + "translation": [ + 0, + 2, + 0 + ], + "scale": [ + 0.2, + 0.2, + 0.2 + ] + } + } +} \ No newline at end of file diff --git a/common-1.21.1/src/main/resources/assets/antarchy/models/item/temporal_tuner.json b/common-1.21.1/src/main/resources/assets/antarchy/models/item/temporal_tuner.json new file mode 100644 index 00000000..81289b2f --- /dev/null +++ b/common-1.21.1/src/main/resources/assets/antarchy/models/item/temporal_tuner.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "antarchy:item/temporal_tuner" + } +} diff --git a/common-1.21.1/src/main/resources/assets/antarchy/textures/block/ichor/ichor_flowing.png b/common-1.21.1/src/main/resources/assets/antarchy/textures/block/ichor/ichor_flowing.png new file mode 100644 index 0000000000000000000000000000000000000000..4709684132068ff6a724d6d080567517c9427df8 GIT binary patch literal 9037 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 sjCse}`a82tv5ap8e@4@lI6i~s-t literal 0 HcmV?d00001 diff --git a/common-1.21.1/src/main/resources/assets/antarchy/textures/block/ichor/ichor_flowing.png.mcmeta b/common-1.21.1/src/main/resources/assets/antarchy/textures/block/ichor/ichor_flowing.png.mcmeta new file mode 100644 index 00000000..76bf944f --- /dev/null +++ b/common-1.21.1/src/main/resources/assets/antarchy/textures/block/ichor/ichor_flowing.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 5, + "interpolate": true + } +} diff --git a/common-1.21.1/src/main/resources/assets/antarchy/textures/block/ichor/ichor_still.png b/common-1.21.1/src/main/resources/assets/antarchy/textures/block/ichor/ichor_still.png new file mode 100644 index 0000000000000000000000000000000000000000..98347bf67f02e9f6c41f6cfa7b09b74b3955c083 GIT binary patch literal 4330 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 Be(wMP literal 0 HcmV?d00001 diff --git a/common-1.21.1/src/main/resources/assets/antarchy/textures/block/ichor/ichor_still.png.mcmeta b/common-1.21.1/src/main/resources/assets/antarchy/textures/block/ichor/ichor_still.png.mcmeta new file mode 100644 index 00000000..76bf944f --- /dev/null +++ b/common-1.21.1/src/main/resources/assets/antarchy/textures/block/ichor/ichor_still.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 5, + "interpolate": true + } +} diff --git a/common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_moon.png b/common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_moon.png new file mode 100644 index 0000000000000000000000000000000000000000..1db201a84be1c3afe6883eba3e968723772a4d60 GIT binary patch literal 1002 zcmVPx&q)9|UR7i=vR=sW>RS-RM?yUU*PDMV`UiKd)^53cVU5?M>7BL~a ztdQHtd^>a!AW%>e0#If&4GF+d8l<)AgEYQCpFtae0xM?3K+>8f$t;v4h-nQe*qkOe zF_-8LDgGf1i#f;A|R3yy`0(qRM!Gv`neZdOp-%nJdOB!FfD z5VB&~tc8)>2}LFx7Mo7;`SA%9a4>WFkU7}Up$BsUgK<);siB}UI!(J;l)H30>}z_Yqwk{)rJNA_yh*?l9% z`*?Nk08TFO;{Ds3jGK&`%$s&wk+CN5HAxnfVpb9b#S7io(e3bwJ^KcLUcUS7*Z}inyo=^g9TRsfEkj>`Sl+2x-#RWm{vnSu-y+8sdxfVJK|*bBXt zwL^QV^kDw{v`ojH;guNGcf-)g-2 z>-TE9jdqh!Q`cDo(4yEGK)_+W-ffg?ZY|d}6;em9S*zK)(xukTd7i~4K(J7Nj;siX zYDvLsYMAa(Yc(aHW<)AlcJxqaEI~Fk|3yzmZ<#w*oIZ79r#bJpOoejl%%QmLximZe z|Izd}CaT%kV(X#Eijm;9v8AONQh?TT*w(RS{ynED;P%0beejx~?+;#&J~}@7@cZcN YGrx9ctHW(u$p8QV07*qoM6N<$f~;KQApigX literal 0 HcmV?d00001 diff --git a/common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_star1.png b/common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_star1.png new file mode 100644 index 0000000000000000000000000000000000000000..0ed8de03f9e6d2ffaee4572a9e3ae33ab18fcd79 GIT binary patch literal 270 zcmV+p0rCEcP)Px#$Vo&&R2Y?&kFg4ZP!xv$qYe$aiL^8cLQCLe)N2GjM$gjT3-}O@K~2G31i{HA zlBRpXhU_-nym*ZU&vf8?{O9|D2}AuNc8R3OGmf(45VeE(s%A^-pY07*qoM6N<$g7XA)r2qf` literal 0 HcmV?d00001 diff --git a/common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_star2.png b/common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_star2.png new file mode 100644 index 0000000000000000000000000000000000000000..c9c7098c641b64c162c419e27b722841d12d31b0 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhjKx9jP7LeL$-D$|rh2+KhDc0J zPFNtC;PR|yZPCy385+kv{QslP1_W*Yx7!(iSYycq! Q2IxQrPgg&ebxsLQ0JUUSjQ{`u literal 0 HcmV?d00001 diff --git a/common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_star3.png b/common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_star3.png new file mode 100644 index 0000000000000000000000000000000000000000..2a9efa289ec361ec51ce033fb02bec78824b82df GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhjKx9jP7LeL$-D$|@;zM~LnNjq zCrF4i2*y6R{c6R39w7LCet*(~yxYx6=UdMFjC%TMeq&=}V%bq!HXvvde|GKv#HW!L zeE-$|6Ft0kyS>D}`@i}Xdk_8I^WB=c|BXCYm41Jugx+4Y2hU=?I9A_%Cwp{)JPQNE Y!W_i|d<#rffmSnky85}Sb4q9e0MUy?XaE2J literal 0 HcmV?d00001 diff --git a/common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_star4.png b/common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_star4.png new file mode 100644 index 0000000000000000000000000000000000000000..2dc291f5fc79381cb9395389bc3c72ba069f2635 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhjKx9jP7LeL$-D$|vOHZJLnNjq zCrF4i2*y6R{c6R39w7LCet*(~yxYx6=UdMFjC#rxe&WD^10N3E`DMS!hI`k^&D!q_ z?^OM6ZUlmbVRL6QE`M~sdcU!X^uP3kgoN}TpJuc^yp+w9cW-IShFfp%1@ioKWMJTW Wr@&#JX|)V!D}$%2pUXO@geCx9*GC-y literal 0 HcmV?d00001 diff --git a/common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_star5.png b/common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_star5.png new file mode 100644 index 0000000000000000000000000000000000000000..5c1cb4bff24d4aec3adfbb114b5d0ec1eaf5f8ed GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhjKx9jP7LeL$-D$|+&oPx$qe(5k}*geQ4of|RTm|rX^tS6g~($eNWkLSGeI~B8%Slp90WojwO|p6 z5lJJ0g`ABD(IUkbsVqW3370gfL`ZcBE{Gn4q*&2K6ZV`m-g4_H-u>`k-h1=Sn}2u~ z9jYWo8}To?=;;(L-LcaB!f)Cy(17zB!vHKl2?2|)c3~IDZwxaqI!PSX+HczvSLem( z;rfWyqp}{ZkLbJ@^~BXoQs&?qcy~6Z({eYHn_4JvPVqq5ecvU=ib zR4HoU+gcK%Mw}Ll83n$b0#T)?yR$j<#Jv$t|G|&2n?hLQ@$*Lvj81Y7STi*qzC30x zK4@+GLfwsEdq0`W{W*E_!1SR14*0ZM;T8$~r$=n>Cv(>oNGk`vt@q7sHn(D)76pLK zt(Y%64nSt|84H1LD?nkw<=tw?tFLDkpa9jKAqt#x!e6T5=#^F)lYcwb*D@$0jyA6= fEi{7{uXm*XscpU515&)G00000NkvXXu0mjf!ob)# literal 0 HcmV?d00001 diff --git a/common-1.21.1/src/main/resources/assets/antarchy/textures/item/bug_spray.png b/common-1.21.1/src/main/resources/assets/antarchy/textures/item/bug_spray.png index 35c4c9129f459ac8b71de1f7e566031b732d10f9..9d5aeb7bc9afa8e032ad1cd65b47043f02cf1aa4 100644 GIT binary patch delta 494 zcmVkqRxLtBRXk?~6;;{U z38c;aiO5KYMmLHNUA;FCK=XJ=rtWZdE>BK}c+N+&x>1%t4_gAKZisQN24*nVWM<9CeS8(;;iGUjQ&Wdx6_`A5khjG=TI892vJNqgcEK zz`6662?7Pc^nbKRFRTi@f`{JxMx!3!`-)42JZ?4%g*< zyc!*v9~qj7p%>D9zW-amt?a`l1YbuvnEDQ5hx<5xwP&DDrjz)`nX!Q!OF%>r5sRP~ z(zNazBL4_Z5MwXzGxyt#`u(y7TZ$ kZWXWF!x3Y9TUnp!HwI~@=`%$Q%K!iX07*qoM6N<$f^@g$7XSbN delta 319 zcmey%e4c57WIZzj1A~Sxe=v|@EDmyaVpw-h<|UBBlJ4m1$iT3%pZiZDE0Av%;1l9% zYHGT4>C(8kxTdBiPZyT||Nj>i75V%7zq(^{O(*mLd0k6NZ=(}IMiug0a%SeGy6b4zyFR1dU_!PC{xWt~$(69AgYe1`x4 diff --git a/common-1.21.1/src/main/resources/assets/antarchy/textures/item/bug_spray_spraying.png b/common-1.21.1/src/main/resources/assets/antarchy/textures/item/bug_spray_spraying.png index 571c8a49ab6ae40ee472684628ac0e77d8caa07d..9d5aeb7bc9afa8e032ad1cd65b47043f02cf1aa4 100644 GIT binary patch delta 494 zcmVkqRxLtBRXk?~6;;{U z38c;aiO5KYMmLHNUA;FCK=XJ=rtWZdE>BK}c+N+&x>1%t4_gAKZisQN24*nVWM<9CeS8(;;iGUjQ&Wdx6_`A5khjG=TI892vJNqgcEK zz`6662?7Pc^nbKRFRTi@f`{JxMx!3!`-)42JZ?4%g*< zyc!*v9~qj7p%>D9zW-amt?a`l1YbuvnEDQ5hx<5xwP&DDrjz)`nX!Q!OF%>r5sRP~ z(zNazBL4_Z5MwXzGxyt#`u(y7TZ$ kZWXWF!x3Y9TUnp!HwI~@=`%$Q%K!iX07*qoM6N<$f{o4QBme*a literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|;0G|-oIeStj@9{P@HC?)NX{Qdo3-LbiGb_T2N2`G$8M0ZW@phDGBlm25LbE4F3Ml1%dLM1s;*b3=DjS zK$uZf!>a)(C{f}XQ4*Y=R#Ki=l*$m0n3-3i=jR%tV5(=RXWo77yCqOfs;7%%h(>Vi zxk#}F1rF8=E_00BzwN)?=j`}#ag4k>U)8H0GE3_0@)R5e8|NMB)aB_&aA3%4HcFJ0 zl9zassa)lEL;Gpa&*=}mymy}2&Uo->)U8+Q4(qSJsq1x+m*!BYsNVT&m2}Z7{y%4) Sa$Nvg$l&Sf=d#Wzp$PyTi-Y6< diff --git a/common-1.21.1/src/main/resources/assets/antarchy/textures/item/giant_frying_pan/giant_frying_pan_in_hand.png b/common-1.21.1/src/main/resources/assets/antarchy/textures/item/giant_frying_pan/giant_frying_pan_in_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..7c0e4f0d88844030f3b49721f0c47c5d2259f76c GIT binary patch literal 395 zcmV;60d)R}P)Px$MM*?KR5*>DlFv&5K@`V78yZR&Bw-5D8WwnPjSfq8U5}lo#%HVr2901U4wTz%Wu?)=RcPVTa zwB6}DxSop*G8o8MgcW#oeTg@jhJt6(DXKLa*K>J)ec`^{HrC?GkAnfc$&}l>8)oB? z_UjgG%aVuH;}D!lr(*x7D+FcJ1dx#mR>4Z^8=C;cwy;XU;E^f(mOYV7Ms4ac_kEnc z^Ct*kHXgxZ3$EvqNvA>+nEQSR9FDw@Ewl$mm5Qv^Y#tw)vDp=v%k9t=f{y4#_u%v6 zjpE*chUdPokAj2J71)*~vs+oZLI6-UO+Bh$-^$++Jp=WLwq?nDvBdLJOFQ`9`9%f% pKbadB4Y_ZYVu6*apV$8n17E>`k)~}0hc^HK002ovPDHLkV1h78uZ{o! literal 0 HcmV?d00001 diff --git a/common-1.21.1/src/main/resources/assets/antarchy/textures/item/giant_frying_pan/giant_frying_pan_in_hand_full.png b/common-1.21.1/src/main/resources/assets/antarchy/textures/item/giant_frying_pan/giant_frying_pan_in_hand_full.png new file mode 100644 index 0000000000000000000000000000000000000000..a3f688b886a40c67c958c5873dabdb900e12c24a GIT binary patch literal 477 zcmV<30V4j1P)Px$mq|oHR7i=nl+R1TU>L_giwq?Uk}!pEg#{j5(P4C}WB)<7{>iRE7Y`vGqLdO+ zY7!_SIvkQX;qB61-r34c?F&2XdER}VU+*)G1$B9TA=LN&pbtQ$TGdqh`l8@;CP#KB zEA8!G8{4rlL8yVW-%-JE4}5!fgY!A|`ICt_#bXoOvH5s=<)L2J)}mGb1i}HF&oTGq z5|hzT`a`$KGz@W4JoCYmiFn}Ire%@WbpR2$f_ZRH8=G4IEYzZTQiDgnMY8}^>#^8R zTUhASb!qq7p`ZYh(Ga4x$aZX!iMa0uOLUIV94v TuH?@Z00000NkvXXu0mjfOXu4n literal 0 HcmV?d00001 diff --git a/common-1.21.1/src/main/resources/assets/antarchy/textures/item/giant_frying_pan/giant_frying_pan_model.png b/common-1.21.1/src/main/resources/assets/antarchy/textures/item/giant_frying_pan/giant_frying_pan_model.png new file mode 100644 index 0000000000000000000000000000000000000000..ac28525ddc0a209be0a96965238d36982fb1c0d2 GIT binary patch literal 4208 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 ipJtnbO*bLaFs literal 0 HcmV?d00001 diff --git a/common-1.21.1/src/main/resources/assets/antarchy/textures/mob_effect/commanded.png b/common-1.21.1/src/main/resources/assets/antarchy/textures/mob_effect/commanded.png index b73a5b56db39d7609a8b1bfd554a817bf682749d..9941aef2ee06d9cfe18b1f0d8f95d8c03e95b6ab 100644 GIT binary patch literal 369 zcmV-%0gnEOP)Px$D@jB_R5*>bRJ&@!FcdvD&FaaRbZa0XbSW6&#b405gN?r-Lw_Voht8R`bj}yJ z6j1_QO6@?psY9}K74hw23FT!sxIL3Ny64=79zcyPO-U6gNzMo@kerb!QrgmVH}-%y z14i4$#5QxQQgrn}RSLN4#j-I-a@IPx^%1PRC!S zuSW0MCP9)Rnq0TG5+oV?aESc=#+bUzlHcS1jqI|UIE@RvSmg?SDBzAFM3XwpC^CV1 zcADEiZ8P0dq*?tQw4ypk8j+~Kb@V5`eP4+xCcKR9#mt)4~12c2h8i% zBxj`W!}Dwd%r>>;<~bcP;dWAGR<(RQH0Iy{=}KzUF>&o&n(#a;{D<47O|&~T;xdKtZ@6pfddBu zRvlz1kGuNJori~K5)Y3Sk4BNfRt+`-AgBR diff --git a/common-1.21.1/src/main/resources/assets/antarchy/textures/mob_effect/contracted.png b/common-1.21.1/src/main/resources/assets/antarchy/textures/mob_effect/contracted.png index d8527f963cf7cb30d1c109b6000f3d34c56f0700..3a0775cc75b4028887bb52a309a487d2a9984f84 100644 GIT binary patch literal 440 zcmV;p0Z0CcP)Px$a!Eu%R5*>zlf6y?K@^3*F+2bXvK2AG1VUnGYhyF>3agEUg_>B?(14ANwTV*N z5DH&l*I20~oe6;i5`qmskvABNWrkT8sVuzBX70{@bM85_@JA)Ky^O+=1~}YXZQH%; zdA~_DXVtRKRq}Q{?@n>orso5C=}}nHt_rsdc;20+V3~C#J{25auM|Br=!`T{1w^6N zs@)eGii{_w}u5TL^0b*wI*; z7lm2_NEIaG7&Q*S^m13pm{J8qpoK4~WMd;>(lec_vSq^$yrsdSH`cGCh_Z+9ZR+Q zLa^l?#nFV}c)`Wlf#o!xJ}DNm7BUEW`@} iQVFt5#Vr@`f9nS;%Cs!Vz_k$o0000k|4ie28U-i(tw;SPZ!6Kid(Ly z9QlqIa5!IVOYA7z`M>ft+tQ6k9@!UuT@ahzF!Q%!3#+8uk6C{v-(mXd@BQnp>={)ZEQFL+LXo$F>!_qFqkC^R<>Q X%VIgOlI61x&{hUdS3j3^P6Px$c}YY;R5*>5lA&wEKorKmj=IT)R@IEapwL28XC_KTGgDZoshTU5F;koDOlRT} z`VY(u1~X%#YGyGDY!C>9nW%(KMrWdX*LS&_*k_Wvd*AQg`x2lg*Y>ObtVsv;jb3Lc z8EF02xdPf;yj1{Tw!4yn)?|$HP&!vYWZ)*(_N%nW;M#sg#%X`1)GMRa+a(h{`FUDo z5~x|vC@nH!tV;)!I--22<;RbEq(z3&+JG~+Fc=%sMO4RqP5cIEw!0$0Yj-K#)|vng ztR3hs6Ll24k`XtOR$idp*N(=;#~^(_@86xdr3Hzw(;`EhhhhW*^g6?RSKe;TN0LBE z8KH-va@d*x=C&*T8R|CncA%t;^rKDtGpxKo8f7pxFj^Y|vho7$?;${O9*R%^UN#K{L@-{=Z{>SQ8A%WY pL@)r-?Hm9=foMT>AeRn6`T^HyuGZe_%AEiJ002ovPDHLkV1lSz#vcFx literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!dVo)eE0F&Eef!_9@&Erb{JQ3K z<_yEjjiPs^32#af^vt+n6}+ZYgGoY6Z2CTyJfKp>k|4ie28U-i(tw;SPZ!6Kid(Ly z9QlqIa5!IVOYA7z`M>ft+tQ6k9@!UuT@ahzF!Q%!3#+8uk6C{v-(mXd@BQnp>={)ZEQFL+LXo$F>!_qFqkC^R<>Q X%VIgOlI61x&{hUdS3j3^P6 zwNH_+*+IZno|h>&uz%f=FJh-{rx_P6f6ID-<#vi-_ixh)Z+On1{XKIgKi^Z0ryB1k zrZCO@@rSWM=k;5Mvm4iJc{6$I?-cR#d-gt?)U>Od|GcDxrsj-!XU+KC_So4n>|ein ru}taXBFj}v7EEfA`oCz|zF+Jb#R+D{(tG59u3+$V^>bP0l+XkKwZ2N@ literal 0 HcmV?d00001 diff --git a/common-1.21.1/src/main/resources/data/antarchy/loot_table/chests/temple_of_technoblade/treasure.json b/common-1.21.1/src/main/resources/data/antarchy/loot_table/chests/temple_of_technoblade/treasure.json index e0fcc99f..f9376c38 100644 --- a/common-1.21.1/src/main/resources/data/antarchy/loot_table/chests/temple_of_technoblade/treasure.json +++ b/common-1.21.1/src/main/resources/data/antarchy/loot_table/chests/temple_of_technoblade/treasure.json @@ -124,6 +124,11 @@ "name": "antarchy:music_disc_verdance", "weight": 2 }, + { + "type": "minecraft:item", + "name": "antarchy:blood_gods_blade", + "weight": 1 + }, { "type": "minecraft:item", "name": "antos:floppy_disk", diff --git a/common-1.21.1/src/main/resources/data/antarchy/recipe/giant_frying_pan.json b/common-1.21.1/src/main/resources/data/antarchy/recipe/giant_frying_pan.json new file mode 100644 index 00000000..1c995ffd --- /dev/null +++ b/common-1.21.1/src/main/resources/data/antarchy/recipe/giant_frying_pan.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "pattern": [ + "NNN", + "NNN", + " S " + ], + "key": { + "N": { + "item": "minecraft:netherite_block" + }, + "S": { + "item": "antarchy:ultimate_shovel" + } + }, + "result": { + "id": "antarchy:giant_frying_pan", + "count": 1 + } +} diff --git a/common-1.21.1/src/main/resources/data/antarchy/recipe/temporal_tuner.json b/common-1.21.1/src/main/resources/data/antarchy/recipe/temporal_tuner.json new file mode 100644 index 00000000..de4263da --- /dev/null +++ b/common-1.21.1/src/main/resources/data/antarchy/recipe/temporal_tuner.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "pattern": [ + "QSQ", + "QCQ", + "QQQ" + ], + "key": { + "S": { + "item": "antarchy:blood_crystal_shard" + }, + "Q": { + "item": "antarchy:queen_scale" + }, + "C": { + "item": "minecraft:compass" + } + }, + "result": { + "id": "antarchy:temporal_tuner", + "count": 1 + } +} diff --git a/common-1.21.1/src/main/resources/data/minecraft/tags/item/enchantable/durability.json b/common-1.21.1/src/main/resources/data/minecraft/tags/item/enchantable/durability.json index d6f4ca78..c8af6bbe 100644 --- a/common-1.21.1/src/main/resources/data/minecraft/tags/item/enchantable/durability.json +++ b/common-1.21.1/src/main/resources/data/minecraft/tags/item/enchantable/durability.json @@ -8,6 +8,7 @@ "antarchy:ultimate_sword", "antarchy:battle_axe", "antarchy:big_bertha", + "antarchy:giant_frying_pan", "antarchy:nightmare_sword", "antarchy:basilisk_dagger", "antarchy:ultimate_bow", @@ -23,6 +24,7 @@ "antarchy:nightmare_boots", "antarchy:moggles", "antarchy:blood_crystal_katana", + "antarchy:blood_gods_blade", "antarchy:mantis_claw", "antarchy:krakens_grasp", "antarchy:blood_crystal_helmet", diff --git a/common-1.21.1/src/main/resources/data/minecraft/tags/item/enchantable/weapon.json b/common-1.21.1/src/main/resources/data/minecraft/tags/item/enchantable/weapon.json index e7175d79..c45c6077 100644 --- a/common-1.21.1/src/main/resources/data/minecraft/tags/item/enchantable/weapon.json +++ b/common-1.21.1/src/main/resources/data/minecraft/tags/item/enchantable/weapon.json @@ -5,9 +5,11 @@ "antarchy:ultimate_axe", "antarchy:ultimate_sword", "antarchy:big_bertha", + "antarchy:giant_frying_pan", "antarchy:nightmare_sword", "antarchy:basilisk_dagger", "antarchy:blood_crystal_katana", + "antarchy:blood_gods_blade", "antarchy:mantis_claw", "antarchy:royal_guardian_sword", "antarchy:royal_assailant_battleaxe" diff --git a/common-1.21.1/src/main/resources/data/minecraft/tags/item/swords.json b/common-1.21.1/src/main/resources/data/minecraft/tags/item/swords.json index 9cc688f6..39afce48 100644 --- a/common-1.21.1/src/main/resources/data/minecraft/tags/item/swords.json +++ b/common-1.21.1/src/main/resources/data/minecraft/tags/item/swords.json @@ -5,7 +5,9 @@ "antarchy:nightmare_sword", "antarchy:basilisk_dagger", "antarchy:big_bertha", + "antarchy:giant_frying_pan", "antarchy:blood_crystal_katana", + "antarchy:blood_gods_blade", "antarchy:mantis_claw", "antarchy:royal_guardian_sword" ] diff --git a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricContent.java b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricContent.java index 029b4107..947bd90a 100644 --- a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricContent.java +++ b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/AntarchyFabricContent.java @@ -397,6 +397,8 @@ public final class AntarchyFabricContent { AntarchyObjects.setSpiritApple(() -> AntarchyFabricItems.SPIRIT_APPLE.get()); AntarchyObjects.setGlimmeringEffect(() -> AntarchyFabricMisc.mobEffectHolder(AntarchyFabricMisc.GLIMMERING)); AntarchyObjects.setRoyalVitalityPenaltyEffect(() -> AntarchyFabricMisc.mobEffectHolder(AntarchyFabricMisc.ROYAL_VITALITY_PENALTY)); + AntarchyObjects.setBleedingEffect(() -> AntarchyFabricMisc.mobEffectHolder(AntarchyFabricMisc.BLEEDING)); + AntarchyObjects.setBloodMoonEffect(() -> AntarchyFabricMisc.mobEffectHolder(AntarchyFabricMisc.BLOOD_MOON)); AntarchyObjects.setElka(AntarchyFabricEntities.ELKA); AntarchyObjects.setPeach(() -> AntarchyFabricItems.PEACH.get()); AntarchyObjects.setCorn(() -> AntarchyFabricItems.CORN.get()); @@ -423,6 +425,7 @@ public final class AntarchyFabricContent { AntarchyObjects.setLucidBoltImpactLarge(() -> AntarchyFabricMisc.LUCID_BOLT_IMPACT_LARGE.get()); AntarchyObjects.setDorrieInventoryMenu(AntarchyFabricMisc.DORRIE_INVENTORY_MENU); AntarchyObjects.setRoyalJudgmentMenu(AntarchyFabricMisc.ROYAL_JUDGMENT_MENU); + AntarchyObjects.setGiantFryingPanMenu(AntarchyFabricMisc.GIANT_FRYING_PAN_MENU); AntarchyObjects.setCritterCage(() -> AntarchyFabricItems.CRITTER_CAGE.get()); AntarchyObjects.setCritterCageBlock(() -> AntarchyFabricBlocks.CRITTER_CAGE_BLOCK.get()); AntarchyObjects.setLucidAnchor(() -> AntarchyFabricBlocks.LUCID_ANCHOR.get()); diff --git a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClient.java b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClient.java index 69778d05..feef1f88 100644 --- a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClient.java +++ b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClient.java @@ -4,8 +4,10 @@ import com.craisinlord.antarchy.Antarchy; import com.craisinlord.antarchy.content.client.QueenMusicHandler; import com.craisinlord.antarchy.content.client.game.AntarchyComputerGames; import com.craisinlord.antarchy.fabric.network.AntarchyFabricClientNetworking; +import com.craisinlord.antarchy.fabric.client.SeparateLargeItemModels; import com.craisinlord.antarchy.fabric.registry.AntarchyFabricSounds; import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener; import net.fabricmc.fabric.api.resource.ResourceManagerHelper; @@ -21,6 +23,7 @@ import java.util.concurrent.Executor; public final class AntarchyFabricClient implements ClientModInitializer { @Override public void onInitializeClient() { + ModelLoadingPlugin.register(plugin -> plugin.addModels(SeparateLargeItemModels.all())); ClientTickEvents.END_CLIENT_TICK.register(client -> QueenMusicHandler.tick(client, AntarchyFabricSounds.THE_QUEEN.get())); AntarchyFabricClientNetworking.register(); AntarchyFabricClientNetworking.bootstrapMultipartClient(); diff --git a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClientBootstrap.java b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClientBootstrap.java index d2cd07d4..3a61de54 100644 --- a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClientBootstrap.java +++ b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/AntarchyFabricClientBootstrap.java @@ -70,6 +70,7 @@ public final class AntarchyFabricClientBootstrap { AntarchyKeyBindings.register(); MenuScreens.register(AntarchyFabricMisc.DORRIE_INVENTORY_MENU.get(), com.craisinlord.antarchy.content.client.screen.DorrieInventoryScreen::new); MenuScreens.register(AntarchyFabricMisc.ROYAL_JUDGMENT_MENU.get(), com.craisinlord.antarchy.content.client.screen.RoyalJudgmentScreen::new); + MenuScreens.register(AntarchyFabricMisc.GIANT_FRYING_PAN_MENU.get(), com.craisinlord.antarchy.content.client.screen.GiantFryingPanScreen::new); registerRenderers(); registerEntityLayers(); registerColors(); @@ -275,8 +276,8 @@ public final class AntarchyFabricClientBootstrap { AntarchyFabricMisc.ICHOR.get(), AntarchyFabricMisc.FLOWING_ICHOR.get(), new SimpleFluidRenderHandler( - ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "block/bile/bile_still"), - ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "block/bile/bile_flowing"), + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "block/ichor/ichor_still"), + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "block/ichor/ichor_flowing"), ResourceLocation.withDefaultNamespace("block/water_overlay"), 0xFF3D0408 ) diff --git a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/GravityGunClientHandler.java b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/GravityGunClientHandler.java index 15f30e3c..d1e78f01 100644 --- a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/GravityGunClientHandler.java +++ b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/GravityGunClientHandler.java @@ -2,8 +2,10 @@ package com.craisinlord.antarchy.fabric.client; import com.craisinlord.antarchy.config.AntarchySettings; import com.craisinlord.antarchy.content.item.GravityGunItem; +import com.craisinlord.antarchy.content.item.TemporalTunerItem; import com.craisinlord.antarchy.content.network.GravityGunPrimaryPayload; import com.craisinlord.antarchy.content.network.GravityGunScrollPayload; +import com.craisinlord.antarchy.content.network.TemporalTunerScrollPayload; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.minecraft.client.Minecraft; @@ -42,7 +44,19 @@ public final class GravityGunClientHandler { public static boolean onScroll(double verticalAmount) { Minecraft mc = Minecraft.getInstance(); - if (mc.player == null || mc.level == null || mc.screen != null || !Screen.hasControlDown() || !AntarchySettings.gravityGunEnabled()) { + if (mc.player == null || mc.level == null || mc.screen != null) { + return false; + } + + if (Screen.hasShiftDown() && TemporalTunerItem.isAvailable(mc.player)) { + double scrollAmount = Mth.clamp(verticalAmount, -1.0D, 1.0D); + if (Math.abs(scrollAmount) >= 1.0E-4D) { + ClientPlayNetworking.send(new TemporalTunerScrollPayload(scrollAmount * TemporalTunerItem.STEP)); + return true; + } + } + + if (!Screen.hasControlDown() || !AntarchySettings.gravityGunEnabled()) { return false; } diff --git a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/SeparateLargeItemModels.java b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/SeparateLargeItemModels.java new file mode 100644 index 00000000..53164412 --- /dev/null +++ b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/client/SeparateLargeItemModels.java @@ -0,0 +1,49 @@ +package com.craisinlord.antarchy.fabric.client; + +import com.craisinlord.antarchy.Antarchy; +import com.craisinlord.antarchy.fabric.registry.AntarchyFabricItems; +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +import java.util.Collection; +import java.util.Map; + +public final class SeparateLargeItemModels { + private static final Map GUI_MODELS = Map.ofEntries( + entry(AntarchyFabricItems.ATTITUDE_ADJUSTER.get(), "attitude_adjuster_gui"), + entry(AntarchyFabricItems.BATTLE_AXE.get(), "battle_axe_gui"), + entry(AntarchyFabricItems.BIG_BERTHA.get(), "big_bertha_gui"), + entry(AntarchyFabricItems.EYE_OF_THE_STORM.get(), "eye_of_the_storm_gui"), + entry(AntarchyFabricItems.GIANT_FRYING_PAN.get(), "giant_frying_pan_gui"), + entry(AntarchyFabricItems.GRAVITY_GUN.get(), "gravity_gun_gui"), + entry(AntarchyFabricItems.GROWTH_RAY.get(), "grow_ray_gui"), + entry(AntarchyFabricItems.KRAKENS_GRASP.get(), "krakens_grasp_gui"), + entry(AntarchyFabricItems.PORTAL_GUN.get(), "portal_gun_gui"), + entry(AntarchyFabricItems.ROYAL_ASSAILANT_BATTLEAXE.get(), "royal_assailant_battleaxe_gui"), + entry(AntarchyFabricItems.ROYAL_ASSAILANT_STAFF.get(), "royal_assailant_staff_gui"), + entry(AntarchyFabricItems.ROYAL_GUARDIAN_SWORD.get(), "royal_guardian_sword_gui"), + entry(AntarchyFabricItems.RPO_LAUNCHER.get(), "rpo_launcher_gui"), + entry(AntarchyFabricItems.SHRINK_RAY.get(), "shrink_ray_gui"), + entry(AntarchyFabricItems.SQUIDZOOKA.get(), "squidzooka_gui"), + entry(AntarchyFabricItems.WATER_CANNON.get(), "water_cannon_gui") + ); + + private SeparateLargeItemModels() { + } + + public static ModelResourceLocation modelFor(ItemStack stack) { + return GUI_MODELS.get(stack.getItem()); + } + + public static Collection all() { + return GUI_MODELS.values(); + } + + private static Map.Entry entry(Item item, String modelPath) { + return Map.entry(item, ModelResourceLocation.inventory( + ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, modelPath) + )); + } +} diff --git a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/SeparateLargeItemModelsMixin.java b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/SeparateLargeItemModelsMixin.java new file mode 100644 index 00000000..014282e5 --- /dev/null +++ b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/mixin/client/SeparateLargeItemModelsMixin.java @@ -0,0 +1,32 @@ +package com.craisinlord.antarchy.fabric.mixin.client; + +import com.craisinlord.antarchy.fabric.client.SeparateLargeItemModels; +import com.llamalad7.mixinextras.sugar.Local; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.world.item.ItemDisplayContext; +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.ModifyVariable; + +@Mixin(ItemRenderer.class) +public abstract class SeparateLargeItemModelsMixin { + @ModifyVariable(method = "render", at = @At("HEAD"), argsOnly = true, ordinal = 0) + private BakedModel antarchy$selectGuiModel(BakedModel original, + @Local(argsOnly = true) ItemStack stack, + @Local(argsOnly = true) ItemDisplayContext displayContext) { + var guiModel = SeparateLargeItemModels.modelFor(stack); + if (guiModel != null && isGuiContext(displayContext)) { + return Minecraft.getInstance().getModelManager().getModel(guiModel); + } + return original; + } + + private static boolean isGuiContext(ItemDisplayContext displayContext) { + return displayContext == ItemDisplayContext.GUI + || displayContext == ItemDisplayContext.GROUND + || displayContext == ItemDisplayContext.FIXED; + } +} diff --git a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricClientNetworking.java b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricClientNetworking.java index 165a2527..4fcefdfb 100644 --- a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricClientNetworking.java +++ b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricClientNetworking.java @@ -2,6 +2,8 @@ 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.CameraShakeClientState; +import com.craisinlord.antarchy.content.client.HerculesBeetleImpactShakeClientState; import com.craisinlord.antarchy.content.client.HordeClientState; import com.craisinlord.antarchy.content.client.ScorpionWhipTetherClientState; import com.craisinlord.antarchy.content.client.WormHookTetherClientState; @@ -13,6 +15,7 @@ import com.craisinlord.antarchy.content.network.*; import com.craisinlord.antarchy.fabric.client.BloodCrystalKatanaTrailClientState; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.phys.Vec3; public final class AntarchyFabricClientNetworking { private AntarchyFabricClientNetworking() { @@ -54,11 +57,15 @@ public final class AntarchyFabricClientNetworking { ClientPlayNetworking.registerGlobalReceiver(BrutalflyElytraAnimationPayload.TYPE, (payload, context) -> context.client().execute(() -> BrutalflyElytraClientState.trigger(payload.entityId(), payload.durationTicks(), payload.strength()))); ClientPlayNetworking.registerGlobalReceiver(HerculesBeetleImpactShakePayload.TYPE, (payload, context) -> - context.client().execute(() -> AntarchyFabricNetworking.triggerHerculesBeetleImpactShake(payload.durationTicks()))); + context.client().execute(() -> HerculesBeetleImpactShakeClientState.trigger(payload.durationTicks()))); ClientPlayNetworking.registerGlobalReceiver(KingJudgmentFlashPayload.TYPE, (payload, context) -> context.client().execute(() -> com.craisinlord.antarchy.content.client.KingJudgmentFlashClientState.trigger(payload.durationTicks()))); ClientPlayNetworking.registerGlobalReceiver(ImpactShakePayload.TYPE, (payload, context) -> - context.client().execute(() -> AntarchyFabricNetworking.triggerImpactShake(payload))); + context.client().execute(() -> CameraShakeClientState.triggerImpact( + new Vec3(payload.x(), payload.y(), payload.z()), + payload.intensity(), + payload.durationTicks(), + payload.radius()))); ClientPlayNetworking.registerGlobalReceiver(HordeIntensityPayload.TYPE, (payload, context) -> context.client().execute(() -> HordeClientState.update(payload.intensity()))); AntarchyFabricTimeDilationNetworking.registerClientReceiver(); diff --git a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricNetworking.java b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricNetworking.java index 58626021..0625241c 100644 --- a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricNetworking.java +++ b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/network/AntarchyFabricNetworking.java @@ -2,8 +2,6 @@ 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; @@ -18,6 +16,7 @@ import com.craisinlord.antarchy.fabric.util.SpringyBootsFabricHelper; import com.craisinlord.antarchy.content.item.SpringyBootsItem; import com.craisinlord.antarchy.content.item.EyeOfTheStormItem; import com.craisinlord.antarchy.content.item.GravityGunItem; +import com.craisinlord.antarchy.content.item.TemporalTunerItem; import com.craisinlord.antarchy.content.item.PortalGunItem; import com.craisinlord.antarchy.content.item.TigerEyeArmorUtil; import com.craisinlord.antarchy.content.network.*; @@ -93,6 +92,7 @@ public final class AntarchyFabricNetworking { PayloadTypeRegistry.playC2S().register(RoyalMountActionPayload.TYPE, RoyalMountActionPayload.STREAM_CODEC); PayloadTypeRegistry.playC2S().register(RoyalMountVerticalPayload.TYPE, RoyalMountVerticalPayload.STREAM_CODEC); PayloadTypeRegistry.playC2S().register(GravityGunScrollPayload.TYPE, GravityGunScrollPayload.STREAM_CODEC); + PayloadTypeRegistry.playC2S().register(TemporalTunerScrollPayload.TYPE, TemporalTunerScrollPayload.STREAM_CODEC); PayloadTypeRegistry.playC2S().register(BigBerthaModeCyclePayload.TYPE, BigBerthaModeCyclePayload.STREAM_CODEC); PayloadTypeRegistry.playC2S().register(com.craisinlord.antarchy.content.network.RoyalGuardianSwordModeCyclePayload.TYPE, com.craisinlord.antarchy.content.network.RoyalGuardianSwordModeCyclePayload.STREAM_CODEC); @@ -128,6 +128,8 @@ public final class AntarchyFabricNetworking { context.server().execute(() -> handleRoyalMountVertical(context.player(), payload))); ServerPlayNetworking.registerGlobalReceiver(GravityGunScrollPayload.TYPE, (payload, context) -> context.server().execute(() -> handleGravityGunScroll(context.player(), payload))); + ServerPlayNetworking.registerGlobalReceiver(TemporalTunerScrollPayload.TYPE, (payload, context) -> + context.server().execute(() -> handleTemporalTunerScroll(context.player(), payload))); ServerPlayNetworking.registerGlobalReceiver(BigBerthaModeCyclePayload.TYPE, (payload, context) -> context.server().execute(() -> handleBigBerthaModeCycle(context.player(), payload))); ServerPlayNetworking.registerGlobalReceiver(com.craisinlord.antarchy.content.network.RoyalGuardianSwordModeCyclePayload.TYPE, @@ -302,6 +304,12 @@ public final class AntarchyFabricNetworking { bigBerthaItem.tryCycleModeFromInput(player.serverLevel(), player, player.getMainHandItem()); } + private static void handleTemporalTunerScroll(ServerPlayer player, TemporalTunerScrollPayload payload) { + if (TemporalTunerItem.isAvailable(player)) { + TemporalTunerItem.adjust(player, payload.delta()); + } + } + private static void handleRoyalGuardianSwordModeCycle(ServerPlayer player) { if (!(player.getMainHandItem().getItem() instanceof com.craisinlord.antarchy.content.item.RoyalGuardianSwordItem sword)) { return; @@ -488,19 +496,6 @@ public final class AntarchyFabricNetworking { } } - 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() - ); - } - private static void handleTigerEyeCamouflageToggle(ServerPlayer player) { TigerEyeCamouflageController.ToggleResult result = TigerEyeCamouflageController.toggle(player); if (result != TigerEyeCamouflageController.ToggleResult.NO_CHANGE) { diff --git a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricItems.java b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricItems.java index f10e73fc..70382fd3 100644 --- a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricItems.java +++ b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricItems.java @@ -1044,6 +1044,9 @@ public final class AntarchyFabricItems { AntarchySettings.bloodCrystalKatanaAttackDamage(), -2.2F )); + public static final DeferredItem BLOOD_GODS_BLADE = ITEMS.register("blood_gods_blade", + () -> new BloodGodsBladeItem(ULTIMATE_TIER, + new Item.Properties().stacksTo(1).durability(4096).rarity(Rarity.EPIC).fireResistant(), 80, -2.4F)); public static final DeferredItem MANTIS_CLAW = ITEMS.register("mantis_claw", @@ -1055,6 +1058,8 @@ public final class AntarchyFabricItems { public static final DeferredItem QUEEN_SCALE = ITEMS.registerSimpleItem("queen_scale", new Item.Properties().rarity(Rarity.RARE).fireResistant()); + public static final DeferredItem TEMPORAL_TUNER = ITEMS.register("temporal_tuner", + () -> new com.craisinlord.antarchy.content.item.TemporalTunerItem(new Item.Properties().rarity(Rarity.RARE).fireResistant())); public static final DeferredItem CHITIN = ITEMS.registerSimpleItem("chitin", new Item.Properties().rarity(Rarity.UNCOMMON)); @@ -1510,6 +1515,9 @@ public final class AntarchyFabricItems { public static final DeferredItem ROYAL_GUARDIAN_SWORD = ITEMS.register("royal_guardian_sword", () -> new RoyalGuardianSwordItem(ROYAL_GUARDIAN_TIER, new Item.Properties().stacksTo(1).rarity(Rarity.EPIC).fireResistant())); + public static final DeferredItem GIANT_FRYING_PAN = ITEMS.register("giant_frying_pan", + () -> new GiantFryingPanItem(ROYAL_GUARDIAN_TIER, + new Item.Properties().stacksTo(1).rarity(Rarity.EPIC).fireResistant())); public static final DeferredItem ROYAL_ASSAILANT_BATTLEAXE = ITEMS.register("royal_assailant_battleaxe", () -> new RoyalAssailantBattleAxeItem(ROYAL_ASSAILANT_TIER, new Item.Properties().stacksTo(1).rarity(Rarity.EPIC).fireResistant())); diff --git a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricMisc.java b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricMisc.java index 901a070b..ac73dfee 100644 --- a/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricMisc.java +++ b/fabric-1.21.1/src/main/java/com/craisinlord/antarchy/fabric/registry/AntarchyFabricMisc.java @@ -27,6 +27,8 @@ import com.craisinlord.antarchy.content.worldgen.thoraxis.QueenHavocTrailFeature import com.craisinlord.antarchy.content.worldgen.thoraxis.ThoraxisIchorLakeFeature; import com.craisinlord.antarchy.fabric.content.fluid.AntiwaterFluid; import com.craisinlord.antarchy.content.effect.DreadMobEffect; +import com.craisinlord.antarchy.content.effect.BleedingMobEffect; +import com.craisinlord.antarchy.content.effect.BloodMoonMobEffect; import com.craisinlord.antarchy.content.effect.GoopedMobEffect; import com.craisinlord.antarchy.content.effect.GrowthMobEffect; import com.craisinlord.antarchy.content.effect.InvertedMobEffect; @@ -207,6 +209,8 @@ public final class AntarchyFabricMisc { MENUS.register("dorrie_inventory", () -> new net.minecraft.world.inventory.MenuType<>(com.craisinlord.antarchy.content.menu.DorrieInventoryMenu::new, FeatureFlags.DEFAULT_FLAGS)); public static final DeferredHolder, net.minecraft.world.inventory.MenuType> ROYAL_JUDGMENT_MENU = MENUS.register("royal_judgment", () -> new net.minecraft.world.inventory.MenuType<>(com.craisinlord.antarchy.content.menu.RoyalJudgmentMenu::new, FeatureFlags.DEFAULT_FLAGS)); + public static final DeferredHolder, net.minecraft.world.inventory.MenuType> GIANT_FRYING_PAN_MENU = + MENUS.register("giant_frying_pan", () -> new net.minecraft.world.inventory.MenuType<>(com.craisinlord.antarchy.content.menu.GiantFryingPanMenu::new, FeatureFlags.DEFAULT_FLAGS)); public static final DeferredRegister> DATA_COMPONENT_TYPES = @@ -435,6 +439,8 @@ public final class AntarchyFabricMisc { public static final DeferredHolder DREAD = MOB_EFFECTS.register("dread", DreadMobEffect::new); + public static final DeferredHolder BLEEDING = MOB_EFFECTS.register("bleeding", BleedingMobEffect::new); + public static final DeferredHolder BLOOD_MOON = MOB_EFFECTS.register("blood_moon", BloodMoonMobEffect::new); public static final DeferredHolder PARALYZED = MOB_EFFECTS.register("paralyzed", ParalyzedMobEffect::new); diff --git a/fabric-1.21.1/src/main/resources/antarchy-fabric.mixins.json b/fabric-1.21.1/src/main/resources/antarchy-fabric.mixins.json index 3a0828ba..fd7b62b6 100644 --- a/fabric-1.21.1/src/main/resources/antarchy-fabric.mixins.json +++ b/fabric-1.21.1/src/main/resources/antarchy-fabric.mixins.json @@ -27,6 +27,7 @@ "infinity.AmendmentRareOresMixin" ], "client": [ + "client.SeparateLargeItemModelsMixin", "client.CameraShakeMixin", "client.BrutalflyElytraExperienceBarMixin", "client.BloodglassChatOrderMixin", diff --git a/fabric-1.21.1/src/main/resources/assets/antarchy/models/item/giant_frying_pan.json b/fabric-1.21.1/src/main/resources/assets/antarchy/models/item/giant_frying_pan.json new file mode 100644 index 00000000..c19ba072 --- /dev/null +++ b/fabric-1.21.1/src/main/resources/assets/antarchy/models/item/giant_frying_pan.json @@ -0,0 +1,3 @@ +{ + "parent": "antarchy:item/giant_frying_pan_held" +} diff --git a/fabric-1.21.1/src/main/resources/assets/antarchy/models/item/royal_assailant_staff_gui.json b/fabric-1.21.1/src/main/resources/assets/antarchy/models/item/royal_assailant_staff_gui.json new file mode 100644 index 00000000..0425788d --- /dev/null +++ b/fabric-1.21.1/src/main/resources/assets/antarchy/models/item/royal_assailant_staff_gui.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "gui_light": "front", + "textures": { + "layer0": "antarchy:item/royal_assailant_staff_item" + } +} diff --git a/gradle.properties b/gradle.properties index fd23f8a6..e653191a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ org.gradle.configureondemand=true minecraft_version_1_21_1=1.21.1 modid=antarchy mod_id=antarchy -mod_version=2.0.2 +mod_version=2.1.0 maven_group=com.craisinlord mixin_version=0.15.4+mixin.0.8.7 diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyConfigModuleNeoforge.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyConfigModuleNeoforge.java index cdb4885a..6ecca069 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyConfigModuleNeoforge.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyConfigModuleNeoforge.java @@ -494,6 +494,7 @@ public final class AntarchyConfigModuleNeoforge { AntarchySettings.setRoyalAssailantLeggingsDoubleDamageChance(AntarchyToolsConfig.royalAssailantLeggingsDoubleDamageChance()); AntarchySettings.setRoyalAssailantBootsDoubleDamageChance(AntarchyToolsConfig.royalAssailantBootsDoubleDamageChance()); AntarchySettings.setRoyalGuardianSwordAttackDamage(AntarchyToolsConfig.royalGuardianSwordAttackDamage()); + AntarchySettings.setGiantFryingPanAttackDamage(AntarchyToolsConfig.giantFryingPanAttackDamage()); AntarchySettings.setRoyalGuardianSwordAttackSpeed(AntarchyToolsConfig.royalGuardianSwordAttackSpeed()); AntarchySettings.setRoyalGuardianSwordElementalCooldownTicks(AntarchyToolsConfig.royalGuardianSwordElementalCooldownTicks()); AntarchySettings.setRoyalGuardianSwordFirePrimaryDamage(AntarchyToolsConfig.royalGuardianSwordFirePrimaryDamage()); diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoforge.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoforge.java index 49770204..ec6f57cf 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoforge.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyNeoforge.java @@ -470,6 +470,8 @@ public class AntarchyNeoforge { AntarchyObjects.setSpiritApple(() -> AntarchyNeoforgeItems.SPIRIT_APPLE.get()); AntarchyObjects.setGlimmeringEffect(() -> AntarchyNeoforgeMisc.GLIMMERING); AntarchyObjects.setRoyalVitalityPenaltyEffect(() -> AntarchyNeoforgeMisc.ROYAL_VITALITY_PENALTY); + AntarchyObjects.setBleedingEffect(() -> AntarchyNeoforgeMisc.BLEEDING); + AntarchyObjects.setBloodMoonEffect(() -> AntarchyNeoforgeMisc.BLOOD_MOON); AntarchyObjects.setElka(AntarchyNeoforgeEntites.ELKA); AntarchyObjects.setPeach(() -> AntarchyNeoforgeItems.PEACH.get()); AntarchyObjects.setCorn(() -> AntarchyNeoforgeItems.CORN.get()); @@ -495,6 +497,7 @@ public class AntarchyNeoforge { AntarchyObjects.setLucidBoltImpactLarge(() -> AntarchyNeoforgeMisc.LUCID_BOLT_IMPACT_LARGE.get()); AntarchyObjects.setDorrieInventoryMenu(AntarchyNeoforgeMisc.DORRIE_INVENTORY_MENU); AntarchyObjects.setRoyalJudgmentMenu(AntarchyNeoforgeMisc.ROYAL_JUDGMENT_MENU); + AntarchyObjects.setGiantFryingPanMenu(AntarchyNeoforgeMisc.GIANT_FRYING_PAN_MENU); AntarchyObjects.setCritterCage(() -> AntarchyNeoforgeItems.CRITTER_CAGE.get()); AntarchyObjects.setCritterCageBlock(() -> AntarchyNeoforgeBlocks.CRITTER_CAGE_BLOCK.get()); AntarchyObjects.setCritterCageBlockEntity(() -> AntarchyNeoforgeBlocks.CRITTER_CAGE_BLOCK_ENTITY.get()); diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java index de7ce45b..fe3d9f81 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/AntarchyToolsConfig.java @@ -91,6 +91,7 @@ public final class AntarchyToolsConfig { private static final ModConfigSpec.DoubleValue ROYAL_ASSAILANT_LEGGINGS_DOUBLE_DAMAGE_CHANCE; private static final ModConfigSpec.DoubleValue ROYAL_ASSAILANT_BOOTS_DOUBLE_DAMAGE_CHANCE; private static final ModConfigSpec.DoubleValue ROYAL_GUARDIAN_SWORD_ATTACK_DAMAGE; + private static final ModConfigSpec.DoubleValue GIANT_FRYING_PAN_ATTACK_DAMAGE; private static final ModConfigSpec.DoubleValue ROYAL_GUARDIAN_SWORD_ATTACK_SPEED; private static final ModConfigSpec.IntValue ROYAL_GUARDIAN_SWORD_ELEMENTAL_COOLDOWN_TICKS, ROYAL_GUARDIAN_SWORD_STORM_MAX_JUMPS; private static final ModConfigSpec.DoubleValue ROYAL_GUARDIAN_SWORD_FIRE_PRIMARY_DAMAGE, ROYAL_GUARDIAN_SWORD_FIRE_SPLASH_DAMAGE, @@ -390,6 +391,7 @@ public final class AntarchyToolsConfig { ROYAL_ASSAILANT_LEGGINGS_DOUBLE_DAMAGE_CHANCE = b.defineInRange("assailantLeggingsDoubleDamageChance", 0.07D, 0.0D, 1.0D); ROYAL_ASSAILANT_BOOTS_DOUBLE_DAMAGE_CHANCE = b.defineInRange("assailantBootsDoubleDamageChance", 0.05D, 0.0D, 1.0D); ROYAL_GUARDIAN_SWORD_ATTACK_DAMAGE = b.defineInRange("guardianSwordAttackDamage", 111.0D, 0.0D, 4096.0D); + GIANT_FRYING_PAN_ATTACK_DAMAGE = b.defineInRange("giantFryingPanAttackDamage", 80.0D, 0.0D, 4096.0D); ROYAL_GUARDIAN_SWORD_ATTACK_SPEED = b.defineInRange("guardianSwordAttackSpeed", -2.5D, -10.0D, 10.0D); ROYAL_GUARDIAN_SWORD_ELEMENTAL_COOLDOWN_TICKS = b.defineInRange("guardianSwordElementalCooldownTicks", 120, 0, 72000); ROYAL_GUARDIAN_SWORD_FIRE_PRIMARY_DAMAGE = b.defineInRange("guardianSwordFirePrimaryDamage", 22.0D, 0.0D, 4096.0D); @@ -886,6 +888,7 @@ public final class AntarchyToolsConfig { static double royalAssailantLeggingsDoubleDamageChance() { return ROYAL_ASSAILANT_LEGGINGS_DOUBLE_DAMAGE_CHANCE.get(); } static double royalAssailantBootsDoubleDamageChance() { return ROYAL_ASSAILANT_BOOTS_DOUBLE_DAMAGE_CHANCE.get(); } static double royalGuardianSwordAttackDamage() { return ROYAL_GUARDIAN_SWORD_ATTACK_DAMAGE.get(); } + static double giantFryingPanAttackDamage() { return GIANT_FRYING_PAN_ATTACK_DAMAGE.get(); } static double royalGuardianSwordAttackSpeed() { return ROYAL_GUARDIAN_SWORD_ATTACK_SPEED.get(); } static int royalGuardianSwordElementalCooldownTicks() { return ROYAL_GUARDIAN_SWORD_ELEMENTAL_COOLDOWN_TICKS.get(); } static double royalGuardianSwordFirePrimaryDamage() { return ROYAL_GUARDIAN_SWORD_FIRE_PRIMARY_DAMAGE.get(); } diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/NeoForgeInfinityCompat.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/NeoForgeInfinityCompat.java index 11184f41..6f68c456 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/NeoForgeInfinityCompat.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/NeoForgeInfinityCompat.java @@ -11,6 +11,12 @@ import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.MinecraftServer; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; +import net.lerariemann.infinity.access.MinecraftServerAccess; +import com.craisinlord.antarchy.neoforge.mixins.infinity.PortalCreatorInvoker; import net.minecraft.util.RandomSource; import java.util.ArrayList; @@ -82,6 +88,30 @@ public final class NeoForgeInfinityCompat implements InfinityCompatBridge { } } + @Override + public InfinityWarpResult requestDimensionCreation(MinecraftServer server, ResourceLocation dimensionId) { + if (!isAvailable() || server == null || dimensionId == null || !"infinity".equals(dimensionId.getNamespace())) { + return InfinityWarpResult.REJECTED; + } + ResourceKey key = ResourceKey.create(Registries.DIMENSION, dimensionId); + if (server.getLevel(key) != null) { + return InfinityWarpResult.READY; + } + if (!(server instanceof MinecraftServerAccess access)) { + return InfinityWarpResult.REJECTED; + } + try { + if (access.infinity$hasToAdd(key)) { + return InfinityWarpResult.PENDING; + } + return PortalCreatorInvoker.antarchy$invokeTryAddInfinityDimension(server, dimensionId) + ? InfinityWarpResult.PENDING : InfinityWarpResult.REJECTED; + } catch (Throwable throwable) { + Antarchy.LOGGER.error("[Antarchy] Failed to request creation of Infinity dimension {}", dimensionId, throwable); + return InfinityWarpResult.FAILED_GENERATION; + } + } + @Override public boolean createPhysicalPortal(ServerLevel level, BlockPos anyPortalBlockPos, ResourceLocation dimensionId) { try { diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/client/AntarchyNeoForgeClient.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/client/AntarchyNeoForgeClient.java index 9b200354..2439820a 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/client/AntarchyNeoForgeClient.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/client/AntarchyNeoForgeClient.java @@ -93,6 +93,8 @@ public final class AntarchyNeoForgeClient { 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 ResourceLocation ICHOR_STILL = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "block/ichor/ichor_still"); + private static final ResourceLocation ICHOR_FLOW = ResourceLocation.fromNamespaceAndPath(Antarchy.MODID, "block/ichor/ichor_flowing"); private AntarchyNeoForgeClient() { } @@ -360,6 +362,7 @@ public final class AntarchyNeoForgeClient { public static void registerMenuScreens(RegisterMenuScreensEvent event) { event.register(AntarchyNeoforgeMisc.DORRIE_INVENTORY_MENU.get(), com.craisinlord.antarchy.content.client.screen.DorrieInventoryScreen::new); event.register(AntarchyNeoforgeMisc.ROYAL_JUDGMENT_MENU.get(), com.craisinlord.antarchy.content.client.screen.RoyalJudgmentScreen::new); + event.register(AntarchyNeoforgeMisc.GIANT_FRYING_PAN_MENU.get(), com.craisinlord.antarchy.content.client.screen.GiantFryingPanScreen::new); } @SubscribeEvent @@ -465,12 +468,12 @@ public final class AntarchyNeoForgeClient { event.registerFluidType(new IClientFluidTypeExtensions() { @Override public ResourceLocation getStillTexture() { - return ANTIWATER_STILL; + return ICHOR_STILL; } @Override public ResourceLocation getFlowingTexture() { - return ANTIWATER_FLOW; + return ICHOR_FLOW; } @Override @@ -612,6 +615,7 @@ public final class AntarchyNeoForgeClient { registerGeoItemExtension(event, AntarchyNeoforgeItems.BATTLE_AXE.get()); registerGeoItemExtension(event, AntarchyNeoforgeItems.BIG_BERTHA.get()); registerGeoItemExtension(event, AntarchyNeoforgeItems.ROYAL_GUARDIAN_SWORD.get()); + registerGeoItemExtension(event, AntarchyNeoforgeItems.GIANT_FRYING_PAN.get()); } @SubscribeEvent diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/client/GravityGunClientHandler.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/client/GravityGunClientHandler.java index c54e5ebe..5039c90a 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/client/GravityGunClientHandler.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/client/GravityGunClientHandler.java @@ -5,6 +5,8 @@ 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 com.craisinlord.antarchy.content.network.TemporalTunerScrollPayload; +import com.craisinlord.antarchy.content.item.TemporalTunerItem; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; import net.minecraft.util.Mth; @@ -46,7 +48,20 @@ public final class GravityGunClientHandler { @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()) { + if (mc.player == null || mc.level == null || mc.screen != null) { + return; + } + + if (Screen.hasShiftDown() && TemporalTunerItem.isAvailable(mc.player)) { + double scrollAmount = Mth.clamp(event.getScrollDeltaY(), -1.0D, 1.0D); + if (Math.abs(scrollAmount) >= 1.0E-4D) { + PacketDistributor.sendToServer(new TemporalTunerScrollPayload(scrollAmount * TemporalTunerItem.STEP)); + event.setCanceled(true); + return; + } + } + + if (!Screen.hasControlDown() || !AntarchySettings.gravityGunEnabled()) { return; } diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/mixins/infinity/PortalCreatorInvoker.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/mixins/infinity/PortalCreatorInvoker.java new file mode 100644 index 00000000..d24765e3 --- /dev/null +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/mixins/infinity/PortalCreatorInvoker.java @@ -0,0 +1,15 @@ +package com.craisinlord.antarchy.neoforge.mixins.infinity; + +import net.lerariemann.infinity.util.teleport.PortalCreator; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(value = PortalCreator.class, remap = false) +public interface PortalCreatorInvoker { + @Invoker(value = "tryAddInfinityDimension", remap = false) + static boolean antarchy$invokeTryAddInfinityDimension(MinecraftServer server, ResourceLocation dimensionId) { + throw new AssertionError(); + } +} diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/network/AntarchyGravityNetworking.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/network/AntarchyGravityNetworking.java index b6899ab9..4332c90a 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/network/AntarchyGravityNetworking.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/network/AntarchyGravityNetworking.java @@ -11,6 +11,8 @@ import com.craisinlord.antarchy.content.network.RoyalGuardianSwordModeCyclePaylo import com.craisinlord.antarchy.content.network.EyeOfStormPrimaryPayload; import com.craisinlord.antarchy.content.network.GravityGunPrimaryPayload; import com.craisinlord.antarchy.content.network.GravityGunScrollPayload; +import com.craisinlord.antarchy.content.network.TemporalTunerScrollPayload; +import com.craisinlord.antarchy.content.item.TemporalTunerItem; import com.craisinlord.antarchy.content.network.GravityStatePayload; import com.craisinlord.antarchy.content.network.ImpactShakePayload; import com.craisinlord.antarchy.content.network.PortalGunPrimaryPayload; @@ -51,6 +53,10 @@ public final class AntarchyGravityNetworking { GravityGunScrollPayload.TYPE, GravityGunScrollPayload.STREAM_CODEC, AntarchyGravityNetworking::handleGravityGunScroll + ).playToServer( + TemporalTunerScrollPayload.TYPE, + TemporalTunerScrollPayload.STREAM_CODEC, + AntarchyGravityNetworking::handleTemporalTunerScroll ).playToServer( BigBerthaModeCyclePayload.TYPE, BigBerthaModeCyclePayload.STREAM_CODEC, @@ -158,6 +164,15 @@ public final class AntarchyGravityNetworking { }); } + private static void handleTemporalTunerScroll(TemporalTunerScrollPayload payload, IPayloadContext context) { + context.enqueueWork(() -> { + if (context.player() instanceof ServerPlayer serverPlayer + && TemporalTunerItem.isAvailable(serverPlayer)) { + TemporalTunerItem.adjust(serverPlayer, payload.delta()); + } + }); + } + private static void handleRoyalGuardianSwordModeCycle(RoyalGuardianSwordModeCyclePayload payload, IPayloadContext context) { context.enqueueWork(() -> { if (!(context.player() instanceof ServerPlayer serverPlayer) diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeItems.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeItems.java index 6129d08d..dcc858f5 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeItems.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeItems.java @@ -697,6 +697,8 @@ public final class AntarchyNeoforgeItems { () -> new com.craisinlord.antarchy.content.item.CloudBucketItem(AntarchyNeoforgeBlocks.CLOUD_BLOCK.get(), new Item.Properties().craftRemainder(Items.BUCKET))); public static final DeferredItem BLOOD_CRYSTAL_SHARD = ITEMS.register("blood_crystal_shard", () -> new BloodCrystalShardItem(new Item.Properties())); + public static final DeferredItem TEMPORAL_TUNER = ITEMS.register("temporal_tuner", + () -> new TemporalTunerItem(new Item.Properties().rarity(Rarity.RARE).fireResistant())); public static final DeferredItem BLOOD_CRYSTAL_APPLE = ITEMS.register("blood_crystal_apple", () -> new BloodCrystalAppleItem(new Item.Properties() .rarity(Rarity.RARE) @@ -730,6 +732,13 @@ public final class AntarchyNeoforgeItems { AntarchySettings.bloodCrystalKatanaAttackDamage(), -2.2F )); + public static final DeferredItem BLOOD_GODS_BLADE = ITEMS.register("blood_gods_blade", + () -> new BloodGodsBladeItem( + ULTIMATE_TIER, + new Item.Properties().stacksTo(1).durability(4096).rarity(Rarity.EPIC).fireResistant(), + 80, + -2.4F + )); 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)); @@ -993,6 +1002,8 @@ public final class AntarchyNeoforgeItems { public static final DeferredItem ROYAL_GUARDIAN_SWORD = ITEMS.register("royal_guardian_sword", () -> new RoyalGuardianSwordItem(ROYAL_GUARDIAN_TIER, new Item.Properties().stacksTo(1).rarity(Rarity.EPIC).fireResistant())); + public static final DeferredItem GIANT_FRYING_PAN = ITEMS.register("giant_frying_pan", + () -> new GiantFryingPanItem(ROYAL_GUARDIAN_TIER, new Item.Properties().stacksTo(1).rarity(Rarity.EPIC).fireResistant())); public static final DeferredItem ROYAL_ASSAILANT_BATTLEAXE = ITEMS.register("royal_assailant_battleaxe", () -> new RoyalAssailantBattleAxeItem(ROYAL_ASSAILANT_TIER, new Item.Properties().stacksTo(1).rarity(Rarity.EPIC).fireResistant())); public static final DeferredItem ROYAL_GUARDIAN_SHIELD = ITEMS.register("royal_guardian_shield", diff --git a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeMisc.java b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeMisc.java index a7dfc821..e2ee7a58 100644 --- a/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeMisc.java +++ b/neoforge-1.21.1/src/main/java/com/craisinlord/antarchy/neoforge/registry/AntarchyNeoforgeMisc.java @@ -4,6 +4,8 @@ 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.BleedingMobEffect; +import com.craisinlord.antarchy.content.effect.BloodMoonMobEffect; import com.craisinlord.antarchy.content.effect.GoopedMobEffect; import com.craisinlord.antarchy.content.effect.GrowthMobEffect; import com.craisinlord.antarchy.content.effect.InvertedMobEffect; @@ -155,9 +157,15 @@ public final class AntarchyNeoforgeMisc { "royal_judgment", () -> new MenuType<>(com.craisinlord.antarchy.content.menu.RoyalJudgmentMenu::new, FeatureFlags.DEFAULT_FLAGS) ); + public static final DeferredHolder, MenuType> GIANT_FRYING_PAN_MENU = MENU_TYPES.register( + "giant_frying_pan", + () -> new MenuType<>(com.craisinlord.antarchy.content.menu.GiantFryingPanMenu::new, FeatureFlags.DEFAULT_FLAGS) + ); // Mob effects public static final DeferredHolder DREAD = MOB_EFFECTS.register("dread", DreadMobEffect::new); + public static final DeferredHolder BLEEDING = MOB_EFFECTS.register("bleeding", BleedingMobEffect::new); + public static final DeferredHolder BLOOD_MOON = MOB_EFFECTS.register("blood_moon", BloodMoonMobEffect::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 COMMANDED = MOB_EFFECTS.register("commanded", CommandedMobEffect::new); diff --git a/neoforge-1.21.1/src/main/resources/antarchy-neoforge.mixins.json b/neoforge-1.21.1/src/main/resources/antarchy-neoforge.mixins.json index bdf8ea3c..02c4e72a 100644 --- a/neoforge-1.21.1/src/main/resources/antarchy-neoforge.mixins.json +++ b/neoforge-1.21.1/src/main/resources/antarchy-neoforge.mixins.json @@ -12,6 +12,7 @@ "infinity.AmendmentRareOresMixin", "infinity.ConfigGenInvocationMixin", "infinity.PortalCreatorMixin", + "infinity.PortalCreatorInvoker", "infinity.WarpLogicMixin", "level.ClientLevelPartEntitiesAccessor", "level.ServerLevelPartEntitiesAccessor" diff --git a/neoforge-1.21.1/src/main/resources/assets/antarchy/models/item/giant_frying_pan.json b/neoforge-1.21.1/src/main/resources/assets/antarchy/models/item/giant_frying_pan.json new file mode 100644 index 00000000..06826590 --- /dev/null +++ b/neoforge-1.21.1/src/main/resources/assets/antarchy/models/item/giant_frying_pan.json @@ -0,0 +1,25 @@ +{ + "loader": "neoforge:separate_transforms", + "gui_light": "front", + "textures": { + "layer0": "antarchy:item/giant_frying_pan/giant_frying_pan_in_hand" + }, + "base": { + "parent": "antarchy:item/giant_frying_pan_held" + }, + "texture_size": [ + 128, + 128 + ], + "perspectives": { + "gui": { + "parent": "antarchy:item/giant_frying_pan_gui" + }, + "ground": { + "parent": "antarchy:item/giant_frying_pan_gui" + }, + "fixed": { + "parent": "antarchy:item/giant_frying_pan_gui" + } + } +}