package net.fretux.adaptivemobs.event; import net.fretux.adaptivemobs.ai.AdaptiveGoalInjector; import net.fretux.adaptivemobs.ai.AdaptiveMemory; import net.fretux.adaptivemobs.ai.AdaptiveMobHooks; import net.fretux.adaptivemobs.ai.AdaptiveSpecialAbilities; import net.fretux.adaptivemobs.commands.AdaptiveMobsCommands; import net.fretux.adaptivemobs.config.AMConfig; import net.fretux.adaptivemobs.difficulty.AdaptiveDifficultyManager; import net.fretux.adaptivemobs.gear.GearScaler; import net.fretux.adaptivemobs.scaling.MobStatScaler; import net.fretux.adaptivemobs.spawn.SpawnPressureHelper; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.monster.Enemy; import net.minecraft.world.entity.projectile.Projectile; import net.minecraftforge.event.RegisterCommandsEvent; import net.minecraftforge.event.entity.living.LivingEntityUseItemEvent; import net.minecraftforge.event.entity.EntityJoinLevelEvent; import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.living.LivingHurtEvent; import net.minecraftforge.event.entity.living.MobSpawnEvent; import net.minecraftforge.event.level.BlockEvent; import net.minecraftforge.event.level.ExplosionEvent; import net.minecraftforge.event.level.LevelEvent; import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; public class AdaptiveMobsEvents { @SubscribeEvent public void onCommands(RegisterCommandsEvent event) { AdaptiveMobsCommands.register(event.getDispatcher()); } @SubscribeEvent public void onLivingDeath(LivingDeathEvent event) { LivingEntity killed = event.getEntity(); if (!(event.getSource().getEntity() instanceof ServerPlayer player)) { return; } AdaptiveDifficultyManager.recordKill(player, killed); } @SubscribeEvent public void onLivingHurt(LivingHurtEvent event) { AdaptiveSpecialAbilities.onLivingHurt(event); if (!AMConfig.enabled || !AMConfig.ENABLE_THREAT_MEMORY_AI.get()) { return; } if (event.getEntity() instanceof Mob mob && mob instanceof Enemy && event.getSource().getEntity() instanceof ServerPlayer player) { AdaptiveMemory.rememberThreat(mob, player, 20 * 12); } } @SubscribeEvent public void onBlockBreak(BlockEvent.BreakEvent event) { if (AMConfig.enabled && AMConfig.ENABLE_SOUND_INVESTIGATION_AI.get() && event.getLevel() instanceof ServerLevel level) { AdaptiveMemory.rememberSound(level, event.getPos(), AdaptiveMemory.SoundKind.BLOCK_BREAK, 20 * 8); } } @SubscribeEvent public void onItemUseFinish(LivingEntityUseItemEvent.Finish event) { if (AMConfig.enabled && AMConfig.ENABLE_SOUND_INVESTIGATION_AI.get() && event.getEntity() instanceof ServerPlayer player && event.getItem().isEdible()) { AdaptiveMemory.rememberSound(player.serverLevel(), player.blockPosition(), AdaptiveMemory.SoundKind.EATING, 20 * 6); } } @SubscribeEvent public void onFinalizeSpawn(MobSpawnEvent.FinalizeSpawn event) { if (!AMConfig.enabled || !(event.getLevel() instanceof ServerLevel level)) { return; } Mob mob = event.getEntity(); if (!(mob instanceof Enemy) || !AMConfig.isMobEnabled(mob.getType())) { return; } int tier = AdaptiveDifficultyManager.getMobTier(level, mob.getType()); MobStatScaler.applyScaling(mob, tier); GearScaler.applyGear(mob, tier); AdaptiveGoalInjector.inject(mob, level, tier); SpawnPressureHelper.maybeSpawnExtra(level, mob, tier, event.getSpawnType()); } @SubscribeEvent public void onEntityJoinLevel(EntityJoinLevelEvent event) { AdaptiveMobHooks.onProjectileJoin(event); AdaptiveSpecialAbilities.onProjectileJoin(event); if (!(event.getLevel() instanceof ServerLevel level)) { return; } Entity entity = event.getEntity(); if (AMConfig.enabled && entity instanceof Mob mob && mob instanceof Enemy && AMConfig.isMobEnabled(mob.getType())) { AdaptiveGoalInjector.inject(mob, level, AdaptiveDifficultyManager.getMobTier(level, mob.getType())); } if (AMConfig.enabled && AMConfig.ENABLE_SOUND_INVESTIGATION_AI.get() && entity instanceof Projectile projectile && projectile.getOwner() instanceof ServerPlayer player) { AdaptiveMemory.rememberSound(level, player.blockPosition(), AdaptiveMemory.SoundKind.BOW_SHOT, 20 * 6); } } @SubscribeEvent public void onLevelUnload(LevelEvent.Unload event) { if (event.getLevel() instanceof ServerLevel level) { AdaptiveMemory.clear(level); } } @SubscribeEvent public void onExplosion(ExplosionEvent.Detonate event) { if (AMConfig.enabled && AMConfig.ENABLE_SOUND_INVESTIGATION_AI.get() && event.getLevel() instanceof ServerLevel level) { AdaptiveMemory.rememberSound(level, event.getExplosion().getPosition(), AdaptiveMemory.SoundKind.EXPLOSION, 20 * 10); } } @SubscribeEvent public void onServerTick(TickEvent.ServerTickEvent event) { AdaptiveSpecialAbilities.onServerTick(event); } }