Files
Ascend/src/main/java/net/fretux/ascend/event/ActivityEvents.java
T
2025-11-08 13:13:31 +01:00

210 lines
8.9 KiB
Java

package net.fretux.ascend.event;
import net.fretux.ascend.AscendMod;
import net.fretux.ascend.player.PlayerStatsProvider;
import net.minecraft.core.BlockPos;
import net.minecraft.world.effect.MobEffectCategory;
import net.minecraft.world.entity.npc.Villager;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.LightLayer;
import net.minecraft.world.level.block.Block;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.entity.living.LivingDeathEvent;
import net.minecraftforge.event.entity.living.LivingHurtEvent;
import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.event.level.BlockEvent;
@Mod.EventBusSubscriber(modid = AscendMod.MODID)
public class ActivityEvents {
private static int agilityTickCounter = 0;
private static int fortitudeTickCounter = 0;
private static int willpowerTickCounter = 0;
@SubscribeEvent
public static void onMobKilled(LivingDeathEvent event) {
if (event.getSource().getEntity() instanceof Player player && !player.level().isClientSide) {
player.getCapability(PlayerStatsProvider.PLAYER_STATS).ifPresent(stats ->
stats.addXP("strength", 5)
);
PlayerStatsProvider.sync(player);
}
}
@SubscribeEvent
public static void onBlockBreak(BlockEvent.BreakEvent event) {
Player player = event.getPlayer();
if (player == null || player.level().isClientSide) return;
Block block = event.getState().getBlock();
String name = block.getName().getString().toLowerCase();
player.getCapability(PlayerStatsProvider.PLAYER_STATS).ifPresent(stats -> {
if (name.contains("log") || name.contains("ore") || name.contains("stone")) {
stats.addXP("strength", 2);
System.out.println("Added 2 strength XP");
PlayerStatsProvider.sync(player);
}
});
}
@SubscribeEvent
public static void onPlayerDamaged(LivingHurtEvent event) {
if (event.getEntity() instanceof Player player && !player.level().isClientSide) {
player.getCapability(PlayerStatsProvider.PLAYER_STATS).ifPresent(stats ->
stats.addXP("fortitude", Math.min((int) event.getAmount() * 2, 10))
);
PlayerStatsProvider.sync(player);
System.out.println("Added " + event.getAmount() * 2 + " fortitude XP");
}
}
@SubscribeEvent
public static void onPlayerTickFortitude(TickEvent.PlayerTickEvent event) {
Player player = event.player;
if (player.level().isClientSide || event.phase != TickEvent.Phase.END) return;
fortitudeTickCounter++;
if (fortitudeTickCounter % 100 == 0) {
player.getCapability(PlayerStatsProvider.PLAYER_STATS).ifPresent(stats -> {
boolean hasNegativeEffect = player.getActiveEffects().stream()
.anyMatch(e -> e.getEffect().getCategory() == MobEffectCategory.HARMFUL);
if (player.getFoodData().getFoodLevel() <= 6 || hasNegativeEffect) {
stats.addXP("fortitude", 2);
PlayerStatsProvider.sync(player);
}
});
}
}
@SubscribeEvent
public static void onPlayerTickAgility(TickEvent.PlayerTickEvent event) {
Player player = event.player;
if (player.level().isClientSide || event.phase != TickEvent.Phase.END) return;
agilityTickCounter++;
if (agilityTickCounter % 20 != 0) return;
player.getCapability(PlayerStatsProvider.PLAYER_STATS).ifPresent(stats -> {
if (player.isSprinting()) stats.addXP("agility", 2);
if (player.isCrouching()) stats.addXP("agility", 1);
if (Math.abs(player.getDeltaMovement().y) > 0.25) stats.addXP("agility", 1);
if (player.onClimbable()) stats.addXP("agility", 1);
PlayerStatsProvider.sync(player);
});
}
@SubscribeEvent
public static void onItemCrafted(PlayerEvent.ItemCraftedEvent event) {
Player player = event.getEntity();
if (player.level().isClientSide) return;
player.getCapability(PlayerStatsProvider.PLAYER_STATS).ifPresent(stats -> {
stats.addXP("intelligence", 3);
PlayerStatsProvider.sync(player);
});
}
@SubscribeEvent
public static void onItemSmelted(PlayerEvent.ItemSmeltedEvent event) {
Player player = event.getEntity();
if (player.level().isClientSide) return;
player.getCapability(PlayerStatsProvider.PLAYER_STATS).ifPresent(stats -> {
stats.addXP("intelligence", 2);
PlayerStatsProvider.sync(player);
});
}
@SubscribeEvent
public static void onPlayerTickWillpower(TickEvent.PlayerTickEvent event) {
Player player = event.player;
if (player.level().isClientSide || event.phase != TickEvent.Phase.END) return;
willpowerTickCounter++;
if (willpowerTickCounter % 100 == 0) { // every 5s
player.getCapability(PlayerStatsProvider.PLAYER_STATS).ifPresent(stats -> {
// XP for surviving under pressure
boolean hasNegativeEffect = player.getActiveEffects().stream()
.anyMatch(e -> e.getEffect().getCategory() == MobEffectCategory.HARMFUL);
boolean lowHealth = player.getHealth() <= player.getMaxHealth() * 0.25f;
// Check darkness
BlockPos pos = player.blockPosition();
int light = player.level().getBrightness(LightLayer.BLOCK, pos);
if (hasNegativeEffect || lowHealth || light < 4) {
stats.addXP("willpower", 2);
PlayerStatsProvider.sync(player);
}
});
}
}
@SubscribeEvent
public static void onVillagerTrade(PlayerInteractEvent.EntityInteract event) {
if (!(event.getTarget() instanceof Villager villager)) return;
Player player = event.getEntity();
if (player.level().isClientSide) return;
player.getCapability(PlayerStatsProvider.PLAYER_STATS).ifPresent(stats -> {
stats.addXP("charisma", 5);
PlayerStatsProvider.sync(player);
});
}
@SubscribeEvent
public static void onWeaponUsed(LivingHurtEvent event) {
if (!(event.getSource().getEntity() instanceof Player player)) return;
if (player.level().isClientSide) return;
if (event.getEntity() == player) return;
player.getCapability(PlayerStatsProvider.PLAYER_STATS).ifPresent(stats -> {
var heldItem = player.getMainHandItem();
if (heldItem.isEmpty()) return;
double attackSpeed = player.getAttribute(
net.minecraft.world.entity.ai.attributes.Attributes.ATTACK_SPEED
).getBaseValue();
String category = (attackSpeed >= 2.0) ? "light_scaling"
: (attackSpeed >= 1.2) ? "medium_scaling"
: "heavy_scaling";
stats.addXP(category, 3);
PlayerStatsProvider.sync(player);
});
}
@SubscribeEvent
public static void onPotionUse(PlayerInteractEvent.RightClickItem event) {
Player player = event.getEntity();
if (player.level().isClientSide) return;
if (event.getItemStack().getItem().getDescriptionId().contains("potion")) {
player.getCapability(PlayerStatsProvider.PLAYER_STATS).ifPresent(stats -> {
stats.addXP("magic_scaling", 3);
PlayerStatsProvider.sync(player);
});
}
}
@SubscribeEvent
public static void onGainPotionEffect(net.minecraftforge.event.entity.living.MobEffectEvent.Added event) {
if (!(event.getEntity() instanceof Player player)) return;
if (player.level().isClientSide) return;
if (event.getEffectInstance().getEffect().getCategory() == net.minecraft.world.effect.MobEffectCategory.BENEFICIAL) {
player.getCapability(PlayerStatsProvider.PLAYER_STATS).ifPresent(stats -> {
stats.addXP("magic_scaling", 2);
PlayerStatsProvider.sync(player);
});
}
}
@SubscribeEvent
public static void onItemSmeltedForMagic(PlayerEvent.ItemSmeltedEvent event) {
Player player = event.getEntity();
if (player.level().isClientSide) return;
String itemName = event.getSmelting().getDisplayName().getString().toLowerCase();
if (itemName.contains("potion") || itemName.contains("elixir")) {
player.getCapability(PlayerStatsProvider.PLAYER_STATS).ifPresent(stats -> {
stats.addXP("magic_scaling", 2);
PlayerStatsProvider.sync(player);
});
}
}
}