diff --git a/src/client/java/dev/hybridlabs/aquatic/fog/ThalassophobiaFogModifier.java b/src/client/java/dev/hybridlabs/aquatic/fog/ThalassophobiaFogModifier.java deleted file mode 100644 index b4164d39f..000000000 --- a/src/client/java/dev/hybridlabs/aquatic/fog/ThalassophobiaFogModifier.java +++ /dev/null @@ -1,27 +0,0 @@ -package dev.hybridlabs.aquatic.fog; - -import dev.hybridlabs.aquatic.effect.HybridAquaticStatusEffects; -import net.minecraft.client.render.BackgroundRenderer; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.util.math.MathHelper; - -public class ThalassophobiaFogModifier implements BackgroundRenderer.StatusEffectFogModifier { - @Override - public StatusEffect getStatusEffect() { - return HybridAquaticStatusEffects.INSTANCE.getTHALASSOPHOBIA(); - } - - @Override - public void applyStartEndModifier(BackgroundRenderer.FogData fogData, LivingEntity entity, StatusEffectInstance effect, float viewDistance, float tickDelta) { - float f = effect.isInfinite() ? 5.0F : MathHelper.lerp(Math.min(1.0F, (float)effect.getDuration() / 20.0F), viewDistance, 5.0F); - if (fogData.fogType == BackgroundRenderer.FogType.FOG_SKY) { - fogData.fogStart = 0.0F; - fogData.fogEnd = f * 0.8F; - } else { - fogData.fogStart = f * 0.25F; - fogData.fogEnd = f; - } - } -} diff --git a/src/client/java/dev/hybridlabs/aquatic/mixin/client/BackgroundRendererMixin.java b/src/client/java/dev/hybridlabs/aquatic/mixin/client/BackgroundRendererMixin.java index 5cb3987aa..cd09d9c05 100644 --- a/src/client/java/dev/hybridlabs/aquatic/mixin/client/BackgroundRendererMixin.java +++ b/src/client/java/dev/hybridlabs/aquatic/mixin/client/BackgroundRendererMixin.java @@ -1,28 +1,18 @@ package dev.hybridlabs.aquatic.mixin.client; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; -import dev.hybridlabs.aquatic.fog.ThalassophobiaFogModifier; import dev.hybridlabs.aquatic.utils.MeasurementUtils; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.render.BackgroundRenderer; -import net.minecraft.client.render.BackgroundRenderer.BlindnessFogModifier; -import net.minecraft.client.render.BackgroundRenderer.DarknessFogModifier; import net.minecraft.client.render.Camera; import net.minecraft.client.render.CameraSubmersionType; import net.minecraft.client.render.FogShape; import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.registry.tag.BiomeTags; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import net.minecraft.world.biome.Biome; -import dev.hybridlabs.aquatic.effect.HybridAquaticStatusEffects; import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -36,13 +26,6 @@ public class BackgroundRendererMixin { @Shadow private static float red, green, blue; @Mutable @Final @Shadow private static List FOG_MODIFIERS; - @Inject(method = "", at = @At("TAIL")) - private static void hybrid$initInject(CallbackInfo ci) { - List tempList = FOG_MODIFIERS; - tempList.add(new ThalassophobiaFogModifier()); - FOG_MODIFIERS = tempList; - System.out.println(FOG_MODIFIERS); - } // @Inject(method = "render", at=@At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;clearColor(FFFF)V"), locals = LocalCapture.CAPTURE_FAILHARD) // private static void hybrid$fogColor(Camera camera, float tickDelta, ClientWorld world, int viewDistance, float skyDarkness, CallbackInfo ci, CameraSubmersionType cameraSubmersionType, Entity entity) { diff --git a/src/client/kotlin/dev/hybridlabs/aquatic/client/model/entity/KarkinosEntityModel.kt b/src/client/kotlin/dev/hybridlabs/aquatic/client/model/entity/KarkinosEntityModel.kt new file mode 100644 index 000000000..465c3ba93 --- /dev/null +++ b/src/client/kotlin/dev/hybridlabs/aquatic/client/model/entity/KarkinosEntityModel.kt @@ -0,0 +1,5 @@ +package dev.hybridlabs.aquatic.client.model.entity + +import dev.hybridlabs.aquatic.entity.critter.HybridAquaticCritterEntity + +class KarkinosEntityModel : HybridAquaticCritterEntityModel("karkinos") \ No newline at end of file diff --git a/src/client/kotlin/dev/hybridlabs/aquatic/client/render/entity/HybridAquaticEntityRenderers.kt b/src/client/kotlin/dev/hybridlabs/aquatic/client/render/entity/HybridAquaticEntityRenderers.kt index eeac33757..0e63bb8b8 100644 --- a/src/client/kotlin/dev/hybridlabs/aquatic/client/render/entity/HybridAquaticEntityRenderers.kt +++ b/src/client/kotlin/dev/hybridlabs/aquatic/client/render/entity/HybridAquaticEntityRenderers.kt @@ -57,6 +57,7 @@ object HybridAquaticEntityRenderers { //endregion //region critters + val KARKINOS = EntityRendererRegistry.register(HybridAquaticEntityTypes.KARKINOS, ::KarkinosEntityRenderer) val CRAB = EntityRendererRegistry.register(HybridAquaticEntityTypes.CRAB, ::CrabEntityRenderer) val FIDDLER_CRAB = EntityRendererRegistry.register(HybridAquaticEntityTypes.FIDDLER_CRAB, ::FiddlerCrabEntityRenderer) val GHOST_CRAB = EntityRendererRegistry.register(HybridAquaticEntityTypes.GHOST_CRAB, ::GhostCrabEntityRenderer) diff --git a/src/client/kotlin/dev/hybridlabs/aquatic/client/render/entity/KarkinosEntityRenderer.kt b/src/client/kotlin/dev/hybridlabs/aquatic/client/render/entity/KarkinosEntityRenderer.kt new file mode 100644 index 000000000..b99a7af9e --- /dev/null +++ b/src/client/kotlin/dev/hybridlabs/aquatic/client/render/entity/KarkinosEntityRenderer.kt @@ -0,0 +1,27 @@ +package dev.hybridlabs.aquatic.client.render.entity + +import dev.hybridlabs.aquatic.client.model.entity.KarkinosEntityModel +import dev.hybridlabs.aquatic.entity.critter.HybridAquaticCritterEntity +import net.minecraft.client.render.VertexConsumerProvider +import net.minecraft.client.render.entity.EntityRendererFactory.Context +import net.minecraft.client.util.math.MatrixStack +import software.bernie.geckolib.renderer.GeoEntityRenderer + +class KarkinosEntityRenderer(context: Context) : GeoEntityRenderer(context, KarkinosEntityModel()) { + override fun render( + entity: HybridAquaticCritterEntity?, + entityYaw: Float, + partialTick: Float, + poseStack: MatrixStack?, + bufferSource: VertexConsumerProvider?, + packedLight: Int + ) { + val size = HybridAquaticCritterEntity.getScaleAdjustment(entity!!, 0.05f) + poseStack!!.scale(size, size, size) + super.render(entity, entityYaw, partialTick, poseStack, bufferSource, packedLight) + } + + override fun getMotionAnimThreshold(animatable: HybridAquaticCritterEntity?): Float { + return 0.0025f + } +} \ No newline at end of file diff --git a/src/client/kotlin/dev/hybridlabs/aquatic/client/render/entity/WhaleSharkEntityRenderer.kt b/src/client/kotlin/dev/hybridlabs/aquatic/client/render/entity/WhaleSharkEntityRenderer.kt index d4a6a38f9..a8640263a 100644 --- a/src/client/kotlin/dev/hybridlabs/aquatic/client/render/entity/WhaleSharkEntityRenderer.kt +++ b/src/client/kotlin/dev/hybridlabs/aquatic/client/render/entity/WhaleSharkEntityRenderer.kt @@ -6,11 +6,7 @@ import net.minecraft.client.render.VertexConsumerProvider import net.minecraft.client.render.entity.EntityRendererFactory.Context import net.minecraft.client.util.math.MatrixStack import software.bernie.geckolib.renderer.GeoEntityRenderer -import software.bernie.geckolib.renderer.layer.AutoGlowingGeoLayer class WhaleSharkEntityRenderer(context: Context) : GeoEntityRenderer(context, WhaleSharkEntityModel()) { - init { - addRenderLayer(AutoGlowingGeoLayer(this)) - } override fun render( entity: HybridAquaticSharkEntity?, entityYaw: Float, diff --git a/src/generated/resources/data/hybrid-aquatic/loot_tables/entities/crayfish.json b/src/generated/resources/data/hybrid-aquatic/loot_tables/entities/crayfish.json new file mode 100644 index 000000000..036d1bdc9 --- /dev/null +++ b/src/generated/resources/data/hybrid-aquatic/loot_tables/entities/crayfish.json @@ -0,0 +1,48 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "conditions": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "flags": { + "is_on_fire": true + } + } + } + ], + "function": "minecraft:furnace_smelt" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + }, + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "hybrid-aquatic:crab_claw" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/hybrid-aquatic/loot_tables/entities/lobster.json b/src/generated/resources/data/hybrid-aquatic/loot_tables/entities/lobster.json new file mode 100644 index 000000000..036d1bdc9 --- /dev/null +++ b/src/generated/resources/data/hybrid-aquatic/loot_tables/entities/lobster.json @@ -0,0 +1,48 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "conditions": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "flags": { + "is_on_fire": true + } + } + } + ], + "function": "minecraft:furnace_smelt" + }, + { + "count": { + "type": "minecraft:uniform", + "max": 1.0, + "min": 0.0 + }, + "function": "minecraft:looting_enchant" + }, + { + "add": false, + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + } + ], + "name": "hybrid-aquatic:crab_claw" + } + ], + "rolls": 1.0 + } + ] +} \ No newline at end of file diff --git a/src/main/kotlin/dev/hybridlabs/aquatic/data/server/loot/EntityTypeLootTableProvider.kt b/src/main/kotlin/dev/hybridlabs/aquatic/data/server/loot/EntityTypeLootTableProvider.kt index 06579dadd..a3de0d43c 100644 --- a/src/main/kotlin/dev/hybridlabs/aquatic/data/server/loot/EntityTypeLootTableProvider.kt +++ b/src/main/kotlin/dev/hybridlabs/aquatic/data/server/loot/EntityTypeLootTableProvider.kt @@ -152,6 +152,30 @@ class EntityTypeLootTableProvider(output: FabricDataOutput) : SimpleFabricLootTa ) } + export(exporter, HybridAquaticEntityTypes.LOBSTER) { + pool( + LootPool.builder() + .with( + ItemEntry.builder(HybridAquaticItems.CRAB_CLAW) + .apply(FurnaceSmeltLootFunction.builder().conditionally(EntityPropertiesLootCondition.builder(LootContext.EntityTarget.THIS, NEEDS_ENTITY_ON_FIRE))) + .apply(LootingEnchantLootFunction.builder(UniformLootNumberProvider.create(0.0F, 1.0F))) + .apply(SetCountLootFunction.builder(UniformLootNumberProvider.create(1.0F, 2.0F))) + ) + ) + } + + export(exporter, HybridAquaticEntityTypes.CRAYFISH) { + pool( + LootPool.builder() + .with( + ItemEntry.builder(HybridAquaticItems.CRAB_CLAW) + .apply(FurnaceSmeltLootFunction.builder().conditionally(EntityPropertiesLootCondition.builder(LootContext.EntityTarget.THIS, NEEDS_ENTITY_ON_FIRE))) + .apply(LootingEnchantLootFunction.builder(UniformLootNumberProvider.create(0.0F, 1.0F))) + .apply(SetCountLootFunction.builder(UniformLootNumberProvider.create(1.0F, 2.0F))) + ) + ) + } + // cephalopods export(exporter, HybridAquaticEntityTypes.VAMPIRE_SQUID) { pool( diff --git a/src/main/kotlin/dev/hybridlabs/aquatic/entity/HybridAquaticEntityTypes.kt b/src/main/kotlin/dev/hybridlabs/aquatic/entity/HybridAquaticEntityTypes.kt index 5579574e0..05bbf2c11 100644 --- a/src/main/kotlin/dev/hybridlabs/aquatic/entity/HybridAquaticEntityTypes.kt +++ b/src/main/kotlin/dev/hybridlabs/aquatic/entity/HybridAquaticEntityTypes.kt @@ -382,6 +382,13 @@ object HybridAquaticEntityTypes { YetiCrabEntity.createMobAttributes() ) + val KARKINOS = registerCritter( + "karkinos", + ::KarkinosEntity, + EntityDimensions.fixed(2.25f, 1.25f), + KarkinosEntity.createMobAttributes() + ) + //critters diff --git a/src/main/kotlin/dev/hybridlabs/aquatic/entity/critter/KarkinosEntity.kt b/src/main/kotlin/dev/hybridlabs/aquatic/entity/critter/KarkinosEntity.kt new file mode 100644 index 000000000..e26c61ad6 --- /dev/null +++ b/src/main/kotlin/dev/hybridlabs/aquatic/entity/critter/KarkinosEntity.kt @@ -0,0 +1,81 @@ +package dev.hybridlabs.aquatic.entity.critter + +import net.minecraft.enchantment.EnchantmentHelper +import net.minecraft.enchantment.Enchantments +import net.minecraft.entity.EntityType +import net.minecraft.entity.attribute.DefaultAttributeContainer +import net.minecraft.entity.attribute.EntityAttributes +import net.minecraft.entity.mob.WaterCreatureEntity +import net.minecraft.entity.player.PlayerEntity +import net.minecraft.world.Difficulty +import net.minecraft.world.World +import software.bernie.geckolib.core.animatable.GeoAnimatable +import software.bernie.geckolib.core.animation.AnimationState +import software.bernie.geckolib.core.`object`.PlayState + +class KarkinosEntity(entityType: EntityType, world: World) : + HybridAquaticCrabEntity(entityType, world) { + + private var isFlipped: Boolean = false + private var flipTimer: Int = 0 + + companion object { + fun createMobAttributes(): DefaultAttributeContainer.Builder { + return WaterCreatureEntity.createMobAttributes() + .add(EntityAttributes.GENERIC_MAX_HEALTH, 100.0) + .add(EntityAttributes.GENERIC_MOVEMENT_SPEED, 0.6) + .add(EntityAttributes.GENERIC_ATTACK_DAMAGE, 4.0) + .add(EntityAttributes.GENERIC_FOLLOW_RANGE, 32.0) + .add(EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE, 100.0) + } + } + + private fun beFlipped() { + isFlipped = true + flipTimer = 100 + } + + override fun damage(source: net.minecraft.entity.damage.DamageSource?, amount: Float): Boolean { + val damaged = super.damage(source, amount) + + if (damaged && source?.source is PlayerEntity && !isFlipped) { + val player = source.source as PlayerEntity + val heldItem = player.mainHandStack + + if (EnchantmentHelper.getLevel(Enchantments.BANE_OF_ARTHROPODS, heldItem) > 2 || + (EnchantmentHelper.getLevel(Enchantments.RIPTIDE, heldItem) > 0) + ) { + beFlipped() + } + } + + return damaged + } + + override fun checkDespawn() { + if (world.difficulty == Difficulty.PEACEFUL && this.isDisallowedInPeaceful) { + discard() + } else { + despawnCounter = 0 + } + } + + override fun isPushable(): Boolean = + this.isFlipped + + + + override fun predicate(event: AnimationState): PlayState { + if (isFlipped) { + event.controller.setAnimation(FLIPPED_ANIMATION) + return PlayState.CONTINUE + } + + return super.predicate(event) + } + + + override fun getMovementSpeed(): Float { + return if (isFlipped) 0.0f else super.getMovementSpeed() + } +} \ No newline at end of file diff --git a/src/main/kotlin/dev/hybridlabs/aquatic/entity/fish/SeahorseEntity.kt b/src/main/kotlin/dev/hybridlabs/aquatic/entity/fish/SeahorseEntity.kt index 36bf11686..aad00bab1 100644 --- a/src/main/kotlin/dev/hybridlabs/aquatic/entity/fish/SeahorseEntity.kt +++ b/src/main/kotlin/dev/hybridlabs/aquatic/entity/fish/SeahorseEntity.kt @@ -4,15 +4,11 @@ import net.minecraft.entity.EntityType import net.minecraft.entity.attribute.DefaultAttributeContainer import net.minecraft.entity.attribute.EntityAttributes import net.minecraft.entity.mob.WaterCreatureEntity -import net.minecraft.registry.tag.BlockTags -import net.minecraft.util.math.BlockPos import net.minecraft.world.World class SeahorseEntity(entityType: EntityType, world: World) : HybridAquaticFishEntity(entityType, world, 6) { - private var targetCoralPos: BlockPos? = null - companion object { fun createMobAttributes(): DefaultAttributeContainer.Builder { return WaterCreatureEntity.createMobAttributes() @@ -28,44 +24,4 @@ class SeahorseEntity(entityType: EntityType, world: World) : override fun getMinSize(): Int { return -5 } - - override fun tick() { - super.tick() - - if (targetCoralPos == null || world.getBlockState(targetCoralPos).isIn(BlockTags.CORAL_PLANTS)) { - targetCoralPos = findNearbyCoralBlock() - } - - if (targetCoralPos != null) { - val distanceToCoral = distanceTo(targetCoralPos!!) - - if (distanceToCoral > 5.0) { - navigateToCoral(targetCoralPos!!) - } - } - } - - private fun navigateToCoral(coralBlockPos: BlockPos) { - this.navigation.startMovingTo(coralBlockPos.x.toDouble(), coralBlockPos.y.toDouble(), coralBlockPos.z.toDouble(), this.getAttributeValue(EntityAttributes.GENERIC_MOVEMENT_SPEED)) - } - - private fun findNearbyCoralBlock(): BlockPos? { - for (i in -16..16) { - for (j in -16..16) { - for (k in -16..16) { - val blockPos = BlockPos((x + i).toInt(), (y + j).toInt(), (z + k).toInt()) - val blockState = world.getBlockState(blockPos) - - if (blockState.isIn(BlockTags.CORAL_PLANTS)) { - return blockPos - } - } - } - } - return null - } - - private fun distanceTo(pos: BlockPos): Double { - return this.blockPos.getSquaredDistance(pos.x.toDouble(), pos.y.toDouble(), pos.z.toDouble()) - } } \ No newline at end of file diff --git a/src/main/resources/assets/hybrid-aquatic/animations/karkinos.animation.json b/src/main/resources/assets/hybrid-aquatic/animations/karkinos.animation.json new file mode 100644 index 000000000..8090bd4e5 --- /dev/null +++ b/src/main/resources/assets/hybrid-aquatic/animations/karkinos.animation.json @@ -0,0 +1,1043 @@ +{ +"format_version": "1.8.0", +"animations": { +"idle": { +"loop": true, +"animation_length": 3, +"bones": { +"right_arm_1": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"1.5": { +"vector": [0, -5, 0] +}, +"3.0": { +"vector": [0, 0, 0] +} +} +}, +"left_arm_1": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"1.5": { +"vector": [0, 5, 0] +}, +"3.0": { +"vector": [0, 0, 0] +} +} +} +} +}, +"walk": { +"loop": true, +"animation_length": 1, +"bones": { +"right_leg_1": { +"rotation": { +"0.0": { +"vector": [0, 22.5, 0] +}, +"0.25": { +"vector": [0, 0, 22.5] +}, +"0.5": { +"vector": [-22.5, -22.5, 22.5] +}, +"0.75": { +"vector": [0, -22.5, 0] +}, +"1.0": { +"vector": [0, 22.5, 0] +} +} +}, +"left_leg_1": { +"rotation": { +"0.0": { +"vector": [0, -22.5, 0] +}, +"0.25": { +"vector": [0, 0, -22.5] +}, +"0.5": { +"vector": [-22.5, 22.5, -22.5] +}, +"0.75": { +"vector": [0, 22.5, 0] +}, +"1.0": { +"vector": [0, -22.5, 0] +} +} +}, +"right_leg_2": { +"rotation": { +"0.0": { +"vector": [0, -22.5, 0] +}, +"0.25": { +"vector": [0, 0, 0] +}, +"0.5": { +"vector": [0, 0, 22.5] +}, +"0.75": { +"vector": [-22.5, -22.5, 22.5] +}, +"1.0": { +"vector": [0, -22.5, 0] +} +} +}, +"left_leg_2": { +"rotation": { +"0.0": { +"vector": [0, 22.5, 0] +}, +"0.25": { +"vector": [0, 0, 0] +}, +"0.5": { +"vector": [0, 0, -22.5] +}, +"0.75": { +"vector": [-22.5, 22.5, -22.5] +}, +"1.0": { +"vector": [0, 22.5, 0] +} +} +}, +"right_leg_3": { +"rotation": { +"0.0": { +"vector": [0, -45, 22.5] +}, +"0.25": { +"vector": [0, -45, 0] +}, +"0.5": { +"vector": [0, 0, 0] +}, +"0.75": { +"vector": [-22.5, -22.5, 22.5] +}, +"1.0": { +"vector": [0, -45, 22.5] +} +} +}, +"left_leg_3": { +"rotation": { +"0.0": { +"vector": [0, 45, -22.5] +}, +"0.25": { +"vector": [0, 45, 0] +}, +"0.5": { +"vector": [0, 0, 0] +}, +"0.75": { +"vector": [-22.5, 22.5, -22.5] +}, +"1.0": { +"vector": [0, 45, -22.5] +} +} +}, +"right_leg_4": { +"rotation": { +"0.0": { +"vector": [20.94102, -26.71053, 30.36119] +}, +"0.25": { +"vector": [9.00717, -46.79519, 24.14867] +}, +"0.5": { +"vector": [0, -45, 0] +}, +"0.75": { +"vector": [0, -22.5, 0] +}, +"1.0": { +"vector": [20.94102, -26.71053, 30.36119] +} +} +}, +"left_leg_4": { +"rotation": { +"0.0": { +"vector": [20.94102, 26.71053, -30.36119] +}, +"0.25": { +"vector": [9.00717, 46.79519, -24.14867] +}, +"0.5": { +"vector": [0, 45, 0] +}, +"0.75": { +"vector": [0, 22.5, 0] +}, +"1.0": { +"vector": [20.94102, 26.71053, -30.36119] +} +} +}, +"left_arm_2": { +"rotation": { +"0.0": { +"vector": [0, 22.5, 0] +}, +"0.5": { +"vector": [0, 15, 0] +}, +"1.0": { +"vector": [0, 22.5, 0] +} +} +}, +"right_arm_2": { +"rotation": { +"0.0": { +"vector": [0, -22.5, 0] +}, +"0.5": { +"vector": [0, -15, 0] +}, +"1.0": { +"vector": [0, -22.5, 0] +} +} +}, +"body": { +"rotation": { +"0.0": { +"vector": [-2.5, 0, 0] +}, +"0.5": { +"vector": [0, 0, 0] +}, +"1.0": { +"vector": [-2.5, 0, 0] +} +} +} +} +}, +"attack_left": { +"loop": true, +"animation_length": 1, +"bones": { +"body": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.5": { +"vector": [0, -5, 0] +}, +"0.75": { +"vector": [0, 5, 0] +}, +"1.0": { +"vector": [0, 0, 0] +} +} +}, +"left_arm_1": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.5417": { +"vector": [0, -35, 0] +}, +"0.75": { +"vector": [7.5, 0, 0] +}, +"1.0": { +"vector": [0, 0, 0] +} +} +}, +"left_arm_2": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.5417": { +"vector": [0, 5, 0] +}, +"0.75": { +"vector": [2.5, -15, 0] +}, +"1.0": { +"vector": [0, 0, 0] +} +} +}, +"left_claw": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.5": { +"vector": [0, 0, -45] +}, +"0.75": { +"vector": [0, 0, 0] +}, +"1.0": { +"vector": [0, 0, 0] +} +} +} +} +}, +"attack_right": { +"loop": true, +"animation_length": 1, +"bones": { +"body": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.5": { +"vector": [0, 5, 0] +}, +"0.75": { +"vector": [0, -5, 0] +}, +"1.0": { +"vector": [0, 0, 0] +} +} +}, +"right_arm_1": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.5417": { +"vector": [0, 35, 0] +}, +"0.75": { +"vector": [7.5, 0, 0] +}, +"1.0": { +"vector": [0, 0, 0] +} +} +}, +"right_arm_2": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.5417": { +"vector": [0, -5, 0] +}, +"0.75": { +"vector": [2.5, 15, 0] +}, +"1.0": { +"vector": [0, 0, 0] +} +} +}, +"right_claw": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.5": { +"vector": [0, 0, 45] +}, +"0.75": { +"vector": [0, 0, 0] +}, +"1.0": { +"vector": [0, 0, 0] +} +} +} +} +}, +"spit": { +"loop": true, +"animation_length": 1, +"bones": { +"body": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.3333": { +"vector": [5, 0, 0] +}, +"1.0": { +"vector": [0, 0, 0] +} +} +}, +"left_arm_1": { +"rotation": { +"0.0": { +"vector": [0, 22.5, 0] +}, +"0.3333": { +"vector": [0, -22.5, 0] +}, +"1.0": { +"vector": [0, 22.5, 0] +} +} +}, +"left_leg_2": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.3333": { +"vector": [-5, 0, 0] +}, +"1.0": { +"vector": [0, 0, 0] +} +} +}, +"left_leg_3": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.3333": { +"vector": [-8.5168, 0.34836, 7.67626] +}, +"1.0": { +"vector": [0, 0, 0] +} +} +}, +"left_leg_4": { +"rotation": { +"0.0": { +"vector": [0, 0, 25.30064] +}, +"0.3333": { +"vector": [-26.3261, 2.36489, 25.30064] +}, +"1.0": { +"vector": [0, 0, 25.30064] +} +} +}, +"left_mouthpiece": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.3333": { +"vector": [0, -67.5, 0] +}, +"1.0": { +"vector": [0, 0, 0] +} +} +}, +"right_arm_1": { +"rotation": { +"0.0": { +"vector": [0, -22.5, 0] +}, +"0.3333": { +"vector": [0, 22.5, 0] +}, +"1.0": { +"vector": [0, -22.5, 0] +} +} +}, +"right_leg_2": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.3333": { +"vector": [-5, 0, 0] +}, +"1.0": { +"vector": [0, 0, 0] +} +} +}, +"right_leg_3": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.3333": { +"vector": [-8.5168, -0.34836, -7.67626] +}, +"1.0": { +"vector": [0, 0, 0] +} +} +}, +"right_leg_4": { +"rotation": { +"0.0": { +"vector": [0, 0, -25.30064] +}, +"0.3333": { +"vector": [-26.3261, -2.36489, -25.30064] +}, +"1.0": { +"vector": [0, 0, -25.30064] +} +} +}, +"right_mouthpiece": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.3333": { +"vector": [0, 67.5, 0] +}, +"1.0": { +"vector": [0, 0, 0] +} +} +} +} +}, +"block": { +"loop": true, +"animation_length": 2, +"bones": { +"left_arm_2": { +"rotation": { +"0.0": { +"vector": [57.04902, 21.55151, 59.26162] +}, +"1.0": { +"vector": [48.48527, 18.51654, 49.82228] +}, +"2.0": { +"vector": [57.04902, 21.55151, 59.26162] +} +} +}, +"right_arm_1": { +"rotation": { +"vector": [0, -22.5, 0] +} +}, +"right_arm_2": { +"rotation": { +"0.0": { +"vector": [32.67199, -9.17273, -35.40187] +}, +"1.0": { +"vector": [29.36799, -4.88529, -31.21432] +}, +"2.0": { +"vector": [32.67199, -9.17273, -35.40187] +} +} +} +} +}, +"flipped": { +"loop": true, +"animation_length": 0.5, +"bones": { +"body": { +"rotation": { +"0.0": { +"vector": [-170.00933, 0.43399, -2.46207] +}, +"0.25": { +"vector": [-170.00933, -0.43399, 2.46207] +}, +"0.5": { +"vector": [-170.00933, 0.43399, -2.46207] +} +}, +"position": { +"vector": [0, -3.5, 0] +} +}, +"left_arm_1": { +"rotation": { +"0.0": { +"vector": [22.5, 0, 0] +}, +"0.25": { +"vector": [0, 0, 0] +}, +"0.5": { +"vector": [22.5, 0, 0] +} +} +}, +"left_arm_2": { +"rotation": { +"0.0": { +"vector": [-12.5, 0, -22.5] +}, +"0.25": { +"vector": [0, 0, 0] +}, +"0.5": { +"vector": [-12.5, 0, -22.5] +} +} +}, +"left_claw": { +"rotation": { +"0.0": { +"vector": [0, 0, -45] +}, +"0.25": { +"vector": [0, 0, 0] +}, +"0.5": { +"vector": [0, 0, -45] +} +} +}, +"left_leg_2": { +"rotation": { +"0.0": { +"vector": [0, 0, 22.5] +}, +"0.25": { +"vector": [0, 0, 0] +}, +"0.5": { +"vector": [0, 0, 22.5] +} +} +}, +"left_leg_1": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.25": { +"vector": [0, 0, 22.5] +}, +"0.5": { +"vector": [0, 0, 0] +} +} +}, +"left_leg_3": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.25": { +"vector": [0, 0, 22.5] +}, +"0.5": { +"vector": [0, 0, 0] +} +} +}, +"left_leg_4": { +"rotation": { +"0.0": { +"vector": [-54.12437, 14.60696, 58.37563] +}, +"0.25": { +"vector": [0, 0, 0] +}, +"0.5": { +"vector": [-54.12437, 14.60696, 58.37563] +} +} +}, +"left_mouthpiece": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.25": { +"vector": [0, -22.5, 0] +}, +"0.5": { +"vector": [0, 0, 0] +} +} +}, +"right_arm_1": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.25": { +"vector": [22.5, 0, 0] +}, +"0.5": { +"vector": [0, 0, 0] +} +} +}, +"right_arm_2": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.25": { +"vector": [-15, 0, 22.5] +}, +"0.5": { +"vector": [0, 0, 0] +} +} +}, +"right_claw": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.25": { +"vector": [0, 0, 45] +}, +"0.5": { +"vector": [0, 0, 0] +} +} +}, +"right_leg_1": { +"rotation": { +"0.0": { +"vector": [0, 0, -22.5] +}, +"0.25": { +"vector": [0, 0, 0] +}, +"0.5": { +"vector": [0, 0, -22.5] +} +} +}, +"right_leg_2": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.25": { +"vector": [0, 0, -22.5] +}, +"0.5": { +"vector": [0, 0, 0] +} +} +}, +"right_leg_3": { +"rotation": { +"0.0": { +"vector": [0, 0, -22.5] +}, +"0.25": { +"vector": [0, 0, 0] +}, +"0.5": { +"vector": [0, 0, -22.5] +} +} +}, +"right_leg_4": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.25": { +"vector": [-54.12437, -14.60696, -58.37563] +}, +"0.5": { +"vector": [0, 0, 0] +} +} +}, +"right_mouthpiece": { +"rotation": { +"0.0": { +"vector": [0, 22.5, 0] +}, +"0.25": { +"vector": [0, 0, 0] +}, +"0.5": { +"vector": [0, 22.5, 0] +} +} +} +} +}, +"death": { +"loop": "hold_on_last_frame", +"animation_length": 0.75, +"bones": { +"body": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.25": { +"vector": [-5, 0, 0] +}, +"0.75": { +"vector": [0, 0, 0] +} +}, +"position": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.25": { +"vector": [0, 0, 0] +}, +"0.75": { +"vector": [0, -4, 0] +} +} +}, +"left_arm_1": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.75": { +"vector": [0, -22.5, 0] +} +} +}, +"left_arm_2": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.375": { +"vector": [0, 0, 22.5] +}, +"0.75": { +"vector": [0, 0, 0] +} +} +}, +"left_claw": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.375": { +"vector": [0, 0, -45] +}, +"0.75": { +"vector": [0, 0, 0] +} +} +}, +"left_eye": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.375": { +"vector": [0, 0, -22.5] +}, +"0.75": { +"vector": [0, 0, 45] +} +} +}, +"left_leg_2": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.25": { +"vector": [4.99527, -0.21782, -0.0095] +}, +"0.75": { +"vector": [0, 0, -20] +} +} +}, +"left_leg_1": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.25": { +"vector": [5, 0, 2.5] +}, +"0.75": { +"vector": [0, 0, -22.5] +} +} +}, +"left_leg_3": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.25": { +"vector": [6.46247, -0.19537, -4.80035] +}, +"0.75": { +"vector": [0, 0, -22.5] +} +} +}, +"left_leg_4": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.25": { +"vector": [21.32437, 2.472, -19.96582] +}, +"0.75": { +"vector": [40.75099, 5.32056, -42.60557] +} +} +}, +"left_mouthpiece": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.75": { +"vector": [0, -22.5, 0] +} +} +}, +"right_arm_1": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.75": { +"vector": [0, 22.5, 0] +} +} +}, +"right_arm_2": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.375": { +"vector": [0, 0, -22.5] +}, +"0.75": { +"vector": [0, 0, 0] +} +} +}, +"right_claw": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.375": { +"vector": [0, 0, 45] +}, +"0.75": { +"vector": [0, 0, 0] +} +} +}, +"right_eye": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.375": { +"vector": [0, 0, 22.5] +}, +"0.75": { +"vector": [0, 0, -45] +} +} +}, +"right_leg_1": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.25": { +"vector": [5, 0, -2.5] +}, +"0.75": { +"vector": [0, 0, 22.5] +} +} +}, +"right_leg_2": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.25": { +"vector": [4.99527, 0.21782, 0.0095] +}, +"0.75": { +"vector": [0, 0, 20] +} +} +}, +"right_leg_3": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.25": { +"vector": [6.46247, 0.19537, 4.80035] +}, +"0.75": { +"vector": [0, 0, 22.5] +} +} +}, +"right_leg_4": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.25": { +"vector": [21.32437, -2.472, 19.96582] +}, +"0.75": { +"vector": [40.75099, -5.32056, 42.60557] +} +} +}, +"right_mouthpiece": { +"rotation": { +"0.0": { +"vector": [0, 0, 0] +}, +"0.75": { +"vector": [0, 22.5, 0] +} +} +} +} +} +}, +"geckolib_format_version": 2 +} \ No newline at end of file diff --git a/src/main/resources/assets/hybrid-aquatic/geo/karkinos.geo.json b/src/main/resources/assets/hybrid-aquatic/geo/karkinos.geo.json new file mode 100644 index 000000000..4d8a3ab91 --- /dev/null +++ b/src/main/resources/assets/hybrid-aquatic/geo/karkinos.geo.json @@ -0,0 +1,183 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.unknown", + "texture_width": 128, + "texture_height": 128, + "visible_bounds_width": 4, + "visible_bounds_height": 2.5, + "visible_bounds_offset": [0, 0.75, 0] + }, + "bones": [ + { + "name": "body", + "pivot": [0, 9.85685, 1.4562], + "cubes": [ + {"origin": [-16, 6.5, -11], "size": [32, 8, 25], "pivot": [-3, 9, 11.5], "rotation": [-10, 0, 0], "uv": [0, 0]}, + {"origin": [-13, 4, -10.5], "size": [26, 7, 23], "uv": [0, 33]} + ] + }, + { + "name": "left_arm_1", + "parent": "body", + "pivot": [8, 7, -6], + "rotation": [0, -112.5, 0], + "cubes": [ + {"origin": [0, 3, -13.5], "size": [8, 6, 7], "uv": [55, 83]} + ] + }, + { + "name": "left_arm_2", + "parent": "left_arm_1", + "pivot": [0, 8, -14], + "rotation": [0, 45, 0], + "cubes": [ + {"origin": [-10, 1.5, -14], "size": [10, 9, 8], "uv": [0, 63]}, + {"origin": [-20, 4, -13.5], "size": [10, 6, 7], "uv": [36, 63]} + ] + }, + { + "name": "left_claw", + "parent": "left_arm_2", + "pivot": [-10, 5, -10], + "cubes": [ + {"origin": [-18, 3, -12.5], "size": [8, 3, 5], "uv": [75, 47]} + ] + }, + { + "name": "left_eye", + "parent": "body", + "pivot": [1.5, 8.25, -10.5], + "rotation": [22.5, 0, 22.5], + "cubes": [ + {"origin": [-0.09567, 8.46339, -10.41161], "size": [3, 8, 3], "uv": [0, 8]} + ] + }, + { + "name": "left_leg_2", + "parent": "body", + "pivot": [12, 6, 3], + "cubes": [ + {"origin": [12, 0, 2], "size": [11, 8, 4], "uv": [84, 63]} + ] + }, + { + "name": "left_leg_1", + "parent": "body", + "pivot": [12, 7, -1], + "rotation": [0, 22.5, 0], + "cubes": [ + {"origin": [12, 0, -3], "size": [11, 10, 4], "uv": [75, 33]} + ] + }, + { + "name": "left_leg_3", + "parent": "body", + "pivot": [12, 5, 8.5], + "rotation": [0, -22.5, 0], + "cubes": [ + {"origin": [12, 0, 7.5], "size": [11, 7, 4], "uv": [89, 0]} + ] + }, + { + "name": "left_leg_4", + "parent": "body", + "pivot": [8, 4, 11], + "rotation": [0, -67.5, 0], + "cubes": [ + {"origin": [8, 0, 10], "size": [11, 6, 4], "uv": [26, 92]} + ] + }, + { + "name": "left_mouthpiece", + "parent": "body", + "pivot": [4.35, 7, -10], + "cubes": [ + {"origin": [0, 3.9924, -11], "size": [4, 5, 1], "uv": [0, 19]} + ] + }, + { + "name": "right_arm_1", + "parent": "body", + "pivot": [-8, 7, -6], + "rotation": [0, 112.5, 0], + "cubes": [ + {"origin": [-8, 3, -13.5], "size": [8, 6, 7], "uv": [0, 80]} + ] + }, + { + "name": "right_arm_2", + "parent": "right_arm_1", + "pivot": [0, 8, -14], + "rotation": [0, -45, 0], + "cubes": [ + {"origin": [0, 2.5, -14], "size": [7, 7, 8], "uv": [62, 68]}, + {"origin": [7, 4, -13.5], "size": [6, 5, 7], "uv": [0, 93]} + ] + }, + { + "name": "right_claw", + "parent": "right_arm_2", + "pivot": [7, 6, -10], + "cubes": [ + {"origin": [7, 3, -12.5], "size": [5, 3, 5], "uv": [0, 0]} + ] + }, + { + "name": "right_eye", + "parent": "body", + "pivot": [-1.5, 8.25, -10.5], + "rotation": [22.5, 0, -22.5], + "cubes": [ + {"origin": [-2.90433, 8.46339, -10.41161], "size": [3, 8, 3], "uv": [12, 8]} + ] + }, + { + "name": "right_leg_1", + "parent": "body", + "pivot": [-12, 7, -1], + "rotation": [0, -22.5, 0], + "cubes": [ + {"origin": [-23, 0, -3], "size": [11, 10, 4], "uv": [32, 76]} + ] + }, + { + "name": "right_leg_2", + "parent": "body", + "pivot": [-12, 6, 3], + "cubes": [ + {"origin": [-23, 0, 2], "size": [11, 8, 4], "uv": [85, 83]} + ] + }, + { + "name": "right_leg_3", + "parent": "body", + "pivot": [-12, 5, 8.5], + "rotation": [0, 22.5, 0], + "cubes": [ + {"origin": [-23, 0, 7.5], "size": [11, 7, 4], "uv": [89, 11]} + ] + }, + { + "name": "right_leg_4", + "parent": "body", + "pivot": [-8, 4, 11], + "rotation": [0, 67.5, 0], + "cubes": [ + {"origin": [-19, 0, 10], "size": [11, 6, 4], "uv": [81, 95]} + ] + }, + { + "name": "right_mouthpiece", + "parent": "body", + "pivot": [-4.35, 7, -10], + "cubes": [ + {"origin": [-4, 3.9924, -11], "size": [4, 5, 1], "uv": [10, 19]} + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/hybrid-aquatic/textures/entity/karkinos.png b/src/main/resources/assets/hybrid-aquatic/textures/entity/karkinos.png new file mode 100644 index 000000000..5f9db0c5a Binary files /dev/null and b/src/main/resources/assets/hybrid-aquatic/textures/entity/karkinos.png differ diff --git a/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_blue.png b/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_blue.png index fcf43ae61..94e37b6dc 100644 Binary files a/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_blue.png and b/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_blue.png differ diff --git a/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_green.png b/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_green.png index 97bf31801..88d3ce977 100644 Binary files a/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_green.png and b/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_green.png differ diff --git a/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_orange.png b/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_orange.png index ccc19d2a3..0a7449eed 100644 Binary files a/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_orange.png and b/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_orange.png differ diff --git a/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_pink.png b/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_pink.png index 3e642f245..9c43e7fe0 100644 Binary files a/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_pink.png and b/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_pink.png differ diff --git a/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_purple.png b/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_purple.png index 75e18b96f..6a68742a0 100644 Binary files a/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_purple.png and b/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_purple.png differ diff --git a/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_yellow.png b/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_yellow.png index 7af20b676..2eaf2e805 100644 Binary files a/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_yellow.png and b/src/main/resources/assets/hybrid-aquatic/textures/entity/seahorse_yellow.png differ diff --git a/src/main/resources/assets/hybrid-aquatic/textures/entity/whale_shark_glowmask.png b/src/main/resources/assets/hybrid-aquatic/textures/entity/whale_shark_glowmask.png deleted file mode 100644 index 57562deae..000000000 Binary files a/src/main/resources/assets/hybrid-aquatic/textures/entity/whale_shark_glowmask.png and /dev/null differ