97 lines
3.3 KiB
Java
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());
|
|
}
|
|
}
|
|
|
|
}
|