package de.tobiyas.racesandclasses.traitcontainer.traits.defaultraits.activate.InstantMeleeDamageTrait;
import org.bukkit.entity.LivingEntity;
import de.tobiyas.racesandclasses.entitystatusmanager.dot.DamageType;
import de.tobiyas.racesandclasses.eventprocessing.eventresolvage.EventWrapper;
import de.tobiyas.racesandclasses.playermanagement.player.RaCPlayer;
import de.tobiyas.racesandclasses.traitcontainer.interfaces.AbstractBasicTrait;
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.TraitEventsUsed;
import de.tobiyas.racesandclasses.traitcontainer.interfaces.annotations.configuration.TraitInfos;
import de.tobiyas.racesandclasses.traitcontainer.interfaces.markerinterfaces.Trait;
import de.tobiyas.racesandclasses.traitcontainer.interfaces.markerinterfaces.TraitRestriction;
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 InstantMeleeDamageTrait extends AbstractBasicTrait {
/**
* The damage to deal.
*/
protected double damage = 1;
/**
* The damage to deal.
*/
protected DamageType damageType = DamageType.ENTITY_ATTACK;
/**
* The range to use.
*/
protected int range = 3;
@TraitInfos(category="activate", traitName="InstantMeleeDamageTrait", visible=true)
@Override
public void importTrait() {}
@TraitEventsUsed()
@Override
public void generalInit() {}
@Override
public String getName() {
return "InstantMeleeDamageTrait";
}
@TraitConfigurationNeeded(fields={
@TraitConfigurationField(fieldName="range", classToExpect=Integer.class, optional=true),
@TraitConfigurationField(fieldName="damage", classToExpect=Double.class, optional=true),
@TraitConfigurationField(fieldName="damageType", classToExpect=String.class, optional=true)
})
@Override
public void setConfiguration(TraitConfiguration configMap) throws TraitConfigurationFailedException {
super.setConfiguration(configMap);
this.range = configMap.getAsInt("range", 3);
this.damage = configMap.getAsDouble("damage", 1);
this.damageType = DamageType.parse(configMap.getAsString("damageType", DamageType.ENTITY_ATTACK.name()));
}
@Override
public TraitResults trigger(EventWrapper wrapper) {
return TraitResults.False();
}
@Override
public boolean isBetterThan(Trait trait) {
if(trait instanceof InstantMeleeDamageTrait) return damage > ((InstantMeleeDamageTrait)trait).damage;
return false;
}
@Override
public boolean canBeTriggered(EventWrapper wrapper) {
return false;
}
@Override
protected String getPrettyConfigIntern() {
return "does instant " + damage + " damage";
}
@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;
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();
if(EnemyChecker.areAllies(player.getPlayer(), target)) 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;
}
}