Skip to content

Commit

Permalink
More ray stuff, still needs a lot of work
Browse files Browse the repository at this point in the history
  • Loading branch information
MysticKoko committed Jun 21, 2024
1 parent e3ae6d8 commit 132f947
Show file tree
Hide file tree
Showing 14 changed files with 592 additions and 101 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package dev.hybridlabs.aquatic.client.model.entity.fish

import dev.hybridlabs.aquatic.HybridAquatic
import dev.hybridlabs.aquatic.entity.fish.ray.HybridAquaticRayEntity
import dev.hybridlabs.aquatic.entity.fish.ray.HybridAquaticRayEntity.RayVariant.Ignore.*
import net.minecraft.client.MinecraftClient
import net.minecraft.client.render.entity.model.EntityModelPartNames
import net.minecraft.util.Identifier
import net.minecraft.util.math.MathHelper
import software.bernie.geckolib.core.animation.AnimationState
import software.bernie.geckolib.model.GeoModel

abstract class HybridAquaticRayEntityModel<T: HybridAquaticRayEntity> (private val id: String) : GeoModel<T>() {
override fun getModelResource(animatable: T?): Identifier {
val variant = animatable?.variant
if (variant != null && !variant.ignore.contains(MODEL))
return Identifier(HybridAquatic.MOD_ID, "geo/${id}_${variant.getProvidedVariant(animatable)}.geo.json")
return Identifier(HybridAquatic.MOD_ID, "geo/$id.geo.json")
}

override fun getTextureResource(animatable: T?): Identifier {
val variant = animatable?.variant
if (variant != null && !variant.ignore.contains(TEXTURE))
return Identifier(HybridAquatic.MOD_ID, "textures/entity/${id}_${variant.getProvidedVariant(animatable)}.png")
return Identifier(HybridAquatic.MOD_ID, "textures/entity/$id.png")
}

override fun getAnimationResource(animatable: T?): Identifier {
val variant = animatable?.variant
if (variant != null && !variant.ignore.contains(ANIMATION))
return Identifier(HybridAquatic.MOD_ID, "animations/${id}_${variant.getProvidedVariant(animatable)}.animation.json")
return Identifier(HybridAquatic.MOD_ID, "animations/$id.animation.json")
}

override fun setCustomAnimations(
animatable: T,
instanceId: Long,
animationState: AnimationState<T>
) {
super.setCustomAnimations(animatable, instanceId, animationState)
val deltaTime: Float = MinecraftClient.getInstance().tickDelta

val body = animationProcessor.getBone(EntityModelPartNames.BODY)
body.rotX = MathHelper.lerp(deltaTime, animatable.prevPitch, animatable.pitch) * -MathHelper.RADIANS_PER_DEGREE
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package dev.hybridlabs.aquatic.client.model.entity.fish

import dev.hybridlabs.aquatic.entity.fish.HybridAquaticFishEntity
import dev.hybridlabs.aquatic.entity.fish.ray.HybridAquaticRayEntity

class MantaRayEntityModel : HybridAquaticFishEntityModel<HybridAquaticFishEntity>("manta_ray")
class MantaRayEntityModel : HybridAquaticRayEntityModel<HybridAquaticRayEntity>("manta_ray")
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package dev.hybridlabs.aquatic.client.model.entity.fish

import dev.hybridlabs.aquatic.entity.fish.HybridAquaticFishEntity
import dev.hybridlabs.aquatic.entity.fish.ray.HybridAquaticRayEntity

class StingrayEntityModel : HybridAquaticFishEntityModel<HybridAquaticFishEntity>("stingray")
class StingrayEntityModel : HybridAquaticRayEntityModel<HybridAquaticRayEntity>("stingray")
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,10 @@ object HybridAquaticEntityRenderers {
val COWFISH = EntityRendererRegistry.register(HybridAquaticEntityTypes.COWFISH, ::CowfishEntityRenderer)
val DISCUS = EntityRendererRegistry.register(HybridAquaticEntityTypes.DISCUS, ::DiscusEntityRenderer)
val SURGEONFISH = EntityRendererRegistry.register(HybridAquaticEntityTypes.SURGEONFISH, ::SurgeonfishEntityRenderer)

//endregion

//region rays
val STINGRAY = EntityRendererRegistry.register(HybridAquaticEntityTypes.STINGRAY, ::StingrayEntityRenderer)
val MANTA_RAY = EntityRendererRegistry.register(HybridAquaticEntityTypes.MANTA_RAY, ::MantaRayEntityRenderer)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package dev.hybridlabs.aquatic.client.render.entity.fish

import dev.hybridlabs.aquatic.entity.fish.ray.HybridAquaticRayEntity
import net.minecraft.client.render.VertexConsumerProvider
import net.minecraft.client.render.entity.EntityRendererFactory
import net.minecraft.client.util.math.MatrixStack
import software.bernie.geckolib.model.GeoModel
import software.bernie.geckolib.renderer.GeoEntityRenderer
import software.bernie.geckolib.renderer.layer.AutoGlowingGeoLayer

@Suppress("LeakingThis")
open class HybridAquaticRayEntityRenderer<T: HybridAquaticRayEntity>(context: EntityRendererFactory.Context, model: GeoModel<T>, private var variableSize: Boolean = false, canGlow: Boolean = false): GeoEntityRenderer<T>(context, model) {

init {
if(canGlow) addRenderLayer(AutoGlowingGeoLayer(this))
}

override fun render(
entity: T,
entityYaw: Float,
partialTick: Float,
poseStack: MatrixStack,
bufferSource: VertexConsumerProvider,
packedLight: Int
) {
if(variableSize) {
val size = HybridAquaticRayEntity.getScaleAdjustment(entity, 0.05f)
poseStack.scale(size, size, size)
}
super.render(entity, entityYaw, partialTick, poseStack, bufferSource, packedLight)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package dev.hybridlabs.aquatic.client.render.entity.fish

import dev.hybridlabs.aquatic.client.model.entity.fish.MantaRayEntityModel
import dev.hybridlabs.aquatic.entity.fish.HybridAquaticFishEntity
import dev.hybridlabs.aquatic.entity.fish.ray.HybridAquaticRayEntity
import net.minecraft.client.render.entity.EntityRendererFactory.Context

class MantaRayEntityRenderer(context: Context) : HybridAquaticFishEntityRenderer<HybridAquaticFishEntity>(context, MantaRayEntityModel(), true, false)
class MantaRayEntityRenderer(context: Context) : HybridAquaticRayEntityRenderer<HybridAquaticRayEntity>(context, MantaRayEntityModel(), true, false)
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@ package dev.hybridlabs.aquatic.client.render.entity.fish

import dev.hybridlabs.aquatic.client.model.entity.fish.StingrayEntityModel
import dev.hybridlabs.aquatic.entity.fish.HybridAquaticFishEntity
import dev.hybridlabs.aquatic.entity.fish.ray.HybridAquaticRayEntity
import net.minecraft.client.render.entity.EntityRendererFactory.Context

class StingrayEntityRenderer(context: Context) : HybridAquaticFishEntityRenderer<HybridAquaticFishEntity>(context,
class StingrayEntityRenderer(context: Context) : HybridAquaticRayEntityRenderer<HybridAquaticRayEntity>(context,
StingrayEntityModel(), true, false)

Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import net.minecraft.client.util.math.MatrixStack
import software.bernie.geckolib.model.GeoModel
import software.bernie.geckolib.renderer.GeoEntityRenderer

open class HybridAquaticSharkEntityRenderer<T: HybridAquaticSharkEntity>(context: EntityRendererFactory.Context, model: GeoModel<T>, private var variableSize: Boolean = false,): GeoEntityRenderer<T>(context, model) {
open class HybridAquaticSharkEntityRenderer<T: HybridAquaticSharkEntity>(context: EntityRendererFactory.Context, model: GeoModel<T>, private var variableSize: Boolean = false): GeoEntityRenderer<T>(context, model) {

override fun render(
entity: T,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,14 @@ object HybridAquaticEntityTypes {
BettaEntity.createMobAttributes()
)

val STINGRAY = registerFish(
val STINGRAY = registerRay(
"stingray",
::StingrayEntity,
EntityDimensions.fixed(0.75f, 0.2f),
StingrayEntity.createMobAttributes()
)

val MANTA_RAY = registerFish(
val MANTA_RAY = registerRay(
"manta_ray",
::MantaRayEntity,
EntityDimensions.fixed(1.0f, 0.3f),
Expand Down Expand Up @@ -618,6 +618,15 @@ object HybridAquaticEntityTypes {
return registerCustomSpawnGroup(id, entityFactory, dimensions, attributeContainer, HybridAquaticSpawnGroup.FISH)
}

private fun <T : LivingEntity> registerRay(
id: String,
entityFactory: EntityFactory<T>,
dimensions: EntityDimensions,
attributeContainer: DefaultAttributeContainer.Builder
): EntityType<T> {
return registerCustomSpawnGroup(id, entityFactory, dimensions, attributeContainer, HybridAquaticSpawnGroup.FISH)
}

private fun <T : LivingEntity> registerFishUnderground(
id: String,
entityFactory: EntityFactory<T>,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import dev.hybridlabs.aquatic.entity.cephalopod.HybridAquaticCephalopodEntity
import dev.hybridlabs.aquatic.entity.critter.HybridAquaticCritterEntity
import dev.hybridlabs.aquatic.entity.crustacean.HybridAquaticCrustaceanEntity
import dev.hybridlabs.aquatic.entity.fish.HybridAquaticFishEntity
import dev.hybridlabs.aquatic.entity.fish.ray.HybridAquaticRayEntity
import dev.hybridlabs.aquatic.entity.jellyfish.HybridAquaticJellyfishEntity
import dev.hybridlabs.aquatic.entity.miniboss.HybridAquaticMinibossEntity
import dev.hybridlabs.aquatic.entity.shark.HybridAquaticSharkEntity
Expand All @@ -29,8 +30,6 @@ object SpawnRestrictionRegistry {
HybridAquaticEntityTypes.COWFISH,
HybridAquaticEntityTypes.SEAHORSE,
HybridAquaticEntityTypes.SUNFISH,
HybridAquaticEntityTypes.STINGRAY,
HybridAquaticEntityTypes.MANTA_RAY,
HybridAquaticEntityTypes.LIONFISH,
HybridAquaticEntityTypes.TOADFISH,
HybridAquaticEntityTypes.OARFISH,
Expand Down Expand Up @@ -61,6 +60,12 @@ object SpawnRestrictionRegistry {
HybridAquaticEntityTypes.RATFISH,
).forEach { registerFishUnderground(it) }

// rays
setOf(
HybridAquaticEntityTypes.STINGRAY,
HybridAquaticEntityTypes.MANTA_RAY,
).forEach { registerRay(it) }

// squids
setOf(
HybridAquaticEntityTypes.FIREFLY_SQUID,
Expand Down Expand Up @@ -147,6 +152,10 @@ object SpawnRestrictionRegistry {
registerWaterCreature(entityType, HybridAquaticFishEntity::canUndergroundSpawn)
}

private fun <T : WaterCreatureEntity> registerRay(entityType: EntityType<T>) {
registerWaterCreature(entityType, HybridAquaticRayEntity::canSpawn)
}

private fun <T : WaterCreatureEntity> registerCephalopod(entityType: EntityType<T>) {
registerWaterCreature(entityType, HybridAquaticCephalopodEntity::canSpawn)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package dev.hybridlabs.aquatic.entity.ai.goal

import net.minecraft.block.Blocks
import net.minecraft.entity.ai.goal.Goal
import net.minecraft.entity.mob.MobEntity
import net.minecraft.util.math.BlockPos
import net.minecraft.util.math.Vec3d

@Suppress("DEPRECATION")
class StayNearSurfaceGoal(private val mob: MobEntity) : Goal() {

override fun canStart(): Boolean {
return true
}

override fun tick() {
val blockPos = mob.blockPos
val blockAbove = mob.entityWorld.getBlockState(blockPos.up(17))
val ceilingAbove = isSolidBlockAbove(blockPos)
val waterBelow = isWaterBelow(blockPos)

if (blockAbove.isOf(Blocks.WATER) && !ceilingAbove && waterBelow) {
setUpwardVelocity()
}
}

private fun isSolidBlockAbove(pos: BlockPos): Boolean {
for (i in 1..16) {
val state = mob.entityWorld.getBlockState(pos.up(i))
if (state.isSolid) {
val airGapBelow = mob.entityWorld.getBlockState(pos.up(i - 1)).isOf(Blocks.AIR)
if (!airGapBelow) {
return true
}
}
}
return false
}

private fun isWaterBelow(pos: BlockPos): Boolean {
for (i in 1..8) {
val state = mob.entityWorld.getBlockState(pos.down(i))
if (state.isOf(Blocks.WATER)) {
return true
}
}
return false
}

private fun setUpwardVelocity() {
val upwardVelocity = 0.25
val currentVelocity = mob.velocity
mob.velocity = Vec3d(currentVelocity.x, upwardVelocity, currentVelocity.z)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,7 @@ import dev.hybridlabs.aquatic.tag.HybridAquaticEntityTags
import net.minecraft.block.Blocks
import net.minecraft.entity.*
import net.minecraft.entity.ai.control.MoveControl
import net.minecraft.entity.ai.goal.ActiveTargetGoal
import net.minecraft.entity.ai.goal.EscapeDangerGoal
import net.minecraft.entity.ai.goal.MeleeAttackGoal
import net.minecraft.entity.ai.goal.SwimAroundGoal
import net.minecraft.entity.ai.goal.*
import net.minecraft.entity.ai.pathing.EntityNavigation
import net.minecraft.entity.ai.pathing.SwimNavigation
import net.minecraft.entity.attribute.EntityAttributes
Expand All @@ -18,6 +15,7 @@ import net.minecraft.entity.data.DataTracker
import net.minecraft.entity.data.TrackedData
import net.minecraft.entity.data.TrackedDataHandlerRegistry
import net.minecraft.entity.mob.WaterCreatureEntity
import net.minecraft.entity.player.PlayerEntity
import net.minecraft.nbt.NbtCompound
import net.minecraft.particle.ParticleTypes
import net.minecraft.registry.tag.FluidTags
Expand Down Expand Up @@ -60,6 +58,8 @@ open class HybridAquaticFishEntity(
super.initGoals()
goalSelector.add(3, SwimToRandomPlaceGoal(this))
goalSelector.add(3, SwimAroundGoal(this, 0.50, 6))
goalSelector.add(4, LookAroundGoal(this))
goalSelector.add(5, LookAtEntityGoal(this, PlayerEntity::class.java, 6.0f))
goalSelector.add(1, EscapeDangerGoal(this, 1.25))
goalSelector.add(2, AttackGoal(this))
targetSelector.add(2, ActiveTargetGoal(this, LivingEntity::class.java, 10, true, true) { hunger <= 300 && it.type.isIn(prey) })
Expand All @@ -83,6 +83,7 @@ open class HybridAquaticFishEntity(
entityNbt: NbtCompound?
): EntityData? {
this.air = getMaxMoistness()
this.size = this.random.nextBetween(getMinSize(),getMaxSize())

if (variants.isNotEmpty()) {
if (spawnReason == SpawnReason.SPAWN_EGG) {
Expand Down
Loading

0 comments on commit 132f947

Please sign in to comment.