diff --git a/src/main/java/com/github/ethanicuss/astraladditions/AstralAdditions.java b/src/main/java/com/github/ethanicuss/astraladditions/AstralAdditions.java index bbe01f2..3165d97 100644 --- a/src/main/java/com/github/ethanicuss/astraladditions/AstralAdditions.java +++ b/src/main/java/com/github/ethanicuss/astraladditions/AstralAdditions.java @@ -2,6 +2,7 @@ import com.github.ethanicuss.astraladditions.entities.ModEntities; import com.github.ethanicuss.astraladditions.fluids.ModFluids; +import com.github.ethanicuss.astraladditions.particle.ModParticles; import com.github.ethanicuss.astraladditions.playertracker.WorldRegister; import com.github.ethanicuss.astraladditions.registry.*; import net.fabricmc.api.ModInitializer; @@ -26,6 +27,7 @@ public void onInitialize() { ModEntitySpawn.addEntitySpawn(); ModEffects.registerEffects(); + ModParticles.registerParticles(); LOGGER.info("Astral Additions is active!"); } diff --git a/src/main/java/com/github/ethanicuss/astraladditions/AstralAdditionsClient.java b/src/main/java/com/github/ethanicuss/astraladditions/AstralAdditionsClient.java index e180e19..27b2dcd 100644 --- a/src/main/java/com/github/ethanicuss/astraladditions/AstralAdditionsClient.java +++ b/src/main/java/com/github/ethanicuss/astraladditions/AstralAdditionsClient.java @@ -2,8 +2,10 @@ import com.github.ethanicuss.astraladditions.entities.ModEntities; import com.github.ethanicuss.astraladditions.fluids.ModFluids; +import com.github.ethanicuss.astraladditions.particle.ModParticlesClient; import com.github.ethanicuss.astraladditions.playertracker.PlayerTracker; import com.github.ethanicuss.astraladditions.registry.ModBlocks; +import com.github.ethanicuss.astraladditions.registry.ModItemProperties; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry; @@ -41,7 +43,8 @@ public void onInitializeClient() { ModEntities.initClient(); ModBlocks.registerClient(); + ModParticlesClient.registerFactories(); + ModItemProperties.register(); } -} - +} \ No newline at end of file diff --git a/src/main/java/com/github/ethanicuss/astraladditions/entities/ModEntities.java b/src/main/java/com/github/ethanicuss/astraladditions/entities/ModEntities.java index bdbbfe9..0c39cb8 100644 --- a/src/main/java/com/github/ethanicuss/astraladditions/entities/ModEntities.java +++ b/src/main/java/com/github/ethanicuss/astraladditions/entities/ModEntities.java @@ -28,28 +28,25 @@ import com.github.ethanicuss.astraladditions.entities.pylon.PylonEntity; import com.github.ethanicuss.astraladditions.entities.pylon.PylonEntityRenderer; import com.github.ethanicuss.astraladditions.entities.shimmerblaze.*; +import com.github.ethanicuss.astraladditions.entities.shimmerfishingrod.ShimmerFishingBobberEntity; +import com.github.ethanicuss.astraladditions.entities.shimmerfishingrod.ShimmerFishingBobberRenderer; import com.github.ethanicuss.astraladditions.entities.voidtouchedskeleton.VoidtouchedSkeletonEntity; import com.github.ethanicuss.astraladditions.entities.voidtouchedskeleton.VoidtouchedSkeletonEntityRenderer; import com.github.ethanicuss.astraladditions.entities.voidtouchedzombie.VoidtouchedZombieEntity; import com.github.ethanicuss.astraladditions.entities.voidtouchedzombie.VoidtouchedZombieEntityRenderer; import com.github.ethanicuss.astraladditions.entities.whast.WhastEntity; import com.github.ethanicuss.astraladditions.entities.whast.WhastEntityRenderer; -import com.github.ethanicuss.astraladditions.registry.ModBlocks; import net.fabricmc.fabric.api.client.rendering.v1.EntityModelLayerRegistry; import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry; import net.fabricmc.fabric.api.object.builder.v1.entity.FabricDefaultAttributeRegistry; import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; import net.minecraft.client.render.entity.model.*; import net.minecraft.entity.EntityDimensions; import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnGroup; -import net.minecraft.entity.SpawnRestriction; -import net.minecraft.entity.mob.HostileEntity; import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; -import net.minecraft.world.Heightmap; + public class ModEntities { /*static Block[] blocks = { @@ -148,6 +145,18 @@ public class ModEntities { FabricEntityTypeBuilder.create(SpawnGroup.MISC, BoomerangEntity::new).dimensions(EntityDimensions.fixed(2.0f, 1.5f)).build() ); + public static final EntityType SHIMMER_FISHING_BOBBER = Registry.register( + Registry.ENTITY_TYPE, + new Identifier(AstralAdditions.MOD_ID, "shimmer_fishing_bobber"), + FabricEntityTypeBuilder.create(SpawnGroup.MISC, ShimmerFishingBobberEntity::new) + .dimensions(EntityDimensions.fixed(0.25f, 0.25f)) + .trackRangeChunks(5) + .trackedUpdateRate(10) + .build() + ); + + + public static void init() { FabricDefaultAttributeRegistry.register(MOONMAN, MoonmanEntity.createMoonmanAttributes()); FabricDefaultAttributeRegistry.register(HEMOGIANT, HemogiantEntity.createGluttonAttributes()); @@ -158,6 +167,7 @@ public static void init() { FabricDefaultAttributeRegistry.register(WHAST, WhastEntity.createWhastAttributes()); FabricDefaultAttributeRegistry.register(ENDER_WATCHER, EnderWatcherEntity.createWatcherAttributes()); FabricDefaultAttributeRegistry.register(GLAZER, GlazerEntity.createGlazerAttributes()); + } public static void initClient() { @@ -202,6 +212,8 @@ public static void initClient() { EntityRendererRegistry.register(SHIMMER_RAIN, ShimmerBlazeRainEntityRenderer::new); + EntityRendererRegistry.register(SHIMMER_FISHING_BOBBER, ShimmerFishingBobberRenderer::new); + EntityRendererRegistry.register(BOOMERANG, BoomerangEntityRenderer::new); } -} +} \ No newline at end of file diff --git a/src/main/java/com/github/ethanicuss/astraladditions/entities/shimmerfishingrod/ShimmerFishingBobberEntity.java b/src/main/java/com/github/ethanicuss/astraladditions/entities/shimmerfishingrod/ShimmerFishingBobberEntity.java new file mode 100644 index 0000000..1a4988d --- /dev/null +++ b/src/main/java/com/github/ethanicuss/astraladditions/entities/shimmerfishingrod/ShimmerFishingBobberEntity.java @@ -0,0 +1,299 @@ +package com.github.ethanicuss.astraladditions.entities.shimmerfishingrod; + +import com.github.ethanicuss.astraladditions.entities.ModEntities; +import com.github.ethanicuss.astraladditions.mixin.fishing.FishingBobberEntityAccessor; +import com.github.ethanicuss.astraladditions.registry.ModItems; +import com.github.ethanicuss.astraladditions.util.FishingBobberStateHelper; +import net.minecraft.advancement.criterion.Criteria; +import net.minecraft.entity.*; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.entity.projectile.FishingBobberEntity; +import net.minecraft.fluid.FluidState; +import net.minecraft.item.ItemStack; +import net.minecraft.loot.LootTable; +import net.minecraft.loot.context.LootContext; +import net.minecraft.loot.context.LootContextParameters; +import net.minecraft.loot.context.LootContextTypes; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.stat.Stats; +import net.minecraft.tag.FluidTags; +import net.minecraft.tag.ItemTags; +import net.minecraft.util.Identifier; +import net.minecraft.util.hit.EntityHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; + +import java.util.Collections; +import java.util.List; +import java.util.Random; + +public class ShimmerFishingBobberEntity extends FishingBobberEntity { + + private final Random velocityRandom = new Random(); + + public ShimmerFishingBobberEntity(EntityType entityType, World world) { + super(entityType, world); + } + + public ShimmerFishingBobberEntity(PlayerEntity player, World world, int luckOfTheSeaLevel, int lureLevel) { + super(ModEntities.SHIMMER_FISHING_BOBBER, world); + + this.setOwner(player); + + ((FishingBobberEntityAccessor)(Object)this).setLuckOfTheSeaLevel(Math.max(0, luckOfTheSeaLevel)); + ((FishingBobberEntityAccessor)(Object)this).setLureLevel(Math.max(0, lureLevel)); + + float f = player.getPitch(); + float g = player.getYaw(); + float h = MathHelper.cos(-g * ((float)Math.PI / 180F) - (float)Math.PI); + float i = MathHelper.sin(-g * ((float)Math.PI / 180F) - (float)Math.PI); + float j = -MathHelper.cos(-f * ((float)Math.PI / 180F)); + float k = MathHelper.sin(-f * ((float)Math.PI / 180F)); + double d = player.getX() - (double)i * 0.3; + double e = player.getEyeY(); + double l = player.getZ() - (double)h * 0.3; + this.refreshPositionAndAngles(d, e, l, g, f); + Vec3d vec3d = new Vec3d((double)(-i), (double)MathHelper.clamp(-(k / j), -5.0F, 5.0F), (double)(-h)); + double m = vec3d.length(); + vec3d = vec3d.multiply(0.6 / m + (double)0.5F + this.random.nextGaussian() * 0.0045, 0.6 / m + (double)0.5F + this.random.nextGaussian() * 0.0045, 0.6 / m + (double)0.5F + this.random.nextGaussian() * 0.0045); + this.setVelocity(vec3d); + this.setYaw((float)(MathHelper.atan2(vec3d.x, vec3d.z) * (double)(180F / (float)Math.PI))); + this.setPitch((float)(MathHelper.atan2(vec3d.y, vec3d.horizontalLength()) * (double)(180F / (float)Math.PI))); + this.prevYaw = this.getYaw(); + this.prevPitch = this.getPitch(); + + } + + @Override + public void tick() { + this.velocityRandom.setSeed(this.getUuid().getLeastSignificantBits() ^ this.world.getTime()); + super.baseTick(); + + PlayerEntity player = this.getPlayerOwner(); + if (player == null) { + this.discard(); + return; + } + + if (!this.world.isClient && !this.isStillHoldingFishingRod(player)) { + this.discard(); + return; + } + + FishingBobberEntityAccessor accessor = (FishingBobberEntityAccessor)(Object)this; + Object currentState = FishingBobberStateHelper.getState(this); + String stateName = ((Enum)currentState).name(); + + if (this.onGround) { + accessor.setRemovalTimer(accessor.getRemovalTimer() + 1); + if (accessor.getRemovalTimer() >= 1200) { + this.discard(); + return; + } + } else { + accessor.setRemovalTimer(0); + } + + float fluidHeight = 0.0F; + BlockPos blockPos = this.getBlockPos(); + FluidState fluidState = this.world.getFluidState(blockPos); + + if (fluidState.isIn(FluidTags.WATER)) { + fluidHeight = fluidState.getHeight(this.world, blockPos); + } + + boolean isInWater = fluidHeight > 0.0F; + + if (stateName.equals("FLYING")) { + if (accessor.getHookedEntity() != null) { + this.setVelocity(Vec3d.ZERO); + FishingBobberStateHelper.setState(this, getEnumStateByName("HOOKED_IN_ENTITY")); + return; + } + + if (isInWater) { + this.setVelocity(this.getVelocity().multiply(0.3, 0.2, 0.3)); + FishingBobberStateHelper.setState(this, getEnumStateByName("BOBBING")); + return; + } + + accessor.callCheckForCollision(); + } else if (stateName.equals("HOOKED_IN_ENTITY")) { + if (accessor.getHookedEntity() != null) { + if (!accessor.getHookedEntity().isRemoved() && accessor.getHookedEntity().world.getRegistryKey() == this.world.getRegistryKey()) { + this.setPosition(accessor.getHookedEntity().getX(), accessor.getHookedEntity().getBodyY(0.8), accessor.getHookedEntity().getZ()); + } else { + accessor.callUpdateHookedEntityId(null); + FishingBobberStateHelper.setState(this, getEnumStateByName("FLYING")); + } + } + return; + } else if (stateName.equals("BOBBING")) { + Vec3d vec3d = this.getVelocity(); + double dy = this.getY() + vec3d.y - (double)blockPos.getY() - (double)fluidHeight; + + if (Math.abs(dy) < 0.01) { + dy += Math.signum(dy) * 0.1; + } + + this.setVelocity(vec3d.x * 0.9, vec3d.y - dy * (double)this.random.nextFloat() * 0.2, vec3d.z * 0.9); + + if (accessor.getHookCountdown() <= 0 && accessor.getFishTravelCountdown() <= 0) { + accessor.setInOpenWater(true); + } else { + accessor.setInOpenWater(accessor.isInOpenWater() && accessor.getOutOfOpenWaterTicks() < 10 && accessor.callIsOpenOrWaterAround(blockPos)); + } + + if (isInWater) { + accessor.setOutOfOpenWaterTicks(Math.max(0, accessor.getOutOfOpenWaterTicks() - 1)); + if (accessor.isCaughtFish()) { + this.setVelocity(this.getVelocity().add(0.0, -0.1 * (double)this.velocityRandom.nextFloat() * (double)this.velocityRandom.nextFloat(), 0.0)); + } + + if (!this.world.isClient) { + accessor.callTickFishingLogic(blockPos); + } + } else { + accessor.setOutOfOpenWaterTicks(Math.min(10, accessor.getOutOfOpenWaterTicks() + 1)); + } + } + + if (!isInWater) { + this.setVelocity(this.getVelocity().add(0.0, -0.03, 0.0)); + } + + this.move(MovementType.SELF, this.getVelocity()); + this.updateRotation(); + + Object stateAfterMove = FishingBobberStateHelper.getState(this); + if (((Enum)stateAfterMove).name().equals("FLYING") && (this.onGround || this.horizontalCollision)) { + this.setVelocity(Vec3d.ZERO); + } + + this.setVelocity(this.getVelocity().multiply(0.92)); + this.refreshPosition(); + } + + + @Override + public int use(ItemStack usedItem) { + PlayerEntity player = this.getPlayerOwner(); + if (!this.world.isClient && player != null && this.isStillHoldingFishingRod(player)) { + int i = 0; + FishingBobberEntityAccessor accessor = (FishingBobberEntityAccessor)(Object)this; + + if (accessor.getHookedEntity() != null) { + this.pullHookedEntity(accessor.getHookedEntity()); + Criteria.FISHING_ROD_HOOKED.trigger((ServerPlayerEntity)player, usedItem, this, Collections.emptyList()); + this.world.sendEntityStatus(this, (byte)31); + i = accessor.getHookedEntity() instanceof ItemEntity ? 3 : 5; + } else if (accessor.getHookCountdown() > 0) { + LootContext.Builder builder = new LootContext.Builder((ServerWorld)this.world) + .parameter(LootContextParameters.ORIGIN, this.getPos()) + .parameter(LootContextParameters.TOOL, usedItem) + .parameter(LootContextParameters.THIS_ENTITY, this) + .random(this.random) + .luck((float)accessor.getLuckOfTheSeaLevel() + player.getLuck()); + + LootTable lootTable = this.world.getServer().getLootManager().getTable(new Identifier("astraladditions", "gameplay/fishing/shimmer_fishing")); + List loot = lootTable.generateLoot(builder.build(LootContextTypes.FISHING)); + Criteria.FISHING_ROD_HOOKED.trigger((ServerPlayerEntity)player, usedItem, this, loot); + + for (ItemStack itemStack : loot) { + ItemEntity itemEntity = new ItemEntity(this.world, this.getX(), this.getY(), this.getZ(), itemStack); + double dx = player.getX() - this.getX(); + double dy = player.getY() - this.getY(); + double dz = player.getZ() - this.getZ(); + itemEntity.setVelocity(dx * 0.1, dy * 0.1 + Math.sqrt(Math.sqrt(dx * dx + dy * dy + dz * dz)) * 0.08, dz * 0.1); + this.world.spawnEntity(itemEntity); + + player.world.spawnEntity(new ExperienceOrbEntity(player.world, player.getX(), player.getY() + 0.5, player.getZ() + 0.5, this.random.nextInt(6) + 1)); + + if (itemStack.isIn(ItemTags.FISHES)) { + player.increaseStat(Stats.FISH_CAUGHT, 1); + } + } + i = 1; + } + + if (this.onGround) { + i = 2; + } + + this.discard(); + return i; + } else { + return 0; + } + } + + @Override + protected void pullHookedEntity(Entity entity) { + Entity owner = this.getOwner(); + if (owner != null) { + Vec3d pull = new Vec3d( + owner.getX() - this.getX(), + owner.getY() - this.getY(), + owner.getZ() - this.getZ() + ).multiply(0.2); + + entity.setVelocity(entity.getVelocity().add(pull)); + } + } + + @Override + protected void onEntityHit(EntityHitResult entityHitResult) { + super.onEntityHit(entityHitResult); + + if (!this.world.isClient) { + ((FishingBobberEntityAccessor)(Object)this).callUpdateHookedEntityId(entityHitResult.getEntity()); + + Entity entity = entityHitResult.getEntity(); + if (entity instanceof LivingEntity living) { + living.addStatusEffect(new StatusEffectInstance(StatusEffects.GLOWING, 32780, 0, false, false)); + living.addStatusEffect(new StatusEffectInstance(StatusEffects.NIGHT_VISION, 32780, 0, false, false)); + } + } + } + + @Override + public void remove(RemovalReason reason) { + Entity hooked = ((FishingBobberEntityAccessor)(Object)this).getHookedEntity(); + if (hooked instanceof LivingEntity living) { + living.removeStatusEffect(StatusEffects.GLOWING); + living.removeStatusEffect(StatusEffects.NIGHT_VISION); + } + super.remove(reason); + } + + private boolean isStillHoldingFishingRod(PlayerEntity player) { + ItemStack mainHand = player.getMainHandStack(); + ItemStack offHand = player.getOffHandStack(); + return mainHand.isOf(ModItems.SHIMMER_FISHING_ROD) || offHand.isOf(ModItems.SHIMMER_FISHING_ROD); + } + + private Object getEnumStateByName(String name) { + Object currentState = FishingBobberStateHelper.getState(this); + if (currentState == null) { + throw new IllegalStateException("State is null"); + } + + Object[] constants = currentState.getClass().getEnumConstants(); + if (constants == null) { + throw new IllegalStateException("Cannot read enum constants"); + } + + for (Object constant : constants) { + if (((Enum)constant).name().equals(name)) { + return constant; + } + } + throw new IllegalArgumentException("No such FishingBobberEntity.State: " + name); + } + +} \ No newline at end of file diff --git a/src/main/java/com/github/ethanicuss/astraladditions/entities/shimmerfishingrod/ShimmerFishingBobberRenderer.java b/src/main/java/com/github/ethanicuss/astraladditions/entities/shimmerfishingrod/ShimmerFishingBobberRenderer.java new file mode 100644 index 0000000..d24e5bd --- /dev/null +++ b/src/main/java/com/github/ethanicuss/astraladditions/entities/shimmerfishingrod/ShimmerFishingBobberRenderer.java @@ -0,0 +1,167 @@ +package com.github.ethanicuss.astraladditions.entities.shimmerfishingrod; + +import com.github.ethanicuss.astraladditions.registry.ModItems; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.OverlayTexture; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.entity.EntityRenderer; +import net.minecraft.client.render.entity.EntityRendererFactory; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Arm; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.*; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; + +import java.awt.Color; +import java.util.List; + +@Environment(EnvType.CLIENT) + +public class ShimmerFishingBobberRenderer extends EntityRenderer { + private static final Identifier TEXTURE = new Identifier("minecraft", "textures/entity/fishing_hook.png"); + private static final RenderLayer LAYER = RenderLayer.getEntityCutout(TEXTURE); + + public ShimmerFishingBobberRenderer(EntityRendererFactory.Context context) { + super(context); + } + //* Just mostly yonked from minecraft itself + @Override + public void render(ShimmerFishingBobberEntity entity, float yaw, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light) { + PlayerEntity player = entity.getPlayerOwner(); + if (player == null) return; + + matrices.push(); + + matrices.push(); + matrices.scale(0.5F, 0.5F, 0.5F); + matrices.multiply(this.dispatcher.getRotation()); + matrices.multiply(Vec3f.POSITIVE_Y.getDegreesQuaternion(180.0F)); + MatrixStack.Entry entry = matrices.peek(); + VertexConsumer vertexConsumer = vertexConsumers.getBuffer(LAYER); + drawBobber(vertexConsumer, entry.getPositionMatrix(), entry.getNormalMatrix(), light); + matrices.pop(); + + + double dX = MathHelper.lerp(tickDelta, entity.prevX, entity.getX()); + double dY = MathHelper.lerp(tickDelta, entity.prevY, entity.getY()) + 0.25; + double dZ = MathHelper.lerp(tickDelta, entity.prevZ, entity.getZ()); + + double playerX = MathHelper.lerp(tickDelta, player.prevX, player.getX()); + double playerY = MathHelper.lerp(tickDelta, player.prevY, player.getY()) + player.getStandingEyeHeight(); + double playerZ = MathHelper.lerp(tickDelta, player.prevZ, player.getZ()); + + double offsetX = playerX - dX; + double offsetY = playerY - dY; + double offsetZ = playerZ - dZ; + + int rodHand = player.getMainArm() == Arm.RIGHT ? 1 : -1; + ItemStack itemStack = player.getMainHandStack(); + if (!isValidFishingRod(itemStack)) { + rodHand = -rodHand; + } + + if ((this.dispatcher.gameOptions == null || this.dispatcher.gameOptions.getPerspective().isFirstPerson()) && player == MinecraftClient.getInstance().player) { + double fovMultiplier = 960.0D / this.dispatcher.gameOptions.fov; + Vec3d vec = this.dispatcher.camera.getProjection().getPosition((float)rodHand * 0.525F, -0.1F).multiply(fovMultiplier); + vec = vec.rotateY(MathHelper.sin(MathHelper.sqrt(player.getHandSwingProgress(tickDelta)) * (float)Math.PI) * 0.5F); + vec = vec.rotateX(-MathHelper.sin(MathHelper.sqrt(player.getHandSwingProgress(tickDelta)) * (float)Math.PI) * 0.7F); + + offsetX = playerX + vec.x - dX; + offsetY = playerY + vec.y - dY; + offsetZ = playerZ + vec.z - dZ; + } + + VertexConsumer lineConsumer = vertexConsumers.getBuffer(RenderLayer.getLineStrip()); + MatrixStack.Entry matrixEntry = matrices.peek(); + + for (int i = 0; i <= 16; ++i) { + renderShimmerFishingLine(offsetX, offsetY, offsetZ, lineConsumer, matrixEntry, percentage(i, 16), percentage(i + 1, 16)); + } + + matrices.pop(); + super.render(entity, yaw, tickDelta, matrices, vertexConsumers, light); + } + + private void drawBobber(VertexConsumer buffer, Matrix4f matrix, Matrix3f normalMatrix, int light) { + drawVertex(buffer, matrix, normalMatrix, light, 0.0F, 0, 0, 1); + drawVertex(buffer, matrix, normalMatrix, light, 1.0F, 0, 1, 1); + drawVertex(buffer, matrix, normalMatrix, light, 1.0F, 1, 1, 0); + drawVertex(buffer, matrix, normalMatrix, light, 0.0F, 1, 0, 0); + } + + private void drawVertex(VertexConsumer buffer, Matrix4f matrix, Matrix3f normalMatrix, int light, float x, int y, int u, int v) { + buffer.vertex(matrix, x - 0.5F, (float) y - 0.5F, 0.0F) + .color(255, 255, 255, 255) + .texture((float) u, (float) v) + .overlay(OverlayTexture.DEFAULT_UV) + .light(light) + .normal(normalMatrix, 0.0F, 1.0F, 0.0F) + .next(); + } + + private static float percentage(int value, int max) { + return (float) value / (float) max; + } + + private static final List SHIMMER_COLORS = List.of( + new float[] { 0.83f, 0.6f, 1.0f }, + new float[] { 0.9f, 0.6f, 1.0f }, + new float[] { 0.58f, 0.6f, 1.0f } + ); + + + private static void renderShimmerFishingLine(double x, double y, double z, VertexConsumer buffer, MatrixStack.Entry matrices, float start, float end) { + float f = (float)(x * start); + float g = (float)(y * (start * start + start) * 0.5D) + 0.25F; + float h = (float)(z * start); + float i = (float)(x * end) - f; + float j = (float)(y * (end * end + end) * 0.5D) + 0.25F - g; + float k = (float)(z * end) - h; + float l = MathHelper.sqrt(i * i + j * j + k * k); + i /= l; + j /= l; + k /= l; + + long time = System.currentTimeMillis(); + float scroll = (time % 10000L) / 10000.0f; + + float totalProgress = (start + scroll) % 1.0f; + float scaledProgress = totalProgress * SHIMMER_COLORS.size(); + int index1 = (int) Math.floor(scaledProgress) % SHIMMER_COLORS.size(); + int index2 = (index1 + 1) % SHIMMER_COLORS.size(); + float mix = scaledProgress - (float)index1; + + float[] color1 = SHIMMER_COLORS.get(index1); + float[] color2 = SHIMMER_COLORS.get(index2); + + float hue = MathHelper.lerp(mix, color1[0], color2[0]); + float saturation = MathHelper.lerp(mix, color1[1], color2[1]); + float brightness = MathHelper.lerp(mix, color1[2], color2[2]); + + int rgb = Color.HSBtoRGB(hue, saturation, brightness); + int r = (rgb >> 16) & 0xFF; + int gCol = (rgb >> 8) & 0xFF; + int b = rgb & 0xFF; + + buffer.vertex(matrices.getPositionMatrix(), f, g, h) + .color(r, gCol, b, 255) + .normal(matrices.getNormalMatrix(), i, j, k) + .next(); + } + + private boolean isValidFishingRod(ItemStack stack) { + return stack.isOf(ModItems.SHIMMER_FISHING_ROD); + } + + @Override + public Identifier getTexture(ShimmerFishingBobberEntity entity) { + return TEXTURE; + } +} \ No newline at end of file diff --git a/src/main/java/com/github/ethanicuss/astraladditions/items/BottomlessBucketItem.java b/src/main/java/com/github/ethanicuss/astraladditions/items/BottomlessBucketItem.java new file mode 100644 index 0000000..75428ee --- /dev/null +++ b/src/main/java/com/github/ethanicuss/astraladditions/items/BottomlessBucketItem.java @@ -0,0 +1,17 @@ +package com.github.ethanicuss.astraladditions.items; + +import net.minecraft.fluid.Fluid; +import net.minecraft.item.BucketItem; +import net.minecraft.item.ItemStack; + + +public class BottomlessBucketItem extends BucketItem { + public BottomlessBucketItem(Fluid fluid, Settings settings) { + super(fluid, settings); + } + + @Override + public boolean hasGlint(ItemStack stack) { + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/github/ethanicuss/astraladditions/items/ShimmerFishingRodItem.java b/src/main/java/com/github/ethanicuss/astraladditions/items/ShimmerFishingRodItem.java new file mode 100644 index 0000000..531b11c --- /dev/null +++ b/src/main/java/com/github/ethanicuss/astraladditions/items/ShimmerFishingRodItem.java @@ -0,0 +1,54 @@ +package com.github.ethanicuss.astraladditions.items; + + +import com.github.ethanicuss.astraladditions.entities.shimmerfishingrod.ShimmerFishingBobberEntity; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.FishingRodItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.sound.SoundEvents; +import net.minecraft.stat.Stats; +import net.minecraft.util.Hand; +import net.minecraft.util.TypedActionResult; +import net.minecraft.world.World; + + +public class ShimmerFishingRodItem extends FishingRodItem { + + public ShimmerFishingRodItem(Item.Settings settings) { + super(settings); + } + + //* Just mostly yonked from minecraft itself + @Override + public TypedActionResult use(World world, PlayerEntity user, Hand hand) { + ItemStack itemStack = user.getStackInHand(hand); + + if (user.fishHook != null) { + int i = user.fishHook.use(itemStack); + itemStack.damage(i, user, (p) -> p.sendToolBreakStatus(hand)); + user.swingHand(hand); + world.playSound(null, user.getX(), user.getY(), user.getZ(), + SoundEvents.ENTITY_FISHING_BOBBER_RETRIEVE, user.getSoundCategory(), 1.0F, 1.0F); + user.incrementStat(Stats.USED.getOrCreateStat(this)); + } else { + world.playSound(null, user.getX(), user.getY(), user.getZ(), + SoundEvents.ENTITY_FISHING_BOBBER_THROW, user.getSoundCategory(), 1.0F, 1.0F); + + if (!world.isClient) { + int luckOfTheSeaLevel = EnchantmentHelper.getLuckOfTheSea(itemStack); + int lureLevel = EnchantmentHelper.getLure(itemStack); + ShimmerFishingBobberEntity bobber = new ShimmerFishingBobberEntity(user, world, luckOfTheSeaLevel, lureLevel); + + world.spawnEntity(bobber); + } + + user.swingHand(hand); + user.incrementStat(Stats.USED.getOrCreateStat(this)); + } + + return TypedActionResult.success(itemStack, world.isClient()); + } + +} \ No newline at end of file diff --git a/src/main/java/com/github/ethanicuss/astraladditions/mixin/ParticleRecolourMixin.java b/src/main/java/com/github/ethanicuss/astraladditions/mixin/ParticleRecolourMixin.java new file mode 100644 index 0000000..dd12c0e --- /dev/null +++ b/src/main/java/com/github/ethanicuss/astraladditions/mixin/ParticleRecolourMixin.java @@ -0,0 +1,114 @@ +package com.github.ethanicuss.astraladditions.mixin; + +import com.github.ethanicuss.astraladditions.fluids.ModFluids; +import com.github.ethanicuss.astraladditions.particle.ModParticles; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.model.ModelPart; +import net.minecraft.client.render.WorldRenderer; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.FluidState; +import net.minecraft.particle.DefaultParticleType; +import net.minecraft.particle.ParticleEffect; +import net.minecraft.particle.ParticleType; +import net.minecraft.particle.ParticleTypes; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.registry.Registry; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + + +@Mixin(WorldRenderer.class) +@Environment(EnvType.CLIENT) +public class ParticleRecolourMixin { + + + private long lastShimmerCheckTime = -1L; + private BlockPos lastCheckedPos = BlockPos.ORIGIN; + private boolean lastShimmerNearbyResult = false; + + @Inject(method = "addParticle(Lnet/minecraft/particle/ParticleEffect;ZZDDDDDD)V", at = @At("HEAD"), cancellable = true) + private void onAddParticle(ParticleEffect particle, boolean alwaysSpawn, boolean important, double x, double y, double z, double velX, double velY, double velZ, CallbackInfo ci) { + if (!isWaterParticle(particle)) return; + + ClientWorld world = MinecraftClient.getInstance().world; + if (world == null) return; + + BlockPos blockPos = new BlockPos(x, y, z); + + if (shouldCheckNew(blockPos)) { + lastShimmerNearbyResult = isShimmerNearby(world, blockPos, x, y, z); + lastCheckedPos = blockPos; + lastShimmerCheckTime = world.getTime(); + } + + if (lastShimmerNearbyResult) { + ParticleEffect shimmerParticle = getShimmerReplacement(particle); + if (shimmerParticle != null) { + MinecraftClient.getInstance().particleManager.addParticle(shimmerParticle, x, y, z, velX, velY, velZ); + ci.cancel(); + } + } + } + + private boolean isWaterParticle(ParticleEffect particle) { + return particle == ParticleTypes.SPLASH + || particle == ParticleTypes.RAIN + || particle == ParticleTypes.BUBBLE; + } + + private boolean isShimmerFluid(ClientWorld world, BlockPos pos) { + Fluid fluid = world.getFluidState(pos).getFluid(); + return fluid == ModFluids.STILL_SHIMMER || fluid == ModFluids.FLOWING_SHIMMER; + } + + private boolean isShimmerNearby(ClientWorld world, BlockPos center, double particleX, double particleY, double particleZ) { + double maxDistanceSquared = 1.125 * 1.125; + + for (int dx = -1; dx <= 1; dx++) { + for (int dy = -1; dy <= 1; dy++) { + for (int dz = -1; dz <= 1; dz++) { + BlockPos checkPos = center.add(dx, dy, dz); + if (isShimmerFluid(world, checkPos)) { + double cx = checkPos.getX() + 0.25; + double cy = checkPos.getY() + 0.25; + double cz = checkPos.getZ() + 0.25; + + double distSq = (cx - particleX) * (cx - particleX) + + (cy - particleY) * (cy - particleY) + + (cz - particleZ) * (cz - particleZ); + + if (distSq <= maxDistanceSquared) { + return true; + } + } + } + } + } + return false; + } + + private ParticleEffect getShimmerReplacement(ParticleEffect original) { + ParticleType type = original.getType(); + Identifier id = Registry.PARTICLE_TYPE.getId(type); + + if (id == null) return null; + + return switch (id.getPath()) { + case "splash", "rain" -> ModParticles.SHIMMER_SPLASH; + case "bubble" -> ModParticles.SHIMMER_BUBBLE; + default -> null; + }; + } + + private boolean shouldCheckNew(BlockPos currentPos) { + return !currentPos.equals(lastCheckedPos) || MinecraftClient.getInstance().world.getTime() != lastShimmerCheckTime; + } +} \ No newline at end of file diff --git a/src/main/java/com/github/ethanicuss/astraladditions/mixin/fishing/BottomlessBucketItemMixin.java b/src/main/java/com/github/ethanicuss/astraladditions/mixin/fishing/BottomlessBucketItemMixin.java new file mode 100644 index 0000000..6b9d08a --- /dev/null +++ b/src/main/java/com/github/ethanicuss/astraladditions/mixin/fishing/BottomlessBucketItemMixin.java @@ -0,0 +1,20 @@ +package com.github.ethanicuss.astraladditions.mixin.fishing; + +import com.github.ethanicuss.astraladditions.items.BottomlessBucketItem; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.BucketItem; +import net.minecraft.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(BucketItem.class) +public class BottomlessBucketItemMixin { + @Inject(method = "getEmptiedStack", at = @At("HEAD"), cancellable = true) + private static void injected_getEmptiedStack(ItemStack stack, PlayerEntity player, CallbackInfoReturnable cir) { + if (stack.getItem() instanceof BottomlessBucketItem) { + cir.setReturnValue(stack); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/github/ethanicuss/astraladditions/mixin/fishing/FishingBobberEntityAccessor.java b/src/main/java/com/github/ethanicuss/astraladditions/mixin/fishing/FishingBobberEntityAccessor.java new file mode 100644 index 0000000..350244f --- /dev/null +++ b/src/main/java/com/github/ethanicuss/astraladditions/mixin/fishing/FishingBobberEntityAccessor.java @@ -0,0 +1,68 @@ +package com.github.ethanicuss.astraladditions.mixin.fishing; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.projectile.FishingBobberEntity; + +import net.minecraft.util.math.BlockPos; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(FishingBobberEntity.class) +public interface FishingBobberEntityAccessor { + + @Accessor("removalTimer") + int getRemovalTimer(); + + @Accessor("removalTimer") + void setRemovalTimer(int removalTimer); + + @Accessor("caughtFish") + boolean isCaughtFish(); + + @Accessor("hookCountdown") + int getHookCountdown(); + + @Accessor("fishTravelCountdown") + int getFishTravelCountdown(); + + @Accessor("outOfOpenWaterTicks") + int getOutOfOpenWaterTicks(); + + @Accessor("outOfOpenWaterTicks") + void setOutOfOpenWaterTicks(int ticks); + + @Accessor("hookedEntity") + Entity getHookedEntity(); + + @Accessor("inOpenWater") + boolean isInOpenWater(); + + @Accessor("inOpenWater") + void setInOpenWater(boolean inOpenWater); + + @Accessor("luckOfTheSeaLevel") + int getLuckOfTheSeaLevel(); + + @Invoker("updateHookedEntityId") + void callUpdateHookedEntityId(Entity entity); + + @Invoker("isOpenOrWaterAround") + boolean callIsOpenOrWaterAround(BlockPos pos); + + @Invoker("tickFishingLogic") + void callTickFishingLogic(BlockPos pos); + + @Invoker("checkForCollision") + void callCheckForCollision(); + + @Mutable + @Accessor("luckOfTheSeaLevel") + void setLuckOfTheSeaLevel(int luck); + + @Mutable + @Accessor("lureLevel") + void setLureLevel(int lure); + +} \ No newline at end of file diff --git a/src/main/java/com/github/ethanicuss/astraladditions/mixin/fishing/FishingBobberEntityMixin.java b/src/main/java/com/github/ethanicuss/astraladditions/mixin/fishing/FishingBobberEntityMixin.java new file mode 100644 index 0000000..286a25f --- /dev/null +++ b/src/main/java/com/github/ethanicuss/astraladditions/mixin/fishing/FishingBobberEntityMixin.java @@ -0,0 +1,36 @@ +package com.github.ethanicuss.astraladditions.mixin.fishing; + +import com.github.ethanicuss.astraladditions.entities.shimmerfishingrod.ShimmerFishingBobberEntity; +import com.github.ethanicuss.astraladditions.fluids.ModFluids; +import net.minecraft.entity.projectile.FishingBobberEntity; +import net.minecraft.fluid.FluidState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + + +@Mixin(FishingBobberEntity.class) +public abstract class FishingBobberEntityMixin { + + @Inject(method = "tickFishingLogic", at = @At("HEAD"), cancellable = true) + private void astraladditions$controlFishingBasedOnFluid(BlockPos pos, CallbackInfo ci) { + FishingBobberEntity bobber = (FishingBobberEntity)(Object)this; + World world = bobber.world; + FluidState fluidState = world.getFluidState(pos); + + boolean inShimmer = fluidState.isOf(ModFluids.STILL_SHIMMER) || fluidState.isOf(ModFluids.FLOWING_SHIMMER); + + if (bobber instanceof ShimmerFishingBobberEntity) { + if (!inShimmer) { + ci.cancel(); + } + } else { + if (inShimmer) { + ci.cancel(); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/github/ethanicuss/astraladditions/particle/ModParticles.java b/src/main/java/com/github/ethanicuss/astraladditions/particle/ModParticles.java new file mode 100644 index 0000000..9440bb4 --- /dev/null +++ b/src/main/java/com/github/ethanicuss/astraladditions/particle/ModParticles.java @@ -0,0 +1,18 @@ +package com.github.ethanicuss.astraladditions.particle; + +import com.github.ethanicuss.astraladditions.AstralAdditions; +import net.fabricmc.fabric.api.particle.v1.FabricParticleTypes; +import net.minecraft.particle.DefaultParticleType; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; + +public class ModParticles { + + public static final DefaultParticleType SHIMMER_BUBBLE = FabricParticleTypes.simple(); + public static final DefaultParticleType SHIMMER_SPLASH = FabricParticleTypes.simple(); + + public static void registerParticles() { + Registry.register(Registry.PARTICLE_TYPE, new Identifier(AstralAdditions.MOD_ID, "shimmer_bubble"), SHIMMER_BUBBLE); + Registry.register(Registry.PARTICLE_TYPE, new Identifier(AstralAdditions.MOD_ID, "shimmer_splash"), SHIMMER_SPLASH); + } +} \ No newline at end of file diff --git a/src/main/java/com/github/ethanicuss/astraladditions/particle/ModParticlesClient.java b/src/main/java/com/github/ethanicuss/astraladditions/particle/ModParticlesClient.java new file mode 100644 index 0000000..f2a38dc --- /dev/null +++ b/src/main/java/com/github/ethanicuss/astraladditions/particle/ModParticlesClient.java @@ -0,0 +1,13 @@ +package com.github.ethanicuss.astraladditions.particle; + +import com.github.ethanicuss.astraladditions.particle.shimmer.ShimmerBubbleParticle; +import com.github.ethanicuss.astraladditions.particle.shimmer.ShimmerSplashParticle; +import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry; + +public class ModParticlesClient { + + public static void registerFactories() { + ParticleFactoryRegistry.getInstance().register(ModParticles.SHIMMER_BUBBLE, ShimmerBubbleParticle.Factory::new); + ParticleFactoryRegistry.getInstance().register(ModParticles.SHIMMER_SPLASH, ShimmerSplashParticle.Factory::new); + } +} \ No newline at end of file diff --git a/src/main/java/com/github/ethanicuss/astraladditions/particle/shimmer/ShimmerBubbleParticle.java b/src/main/java/com/github/ethanicuss/astraladditions/particle/shimmer/ShimmerBubbleParticle.java new file mode 100644 index 0000000..2fb3f31 --- /dev/null +++ b/src/main/java/com/github/ethanicuss/astraladditions/particle/shimmer/ShimmerBubbleParticle.java @@ -0,0 +1,66 @@ +package com.github.ethanicuss.astraladditions.particle.shimmer; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.particle.*; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.particle.DefaultParticleType; + +@Environment(EnvType.CLIENT) +public class ShimmerBubbleParticle extends SpriteBillboardParticle { + + public ShimmerBubbleParticle(ClientWorld clientWorld, double d, double e, double f, double g, double h, double i) { + super(clientWorld, d, e, f); + this.setBoundingBoxSpacing(0.02F, 0.02F); + this.scale *= this.random.nextFloat() * 0.6F + 0.2F; + this.velocityX = g *0.2F + (Math.random() *2.0F -1.0F) *0.02F; + this.velocityY = h *0.2F + (Math.random() *2.0F -1.0F) *0.02F; + this.velocityZ = i *0.2F + (Math.random() *2.0F -1.0F) *0.02F; + this.maxAge = (int) (8.0F / (Math.random() * 0.8 + 0.2)); + + + } + + public void tick() { + this.prevPosX = this.x; + this.prevPosY = this.y; + this.prevPosZ = this.z; + if (this.maxAge-- <= 0) { + this.markDead(); + } else { + this.velocityY += 0.002; + this.move(this.velocityX, this.velocityY, this.velocityZ); + this.velocityX *= 0.85F; + this.velocityY *= 0.85F; + this.velocityZ *= 0.85F; + + } + } + + @Override + public int getBrightness(float tint) { + return 240; + } + + @Override + public ParticleTextureSheet getType() { + return ParticleTextureSheet.PARTICLE_SHEET_OPAQUE; + } + + @Environment(EnvType.CLIENT) + public static class Factory implements ParticleFactory { + private final SpriteProvider spriteProvider; + + public Factory(SpriteProvider spriteProvider) { + this.spriteProvider = spriteProvider; + } + + public Particle createParticle(DefaultParticleType defaultParticleType, ClientWorld clientWorld, double d, double e, double f, double g, double h, double i) { + ShimmerBubbleParticle shimmerBubbleParticle = new ShimmerBubbleParticle(clientWorld, d, e, f, g, h, i); + shimmerBubbleParticle.setSprite(this.spriteProvider); + return shimmerBubbleParticle; + } + } + + +} \ No newline at end of file diff --git a/src/main/java/com/github/ethanicuss/astraladditions/particle/shimmer/ShimmerSplashParticle.java b/src/main/java/com/github/ethanicuss/astraladditions/particle/shimmer/ShimmerSplashParticle.java new file mode 100644 index 0000000..c5fcc82 --- /dev/null +++ b/src/main/java/com/github/ethanicuss/astraladditions/particle/shimmer/ShimmerSplashParticle.java @@ -0,0 +1,47 @@ +package com.github.ethanicuss.astraladditions.particle.shimmer; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.particle.*; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.particle.DefaultParticleType; + +@Environment(EnvType.CLIENT) +public class ShimmerSplashParticle extends RainSplashParticle { + + public ShimmerSplashParticle(ClientWorld clientWorld, double d, double e, double f, double g, double h, double i) { + super(clientWorld, d, e, f); + this.gravityStrength = 0.04F; + if (h == (double)0.0F && (g != (double)0.0F || i != (double)0.0F)) { + this.velocityX = g; + this.velocityY = 0.1; + this.velocityZ = i; + } + + } + + @Environment(EnvType.CLIENT) + public static class SplashFactory implements ParticleFactory { + private final SpriteProvider spriteProvider; + + public SplashFactory(SpriteProvider spriteProvider) { + this.spriteProvider = spriteProvider; + } + + public Particle createParticle(DefaultParticleType defaultParticleType, ClientWorld clientWorld, double d, double e, double f, double g, double h, double i) { + ShimmerSplashParticle shimmerSplashParticle = new ShimmerSplashParticle(clientWorld, d, e, f, g, h, i); + shimmerSplashParticle.setSprite(this.spriteProvider); + return shimmerSplashParticle; + } + } + + @Override + public int getBrightness(float tint) { + return 240; + } + + @Override + public ParticleTextureSheet getType() { + return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; + } +} \ No newline at end of file diff --git a/src/main/java/com/github/ethanicuss/astraladditions/registry/ModItemProperties.java b/src/main/java/com/github/ethanicuss/astraladditions/registry/ModItemProperties.java new file mode 100644 index 0000000..f6fb03f --- /dev/null +++ b/src/main/java/com/github/ethanicuss/astraladditions/registry/ModItemProperties.java @@ -0,0 +1,22 @@ +package com.github.ethanicuss.astraladditions.registry; + +import net.minecraft.client.item.ModelPredicateProviderRegistry; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.FishingRodItem; +import net.minecraft.util.Identifier; + +public class ModItemProperties { + + public static void register() { + ModelPredicateProviderRegistry.register(ModItems.SHIMMER_FISHING_ROD, new Identifier("cast"), (stack, world, entity, seed) -> { + if (entity instanceof PlayerEntity player) { + boolean usingMainHand = player.getMainHandStack() == stack; + boolean usingOffHand = player.getOffHandStack() == stack; + if (player.getMainHandStack().getItem() instanceof FishingRodItem) { + usingOffHand = false; + } + return (usingMainHand || usingOffHand) && player.fishHook != null ? 1.0F : 0.0F; + } + return 0.0F; + }); +}} \ No newline at end of file diff --git a/src/main/java/com/github/ethanicuss/astraladditions/registry/ModItems.java b/src/main/java/com/github/ethanicuss/astraladditions/registry/ModItems.java index 643dae3..10c5c2a 100644 --- a/src/main/java/com/github/ethanicuss/astraladditions/registry/ModItems.java +++ b/src/main/java/com/github/ethanicuss/astraladditions/registry/ModItems.java @@ -2,10 +2,14 @@ import com.github.ethanicuss.astraladditions.AstralAdditions; import com.github.ethanicuss.astraladditions.entities.ModEntities; +import com.github.ethanicuss.astraladditions.fluids.ModFluid; +import com.github.ethanicuss.astraladditions.fluids.ModFluids; import com.github.ethanicuss.astraladditions.items.*; import net.fabricmc.fabric.api.item.v1.FabricItemSettings; import net.minecraft.entity.EntityType; import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.fluid.Fluids; +import net.minecraft.item.FoodComponent; import net.minecraft.item.Item; import net.minecraft.item.ItemGroup; import net.minecraft.text.TranslatableText; @@ -20,13 +24,13 @@ public class ModItems { public static final Item COMETBALL = new CometballItem(new FabricItemSettings().group(ItemGroup.COMBAT).maxCount(16).rarity(Rarity.UNCOMMON)); public static final Item PYLON = new PylonItem(new FabricItemSettings().group(ItemGroup.TOOLS).maxCount(1).rarity(Rarity.UNCOMMON)); - public static final Item METEOR_MITTS = new MeteorMittsItem(new FabricItemSettings().group(ItemGroup.COMBAT).maxCount(1).rarity(Rarity.RARE).maxDamage(1536)); + public static final Item METEOR_MITTS = new MeteorMittsItem(new FabricItemSettings().group(ItemGroup.COMBAT).maxCount(1).rarity(Rarity.UNCOMMON).maxDamage(1536)); public static final Item COSMIC_HOURGLASS = new CosmicHourglassItem(new FabricItemSettings().maxCount(1).rarity(Rarity.UNCOMMON)); public static final Item E_GUITAR = new EGuitarItem(new FabricItemSettings().group(ItemGroup.COMBAT).maxCount(1).rarity(Rarity.UNCOMMON).maxDamage(2048)); public static final Item MOONSET_CRYSTAL = new Item(new FabricItemSettings().group(ItemGroup.MISC).rarity(Rarity.UNCOMMON)); public static final Item OHNO = new OHNOItem(new FabricItemSettings().group(ItemGroup.TOOLS).maxCount(1).rarity(Rarity.RARE)); public static final Item OHNO_BROKEN = new OHNOBrokenItem(new FabricItemSettings().group(ItemGroup.TOOLS).rarity(Rarity.RARE)); - public static final Item SHIMMER_BLOWER = new ShimmerBlowerItem(new FabricItemSettings().group(ItemGroup.COMBAT).maxCount(1).rarity(Rarity.UNCOMMON).maxDamage(25)); + public static final Item SHIMMER_BLOWER = new ShimmerBlowerItem(new FabricItemSettings().group(ItemGroup.COMBAT).maxCount(1).rarity(Rarity.UNCOMMON).maxDamage(20)); public static final Item LUNAR_WACKER = new LunarWackerItem(new FabricItemSettings().group(ItemGroup.COMBAT).maxCount(1).rarity(Rarity.UNCOMMON).maxDamage(512)); public static final Item SHIMMER_HEART = new Item(new FabricItemSettings().group(ItemGroup.MISC).rarity(Rarity.UNCOMMON)); public static final Item AWAKENED_SHIMMER_HEART = new Item(new FabricItemSettings().group(ItemGroup.MISC).rarity(Rarity.UNCOMMON)); @@ -43,9 +47,24 @@ public class ModItems { public static final Item DISC_PURPLE_PRISON = new ModMusicDiscItem(7, ModSounds.MUSIC_SHIMMER_BLAZE, new FabricItemSettings().group(ItemGroup.MISC).maxCount(1)); public static final Item DISC_ASTRAL_LAKES_REMIX = new ModMusicDiscItem(7, ModSounds.MUSIC_ASTRAL_LAKES_REMIX, new FabricItemSettings().group(ItemGroup.MISC).maxCount(1)); //public static final Item SHIMMER_BOTTLE = new ShimmerBottleItem(new FabricItemSettings().group(ItemGroup.BREWING).maxCount(1)); - public static final Item SHIMMER_BOTTLE = new ShimmerBottleItem(StatusEffects.NIGHT_VISION, 3600, 0, new TranslatableText("Yummy").formatted(Formatting.BLUE), new FabricItemSettings().group(ItemGroup.BREWING).maxCount(1).rarity(Rarity.UNCOMMON)); - + public static final Item SHIMMER_BOTTLE = new ShimmerBottleItem(StatusEffects.NIGHT_VISION, 3600, 0, new TranslatableText("Multiplies XP gain by 1.5 (3:00)").formatted(Formatting.BLUE), new FabricItemSettings().group(ItemGroup.BREWING).maxCount(1).rarity(Rarity.UNCOMMON)); public static final Item CHROMATIC_VACUUM = new ChromaticVacuumItem(new FabricItemSettings().group(ItemGroup.TOOLS).maxCount(1).maxDamage(512)); + + //Ethan Balance the food ;-; + public static final Item SHIMMER_FISHING_ROD = new ShimmerFishingRodItem(new Item.Settings().maxCount(1).maxDamage(150).rarity(Rarity.EPIC).group(ItemGroup.TOOLS)); + public static final Item BOTTOMLESS_WATER_BUCKET = new BottomlessBucketItem(Fluids.WATER, new Item.Settings().maxCount(1).group(ItemGroup.TOOLS).rarity(Rarity.UNCOMMON)); + public static final Item SHIMMERING_THREAD = new Item(new Item.Settings().group(ItemGroup.MISC).rarity(Rarity.UNCOMMON)); + public static final Item SHIMMER_TROUT = new Item(new Item.Settings().group(ItemGroup.FOOD).rarity(Rarity.UNCOMMON) + .food(new FoodComponent.Builder() + .hunger(6) + .saturationModifier(0.8f) + .build())); + public static final Item SHIMMER_SHISH = new Item(new Item.Settings().group(ItemGroup.FOOD).rarity(Rarity.UNCOMMON) + .food(new FoodComponent.Builder() + .hunger(6) + .saturationModifier(0.8f) + .build())); + public static final Item ASTRAL_HOE = new AstralHoeItem(new FabricItemSettings().group(ItemGroup.COMBAT).maxCount(1).rarity(Rarity.RARE).maxDamage(1536)); public static final Item SOULSTEAL_DAGGER = new SoulstealDaggerItem(new FabricItemSettings().group(ItemGroup.COMBAT).maxCount(1).rarity(Rarity.RARE).maxDamage(768)); public static final Item DIAMOND_BOOMER = new BoomerangItem(new FabricItemSettings().group(ItemGroup.COMBAT).maxCount(1).rarity(Rarity.RARE), 6.0f, 12, 1.2f, 0.0f); @@ -82,6 +101,12 @@ public static void registerItems() { Registry.register(Registry.ITEM, new Identifier(AstralAdditions.MOD_ID, "diamond_boomer"), DIAMOND_BOOMER); Registry.register(Registry.ITEM, new Identifier(AstralAdditions.MOD_ID, "shimmerang"), SHIMMERANG); addSacrificeItem(AWAKENED_SHIMMER_HEART, ModEntities.SHIMMER_BLAZE); + + Registry.register(Registry.ITEM, new Identifier(AstralAdditions.MOD_ID, "shimmer_fishing_rod"), SHIMMER_FISHING_ROD); + Registry.register(Registry.ITEM, new Identifier(AstralAdditions.MOD_ID, "shimmering_thread"), SHIMMERING_THREAD); + Registry.register(Registry.ITEM, new Identifier(AstralAdditions.MOD_ID, "shimmer_trout"), SHIMMER_TROUT); + Registry.register(Registry.ITEM, new Identifier(AstralAdditions.MOD_ID, "shimmer_shish"), SHIMMER_SHISH); + Registry.register(Registry.ITEM, new Identifier(AstralAdditions.MOD_ID, "bottomless_water_bucket"), BOTTOMLESS_WATER_BUCKET); } private static List sacrificableItems = new ArrayList(); public static void addSacrificeItem(Item item, EntityType spawns){ @@ -90,4 +115,4 @@ public static void addSacrificeItem(Item item, EntityType spawns){ public static boolean isSacrificeItem(Item item){ return sacrificableItems.contains(item); } -} +} \ No newline at end of file diff --git a/src/main/java/com/github/ethanicuss/astraladditions/util/FishingBobberStateHelper.java b/src/main/java/com/github/ethanicuss/astraladditions/util/FishingBobberStateHelper.java new file mode 100644 index 0000000..af2e0f1 --- /dev/null +++ b/src/main/java/com/github/ethanicuss/astraladditions/util/FishingBobberStateHelper.java @@ -0,0 +1,44 @@ +package com.github.ethanicuss.astraladditions.util; + +import net.minecraft.entity.projectile.FishingBobberEntity; + +import java.lang.reflect.Field; + +public class FishingBobberStateHelper { + + private static Field stateField; + + static { + try { + for (Field field : FishingBobberEntity.class.getDeclaredFields()) { + if (field.getType().isEnum()) { + stateField = field; + stateField.setAccessible(true); + break; + } + } + + if (stateField == null) { + throw new RuntimeException("Could not find FishingBobberEntity 'state' field! No enum field found."); + } + } catch (Exception e) { + throw new RuntimeException("Failed to initialize FishingBobberStateHelper", e); + } + } + + public static Object getState(FishingBobberEntity entity) { + try { + return stateField.get(entity); + } catch (Exception e) { + throw new RuntimeException("Failed to get state from bobber entity", e); + } + } + + public static void setState(FishingBobberEntity entity, Object state) { + try { + stateField.set(entity, state); + } catch (Exception e) { + throw new RuntimeException("Failed to set state on bobber entity", e); + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/astraladditions/lang/en_us.json b/src/main/resources/assets/astraladditions/lang/en_us.json index c7df6e1..3663066 100644 --- a/src/main/resources/assets/astraladditions/lang/en_us.json +++ b/src/main/resources/assets/astraladditions/lang/en_us.json @@ -41,6 +41,12 @@ "item.astraladditions.disc_astral_lakes_remix": "Astral Lakes (ethanicuss' meow moew :wolfGif: remix) Music Disc", "item.astraladditions.disc_astral_lakes_remix.desc": "Astral Lakes (ethanicuss' meow moew :wolfGif: remix) - ethanicuss", + "item.astraladditions.shimmer_fishing_rod": "Shimmer Fishing Rod", + "item.astraladditions.shimmering_thread": "Shimmering Thread", + "item.astraladditions.shimmer_trout": "Shimmer Trout", + "item.astraladditions.shimmer_shish": "Shish", + "item.astraladditions.bottomless_water_bucket": "Bottomless Water Bucket", + "block.astraladditions.enderrack": "Enderrack", "block.astraladditions.twisted_nylium": "Twisted Nylium", "block.astraladditions.ender_sprouts": "Ender Sprouts", diff --git a/src/main/resources/assets/astraladditions/models/item/bottomless_water_bucket.json b/src/main/resources/assets/astraladditions/models/item/bottomless_water_bucket.json new file mode 100644 index 0000000..15dafa1 --- /dev/null +++ b/src/main/resources/assets/astraladditions/models/item/bottomless_water_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "astraladditions:item/bottomless_water_bucket" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/astraladditions/models/item/shimmer_fishing_rod.json b/src/main/resources/assets/astraladditions/models/item/shimmer_fishing_rod.json new file mode 100644 index 0000000..27c05bd --- /dev/null +++ b/src/main/resources/assets/astraladditions/models/item/shimmer_fishing_rod.json @@ -0,0 +1,14 @@ +{ + "parent": "item/handheld_rod", + "textures": { + "layer0": "astraladditions:item/shimmer_fishing_rod" + }, + "overrides": [ + { + "predicate": { + "cast": 1.0 + }, + "model": "astraladditions:item/shimmer_fishing_rod_cast" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/astraladditions/models/item/shimmer_fishing_rod_cast.json b/src/main/resources/assets/astraladditions/models/item/shimmer_fishing_rod_cast.json new file mode 100644 index 0000000..075913b --- /dev/null +++ b/src/main/resources/assets/astraladditions/models/item/shimmer_fishing_rod_cast.json @@ -0,0 +1,6 @@ +{ + "parent": "item/handheld_rod", + "textures": { + "layer0": "astraladditions:item/shimmer_fishing_rod_cast" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/astraladditions/models/item/shimmer_shish.json b/src/main/resources/assets/astraladditions/models/item/shimmer_shish.json new file mode 100644 index 0000000..c0df6d5 --- /dev/null +++ b/src/main/resources/assets/astraladditions/models/item/shimmer_shish.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "astraladditions:item/shimmer_shish" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/astraladditions/models/item/shimmer_trout.json b/src/main/resources/assets/astraladditions/models/item/shimmer_trout.json new file mode 100644 index 0000000..668f7fc --- /dev/null +++ b/src/main/resources/assets/astraladditions/models/item/shimmer_trout.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "astraladditions:item/shimmer_trout" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/astraladditions/models/item/shimmering_thread.json b/src/main/resources/assets/astraladditions/models/item/shimmering_thread.json new file mode 100644 index 0000000..f1a953d --- /dev/null +++ b/src/main/resources/assets/astraladditions/models/item/shimmering_thread.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "astraladditions:item/shimmering_thread" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/astraladditions/particles/shimmer_bubble.json b/src/main/resources/assets/astraladditions/particles/shimmer_bubble.json new file mode 100644 index 0000000..844a056 --- /dev/null +++ b/src/main/resources/assets/astraladditions/particles/shimmer_bubble.json @@ -0,0 +1,6 @@ +{ + "textures": [ + "astraladditions:shimmer_bubble" + ], + "type": "minecraft:particle" +} \ No newline at end of file diff --git a/src/main/resources/assets/astraladditions/particles/shimmer_splash.json b/src/main/resources/assets/astraladditions/particles/shimmer_splash.json new file mode 100644 index 0000000..b463085 --- /dev/null +++ b/src/main/resources/assets/astraladditions/particles/shimmer_splash.json @@ -0,0 +1,9 @@ +{ + "textures": [ + "astraladditions:shimmer_splash_0", + "astraladditions:shimmer_splash_1", + "astraladditions:shimmer_splash_2", + "astraladditions:shimmer_splash_3" + ], + "type": "minecraft:particle" +} \ No newline at end of file diff --git a/src/main/resources/assets/astraladditions/textures/item/shimmer_fishing_rod.png b/src/main/resources/assets/astraladditions/textures/item/shimmer_fishing_rod.png new file mode 100644 index 0000000..63c49e0 Binary files /dev/null and b/src/main/resources/assets/astraladditions/textures/item/shimmer_fishing_rod.png differ diff --git a/src/main/resources/assets/astraladditions/textures/item/shimmer_fishing_rod_cast.png b/src/main/resources/assets/astraladditions/textures/item/shimmer_fishing_rod_cast.png new file mode 100644 index 0000000..3031439 Binary files /dev/null and b/src/main/resources/assets/astraladditions/textures/item/shimmer_fishing_rod_cast.png differ diff --git a/src/main/resources/assets/astraladditions/textures/item/shimmer_shish.png b/src/main/resources/assets/astraladditions/textures/item/shimmer_shish.png new file mode 100644 index 0000000..a499e0f Binary files /dev/null and b/src/main/resources/assets/astraladditions/textures/item/shimmer_shish.png differ diff --git a/src/main/resources/assets/astraladditions/textures/item/shimmer_trout.png b/src/main/resources/assets/astraladditions/textures/item/shimmer_trout.png new file mode 100644 index 0000000..6eeb744 Binary files /dev/null and b/src/main/resources/assets/astraladditions/textures/item/shimmer_trout.png differ diff --git a/src/main/resources/assets/astraladditions/textures/item/shimmering_thread.png b/src/main/resources/assets/astraladditions/textures/item/shimmering_thread.png new file mode 100644 index 0000000..277d403 Binary files /dev/null and b/src/main/resources/assets/astraladditions/textures/item/shimmering_thread.png differ diff --git a/src/main/resources/assets/astraladditions/textures/particle/shimmer_bubble.png b/src/main/resources/assets/astraladditions/textures/particle/shimmer_bubble.png new file mode 100644 index 0000000..5838da3 Binary files /dev/null and b/src/main/resources/assets/astraladditions/textures/particle/shimmer_bubble.png differ diff --git a/src/main/resources/assets/astraladditions/textures/particle/shimmer_bubble.png.mcmeta b/src/main/resources/assets/astraladditions/textures/particle/shimmer_bubble.png.mcmeta new file mode 100644 index 0000000..5d22856 --- /dev/null +++ b/src/main/resources/assets/astraladditions/textures/particle/shimmer_bubble.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8 + } +} diff --git a/src/main/resources/assets/astraladditions/textures/particle/shimmer_bubble1.png b/src/main/resources/assets/astraladditions/textures/particle/shimmer_bubble1.png new file mode 100644 index 0000000..7e3196d Binary files /dev/null and b/src/main/resources/assets/astraladditions/textures/particle/shimmer_bubble1.png differ diff --git a/src/main/resources/assets/astraladditions/textures/particle/shimmer_splash_0.png b/src/main/resources/assets/astraladditions/textures/particle/shimmer_splash_0.png new file mode 100644 index 0000000..6c990da Binary files /dev/null and b/src/main/resources/assets/astraladditions/textures/particle/shimmer_splash_0.png differ diff --git a/src/main/resources/assets/astraladditions/textures/particle/shimmer_splash_1.png b/src/main/resources/assets/astraladditions/textures/particle/shimmer_splash_1.png new file mode 100644 index 0000000..46c67e7 Binary files /dev/null and b/src/main/resources/assets/astraladditions/textures/particle/shimmer_splash_1.png differ diff --git a/src/main/resources/assets/astraladditions/textures/particle/shimmer_splash_2.png b/src/main/resources/assets/astraladditions/textures/particle/shimmer_splash_2.png new file mode 100644 index 0000000..f47f25a Binary files /dev/null and b/src/main/resources/assets/astraladditions/textures/particle/shimmer_splash_2.png differ diff --git a/src/main/resources/assets/astraladditions/textures/particle/shimmer_splash_3.png b/src/main/resources/assets/astraladditions/textures/particle/shimmer_splash_3.png new file mode 100644 index 0000000..40b09ef Binary files /dev/null and b/src/main/resources/assets/astraladditions/textures/particle/shimmer_splash_3.png differ diff --git a/src/main/resources/astraladditions.mixins.json b/src/main/resources/astraladditions.mixins.json index 003c7e2..9c51b50 100644 --- a/src/main/resources/astraladditions.mixins.json +++ b/src/main/resources/astraladditions.mixins.json @@ -18,12 +18,19 @@ "betterdragon.HoverPhaseAccessor", "betterdragon.LandingPhaseAccessor", "betterdragon.SittingFlamingPhaseAccessor", - "ItemEntityMixin" + "ItemEntityMixin", + "ParticleRecolourMixin", + "fishing.FishingBobberEntityAccessor", + "fishing.FishingBobberEntityMixin", + "fishing.BottomlessBucketItemMixin" + ], + + "client": [ "SpaceMusic" ], "injectors": { "defaultRequire": 1 } -} +} \ No newline at end of file diff --git a/src/main/resources/data/astraladditions/loot_tables/gameplay/fishing/shimmer_fishing.json b/src/main/resources/data/astraladditions/loot_tables/gameplay/fishing/shimmer_fishing.json new file mode 100644 index 0000000..01eea3e --- /dev/null +++ b/src/main/resources/data/astraladditions/loot_tables/gameplay/fishing/shimmer_fishing.json @@ -0,0 +1,35 @@ +{ + "type": "minecraft:loot_table", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:amethyst_shard", + "weight": 10 + }, + { + "type": "minecraft:item", + "name": "minecraft:prismarine_crystals", + "weight": 5 + }, + { + "type": "minecraft:item", + "name": "minecraft:glow_ink_sac", + "weight": 7 + }, + { + "type": "minecraft:item", + "name": "minecraft:name_tag", + "weight": 1 + }, + { + "type": "minecraft:item", + "name": "minecraft:nautilus_shell", + "weight": 2 + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/data/astraladditions/recipes/testing.json b/src/main/resources/data/astraladditions/recipes/testing.json new file mode 100644 index 0000000..5636433 --- /dev/null +++ b/src/main/resources/data/astraladditions/recipes/testing.json @@ -0,0 +1,27 @@ +{ + "type": "astraladditions:shimmer_transmute", + "input": { + "item": "minecraft:iron_ingot", + "count": 2 + }, + + "output": [ + { "item": "minecraft:gold_ingot", "count": 2 }, + { "item": "minecraft:dirt" }, + { "item": "minecraft:sand" }, + { "item": "minecraft:cobblestone" }, + { "item": "minecraft:oak_planks" }, + { "item": "minecraft:stone" }, + { "item": "minecraft:iron_ingot" }, + { "item": "minecraft:glass" }, + { "item": "minecraft:coal" }, + { "item": "minecraft:gravel" }, + { "item": "minecraft:clay" }, + { "item": "minecraft:emerald" }, + { "item": "minecraft:lapis_lazuli" }, + { "item": "minecraft:brick" }, + { "item": "minecraft:redstone" }, + { "item": "minecraft:quartz" } + ] + +} \ No newline at end of file diff --git a/src/main/resources/data/astraladditions/recipes/testing2.json b/src/main/resources/data/astraladditions/recipes/testing2.json new file mode 100644 index 0000000..5820d21 --- /dev/null +++ b/src/main/resources/data/astraladditions/recipes/testing2.json @@ -0,0 +1,14 @@ +{ + "type": "astraladditions:shimmer_transmute", + "input": { + "item": "minecraft:sand", + "ignore_count": true + }, + + "output": [ + { + "item": "minecraft:gold_ingot" + } + ] + +} \ No newline at end of file diff --git a/src/main/resources/data/astraladditions/recipes/testing3.json b/src/main/resources/data/astraladditions/recipes/testing3.json new file mode 100644 index 0000000..3e8ddae --- /dev/null +++ b/src/main/resources/data/astraladditions/recipes/testing3.json @@ -0,0 +1,16 @@ +{ + "type": "astraladditions:shimmer_transmute", + "input": { + "item": "minecraft:dirt", + "soft_ignore_count": true, + "count": 2 + }, + + "output": [ + { + "item": "minecraft:gold_ingot", + "count": 1 + } + ] + +} \ No newline at end of file diff --git a/src/main/resources/data/astraladditions/recipes/transmute/shimmering_thread.json b/src/main/resources/data/astraladditions/recipes/transmute/shimmering_thread.json new file mode 100644 index 0000000..59678fb --- /dev/null +++ b/src/main/resources/data/astraladditions/recipes/transmute/shimmering_thread.json @@ -0,0 +1,13 @@ +{ + "type": "astraladditions:shimmer_transmute", + "input": { + "item": "minecraft:string", + "soft_ignore_count": true, + "count": 16 + }, + + "output": [ + { "item": "astraladditions:shimmering_thread", "count": 1 } + ] + +} \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index f9ee916..c0e1779 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -37,11 +37,10 @@ "mixins": [ "astraladditions.mixins.json" ], - "depends": { "fabricloader": ">=0.14.14", "fabric": "*", "minecraft": "~1.18.2", "java": ">=17" } -} +} \ No newline at end of file