Advertisement
Roadkill909

FireListener

Sep 9th, 2012
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 4.51 KB | None | 0 0
  1. import java.util.HashMap;
  2. import org.bukkit.Bukkit;
  3. import org.bukkit.entity.Entity;
  4. import org.bukkit.entity.LivingEntity;
  5. import org.bukkit.entity.Player;
  6. import org.bukkit.entity.SmallFireball;
  7. import org.bukkit.event.EventHandler;
  8. import org.bukkit.event.Listener;
  9. import org.bukkit.event.entity.EntityDamageByEntityEvent;
  10. import org.bukkit.event.entity.EntityDeathEvent;
  11. import org.bukkit.event.player.PlayerQuitEvent;
  12. import org.bukkit.scheduler.BukkitScheduler;
  13.  
  14. import static org.bukkit.entity.EntityType.SMALL_FIREBALL;
  15. import static org.bukkit.event.entity.EntityDamageEvent.DamageCause.FIRE_TICK;
  16. import static org.bukkit.event.EventPriority.MONITOR;
  17.  
  18. import com.herocraftonline.heroes.Heroes;
  19. import com.herocraftonline.heroes.characters.Hero;
  20. import com.herocraftonline.heroes.characters.classes.HeroClass.ExperienceType;
  21.  
  22. /** Should give exp to players kill entities with fireballs
  23.  *  It looks like it turned out well for being written in under
  24.  *  an hour. Note it is untested
  25.  *  
  26.  *  I, Roadkill909, the author of this class allow anyone to use, modify, distribute,
  27.  * or relicense this source file or this file in compiled form without restriction
  28.  *  @author Roadkill909 */
  29. public class FireListener implements Listener{
  30.     private static HashMap<LivingEntity,BurningEntityInfo> onFireEntities =
  31.             new HashMap<LivingEntity,BurningEntityInfo>();
  32.     private final Heroes heroes;
  33.    
  34.     private FireListener(Heroes heroes) {
  35.         this.heroes = heroes;
  36.     }
  37.  
  38.     /** checks if a fireball casted by a hero hits
  39.      * an entity and adds this info to the collection of onFireEntities.
  40.      * If the collection already contains that entity, the hero and removal task are reset */
  41.     @EventHandler(ignoreCancelled=true, priority=MONITOR)
  42.     public void onEntityDamageByEntity(EntityDamageByEntityEvent event){
  43.         final Entity victim = event.getEntity();
  44.         if(!(victim instanceof LivingEntity))return;
  45.        
  46.         //check if fireball
  47.         final Entity damager = event.getDamager();
  48.         final SmallFireball projectile;
  49.         if(damager.getType()==SMALL_FIREBALL)
  50.             projectile=(SmallFireball) damager;
  51.         else return;
  52.        
  53.         //check if hero is caster
  54.         final LivingEntity caster = projectile.getShooter();
  55.         final Hero heroicCaster;
  56.         if(caster!=null&&caster instanceof Player){
  57.             heroicCaster =heroes.getCharacterManager().getHero((Player) caster);
  58.             final BurningEntityInfo info = onFireEntities.get(victim);
  59.             if(info==null){
  60.                 new BurningEntityInfo((LivingEntity) victim,heroicCaster);
  61.             }else{
  62.                 info.reset(heroicCaster);//used if the entity is already on fire and in the collection of onFireEntities
  63.             }
  64.         }
  65.     }
  66.    
  67.     /** attempts to remove the entity, if removed, gives the Hero Exp */
  68.     @EventHandler(ignoreCancelled=true, priority=MONITOR)
  69.     public void onEntityDeath(EntityDeathEvent event){
  70.         final LivingEntity entity = event.getEntity();
  71.         final BurningEntityInfo info = onFireEntities.remove(entity);
  72.         if(entity.getLastDamageCause().getCause()!=FIRE_TICK&&info!=null){
  73.             info.caster.gainExp(
  74.                     heroes.getCharacterManager().getMonster(entity).getExperience(),
  75.                     ExperienceType.KILLING,
  76.                     entity.getLocation()
  77.                 );
  78.         }
  79.     }
  80.    
  81.     /** attempts to remove the entity if it's a player that logs out */
  82.     @EventHandler(priority=MONITOR)
  83.     public void onPlayerQuit(PlayerQuitEvent event){
  84.         onFireEntities.remove(event.getPlayer());
  85.     }
  86.    
  87.     /** I was going to make this two different classes stored in two different maps,
  88.      * but seemed safer to combine this.
  89.      *
  90.      * This task when run removes the entity from the onFireEntities
  91.      * can be reset if another/same hero hits the same entity agains
  92.      */
  93.     private final class BurningEntityInfo implements Runnable{
  94.         private final LivingEntity victim;
  95.         private Hero caster;
  96.         private int taskId;
  97.        
  98.         private BurningEntityInfo(LivingEntity victim, Hero caster) {
  99.             this.victim=victim;
  100.             this.caster=caster;
  101.             taskId= Bukkit.getScheduler().scheduleSyncDelayedTask(heroes,this,victim.getFireTicks());
  102.             onFireEntities.put(victim,this);
  103.         }
  104.        
  105.         /** removes the burning entity when run*/
  106.         public void run() {
  107.             onFireEntities.remove(victim);
  108.         }
  109.        
  110.         /** Used if the entity is hit again by a fireball
  111.          * it reschedules the task and restores the hero object
  112.          * in case it is a different hero (Two mages hitting the same target */
  113.         private void reset(Hero caster){
  114.             this.caster=caster;
  115.             BukkitScheduler schedule = Bukkit.getScheduler();
  116.             schedule.cancelTask(taskId);
  117.             taskId=schedule.scheduleSyncDelayedTask(heroes, this, victim.getFireTicks());
  118.         }
  119.     }
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement