Files
Wizardry/src/main/java/electroblob/wizardry/spell/Transience.java
T
2020-04-13 20:53:14 +01:00

97 lines
3.3 KiB
Java

package electroblob.wizardry.spell;
import electroblob.wizardry.Wizardry;
import electroblob.wizardry.registry.WizardryItems;
import electroblob.wizardry.registry.WizardryPotions;
import electroblob.wizardry.util.SpellModifiers;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.MobEffects;
import net.minecraft.item.EnumAction;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.DamageSource;
import net.minecraft.util.EnumHand;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.event.entity.living.LivingAttackEvent;
import net.minecraftforge.event.entity.living.PotionEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
@Mod.EventBusSubscriber
public class Transience extends Spell {
/** A {@code ResourceLocation} representing the shader file used when under the effects of transience. */
public static final ResourceLocation SHADER = new ResourceLocation(Wizardry.MODID, "shaders/post/transience.json");
public Transience(){
super("transience", EnumAction.BOW, false);
addProperties(EFFECT_DURATION);
}
@Override
public boolean requiresPacket(){
return true;
}
@Override
public boolean cast(World world, EntityPlayer caster, EnumHand hand, int ticksInUse, SpellModifiers modifiers){
if(world.isRemote){
Wizardry.proxy.loadShader(caster, SHADER);
Wizardry.proxy.playBlinkEffect(caster);
}
if(!caster.isPotionActive(WizardryPotions.transience)){
if(!world.isRemote){
int duration = (int)(getProperty(EFFECT_DURATION).floatValue() * modifiers.get(WizardryItems.duration_upgrade));
caster.addPotionEffect(new PotionEffect(WizardryPotions.transience, duration, 0));
caster.addPotionEffect(new PotionEffect(MobEffects.INVISIBILITY, duration, 0, false, false));
this.playSound(world, caster, ticksInUse, duration, modifiers);
}
return true;
}
return false;
}
@SubscribeEvent
public static void onLivingAttackEvent(LivingAttackEvent event){
if(event.getSource() != null){
// Prevents all blockable damage while transience is active
if(event.getEntityLiving().isPotionActive(WizardryPotions.transience)
&& event.getSource() != DamageSource.OUT_OF_WORLD){
event.setCanceled(true);
}
// Prevents transient entities from causing any damage
if(event.getSource().getTrueSource() instanceof EntityLivingBase
&& ((EntityLivingBase)event.getSource().getTrueSource()).isPotionActive(WizardryPotions.transience)){
event.setCanceled(true);
}
}
}
@SubscribeEvent
public static void onPlayerInteractEvent(PlayerInteractEvent event){
// Prevents transient players from interacting with the world in any way
if(event.isCancelable() && event.getEntityPlayer().isPotionActive(WizardryPotions.transience)){
event.setCanceled(true);
}
}
@SubscribeEvent
public static void onPotionAddedEvent(PotionEvent.PotionAddedEvent event){
if(event.getEntity().world.isRemote && event.getPotionEffect().getPotion() == WizardryPotions.transience
&& event.getEntity() instanceof EntityPlayer){
Wizardry.proxy.loadShader((EntityPlayer)event.getEntity(), SHADER);
Wizardry.proxy.playBlinkEffect((EntityPlayer)event.getEntity());
}
}
}