package de.tobiyas.racesandclasses.traitcontainer.traits.defaultraits.activate.ExecuteTrait;
import org.bukkit.entity.LivingEntity;
import de.tobiyas.racesandclasses.eventprocessing.eventresolvage.EventWrapper;
import de.tobiyas.racesandclasses.playermanagement.player.RaCPlayer;
import de.tobiyas.racesandclasses.traitcontainer.interfaces.TraitResults;
import de.tobiyas.racesandclasses.traitcontainer.interfaces.annotations.configuration.TraitConfigurationField;
import de.tobiyas.racesandclasses.traitcontainer.interfaces.annotations.configuration.TraitConfigurationNeeded;
import de.tobiyas.racesandclasses.traitcontainer.interfaces.annotations.configuration.TraitInfos;
import de.tobiyas.racesandclasses.traitcontainer.interfaces.markerinterfaces.TraitRestriction;
import de.tobiyas.racesandclasses.traitcontainer.traits.defaultraits.activate.InstantMeleeDamageTrait.InstantMeleeDamageTrait;
import de.tobiyas.racesandclasses.util.bukkit.versioning.compatibility.CompatibilityModifier;
import de.tobiyas.racesandclasses.util.entitysearch.SearchEntity;
import de.tobiyas.racesandclasses.util.friend.EnemyChecker;
import de.tobiyas.racesandclasses.util.traitutil.TraitConfiguration;
import de.tobiyas.racesandclasses.util.traitutil.TraitConfigurationFailedException;
import de.tobiyas.racesandclasses.vollotile.Vollotile;
public class ExecuteTrait extends InstantMeleeDamageTrait {
/**
* Under what percent.
*/
private double percent = 20;
@TraitInfos(category="activate", traitName="ExecuteTrait", visible=true)
@Override
public void importTrait() {}
@Override
public String getName() {
return "ExecuteTrait";
}
@TraitConfigurationNeeded(fields={
@TraitConfigurationField(fieldName="percent", classToExpect=Double.class, optional=true)
})
@Override
public void setConfiguration(TraitConfiguration configMap) throws TraitConfigurationFailedException {
super.setConfiguration(configMap);
this.percent = configMap.getAsDouble("percent", 20);
}
@Override
public TraitResults trigger(EventWrapper wrapper) {
return TraitResults.False();
}
@Override
protected String getPrettyConfigIntern() {
return "does instant " + damage + " damage when under " + percent + " percent";
}
@Override
protected TraitRestriction checkForFurtherRestrictions(EventWrapper wrapper) {
int range = modifyToPlayer(wrapper.getPlayer(), this.range, "range");
LivingEntity target = SearchEntity.inLineOfSight(range, wrapper.getPlayer().getPlayer());
if(target == null) return TraitRestriction.NoTarget;
double targetPercent = target.getMaxHealth() / target.getHealth();
if(targetPercent > percent) return TraitRestriction.NoTarget;
if(EnemyChecker.areAllies(wrapper.getPlayer().getPlayer(), target)) return TraitRestriction.TargetFriendly;
return null;
}
@Override
protected TraitResults bindCastIntern(RaCPlayer player) {
int range = modifyToPlayer(player, this.range, "range");
LivingEntity target = SearchEntity.inLineOfSight(range, player.getPlayer());
if(target == null) return TraitResults.False();
double newDamage = modifyToPlayer(player, this.damage, "damage");
CompatibilityModifier.LivingEntity.safeDamageEntityByEntity(target, player.getPlayer(), newDamage, damageType.getCause());
//Sends a particle effect to be somewhat more cool!
Vollotile.get().sendOwnParticleEffectToAll(damageType.getParticleContainer(), target.getEyeLocation());
return TraitResults.True();
}
@Override
public boolean isBindable() {
return true;
}
}