115 lines
4.1 KiB
Java
115 lines
4.1 KiB
Java
package com.atsuishio.superbwarfare.mobeffect;
|
|
|
|
import com.atsuishio.superbwarfare.init.ModDamageTypes;
|
|
import com.atsuishio.superbwarfare.init.ModMobEffects;
|
|
import com.atsuishio.superbwarfare.init.ModSounds;
|
|
import com.atsuishio.superbwarfare.network.message.receive.ClientIndicatorMessage;
|
|
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.neoforged.bus.api.SubscribeEvent;
|
|
import net.neoforged.fml.common.EventBusSubscriber;
|
|
import net.neoforged.neoforge.event.entity.living.MobEffectEvent;
|
|
import net.neoforged.neoforge.event.tick.EntityTickEvent;
|
|
import net.neoforged.neoforge.network.PacketDistributor;
|
|
|
|
@EventBusSubscriber(bus = EventBusSubscriber.Bus.GAME)
|
|
public class BurnMobEffect extends MobEffect {
|
|
|
|
public BurnMobEffect() {
|
|
super(MobEffectCategory.HARMFUL, -12708330);
|
|
}
|
|
|
|
@Override
|
|
public boolean 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(ModDamageTypes.causeBurnDamage(entity.level().registryAccess(), 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);
|
|
PacketDistributor.sendToPlayer(player, new ClientIndicatorMessage(0, 5));
|
|
}
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public boolean shouldApplyEffectTickThisTick(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 != null && !instance.getEffect().value().equals(ModMobEffects.BURN.value())) {
|
|
return;
|
|
}
|
|
|
|
float amount = 0.6f + (0.3f * (instance == null ? 0 : instance.getAmplifier()));
|
|
|
|
living.hurt(new DamageSource(living.level().registryAccess().registryOrThrow(Registries.DAMAGE_TYPE).getHolderOrThrow(DamageTypes.IN_FIRE),
|
|
event.getEffectSource()), amount);
|
|
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)) {
|
|
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)) {
|
|
living.getPersistentData().remove("BurnAttacker");
|
|
}
|
|
}
|
|
|
|
@SubscribeEvent
|
|
public static void onLivingTick(EntityTickEvent.Post event) {
|
|
var entity = event.getEntity();
|
|
if (!(entity instanceof LivingEntity living)) return;
|
|
|
|
if (living.hasEffect(ModMobEffects.BURN)) {
|
|
living.setRemainingFireTicks(2);
|
|
}
|
|
|
|
if (living.isInWater()) {
|
|
living.removeEffect(ModMobEffects.BURN);
|
|
}
|
|
}
|
|
}
|