Unicopia/src/main/java/com/minelittlepony/unicopia/ability/ChangelingDisguiseAbility.java

87 lines
3.1 KiB
Java
Raw Normal View History

package com.minelittlepony.unicopia.ability;
2020-01-16 12:35:46 +01:00
import javax.annotation.Nullable;
import com.minelittlepony.unicopia.ability.data.Hit;
import com.minelittlepony.unicopia.ability.magic.spell.DisguiseSpell;
import com.minelittlepony.unicopia.ability.magic.spell.SpellType;
import com.minelittlepony.unicopia.entity.behaviour.Disguise;
import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.particle.UParticles;
2020-09-27 20:07:55 +02:00
import com.minelittlepony.unicopia.util.RayTraceHelper;
2020-01-16 12:35:46 +01:00
import net.minecraft.entity.Entity;
import net.minecraft.entity.FallingBlockEntity;
import net.minecraft.entity.LightningEntity;
import net.minecraft.entity.player.PlayerEntity;
2020-09-27 20:07:55 +02:00
import net.minecraft.predicate.entity.EntityPredicates;
2020-01-16 12:35:46 +01:00
import net.minecraft.sound.SoundCategory;
import net.minecraft.sound.SoundEvents;
/**
* Changeling ability to disguise themselves as other players.
*/
2020-04-15 17:22:29 +02:00
public class ChangelingDisguiseAbility extends ChangelingFeedAbility {
2020-01-16 12:35:46 +01:00
@Nullable
@Override
2020-04-15 18:12:00 +02:00
public Hit tryActivate(Pony player) {
if (player.getMaster().isCreative() || player.getMagicalReserves().getMana().getPercentFill() >= 0.9F) {
2020-10-01 17:04:48 +02:00
return Hit.INSTANCE;
}
return null;
2020-01-16 12:35:46 +01:00
}
@Override
2020-04-15 18:12:00 +02:00
public void apply(Pony iplayer, Hit data) {
PlayerEntity player = iplayer.getMaster();
2020-01-16 12:35:46 +01:00
if (!player.isCreative() && iplayer.getMagicalReserves().getMana().getPercentFill() < 0.9F) {
2020-10-01 17:04:48 +02:00
return;
}
2020-09-27 20:07:55 +02:00
RayTraceHelper.Trace trace = RayTraceHelper.doTrace(player, 10, 1, EntityPredicates.EXCEPT_SPECTATOR.and(e -> !(e instanceof LightningEntity)));
2020-01-16 12:35:46 +01:00
2020-09-27 20:07:55 +02:00
Entity looked = trace.getEntity().map(e -> {
return e instanceof PlayerEntity ? Pony.of((PlayerEntity)e)
.getSpellOrEmpty(DisguiseSpell.class)
.map(DisguiseSpell::getDisguise)
.map(Disguise::getAppearance)
.orElse(e) : e;
}).orElseGet(() -> trace.getBlockPos().map(pos -> {
2020-01-16 12:35:46 +01:00
if (!iplayer.getWorld().isAir(pos)) {
2020-09-27 20:07:55 +02:00
return new FallingBlockEntity(player.getEntityWorld(), 0, 0, 0, iplayer.getWorld().getBlockState(pos));
2020-01-16 12:35:46 +01:00
}
2020-09-27 20:07:55 +02:00
return null;
}).orElse(null));
2020-01-16 12:35:46 +01:00
2020-04-22 16:28:20 +02:00
player.getEntityWorld().playSound(null, player.getBlockPos(), SoundEvents.ENTITY_PARROT_IMITATE_RAVAGER, SoundCategory.PLAYERS, 1.4F, 0.4F);
2020-01-16 12:35:46 +01:00
2020-09-24 14:49:02 +02:00
iplayer.getSpellOrEmpty(DisguiseSpell.class).orElseGet(() -> {
DisguiseSpell disc = SpellType.DISGUISE.create();
2020-01-16 12:35:46 +01:00
2020-05-28 18:27:30 +02:00
iplayer.setSpell(disc);
2020-01-16 12:35:46 +01:00
return disc;
}).setDisguise(looked);
if (!player.isCreative()) {
iplayer.getMagicalReserves().getMana().multiply(0.1F);
}
2020-10-01 17:04:48 +02:00
2020-09-27 20:07:55 +02:00
player.calculateDimensions();
iplayer.setDirty();
2020-01-16 12:35:46 +01:00
}
@Override
public void preApply(Pony player, AbilitySlot slot) {
2020-10-01 17:04:48 +02:00
player.getMagicalReserves().getEnergy().add(20);
2020-01-16 12:35:46 +01:00
player.spawnParticles(UParticles.CHANGELING_MAGIC, 5);
}
@Override
public void postApply(Pony player, AbilitySlot slot) {
2020-10-01 17:04:48 +02:00
player.getMagicalReserves().getEnergy().set(0);
2020-01-16 12:35:46 +01:00
player.spawnParticles(UParticles.CHANGELING_MAGIC, 5);
}
}