package de.tobiyas.racesandclasses.traitcontainer.traits.defaultraits.activate.MeleeDotTrait; import java.util.LinkedList; import java.util.List; import org.bukkit.ChatColor; import org.bukkit.entity.LivingEntity; import de.tobiyas.racesandclasses.APIs.DotAPI; import de.tobiyas.racesandclasses.entitystatusmanager.dot.DamageType; import de.tobiyas.racesandclasses.entitystatusmanager.dot.DotBuilder; 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.translation.languages.Keys; import de.tobiyas.racesandclasses.util.entitysearch.SearchEntity; import de.tobiyas.racesandclasses.util.traitutil.TraitConfiguration; import de.tobiyas.racesandclasses.util.traitutil.TraitConfigurationFailedException; public class MeleeDotTrait extends AbstractBasicTrait { /** * The Dot to apply. */ private DotBuilder dotBuilderToApply = null; /** * the range to use. */ private int range = 4; @TraitEventsUsed(registerdClasses = {}) @Override public void generalInit(){ plugin.registerEvents(this); } @Override public String getName() { return "MeleeDotTrait"; } @Override protected String getPrettyConfigIntern() { return "fire a Grappling hook."; } @TraitConfigurationNeeded(fields = { @TraitConfigurationField(fieldName = "damage", classToExpect = Double.class, optional = true), @TraitConfigurationField(fieldName = "duration", classToExpect = Integer.class, optional = true), @TraitConfigurationField(fieldName = "damageEvery", classToExpect = Integer.class, optional = true), @TraitConfigurationField(fieldName = "damageType", classToExpect = String.class, optional = true), @TraitConfigurationField(fieldName = "range", classToExpect = Integer.class, optional = true) }) @Override public void setConfiguration(TraitConfiguration configMap) throws TraitConfigurationFailedException { super.setConfiguration(configMap); this.range = configMap.getAsInt("range", 3); double damage = configMap.getAsDouble("damage", 2); int duration = configMap.getAsInt("duration", 4)*20; int damageEvery = configMap.getAsInt("damageEvery", 20); String type = configMap.getAsString("damageType", DamageType.BLEEDING.name()).toUpperCase(); this.dotBuilderToApply = new DotBuilder(getName()) .setTotalDamage(damage) .setTotalTimeInSeconds(duration) .setDamageEveryTicks(damageEvery) .setDamageType(DamageType.parse(type)); if(!this.dotBuilderToApply.valid()) throw new TraitConfigurationFailedException(getName() + " Dot-Properties are not valid!", holders.iterator().next()); } @Override public TraitResults trigger(EventWrapper eventWrapper) { return TraitResults.False(); } public static List<String> getHelpForTrait(){ List<String> helpList = new LinkedList<String>(); helpList.add(ChatColor.YELLOW + "Put a DoT on your enemy."); return helpList; } @Override public boolean isBetterThan(Trait trait) { return false; } @TraitInfos(category="activate", traitName="MeleeDotTrait", visible=true) @Override public void importTrait() { } @Override public boolean triggerButHasUplink(EventWrapper wrapper) { //Not needed return true; } @Override public boolean notifyTriggeredUplinkTime(EventWrapper wrapper) { return true; } @Override public boolean isBindable() { return true; } @Override protected TraitResults bindCastIntern(RaCPlayer player) { LivingEntity target = SearchEntity.inLineOfSight(modifyToPlayer(player, range, "range"), player.getPlayer()); if(target == null) { player.sendTranslatedMessage(Keys.no_taget_found); return TraitResults.False(); } //Add the Dot: DotBuilder builder = dotBuilderToApply.copy(); builder.setDamager(player); builder.setTotalDamage(modifyToPlayer(player, builder.getTotalDamage(), "damage")); builder.setTotalTimeInTicks(modifyToPlayer(player, builder.getTotalTimeInTicks(), "duration")); DotAPI.addDot(target, dotBuilderToApply); return TraitResults.True(); } @Override public boolean canBeTriggered(EventWrapper wrapper) { return false; } }