don't move when charging

This commit is contained in:
GearShocky 2025-03-16 10:03:41 +05:00
parent 7b3a6f229b
commit 24485696f3

View File

@ -30,12 +30,13 @@ import net.minecraft.world.level.Level
import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.TranslatableComponent
import ru.dbotthepony.mc.otm.registry.MNames import ru.dbotthepony.mc.otm.registry.MNames
import ru.dbotthepony.mc.otm.registry.game.MSoundEvents import ru.dbotthepony.mc.otm.registry.game.MSoundEvents
import java.util.*
class Enforcer(type: EntityType<Enforcer>, level: Level) : Monster(type,level) { class Enforcer(type: EntityType<Enforcer>, level: Level) : Monster(type,level) {
val idleState = AnimationState() val idleState = AnimationState()
val chargeState = AnimationState() val chargeState = AnimationState()
init { init {
entityData.set(isChargingb, false)
idleState.start(tickCount) idleState.start(tickCount)
} }
@ -48,18 +49,23 @@ class Enforcer(type: EntityType<Enforcer>, level: Level) : Monster(type,level) {
.add(Attributes.STEP_HEIGHT, 1.0) .add(Attributes.STEP_HEIGHT, 1.0)
.add(Attributes.KNOCKBACK_RESISTANCE, 1.0) .add(Attributes.KNOCKBACK_RESISTANCE, 1.0)
} }
private val isChargingb: EntityDataAccessor<Boolean> = private val IS_CHARGING: EntityDataAccessor<Boolean> =
SynchedEntityData.defineId(Enforcer::class.java, EntityDataSerializers.BOOLEAN) SynchedEntityData.defineId(Enforcer::class.java, EntityDataSerializers.BOOLEAN)
} }
override fun defineSynchedData(builder: SynchedEntityData.Builder) { override fun defineSynchedData(builder: SynchedEntityData.Builder) {
super.defineSynchedData(builder) super.defineSynchedData(builder)
builder.define(isChargingb, false) builder.define(IS_CHARGING, false)
}
fun setCharging(value: Boolean) {
entityData.set(IS_CHARGING, value)
}
fun isCharging(): Boolean {
return entityData.get(IS_CHARGING)
} }
var isCharging: Boolean
get() = entityData.get(isChargingb)
set(value) = entityData.set(isChargingb, value)
override fun registerGoals() { override fun registerGoals() {
goalSelector.addGoal(7, LookAtPlayerGoal(this, Player::class.java, 8f)) goalSelector.addGoal(7, LookAtPlayerGoal(this, Player::class.java, 8f))
@ -124,13 +130,18 @@ class Enforcer(type: EntityType<Enforcer>, level: Level) : Monster(type,level) {
class RammingGoal(private val mob: Enforcer) : Goal() { class RammingGoal(private val mob: Enforcer) : Goal() {
private var target: LivingEntity? = null private var target: LivingEntity? = null
init {
setFlags(EnumSet.of(Goal.Flag.MOVE))
}
private var chargeTime = 0 private var chargeTime = 0
private val windupTime = 20 private val windupTime = 20
private val maxChargeTime = 40
private var chargeDir: Vec3? = null private var chargeDir: Vec3? = null
private var cooldown = 0 private var cooldown = 0
private val minCooldown = 20 private val minCooldown = 20
private val maxCooldown = 60 private val maxCooldown = 60
private var isCharging = false
override fun canUse(): Boolean { override fun canUse(): Boolean {
if (cooldown > 0) { if (cooldown > 0) {
@ -142,18 +153,22 @@ class Enforcer(type: EntityType<Enforcer>, level: Level) : Monster(type,level) {
return target != null return target != null
} }
override fun canContinueToUse(): Boolean {
return isCharging && chargeTime < maxChargeTime
}
override fun start() { override fun start() {
mob.setCharging(true)
mob.playSound(MSoundEvents.ENFORCER_ALERT, 1.0f, 1.0f) mob.playSound(MSoundEvents.ENFORCER_ALERT, 1.0f, 1.0f)
chargeTime = 0 chargeTime = 0
mob.navigation.stop() mob.navigation.stop()
cooldown = minCooldown + mob.random.nextInt(maxCooldown - minCooldown) cooldown = minCooldown + mob.random.nextInt(maxCooldown - minCooldown)
mob.isCharging = true isCharging = true
mob.chargeState.start(mob.tickCount) mob.chargeState.start(mob.tickCount)
} }
override fun tick() { override fun tick() {
if (!mob.isCharging) return if (!isCharging) return
chargeTime++ chargeTime++
val target = mob.target ?: return val target = mob.target ?: return
@ -202,7 +217,6 @@ class Enforcer(type: EntityType<Enforcer>, level: Level) : Monster(type,level) {
mob.yHeadRot = mob.yRot mob.yHeadRot = mob.yRot
mob.move(net.minecraft.world.entity.MoverType.SELF, dir.scale(1.8)) mob.move(net.minecraft.world.entity.MoverType.SELF, dir.scale(1.8))
//mob.setDeltaMovement(dir.scale(1.8))
if (mob.horizontalCollision) { if (mob.horizontalCollision) {
@ -232,12 +246,11 @@ class Enforcer(type: EntityType<Enforcer>, level: Level) : Monster(type,level) {
} }
override fun stop() { override fun stop() {
mob.isCharging = false mob.setCharging(false)
mob.setDeltaMovement(Vec3.ZERO) mob.setDeltaMovement(Vec3.ZERO)
chargeTime = 0 chargeTime = 0
chargeDir = null chargeDir = null
mob.isCharging = false isCharging = false
mob.chargeState.stop() mob.chargeState.stop()
} }
} }
@ -248,7 +261,7 @@ class Enforcer(type: EntityType<Enforcer>, level: Level) : Monster(type,level) {
private var movePos: Vec3? = null private var movePos: Vec3? = null
override fun canUse(): Boolean { override fun canUse(): Boolean {
return mob.target != null && !mob.isCharging return mob.target != null && !mob.isCharging()
} }
override fun canContinueToUse(): Boolean { override fun canContinueToUse(): Boolean {