Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.HashMap;
- import org.bukkit.Bukkit;
- import org.bukkit.entity.Entity;
- import org.bukkit.entity.LivingEntity;
- import org.bukkit.entity.Player;
- import org.bukkit.entity.SmallFireball;
- import org.bukkit.event.EventHandler;
- import org.bukkit.event.Listener;
- import org.bukkit.event.entity.EntityDamageByEntityEvent;
- import org.bukkit.event.entity.EntityDeathEvent;
- import org.bukkit.event.player.PlayerQuitEvent;
- import org.bukkit.scheduler.BukkitScheduler;
- import static org.bukkit.entity.EntityType.SMALL_FIREBALL;
- import static org.bukkit.event.entity.EntityDamageEvent.DamageCause.FIRE_TICK;
- import static org.bukkit.event.EventPriority.MONITOR;
- import com.herocraftonline.heroes.Heroes;
- import com.herocraftonline.heroes.characters.Hero;
- import com.herocraftonline.heroes.characters.classes.HeroClass.ExperienceType;
- /** Should give exp to players kill entities with fireballs
- * It looks like it turned out well for being written in under
- * an hour. Note it is untested
- *
- * I, Roadkill909, the author of this class allow anyone to use, modify, distribute,
- * or relicense this source file or this file in compiled form without restriction
- * @author Roadkill909 */
- public class FireListener implements Listener{
- private static HashMap<LivingEntity,BurningEntityInfo> onFireEntities =
- new HashMap<LivingEntity,BurningEntityInfo>();
- private final Heroes heroes;
- private FireListener(Heroes heroes) {
- this.heroes = heroes;
- }
- /** checks if a fireball casted by a hero hits
- * an entity and adds this info to the collection of onFireEntities.
- * If the collection already contains that entity, the hero and removal task are reset */
- @EventHandler(ignoreCancelled=true, priority=MONITOR)
- public void onEntityDamageByEntity(EntityDamageByEntityEvent event){
- final Entity victim = event.getEntity();
- if(!(victim instanceof LivingEntity))return;
- //check if fireball
- final Entity damager = event.getDamager();
- final SmallFireball projectile;
- if(damager.getType()==SMALL_FIREBALL)
- projectile=(SmallFireball) damager;
- else return;
- //check if hero is caster
- final LivingEntity caster = projectile.getShooter();
- final Hero heroicCaster;
- if(caster!=null&&caster instanceof Player){
- heroicCaster =heroes.getCharacterManager().getHero((Player) caster);
- final BurningEntityInfo info = onFireEntities.get(victim);
- if(info==null){
- new BurningEntityInfo((LivingEntity) victim,heroicCaster);
- }else{
- info.reset(heroicCaster);//used if the entity is already on fire and in the collection of onFireEntities
- }
- }
- }
- /** attempts to remove the entity, if removed, gives the Hero Exp */
- @EventHandler(ignoreCancelled=true, priority=MONITOR)
- public void onEntityDeath(EntityDeathEvent event){
- final LivingEntity entity = event.getEntity();
- final BurningEntityInfo info = onFireEntities.remove(entity);
- if(entity.getLastDamageCause().getCause()!=FIRE_TICK&&info!=null){
- info.caster.gainExp(
- heroes.getCharacterManager().getMonster(entity).getExperience(),
- ExperienceType.KILLING,
- entity.getLocation()
- );
- }
- }
- /** attempts to remove the entity if it's a player that logs out */
- @EventHandler(priority=MONITOR)
- public void onPlayerQuit(PlayerQuitEvent event){
- onFireEntities.remove(event.getPlayer());
- }
- /** I was going to make this two different classes stored in two different maps,
- * but seemed safer to combine this.
- *
- * This task when run removes the entity from the onFireEntities
- * can be reset if another/same hero hits the same entity agains
- */
- private final class BurningEntityInfo implements Runnable{
- private final LivingEntity victim;
- private Hero caster;
- private int taskId;
- private BurningEntityInfo(LivingEntity victim, Hero caster) {
- this.victim=victim;
- this.caster=caster;
- taskId= Bukkit.getScheduler().scheduleSyncDelayedTask(heroes,this,victim.getFireTicks());
- onFireEntities.put(victim,this);
- }
- /** removes the burning entity when run*/
- public void run() {
- onFireEntities.remove(victim);
- }
- /** Used if the entity is hit again by a fireball
- * it reschedules the task and restores the hero object
- * in case it is a different hero (Two mages hitting the same target */
- private void reset(Hero caster){
- this.caster=caster;
- BukkitScheduler schedule = Bukkit.getScheduler();
- schedule.cancelTask(taskId);
- taskId=schedule.scheduleSyncDelayedTask(heroes, this, victim.getFireTicks());
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement