package com.atsuishio.superbwarfare.mobeffect; import com.atsuishio.superbwarfare.network.message.ClientIndicatorMessage; import com.atsuishio.superbwarfare.ModUtils; import com.atsuishio.superbwarfare.init.ModDamageTypes; import com.atsuishio.superbwarfare.init.ModMobEffects; import com.atsuishio.superbwarfare.init.ModSounds; import net.minecraft.core.registries.Registries; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundSource; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.damagesource.DamageTypes; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.effect.MobEffectCategory; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraftforge.event.entity.living.LivingEvent; import net.minecraftforge.event.entity.living.MobEffectEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.network.PacketDistributor; @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.FORGE) public class BurnMobEffect extends MobEffect { public BurnMobEffect() { super(MobEffectCategory.HARMFUL, -12708330); } @Override public void applyEffectTick(LivingEntity entity, int amplifier) { Entity attacker; if (!entity.getPersistentData().contains("BurnAttacker")) { attacker = null; } else { attacker = entity.level().getEntity(entity.getPersistentData().getInt("BurnAttacker")); } entity.hurt(new DamageSource(entity.level().registryAccess().registryOrThrow(Registries.DAMAGE_TYPE).getHolderOrThrow(ModDamageTypes.BURN), attacker), 0.6f + (0.3f * amplifier)); entity.invulnerableTime = 0; if (attacker instanceof ServerPlayer player) { player.level().playSound(null, player.blockPosition(), ModSounds.INDICATION.get(), SoundSource.VOICE, 1, 1); ModUtils.PACKET_HANDLER.send(PacketDistributor.PLAYER.with(() -> player), new ClientIndicatorMessage(0, 5)); } } @Override public boolean isDurationEffectTick(int duration, int amplifier) { return duration % 20 == 0; } @SubscribeEvent public static void onEffectAdded(MobEffectEvent.Added event) { LivingEntity living = event.getEntity(); MobEffectInstance instance = event.getEffectInstance(); if (!instance.getEffect().equals(ModMobEffects.BURN.get())) { return; } living.hurt(new DamageSource(living.level().registryAccess().registryOrThrow(Registries.DAMAGE_TYPE).getHolderOrThrow(DamageTypes.IN_FIRE), event.getEffectSource()), 0.6f + (0.3f * instance.getAmplifier())); living.invulnerableTime = 0; if (event.getEffectSource() instanceof LivingEntity source) { living.getPersistentData().putInt("BurnAttacker", source.getId()); } } @SubscribeEvent public static void onEffectExpired(MobEffectEvent.Expired event) { LivingEntity living = event.getEntity(); MobEffectInstance instance = event.getEffectInstance(); if (instance == null) { return; } if (instance.getEffect().equals(ModMobEffects.BURN.get())) { living.getPersistentData().remove("BurnAttacker"); } } @SubscribeEvent public static void onEffectRemoved(MobEffectEvent.Remove event) { LivingEntity living = event.getEntity(); MobEffectInstance instance = event.getEffectInstance(); if (instance == null) { return; } if (instance.getEffect().equals(ModMobEffects.BURN.get())) { living.getPersistentData().remove("BurnAttacker"); } } @SubscribeEvent public static void onLivingTick(LivingEvent.LivingTickEvent event) { LivingEntity living = event.getEntity(); if (living.hasEffect(ModMobEffects.BURN.get())) { living.setRemainingFireTicks(2); } if (living.isInWater()) { living.removeEffect(ModMobEffects.BURN.get()); } } }