fix: swarm
This commit is contained in:
parent
5e3df22a10
commit
14a3b23e43
@ -1,7 +1,6 @@
|
||||
package quaedam.projection.swarm
|
||||
|
||||
import com.google.common.collect.ImmutableList
|
||||
import com.mojang.datafixers.util.Pair
|
||||
import net.minecraft.world.entity.ai.Brain
|
||||
import net.minecraft.world.entity.ai.behavior.*
|
||||
import net.minecraft.world.entity.ai.memory.MemoryModuleType
|
||||
@ -10,6 +9,8 @@ import net.minecraft.world.entity.schedule.Activity
|
||||
import net.minecraft.world.entity.schedule.Schedule
|
||||
import net.minecraft.world.entity.schedule.ScheduleBuilder
|
||||
import quaedam.Quaedam
|
||||
import quaedam.utils.weight
|
||||
import quaedam.utils.weightR
|
||||
|
||||
object ProjectedPersonAI {
|
||||
|
||||
@ -21,14 +22,15 @@ object ProjectedPersonAI {
|
||||
MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES,
|
||||
MemoryModuleType.NEAREST_VISIBLE_WANTED_ITEM,
|
||||
MemoryModuleType.HURT_BY,
|
||||
MemoryModuleType.ATTACK_COOLING_DOWN
|
||||
MemoryModuleType.ATTACK_COOLING_DOWN,
|
||||
MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE,
|
||||
)
|
||||
|
||||
private val sensorTypes = listOf(
|
||||
SensorType.NEAREST_LIVING_ENTITIES,
|
||||
SensorType.NEAREST_PLAYERS,
|
||||
SensorType.HURT_BY,
|
||||
SensorType.NEAREST_ITEMS
|
||||
SensorType.NEAREST_ITEMS,
|
||||
)
|
||||
|
||||
val defaultSchedule = Quaedam.schedule.register("projected_person_default") {
|
||||
@ -80,52 +82,61 @@ object ProjectedPersonAI {
|
||||
|
||||
private fun initCoreActivity(brain: Brain<ProjectedPersonEntity>) {
|
||||
brain.addActivity(
|
||||
Activity.CORE, 0, ImmutableList.of(
|
||||
Swim(0.8f),
|
||||
InteractWithDoor.create(),
|
||||
LookAtTargetSink(40, 70),
|
||||
MoveToTargetSink(),
|
||||
WakeUp.create(),
|
||||
)
|
||||
)
|
||||
brain.addActivity(
|
||||
Activity.CORE, 3, ImmutableList.of(
|
||||
GoToWantedItem.create(0.7f, false, 7)
|
||||
Activity.CORE, ImmutableList.of(
|
||||
0 weight Swim(0.8f),
|
||||
0 weight InteractWithDoor.create(),
|
||||
0 weight LookAtTargetSink(40, 70),
|
||||
0 weight MoveToTargetSink(),
|
||||
0 weight WakeUp.create(),
|
||||
3 weight GoToWantedItem.create(1.2f, false, 7),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
private fun initIdleActivity(brain: Brain<ProjectedPersonEntity>) {
|
||||
brain.addActivity(Activity.IDLE, 99, ImmutableList.of(UpdateActivityFromSchedule.create()))
|
||||
brain.addActivity(
|
||||
Activity.IDLE, ImmutableList.of(
|
||||
3 weight createStrollBehavior(),
|
||||
99 weight UpdateActivityFromSchedule.create(),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
private fun initPlayActivity(brain: Brain<ProjectedPersonEntity>) {
|
||||
brain.addActivity(
|
||||
Activity.PLAY, 3, ImmutableList.of(
|
||||
GoToWantedItem.create(1.75f, true, 32),
|
||||
Activity.PLAY, ImmutableList.of(
|
||||
3 weight GoToWantedItem.create(1.75f, true, 32),
|
||||
5 weight JumpOnBed(1.0f),
|
||||
5 weight createStrollBehavior(),
|
||||
99 weight UpdateActivityFromSchedule.create(),
|
||||
)
|
||||
)
|
||||
brain.addActivity(
|
||||
Activity.PLAY, 5, ImmutableList.of(
|
||||
JumpOnBed(0.5f),
|
||||
RunOne(
|
||||
listOf(
|
||||
Pair.of(RandomStroll.stroll(0.5f), 2),
|
||||
Pair.of(SetWalkTargetFromLookTarget.create(1.0f, 5), 2),
|
||||
Pair.of(DoNothing(30, 60), 1)
|
||||
)
|
||||
),
|
||||
)
|
||||
)
|
||||
brain.addActivity(Activity.PLAY, 99, ImmutableList.of(UpdateActivityFromSchedule.create()))
|
||||
}
|
||||
|
||||
private fun initWorkActivity(brain: Brain<ProjectedPersonEntity>) {
|
||||
brain.addActivity(Activity.WORK, 99, ImmutableList.of(UpdateActivityFromSchedule.create()))
|
||||
brain.addActivity(
|
||||
Activity.WORK, ImmutableList.of(
|
||||
3 weight createStrollBehavior(),
|
||||
99 weight UpdateActivityFromSchedule.create(),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
private fun initRestActivity(brain: Brain<ProjectedPersonEntity>) {
|
||||
brain.addActivity(Activity.REST, 99, ImmutableList.of(UpdateActivityFromSchedule.create()))
|
||||
brain.addActivity(
|
||||
Activity.REST, ImmutableList.of(
|
||||
3 weight createStrollBehavior(),
|
||||
99 weight UpdateActivityFromSchedule.create(),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
private fun createStrollBehavior() = RunOne(
|
||||
listOf(
|
||||
2 weightR RandomStroll.stroll(1.0f),
|
||||
2 weightR SetWalkTargetFromLookTarget.create(1.0f, 5),
|
||||
1 weightR DoNothing(30, 60)
|
||||
)
|
||||
)
|
||||
|
||||
}
|
@ -10,18 +10,21 @@ import net.minecraft.network.protocol.game.DebugPackets
|
||||
import net.minecraft.network.syncher.EntityDataAccessor
|
||||
import net.minecraft.network.syncher.EntityDataSerializers
|
||||
import net.minecraft.network.syncher.SynchedEntityData
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
import net.minecraft.world.DifficultyInstance
|
||||
import net.minecraft.world.SimpleContainer
|
||||
import net.minecraft.world.entity.*
|
||||
import net.minecraft.world.entity.ai.Brain
|
||||
import net.minecraft.world.entity.ai.attributes.AttributeSupplier
|
||||
import net.minecraft.world.entity.ai.attributes.Attributes
|
||||
import net.minecraft.world.entity.ai.memory.MemoryModuleType
|
||||
import net.minecraft.world.entity.item.ItemEntity
|
||||
import net.minecraft.world.entity.npc.InventoryCarrier
|
||||
import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.ServerLevelAccessor
|
||||
import quaedam.Quaedam
|
||||
import quaedam.projector.Projector
|
||||
import kotlin.jvm.optionals.getOrNull
|
||||
|
||||
class ProjectedPersonEntity(entityType: EntityType<out PathfinderMob>, level: Level) : PathfinderMob(entityType, level),
|
||||
InventoryCarrier {
|
||||
@ -51,7 +54,8 @@ class ProjectedPersonEntity(entityType: EntityType<out PathfinderMob>, level: Le
|
||||
}
|
||||
|
||||
private fun createAttributes(): AttributeSupplier.Builder =
|
||||
Mob.createMobAttributes().add(Attributes.ATTACK_DAMAGE, 1.5).add(Attributes.MOVEMENT_SPEED, 0.11)
|
||||
Mob.createMobAttributes().add(Attributes.ATTACK_DAMAGE, 1.5)
|
||||
.add(Attributes.MOVEMENT_SPEED, 0.2)
|
||||
.add(Attributes.ATTACK_SPEED)
|
||||
|
||||
}
|
||||
@ -107,7 +111,7 @@ class ProjectedPersonEntity(entityType: EntityType<out PathfinderMob>, level: Le
|
||||
override fun getTypeName(): Component =
|
||||
shape.name.takeIf { it.isNotEmpty() }?.let { Component.literal(it) } ?: super.getTypeName()
|
||||
|
||||
override fun getNameTagOffsetY() = super.getNameTagOffsetY() - (BOUNDING_HEIGHT * (1.2f - shape.scaleY))
|
||||
override fun getNameTagOffsetY() = super.getNameTagOffsetY() - (BOUNDING_HEIGHT * (1.3f - shape.scaleY))
|
||||
|
||||
override fun createNavigation(level: Level) = ProjectedPersonNavigation(this, level)
|
||||
|
||||
@ -152,6 +156,11 @@ class ProjectedPersonEntity(entityType: EntityType<out PathfinderMob>, level: Le
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun getBrain(): Brain<ProjectedPersonEntity> = super.getBrain() as Brain<ProjectedPersonEntity>
|
||||
|
||||
override fun customServerAiStep() {
|
||||
super.customServerAiStep()
|
||||
getBrain().tick(level() as ServerLevel, this)
|
||||
}
|
||||
|
||||
override fun isBaby() = shape.baby
|
||||
|
||||
}
|
14
common/src/main/kotlin/quaedam/utils/Brain.kt
Normal file
14
common/src/main/kotlin/quaedam/utils/Brain.kt
Normal file
@ -0,0 +1,14 @@
|
||||
package quaedam.utils
|
||||
|
||||
import com.mojang.datafixers.util.Pair
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
import net.minecraft.world.entity.ai.behavior.BehaviorControl
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline infix fun <B : BehaviorControl<E>, E : LivingEntity> Int.weight(behavior: B): Pair<Int, B> =
|
||||
Pair.of(this, behavior)
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
inline infix fun <B, E> Int.weightR(behavior: B): Pair<B, Int>
|
||||
where B : BehaviorControl<E>, E : LivingEntity =
|
||||
Pair.of(behavior, this)
|
Loading…
Reference in New Issue
Block a user