/******************************************************************************* * Copyright 2014 Tob * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package de.tobiyas.racesandclasses.traitcontainer.traits.defaultraits.arrow.StunArrowTrait; import java.security.SecureRandom; import java.util.LinkedList; import java.util.List; import org.bukkit.ChatColor; import org.bukkit.entity.Arrow; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityShootBowEvent; import org.bukkit.event.entity.ProjectileHitEvent; import de.tobiyas.racesandclasses.APIs.LanguageAPI; import de.tobiyas.racesandclasses.APIs.StunAPI; import de.tobiyas.racesandclasses.playermanagement.player.RaCPlayer; import de.tobiyas.racesandclasses.playermanagement.player.RaCPlayerManager; 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.traits.arrows.AbstractArrow; import de.tobiyas.racesandclasses.translation.languages.Keys; import de.tobiyas.racesandclasses.util.bukkit.versioning.compatibility.CompatibilityModifier; import de.tobiyas.racesandclasses.util.traitutil.TraitConfiguration; import de.tobiyas.racesandclasses.util.traitutil.TraitConfigurationFailedException; public class StunArrowTrait extends AbstractArrow { /** * The Chance that a Stun works. */ private double chance = 0.1; /** * The Rand to check the Chance. */ private final SecureRandom rand = new SecureRandom(); public StunArrowTrait(){ } @TraitEventsUsed(registerdClasses = {}) @Override public void generalInit(){ } @Override public String getName() { return "StunArrowTrait"; } @Override protected String getPrettyConfigIntern(){ return "stun duration: " + duration + " seconds."; } @TraitConfigurationNeeded(fields = { @TraitConfigurationField(fieldName = "duration", classToExpect = Integer.class), @TraitConfigurationField(fieldName = "chance", classToExpect = Double.class, optional = true) }) @Override public void setConfiguration(TraitConfiguration configMap) throws TraitConfigurationFailedException { super.setConfiguration(configMap); duration = (Integer) configMap.get("duration"); if(configMap.containsKey("chance")){ chance = (Double) configMap.get("chance"); } } @Override protected boolean onShoot(EntityShootBowEvent event){ return false; } @Override protected boolean onHitEntity(EntityDamageByEntityEvent event){ //early out for no damaging. if(event.isCancelled() || CompatibilityModifier.EntityDamage.safeGetDamage(event) == 0) return false; Entity hitTarget = event.getEntity(); if(!(hitTarget instanceof LivingEntity)) return false; //chance did not hit. if(rand.nextDouble() > chance) return false; Player shooter = null; if(event.getDamager() instanceof Arrow){ Arrow arrow = (Arrow) event.getDamager(); if(arrow.getShooter() instanceof Player){ shooter = (Player) arrow.getShooter(); } }else{ if(event.getDamager() instanceof Player){ shooter = (Player) event.getDamager(); } } RaCPlayer racshooter = RaCPlayerManager.get().getPlayer((Player) shooter); int modDur = modifyToPlayer(racshooter, duration, "duration"); boolean stunned = StunAPI.StunEntity.stunEntityForSeconds(shooter, hitTarget, modDur); if(stunned){ if(shooter != null){ String enemy = hitTarget instanceof Player ? ((Player)hitTarget).getName() : hitTarget.getType().name(); LanguageAPI.sendTranslatedMessage(shooter, Keys.trait_stun_arrow_success, "duration", String.valueOf(modDur), "target", enemy); } } return stunned; } @Override protected String getArrowName(){ return "Stun Arrow"; } @Override protected boolean onHitLocation(ProjectileHitEvent event) { //Not needed return false; } public static List<String> getHelpForTrait(){ List<String> helpList = new LinkedList<String>(); helpList.add(ChatColor.YELLOW + "If you hit an enemy with an arrow and choosen the Stun Arrow as current arrow,"); helpList.add(ChatColor.YELLOW + "He will be stunned."); return helpList; } @TraitInfos(category="arrow", traitName="StunArrowTrait", visible=true) @Override public void importTrait() { } }