This commit is contained in:
GearShocky 2025-03-05 17:46:30 +05:00
parent 7efb792353
commit bc109e8020
5 changed files with 61 additions and 15 deletions

View File

@ -1,4 +1,5 @@
package ru.dbotthepony.mc.otm.client.render.entity
import net.minecraft.client.model.HumanoidModel
import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.core.ResourceLocation
@ -6,17 +7,32 @@ import net.minecraft.client.model.PlayerModel
import net.minecraft.client.renderer.entity.EntityRendererProvider
import net.minecraft.client.renderer.entity.HumanoidMobRenderer
import net.minecraft.client.model.geom.ModelLayers
import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer
import net.minecraft.client.renderer.entity.layers.ItemInHandLayer
import net.minecraft.client.resources.model.ModelManager
import net.minecraft.resources.ResourceLocation
import net.minecraft.world.entity.EntityType
import net.minecraft.world.entity.Mob
class RogueAndroidRenderer<T : Mob>(context: EntityRendererProvider.Context, private val entityType: EntityType<T>, private val androidTexture: String) :
class RogueAndroidRenderer<T : Mob>(context: EntityRendererProvider.Context, private val entityType: EntityType<T>, private val androidTexture: String,private val modelManager: ModelManager) :
HumanoidMobRenderer<T, PlayerModel<T>>(
context, PlayerModel(context.bakeLayer(ModelLayers.PLAYER), false), 0.5f
) {
init {
addLayer(ItemInHandLayer(this, context.itemInHandRenderer))
addLayer(
HumanoidArmorLayer(
this,
HumanoidModel(context.bakeLayer(ModelLayers.PLAYER_INNER_ARMOR)),
HumanoidModel(context.bakeLayer(ModelLayers.PLAYER_OUTER_ARMOR)),
modelManager
)
)
}
override fun getTextureLocation(entity: T): ResourceLocation {
return ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/entity/android/$androidTexture.png")
}

View File

@ -6,7 +6,7 @@ import net.minecraft.world.entity.EntityType
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.ai.attributes.AttributeSupplier
import net.minecraft.world.entity.ai.attributes.Attributes
import net.minecraft.world.entity.ai.goal.LeapAtTargetGoal
import net.minecraft.world.entity.ai.goal.AvoidEntityGoal
import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal
import net.minecraft.world.entity.ai.goal.MeleeAttackGoal
import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal
@ -15,7 +15,9 @@ import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal
import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal
import net.minecraft.world.entity.ai.navigation.GroundPathNavigation
import net.minecraft.world.entity.ai.navigation.PathNavigation
import net.minecraft.world.entity.monster.Monster
import net.minecraft.world.entity.animal.frog.Frog
import net.minecraft.world.entity.monster.*
import net.minecraft.world.entity.npc.Villager
import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.ItemStack
import net.minecraft.world.level.Level
@ -24,14 +26,19 @@ class AndroidMelee(type: EntityType<AndroidMelee>, level: Level) : Monster(type,
override fun registerGoals() {
goalSelector.addGoal(8, RandomLookAroundGoal(this))
goalSelector.addGoal(7, WaterAvoidingRandomStrollGoal(this, 0.8))
goalSelector.addGoal(7, WaterAvoidingRandomStrollGoal(this, 0.6))
goalSelector.addGoal(8, LookAtPlayerGoal(this, Player::class.java, 8f))
goalSelector.addGoal(3, NearestAttackableTargetGoal(this, LivingEntity::class.java , true, true))
goalSelector.addGoal(3, NearestAttackableTargetGoal(this, Player::class.java , true, true))
goalSelector.addGoal(3, NearestAttackableTargetGoal(this, LivingEntity::class.java, 10, true, true) { entity ->
entity is Player ||
entity is Villager ||
entity is AbstractIllager ||
entity is Zombie ||
entity is AbstractSkeleton
})
goalSelector.addGoal(1, LeapAtTargetGoal(this, 0.4f))
goalSelector.addGoal(2, MeleeAttackGoal(this, 1.3, true))
goalSelector.addGoal(1, AvoidEntityGoal(this, Frog::class.java, 8.0F, 1.2, 1.5))
goalSelector.addGoal(2, MeleeAttackGoal(this, 1.0, true))
targetSelector.addGoal(1, HurtByTargetGoal(this))
}
@ -40,7 +47,11 @@ class AndroidMelee(type: EntityType<AndroidMelee>, level: Level) : Monster(type,
}
override fun getHurtSound(damageSource: net.minecraft.world.damagesource.DamageSource): SoundEvent {
return SoundEvents.IRON_GOLEM_HURT
return SoundEvents.HEAVY_CORE_BREAK
}
override fun getDeathSound(): SoundEvent {
return SoundEvents.VAULT_BREAK
}
override fun createNavigation(level: Level): PathNavigation = GroundPathNavigation(this, level)
@ -48,9 +59,11 @@ class AndroidMelee(type: EntityType<AndroidMelee>, level: Level) : Monster(type,
companion object {
fun createAttributes() : AttributeSupplier.Builder {
return createMonsterAttributes()
.add(Attributes.MAX_HEALTH, 16.0)
.add(Attributes.MAX_HEALTH, 30.0)
.add(Attributes.ARMOR, 4.0)
.add(Attributes.SCALE, 1.1)
.add(Attributes.MOVEMENT_SPEED, 0.3)
.add(Attributes.ATTACK_DAMAGE, 3.0)
.add(Attributes.ATTACK_DAMAGE, 4.0)
}
}
}

View File

@ -14,7 +14,11 @@ import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal
import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal
import net.minecraft.world.entity.ai.navigation.GroundPathNavigation
import net.minecraft.world.entity.ai.navigation.PathNavigation
import net.minecraft.world.entity.monster.AbstractIllager
import net.minecraft.world.entity.monster.AbstractSkeleton
import net.minecraft.world.entity.monster.Monster
import net.minecraft.world.entity.monster.Zombie
import net.minecraft.world.entity.npc.Villager
import net.minecraft.world.entity.player.Player
import net.minecraft.world.level.Level
@ -29,8 +33,10 @@ class BreadMonster(type: EntityType<BreadMonster>, level: Level) : Monster(type,
goalSelector.addGoal(8, RandomLookAroundGoal(this))
goalSelector.addGoal(7, WaterAvoidingRandomStrollGoal(this, 0.8))
goalSelector.addGoal(8, LookAtPlayerGoal(this, Player::class.java, 8f))
goalSelector.addGoal(3, NearestAttackableTargetGoal(this, LivingEntity::class.java , true, true))
goalSelector.addGoal(3, NearestAttackableTargetGoal(this, Player::class.java , true, true))
goalSelector.addGoal(3, NearestAttackableTargetGoal(this, LivingEntity::class.java, 10, true, true) { entity ->
entity !is BreadMonster
})
goalSelector.addGoal(1, LeapAtTargetGoal(this, 0.4f))
goalSelector.addGoal(2, MeleeAttackGoal(this, 1.3, true))

View File

@ -12,6 +12,7 @@ import net.minecraft.sounds.SoundEvents
import net.minecraft.world.entity.AnimationState
import net.minecraft.world.entity.Entity
import net.minecraft.world.entity.EntityType
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.ai.attributes.AttributeSupplier
import net.minecraft.world.entity.ai.attributes.Attributes
import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal
@ -22,7 +23,11 @@ import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal
import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal
import net.minecraft.world.entity.ai.navigation.GroundPathNavigation
import net.minecraft.world.entity.ai.navigation.PathNavigation
import net.minecraft.world.entity.monster.AbstractIllager
import net.minecraft.world.entity.monster.AbstractSkeleton
import net.minecraft.world.entity.monster.Monster
import net.minecraft.world.entity.monster.Zombie
import net.minecraft.world.entity.npc.Villager
import net.minecraft.world.entity.player.Player
import net.minecraft.world.level.Level
import ru.dbotthepony.mc.otm.OverdriveThatMatters
@ -68,7 +73,13 @@ class Loader(type: EntityType<Loader>, level: Level) : Monster(type, level) {
goalSelector.addGoal(8, RandomLookAroundGoal(this))
goalSelector.addGoal(7, WaterAvoidingRandomStrollGoal(this, 0.8))
goalSelector.addGoal(8, LookAtPlayerGoal(this, Player::class.java, 8f))
goalSelector.addGoal(3, NearestAttackableTargetGoal(this, Player::class.java , true, true))
goalSelector.addGoal(3, NearestAttackableTargetGoal(this, LivingEntity::class.java, 10, true, true) { entity ->
entity is Player ||
entity is Villager ||
entity is AbstractIllager ||
entity is Zombie ||
entity is AbstractSkeleton
})
goalSelector.addGoal(2, MeleeAttackGoal(this, 1.0, true))

View File

@ -77,7 +77,7 @@ object MEntityTypes {
private fun registerAttributes(event: EntityAttributeCreationEvent) {
event.put(BREAD_MONSTER, BreadMonster.createAttributes().build())
event.put(LOADER, Loader.createAttributes().build())
event.put(ANDROID_MELEE, Loader.createAttributes().build())
event.put(ANDROID_MELEE, AndroidMelee.createAttributes().build())
}
@Suppress("unchecked_cast")
@ -94,7 +94,7 @@ object MEntityTypes {
EntityRenderers.register(LOADER, ::LoaderRenderer)
EntityRenderers.register(ANDROID_MELEE) { context ->
RogueAndroidRenderer(context, ANDROID_MELEE, "melee")
RogueAndroidRenderer(context, ANDROID_MELEE, "melee",context.modelManager)
}
}
}