Compare commits

...
Author SHA1 Message Date
broccoli a091290eb8 work on swapping to sbl 2024-05-13 15:16:37 +01:00
7 changed files with 91 additions and 61 deletions
+1
View File
@@ -43,6 +43,7 @@ dependencies {
modCompileOnly(libs.bundles.fabric.integrations.compileOnly) {
isTransitive = false
}
modImplementation(libs.sbl.fabric)
// Flywheel has no common dep so just pick one and don't use any platform specific code in common
// modCompileOnly(libs.flywheelFabric)
@@ -8,29 +8,36 @@
package com.cobblemon.mod.common.entity.ai
import net.minecraft.entity.LivingEntity
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import com.cobblemon.mod.common.util.toDF
import com.mojang.datafixers.util.Pair
import net.minecraft.entity.ai.brain.MemoryModuleState
import net.minecraft.entity.ai.brain.MemoryModuleType
import net.minecraft.entity.ai.brain.task.SingleTickTask
import net.minecraft.entity.ai.brain.task.TaskRunnable
import net.minecraft.entity.ai.brain.task.TaskTriggerer
import net.tslat.smartbrainlib.api.core.behaviour.ExtendedBehaviour
import net.tslat.smartbrainlib.util.BrainUtils
object GetAngryAtAttackerTask {
fun create(): SingleTickTask<LivingEntity> {
return TaskTriggerer.task {
it.group(
it.queryMemoryValue(MemoryModuleType.HURT_BY_ENTITY),
it.queryMemoryOptional(MemoryModuleType.ANGRY_AT)
).apply(it) { hurtByEntity, angryAt ->
TaskRunnable { _, entity, _ ->
val hurtByEntity = it.getValue(hurtByEntity)
val angryAt = it.getOptionalValue(angryAt).orElse(null)
if (angryAt != null && angryAt == hurtByEntity.uuid) {
return@TaskRunnable false
}
entity.brain.remember(MemoryModuleType.ANGRY_AT, hurtByEntity.uuid)
return@TaskRunnable true
}
//todo: make sure it's the same behaviour
class GetAngryAtAttackerTask : ExtendedBehaviour<PokemonEntity>() {
init {
whenStarting { entity ->
val hurtByEntity = requireNotNull(
BrainUtils.getMemory(entity, MemoryModuleType.HURT_BY_ENTITY)
)
val angryAt = BrainUtils.getMemory(entity, MemoryModuleType.ANGRY_AT)
if (angryAt != null && angryAt == hurtByEntity.uuid) {
return@whenStarting
}
entity.brain.remember(MemoryModuleType.ANGRY_AT, hurtByEntity.uuid)
}
}
override fun getMemoryRequirements(): List<Pair<MemoryModuleType<*>, MemoryModuleState>> {
//todo: not sure what state these should be
return listOf(
MemoryModuleType.HURT_BY_ENTITY toDF MemoryModuleState.REGISTERED,
MemoryModuleType.ANGRY_AT toDF MemoryModuleState.REGISTERED,
)
}
}
@@ -10,7 +10,6 @@ package com.cobblemon.mod.common.entity.pokemon
import com.cobblemon.mod.common.*
import com.cobblemon.mod.common.CobblemonNetwork.sendPacket
import com.cobblemon.mod.common.GenericsCheatClass.createPokemonBrain
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
import com.cobblemon.mod.common.api.drop.DropTable
import com.cobblemon.mod.common.api.entity.Despawner
@@ -36,24 +35,14 @@ import com.cobblemon.mod.common.block.entity.PokemonPastureBlockEntity
import com.cobblemon.mod.common.client.entity.PokemonClientDelegate
import com.cobblemon.mod.common.entity.PoseType
import com.cobblemon.mod.common.entity.Poseable
import com.cobblemon.mod.common.entity.ai.AttackAngryAtTask
import com.cobblemon.mod.common.entity.ai.ChooseLandWanderTargetTask
import com.cobblemon.mod.common.entity.ai.FollowWalkTargetTask
import com.cobblemon.mod.common.entity.ai.GetAngryAtAttackerTask
import com.cobblemon.mod.common.entity.ai.MoveToAttackTargetTask
import com.cobblemon.mod.common.entity.ai.StayAfloatTask
import com.cobblemon.mod.common.entity.ai.*
import com.cobblemon.mod.common.entity.generic.GenericBedrockEntity
import com.cobblemon.mod.common.entity.pokeball.EmptyPokeBallEntity
import com.cobblemon.mod.common.entity.pokemon.ai.PokemonMoveControl
import com.cobblemon.mod.common.entity.pokemon.ai.PokemonNavigation
import com.cobblemon.mod.common.entity.pokemon.ai.goals.*
import com.cobblemon.mod.common.entity.pokemon.ai.tasks.EatGrassTask
import com.cobblemon.mod.common.entity.pokemon.ai.tasks.FindRestingPlaceTask
import com.cobblemon.mod.common.entity.pokemon.ai.tasks.GoToSleepTask
import com.cobblemon.mod.common.entity.pokemon.ai.tasks.HandleBattleActivityGoal
import com.cobblemon.mod.common.entity.pokemon.ai.tasks.LookAtTargetedBattlePokemonTask
import com.cobblemon.mod.common.entity.pokemon.ai.tasks.MoveToOwnerTask
import com.cobblemon.mod.common.entity.pokemon.ai.tasks.WakeUpTask
import com.cobblemon.mod.common.entity.pokemon.ai.sensors.DrowsySensor
import com.cobblemon.mod.common.entity.pokemon.ai.tasks.*
import com.cobblemon.mod.common.entity.pokemon.effects.EffectTracker
import com.cobblemon.mod.common.entity.pokemon.effects.IllusionEffect
import com.cobblemon.mod.common.net.messages.client.animation.PlayPoseableAnimationPacket
@@ -74,18 +63,18 @@ import com.cobblemon.mod.common.util.*
import com.cobblemon.mod.common.world.gamerules.CobblemonGameRules
import com.google.common.collect.ImmutableList
import com.mojang.serialization.Dynamic
import java.util.*
import java.util.concurrent.CompletableFuture
import kotlin.math.ceil
import net.minecraft.entity.*
import net.minecraft.entity.ai.brain.Activity
import net.minecraft.entity.ai.brain.Brain
import net.minecraft.entity.ai.brain.MemoryModuleType
import net.minecraft.entity.ai.brain.sensor.NearestLivingEntitiesSensor
import net.minecraft.entity.ai.brain.sensor.NearestPlayersSensor
import net.minecraft.entity.ai.brain.sensor.Sensor
import net.minecraft.entity.ai.brain.sensor.SensorType
import net.minecraft.entity.ai.brain.task.ForgetAngryAtTargetTask
import net.minecraft.entity.ai.brain.task.LookAroundTask
import net.minecraft.entity.ai.brain.task.LookAtMobTask
import net.minecraft.entity.ai.brain.task.MultiTickTask
import net.minecraft.entity.ai.brain.task.Task
import net.minecraft.entity.ai.control.MoveControl
import net.minecraft.entity.ai.pathing.PathNodeType
@@ -131,13 +120,24 @@ import net.minecraft.world.EntityView
import net.minecraft.world.LightType
import net.minecraft.world.World
import net.minecraft.world.event.GameEvent
import net.tslat.smartbrainlib.api.SmartBrainOwner
import net.tslat.smartbrainlib.api.core.BrainActivityGroup
import net.tslat.smartbrainlib.api.core.SmartBrainProvider
import net.tslat.smartbrainlib.api.core.sensor.ExtendedSensor
import net.tslat.smartbrainlib.api.core.sensor.vanilla.HurtBySensor
import net.tslat.smartbrainlib.api.core.sensor.vanilla.NearbyLivingEntitySensor
import net.tslat.smartbrainlib.api.core.sensor.vanilla.NearbyPlayersSensor
import java.util.*
import java.util.concurrent.CompletableFuture
import kotlin.math.ceil
@Suppress("unused")
open class PokemonEntity(
world: World,
pokemon: Pokemon = Pokemon(),
type: EntityType<out PokemonEntity> = CobblemonEntities.POKEMON,
) : TameableShoulderEntity(type, world), Poseable, Shearable, Schedulable {
) : TameableShoulderEntity(type, world), Poseable, Shearable, Schedulable, SmartBrainOwner<PokemonEntity> {
companion object {
@JvmStatic val SPECIES = DataTracker.registerData(PokemonEntity::class.java, TrackedDataHandlerRegistry.STRING)
@JvmStatic val NICKNAME = DataTracker.registerData(PokemonEntity::class.java, TrackedDataHandlerRegistry.TEXT_COMPONENT)
@@ -391,7 +391,7 @@ open class PokemonEntity(
override fun mobTick() {
super.mobTick()
getBrain().tick(world as ServerWorld, this)
tickBrain(this)
}
fun setMoveControl(moveControl: MoveControl) {
@@ -591,8 +591,18 @@ open class PokemonEntity(
override fun getNavigation() = navigation as PokemonNavigation
override fun createNavigation(world: World) = PokemonNavigation(world, this)
override fun createBrainProfile() = createPokemonBrain(MEMORY_MODULES, SENSORS)
override fun getBrain() = super.getBrain() as Brain<PokemonEntity>
@Suppress("KotlinConstantConditions")
// Brain.Profile is final and Kotlin error's, but this cast is safe.
override fun createBrainProfile() = SmartBrainProvider(this) as Brain.Profile<*>
override fun getSensors(): List<ExtendedSensor<PokemonEntity>> {
return listOf(
NearbyLivingEntitySensor(),
HurtBySensor(),
NearbyPlayersSensor(),
DrowsySensor()
)
}
override fun initGoals() {
super.initGoals()
@@ -604,25 +614,19 @@ open class PokemonEntity(
(moveControl as PokemonMoveControl).stop()
}
override fun deserializeBrain(dynamic: Dynamic<*>): Brain<PokemonEntity> {
val brain = createBrainProfile().deserialize(dynamic)
if (pokemon == null) {
return brain
}
setupTasks()
return brain
}
fun getCoreTasks(): List<com.mojang.datafixers.util.Pair<Int, Task<in PokemonEntity>>> {
val tasks: MutableList<com.mojang.datafixers.util.Pair<Int, Task<in PokemonEntity>>> = mutableListOf()
override fun getCoreTasks(): BrainActivityGroup<PokemonEntity> {
val tasks: MutableList<MultiTickTask<in PokemonEntity>> = mutableListOf()
if (!pokemon.form.behaviour.moving.swim.canBreatheUnderwater) {
tasks.add(0 toDF StayAfloatTask(0.8F))
tasks.add(StayAfloatTask(0.8F))
}
tasks.add(0 toDF GetAngryAtAttackerTask.create())
tasks.add(0 toDF ForgetAngryAtTargetTask.create())
tasks.add(0 toDF HandleBattleActivityGoal.create())
tasks.add(0 toDF FollowWalkTargetTask())
return tasks
tasks.add(GetAngryAtAttackerTask())
tasks.add(ForgetAngryAtTargetTask.create())
tasks.add(HandleBattleActivityGoal.create())
tasks.add(FollowWalkTargetTask())
return BrainActivityGroup.coreTasks(
tasks
)
}
fun getIdleTasks(): List<com.mojang.datafixers.util.Pair<Int, Task<in PokemonEntity>>> {
@@ -9,9 +9,12 @@
package com.cobblemon.mod.common.entity.pokemon.ai.sensors
import com.cobblemon.mod.common.CobblemonMemories
import com.cobblemon.mod.common.CobblemonSensors
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
import net.minecraft.entity.ai.brain.sensor.Sensor
import net.minecraft.entity.ai.brain.MemoryModuleType
import net.minecraft.entity.ai.brain.sensor.SensorType
import net.minecraft.server.world.ServerWorld
import net.tslat.smartbrainlib.api.core.sensor.ExtendedSensor
/**
* Senses when the Pokémon is in a situation that would make it ready to sleep.
@@ -19,8 +22,17 @@ import net.minecraft.server.world.ServerWorld
* @author Hiroku
* @since March 23rd, 2024
*/
class DrowsySensor : Sensor<PokemonEntity>(100) {
override fun getOutputMemoryModules() = setOf(CobblemonMemories.POKEMON_DROWSY)
class DrowsySensor : ExtendedSensor<PokemonEntity>() {
override fun memoriesUsed(): List<MemoryModuleType<*>> {
return listOf(
CobblemonMemories.POKEMON_DROWSY
)
}
override fun type(): SensorType<out ExtendedSensor<*>> {
return CobblemonSensors.POKEMON_DROWSY
}
override fun sense(world: ServerWorld, entity: PokemonEntity) {
val rest = entity.behaviour.resting
val isDrowsy = entity.brain.getOptionalRegisteredMemory(CobblemonMemories.POKEMON_DROWSY).orElse(false)
+1
View File
@@ -60,6 +60,7 @@ dependencies {
isTransitive = false
}
modRuntimeOnly(libs.jei.fabric)
modImplementation(libs.sbl.fabric)
// modImplementation(libs.flywheelFabric)
// include(libs.flywheelFabric)
@@ -39,6 +39,8 @@ repositories {
//JEI
maven("https://maven.blamejared.com/")
maven("https://maven.tterrag.com/")
// SBL
maven("https://dl.cloudsmith.io/public/tslat/sbl/maven/")
}
license {
+3
View File
@@ -20,6 +20,7 @@ molang = "1.1.11"
graal = "22.3.0"
icu4j = "71.1"
jei-api = "15.2.0.25"
sbl = "1.14"
# Fabric
fabric-loader = "0.15.10"
@@ -65,6 +66,8 @@ jei-api = { group = "local.mezz.jei", name = "common-api", version.ref = "jei-ap
molang = { group = "local.com.bedrockk", name = "molang", version.ref = "molang" }
graal = { group = "org.graalvm.js", name = "js", version.ref = "graal" }
icu4j = { group = "com.ibm.icu", name = "icu4j", version.ref = "icu4j" }
sbl-common = { group = "net.tslat.smartbrainlib", name = "SmartBrainLib-common-1.20.1", version.ref = "sbl" }
sbl-fabric = { group = "net.tslat.smartbrainlib", name = "SmartBrainLib-fabric-1.20.1", version.ref = "sbl" }
# Fabric
fabric-loader = { group = "net.fabricmc", name = "fabric-loader", version.ref = "fabric-loader" }