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 00000000..47096841 Binary files /dev/null and b/common-1.21.1/src/main/resources/assets/antarchy/textures/block/ichor/ichor_flowing.png differ 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 00000000..98347bf6 Binary files /dev/null and b/common-1.21.1/src/main/resources/assets/antarchy/textures/block/ichor/ichor_still.png differ 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 00000000..1db201a8 Binary files /dev/null and b/common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_moon.png differ 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 00000000..0ed8de03 Binary files /dev/null and b/common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_star1.png differ 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 00000000..c9c7098c Binary files /dev/null and b/common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_star2.png differ 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 00000000..2a9efa28 Binary files /dev/null and b/common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_star3.png differ 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 00000000..2dc291f5 Binary files /dev/null and b/common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_star4.png differ 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 00000000..5c1cb4bf Binary files /dev/null and b/common-1.21.1/src/main/resources/assets/antarchy/textures/environment/eye_star5.png differ diff --git a/common-1.21.1/src/main/resources/assets/antarchy/textures/item/blood_gods_blade.png b/common-1.21.1/src/main/resources/assets/antarchy/textures/item/blood_gods_blade.png new file mode 100644 index 00000000..bbe2bacb Binary files /dev/null and b/common-1.21.1/src/main/resources/assets/antarchy/textures/item/blood_gods_blade.png differ 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 35c4c912..9d5aeb7b 100644 Binary files a/common-1.21.1/src/main/resources/assets/antarchy/textures/item/bug_spray.png and b/common-1.21.1/src/main/resources/assets/antarchy/textures/item/bug_spray.png differ 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 571c8a49..9d5aeb7b 100644 Binary files a/common-1.21.1/src/main/resources/assets/antarchy/textures/item/bug_spray_spraying.png and b/common-1.21.1/src/main/resources/assets/antarchy/textures/item/bug_spray_spraying.png differ 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 00000000..7c0e4f0d Binary files /dev/null and b/common-1.21.1/src/main/resources/assets/antarchy/textures/item/giant_frying_pan/giant_frying_pan_in_hand.png differ 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 00000000..a3f688b8 Binary files /dev/null and b/common-1.21.1/src/main/resources/assets/antarchy/textures/item/giant_frying_pan/giant_frying_pan_in_hand_full.png differ 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 00000000..ac28525d Binary files /dev/null and b/common-1.21.1/src/main/resources/assets/antarchy/textures/item/giant_frying_pan/giant_frying_pan_model.png differ diff --git a/common-1.21.1/src/main/resources/assets/antarchy/textures/item/temporal_tuner.png b/common-1.21.1/src/main/resources/assets/antarchy/textures/item/temporal_tuner.png new file mode 100644 index 00000000..5aefb6c5 Binary files /dev/null and b/common-1.21.1/src/main/resources/assets/antarchy/textures/item/temporal_tuner.png differ 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 b73a5b56..9941aef2 100644 Binary files a/common-1.21.1/src/main/resources/assets/antarchy/textures/mob_effect/commanded.png and b/common-1.21.1/src/main/resources/assets/antarchy/textures/mob_effect/commanded.png differ 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 d8527f96..3a0775cc 100644 Binary files a/common-1.21.1/src/main/resources/assets/antarchy/textures/mob_effect/contracted.png and b/common-1.21.1/src/main/resources/assets/antarchy/textures/mob_effect/contracted.png differ diff --git a/common-1.21.1/src/main/resources/assets/antarchy/textures/mob_effect/dilated.png b/common-1.21.1/src/main/resources/assets/antarchy/textures/mob_effect/dilated.png index d8527f96..9e4f657c 100644 Binary files a/common-1.21.1/src/main/resources/assets/antarchy/textures/mob_effect/dilated.png and b/common-1.21.1/src/main/resources/assets/antarchy/textures/mob_effect/dilated.png differ diff --git a/common-1.21.1/src/main/resources/assets/antarchy/textures/vfx/commanded_vfx_side.png b/common-1.21.1/src/main/resources/assets/antarchy/textures/vfx/commanded_vfx_side.png new file mode 100644 index 00000000..e9ef5b59 Binary files /dev/null and b/common-1.21.1/src/main/resources/assets/antarchy/textures/vfx/commanded_vfx_side.png differ 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" + } + } +}