superb-warfare/src/main/java/com/atsuishio/superbwarfare/mobeffect/BurnMobEffect.java
2024-11-26 22:52:05 +08:00

111 lines
4.1 KiB
Java

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());
}
}
}