Initial commit

This commit is contained in:
2026-06-29 15:59:48 +02:00
commit 7fe5ab4e24
67 changed files with 7661 additions and 0 deletions
@@ -0,0 +1,129 @@
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);
}
}