mirror of
https://gitlab.com/phoenix-dvpmt/mmoitems.git
synced 2024-12-23 04:47:34 +01:00
!Made most ability listeners temporary
This commit is contained in:
parent
7c150de7de
commit
91e5d6fad0
@ -1,12 +1,15 @@
|
|||||||
package net.Indyuce.mmoitems.ability;
|
package net.Indyuce.mmoitems.ability;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Sound;
|
import org.bukkit.Sound;
|
||||||
import org.bukkit.entity.LivingEntity;
|
import org.bukkit.entity.LivingEntity;
|
||||||
import org.bukkit.entity.Snowball;
|
import org.bukkit.entity.Snowball;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.Listener;
|
|
||||||
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
@ -16,11 +19,13 @@ import net.Indyuce.mmoitems.api.ability.Ability;
|
|||||||
import net.Indyuce.mmoitems.api.ability.AbilityResult;
|
import net.Indyuce.mmoitems.api.ability.AbilityResult;
|
||||||
import net.Indyuce.mmoitems.api.ability.SimpleAbilityResult;
|
import net.Indyuce.mmoitems.api.ability.SimpleAbilityResult;
|
||||||
import net.Indyuce.mmoitems.api.player.PlayerStats.CachedStats;
|
import net.Indyuce.mmoitems.api.player.PlayerStats.CachedStats;
|
||||||
|
import net.Indyuce.mmoitems.api.util.TemporaryListener;
|
||||||
import net.Indyuce.mmoitems.stat.data.AbilityData;
|
import net.Indyuce.mmoitems.stat.data.AbilityData;
|
||||||
|
|
||||||
public class Blizzard extends Ability implements Listener {
|
public class Blizzard extends Ability {
|
||||||
public Blizzard() {
|
public Blizzard() {
|
||||||
super(CastingMode.ON_HIT, CastingMode.WHEN_HIT, CastingMode.LEFT_CLICK, CastingMode.RIGHT_CLICK, CastingMode.SHIFT_LEFT_CLICK, CastingMode.SHIFT_RIGHT_CLICK);
|
super(CastingMode.ON_HIT, CastingMode.WHEN_HIT, CastingMode.LEFT_CLICK, CastingMode.RIGHT_CLICK, CastingMode.SHIFT_LEFT_CLICK,
|
||||||
|
CastingMode.SHIFT_RIGHT_CLICK);
|
||||||
|
|
||||||
addModifier("duration", 2.5);
|
addModifier("duration", 2.5);
|
||||||
addModifier("damage", 2);
|
addModifier("damage", 2);
|
||||||
@ -44,12 +49,14 @@ public class Blizzard extends Ability implements Listener {
|
|||||||
|
|
||||||
new BukkitRunnable() {
|
new BukkitRunnable() {
|
||||||
int j = 0;
|
int j = 0;
|
||||||
double damage = ability.getModifier("damage");
|
SnowballThrower handler = new SnowballThrower(ability.getModifier("damage"));
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
j++;
|
if (j++ > duration) {
|
||||||
if (j > duration)
|
handler.close(5 * 20);
|
||||||
cancel();
|
cancel();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Location loc = stats.getPlayer().getEyeLocation();
|
Location loc = stats.getPlayer().getEyeLocation();
|
||||||
loc.setPitch((float) (loc.getPitch() + (random.nextDouble() - .5) * inaccuracy));
|
loc.setPitch((float) (loc.getPitch() + (random.nextDouble() - .5) * inaccuracy));
|
||||||
@ -58,18 +65,25 @@ public class Blizzard extends Ability implements Listener {
|
|||||||
loc.getWorld().playSound(loc, Sound.ENTITY_SNOWBALL_THROW, 1, 1);
|
loc.getWorld().playSound(loc, Sound.ENTITY_SNOWBALL_THROW, 1, 1);
|
||||||
Snowball snowball = stats.getPlayer().launchProjectile(Snowball.class);
|
Snowball snowball = stats.getPlayer().launchProjectile(Snowball.class);
|
||||||
snowball.setVelocity(loc.getDirection().multiply(1.3 * force));
|
snowball.setVelocity(loc.getDirection().multiply(1.3 * force));
|
||||||
MMOItems.plugin.getEntities().registerCustomEntity(snowball, damage);
|
handler.entities.add(snowball.getUniqueId());
|
||||||
}
|
}
|
||||||
}.runTaskTimer(MMOItems.plugin, 0, 2);
|
}.runTaskTimer(MMOItems.plugin, 0, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGHEST)
|
public class SnowballThrower extends TemporaryListener {
|
||||||
public void a(EntityDamageByEntityEvent event) {
|
private final List<UUID> entities = new ArrayList<>();
|
||||||
if (!(event.getDamager() instanceof Snowball))
|
private final double damage;
|
||||||
return;
|
|
||||||
|
|
||||||
Snowball snowball = (Snowball) event.getDamager();
|
public SnowballThrower(double damage) {
|
||||||
if (MMOItems.plugin.getEntities().isCustomEntity(snowball))
|
super(EntityDamageByEntityEvent.getHandlerList());
|
||||||
event.setDamage((double) MMOItems.plugin.getEntities().getEntityData(snowball)[0]);
|
|
||||||
|
this.damage = damage;
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||||
|
public void a(EntityDamageByEntityEvent event) {
|
||||||
|
if (entities.contains(event.getDamager().getUniqueId()))
|
||||||
|
event.setDamage(damage);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,14 +1,11 @@
|
|||||||
package net.Indyuce.mmoitems.ability;
|
package net.Indyuce.mmoitems.ability;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import org.bukkit.Bukkit;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
import org.bukkit.Particle;
|
import org.bukkit.Particle;
|
||||||
import org.bukkit.entity.LivingEntity;
|
import org.bukkit.entity.LivingEntity;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.entity.EntityDamageEvent;
|
import org.bukkit.event.entity.EntityDamageEvent;
|
||||||
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
|
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
@ -19,14 +16,14 @@ import net.Indyuce.mmoitems.api.ability.Ability;
|
|||||||
import net.Indyuce.mmoitems.api.ability.AbilityResult;
|
import net.Indyuce.mmoitems.api.ability.AbilityResult;
|
||||||
import net.Indyuce.mmoitems.api.ability.SimpleAbilityResult;
|
import net.Indyuce.mmoitems.api.ability.SimpleAbilityResult;
|
||||||
import net.Indyuce.mmoitems.api.player.PlayerStats.CachedStats;
|
import net.Indyuce.mmoitems.api.player.PlayerStats.CachedStats;
|
||||||
|
import net.Indyuce.mmoitems.api.util.TemporaryListener;
|
||||||
import net.Indyuce.mmoitems.stat.data.AbilityData;
|
import net.Indyuce.mmoitems.stat.data.AbilityData;
|
||||||
import net.mmogroup.mmolib.version.VersionSound;
|
import net.mmogroup.mmolib.version.VersionSound;
|
||||||
|
|
||||||
public class Bunny_Mode extends Ability implements Listener {
|
public class Bunny_Mode extends Ability {
|
||||||
private Map<UUID, Long> fallDamage = new HashMap<UUID, Long>();
|
|
||||||
|
|
||||||
public Bunny_Mode() {
|
public Bunny_Mode() {
|
||||||
super(CastingMode.ON_HIT, CastingMode.WHEN_HIT, CastingMode.LEFT_CLICK, CastingMode.RIGHT_CLICK, CastingMode.SHIFT_LEFT_CLICK, CastingMode.SHIFT_RIGHT_CLICK);
|
super(CastingMode.ON_HIT, CastingMode.WHEN_HIT, CastingMode.LEFT_CLICK, CastingMode.RIGHT_CLICK, CastingMode.SHIFT_LEFT_CLICK,
|
||||||
|
CastingMode.SHIFT_RIGHT_CLICK);
|
||||||
|
|
||||||
addModifier("duration", 20);
|
addModifier("duration", 20);
|
||||||
addModifier("jump-force", 1);
|
addModifier("jump-force", 1);
|
||||||
@ -49,39 +46,43 @@ public class Bunny_Mode extends Ability implements Listener {
|
|||||||
|
|
||||||
new BukkitRunnable() {
|
new BukkitRunnable() {
|
||||||
int j = 0;
|
int j = 0;
|
||||||
|
BunnyHandler handler = new BunnyHandler(stats.getPlayer(), duration);
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
j++;
|
if (j++ > duration) {
|
||||||
if (j > duration)
|
handler.close(3 * 20);
|
||||||
cancel();
|
cancel();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (stats.getPlayer().getLocation().add(0, -.5, 0).getBlock().getType().isSolid()) {
|
if (stats.getPlayer().getLocation().add(0, -.5, 0).getBlock().getType().isSolid()) {
|
||||||
stats.getPlayer().setVelocity(stats.getPlayer().getEyeLocation().getDirection().setY(0).normalize().multiply(.8 * xz).setY(0.5 * y / xz));
|
stats.getPlayer()
|
||||||
|
.setVelocity(stats.getPlayer().getEyeLocation().getDirection().setY(0).normalize().multiply(.8 * xz).setY(0.5 * y / xz));
|
||||||
stats.getPlayer().getWorld().playSound(stats.getPlayer().getLocation(), VersionSound.ENTITY_ENDER_DRAGON_FLAP.toSound(), 2, 1);
|
stats.getPlayer().getWorld().playSound(stats.getPlayer().getLocation(), VersionSound.ENTITY_ENDER_DRAGON_FLAP.toSound(), 2, 1);
|
||||||
for (double a = 0; a < Math.PI * 2; a += Math.PI / 12)
|
for (double a = 0; a < Math.PI * 2; a += Math.PI / 12)
|
||||||
stats.getPlayer().getWorld().spawnParticle(Particle.CLOUD, stats.getPlayer().getLocation(), 0, Math.cos(a), 0, Math.sin(a), .2);
|
stats.getPlayer().getWorld().spawnParticle(Particle.CLOUD, stats.getPlayer().getLocation(), 0, Math.cos(a), 0, Math.sin(a),
|
||||||
|
.2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}.runTaskTimer(MMOItems.plugin, 0, 1);
|
}.runTaskTimer(MMOItems.plugin, 0, 1);
|
||||||
|
|
||||||
fallDamage.put(stats.getPlayer().getUniqueId(), (long) (System.currentTimeMillis() + duration * 100 + 3000));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
public class BunnyHandler extends TemporaryListener {
|
||||||
|
private final Player player;
|
||||||
|
|
||||||
|
public BunnyHandler(Player player, double duration) {
|
||||||
|
super(EntityDamageEvent.getHandlerList());
|
||||||
|
|
||||||
|
this.player = player;
|
||||||
|
|
||||||
|
Bukkit.getScheduler().runTaskLater(MMOItems.plugin, () -> close(), (long) (duration * 20));
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||||
public void a(EntityDamageEvent event) {
|
public void a(EntityDamageEvent event) {
|
||||||
if (!(event.getEntity() instanceof Player) || event.getCause() != DamageCause.FALL)
|
if (event.getEntity().equals(player) && event.getCause() == DamageCause.FALL)
|
||||||
return;
|
|
||||||
|
|
||||||
Player player = (Player) event.getEntity();
|
|
||||||
if (!fallDamage.containsKey(player.getUniqueId()))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (fallDamage.get(player.getUniqueId()) > System.currentTimeMillis()) {
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// clear player from map not to overload memory
|
|
||||||
fallDamage.remove(player.getUniqueId());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,6 @@ import org.bukkit.Particle;
|
|||||||
import org.bukkit.Sound;
|
import org.bukkit.Sound;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.entity.LivingEntity;
|
import org.bukkit.entity.LivingEntity;
|
||||||
import org.bukkit.event.Listener;
|
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
import org.bukkit.util.Vector;
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
@ -20,9 +19,10 @@ import net.Indyuce.mmoitems.stat.data.AbilityData;
|
|||||||
import net.mmogroup.mmolib.api.AttackResult;
|
import net.mmogroup.mmolib.api.AttackResult;
|
||||||
import net.mmogroup.mmolib.api.DamageType;
|
import net.mmogroup.mmolib.api.DamageType;
|
||||||
|
|
||||||
public class Burning_Hands extends Ability implements Listener {
|
public class Burning_Hands extends Ability {
|
||||||
public Burning_Hands() {
|
public Burning_Hands() {
|
||||||
super(CastingMode.ON_HIT, CastingMode.WHEN_HIT, CastingMode.LEFT_CLICK, CastingMode.RIGHT_CLICK, CastingMode.SHIFT_LEFT_CLICK, CastingMode.SHIFT_RIGHT_CLICK);
|
super(CastingMode.ON_HIT, CastingMode.WHEN_HIT, CastingMode.LEFT_CLICK, CastingMode.RIGHT_CLICK, CastingMode.SHIFT_LEFT_CLICK,
|
||||||
|
CastingMode.SHIFT_RIGHT_CLICK);
|
||||||
|
|
||||||
addModifier("duration", 3);
|
addModifier("duration", 3);
|
||||||
addModifier("damage", 2);
|
addModifier("damage", 2);
|
||||||
@ -45,8 +45,7 @@ public class Burning_Hands extends Ability implements Listener {
|
|||||||
int j = 0;
|
int j = 0;
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
j++;
|
if (j++ > duration)
|
||||||
if (j > duration)
|
|
||||||
cancel();
|
cancel();
|
||||||
|
|
||||||
Location loc = stats.getPlayer().getLocation().add(0, 1.2, 0);
|
Location loc = stats.getPlayer().getLocation().add(0, 1.2, 0);
|
||||||
@ -63,7 +62,10 @@ public class Burning_Hands extends Ability implements Listener {
|
|||||||
|
|
||||||
if (j % 5 == 0)
|
if (j % 5 == 0)
|
||||||
for (Entity entity : MMOUtils.getNearbyChunkEntities(loc))
|
for (Entity entity : MMOUtils.getNearbyChunkEntities(loc))
|
||||||
if (entity.getLocation().distanceSquared(loc) < 60 && stats.getPlayer().getEyeLocation().getDirection().angle(entity.getLocation().toVector().subtract(stats.getPlayer().getLocation().toVector())) < Math.PI / 6 && MMOUtils.canDamage(stats.getPlayer(), entity))
|
if (entity.getLocation().distanceSquared(loc) < 60
|
||||||
|
&& stats.getPlayer().getEyeLocation().getDirection()
|
||||||
|
.angle(entity.getLocation().toVector().subtract(stats.getPlayer().getLocation().toVector())) < Math.PI / 6
|
||||||
|
&& MMOUtils.canDamage(stats.getPlayer(), entity))
|
||||||
new AttackResult(damage, DamageType.SKILL, DamageType.MAGIC).damage(stats.getPlayer(), (LivingEntity) entity);
|
new AttackResult(damage, DamageType.SKILL, DamageType.MAGIC).damage(stats.getPlayer(), (LivingEntity) entity);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,14 @@
|
|||||||
package net.Indyuce.mmoitems.ability;
|
package net.Indyuce.mmoitems.ability;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Sound;
|
import org.bukkit.Sound;
|
||||||
import org.bukkit.entity.Egg;
|
import org.bukkit.entity.Egg;
|
||||||
import org.bukkit.entity.LivingEntity;
|
import org.bukkit.entity.LivingEntity;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
@ -15,11 +18,13 @@ import net.Indyuce.mmoitems.api.ability.Ability;
|
|||||||
import net.Indyuce.mmoitems.api.ability.AbilityResult;
|
import net.Indyuce.mmoitems.api.ability.AbilityResult;
|
||||||
import net.Indyuce.mmoitems.api.ability.SimpleAbilityResult;
|
import net.Indyuce.mmoitems.api.ability.SimpleAbilityResult;
|
||||||
import net.Indyuce.mmoitems.api.player.PlayerStats.CachedStats;
|
import net.Indyuce.mmoitems.api.player.PlayerStats.CachedStats;
|
||||||
|
import net.Indyuce.mmoitems.api.util.TemporaryListener;
|
||||||
import net.Indyuce.mmoitems.stat.data.AbilityData;
|
import net.Indyuce.mmoitems.stat.data.AbilityData;
|
||||||
|
|
||||||
public class Chicken_Wraith extends Ability implements Listener {
|
public class Chicken_Wraith extends Ability {
|
||||||
public Chicken_Wraith() {
|
public Chicken_Wraith() {
|
||||||
super(CastingMode.ON_HIT, CastingMode.WHEN_HIT, CastingMode.LEFT_CLICK, CastingMode.RIGHT_CLICK, CastingMode.SHIFT_LEFT_CLICK, CastingMode.SHIFT_RIGHT_CLICK);
|
super(CastingMode.ON_HIT, CastingMode.WHEN_HIT, CastingMode.LEFT_CLICK, CastingMode.RIGHT_CLICK, CastingMode.SHIFT_LEFT_CLICK,
|
||||||
|
CastingMode.SHIFT_RIGHT_CLICK);
|
||||||
|
|
||||||
addModifier("duration", 2.5);
|
addModifier("duration", 2.5);
|
||||||
addModifier("damage", 2);
|
addModifier("damage", 2);
|
||||||
@ -43,32 +48,42 @@ public class Chicken_Wraith extends Ability implements Listener {
|
|||||||
|
|
||||||
new BukkitRunnable() {
|
new BukkitRunnable() {
|
||||||
int j = 0;
|
int j = 0;
|
||||||
double damage = ability.getModifier("damage");
|
EggHandler handler = new EggHandler(ability.getModifier("damage"));
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
j++;
|
if (j++ > duration) {
|
||||||
if (j > duration)
|
handler.close(5 * 20);
|
||||||
cancel();
|
cancel();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Location loc = stats.getPlayer().getEyeLocation();
|
Location loc = stats.getPlayer().getEyeLocation();
|
||||||
loc.setPitch((float) (loc.getPitch() + (random.nextDouble() - .5) * inaccuracy));
|
loc.setPitch((float) (loc.getPitch() + (random.nextDouble() - .5) * inaccuracy));
|
||||||
loc.setYaw((float) (loc.getYaw() + (random.nextDouble() - .5) * inaccuracy));
|
loc.setYaw((float) (loc.getYaw() + (random.nextDouble() - .5) * inaccuracy));
|
||||||
|
|
||||||
loc.getWorld().playSound(loc, Sound.ENTITY_CHICKEN_EGG, 1, 1);
|
loc.getWorld().playSound(loc, Sound.ENTITY_CHICKEN_EGG, 1, 1);
|
||||||
Egg snowball = stats.getPlayer().launchProjectile(Egg.class);
|
Egg egg = stats.getPlayer().launchProjectile(Egg.class);
|
||||||
snowball.setVelocity(loc.getDirection().multiply(1.3 * force));
|
egg.setVelocity(loc.getDirection().multiply(1.3 * force));
|
||||||
MMOItems.plugin.getEntities().registerCustomEntity(snowball, damage);
|
|
||||||
|
handler.entities.add(egg.getEntityId());
|
||||||
}
|
}
|
||||||
}.runTaskTimer(MMOItems.plugin, 0, 2);
|
}.runTaskTimer(MMOItems.plugin, 0, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
public class EggHandler extends TemporaryListener {
|
||||||
public void a(EntityDamageByEntityEvent event) {
|
private final List<Integer> entities = new ArrayList<>();
|
||||||
if (!(event.getDamager() instanceof Egg))
|
private final double damage;
|
||||||
return;
|
|
||||||
|
|
||||||
Egg egg = (Egg) event.getDamager();
|
public EggHandler(double damage) {
|
||||||
if (MMOItems.plugin.getEntities().isCustomEntity(egg))
|
super(EntityDamageByEntityEvent.getHandlerList());
|
||||||
event.setDamage((double) MMOItems.plugin.getEntities().getEntityData(egg)[0]);
|
|
||||||
|
this.damage = damage;
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||||
|
public void a(EntityDamageByEntityEvent event) {
|
||||||
|
if (entities.contains(event.getDamager().getEntityId()))
|
||||||
|
event.setDamage(damage);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
package net.Indyuce.mmoitems.ability;
|
package net.Indyuce.mmoitems.ability;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Sound;
|
import org.bukkit.Sound;
|
||||||
import org.bukkit.entity.EntityType;
|
import org.bukkit.entity.EntityType;
|
||||||
@ -18,13 +21,15 @@ import net.Indyuce.mmoitems.api.ability.Ability;
|
|||||||
import net.Indyuce.mmoitems.api.ability.AbilityResult;
|
import net.Indyuce.mmoitems.api.ability.AbilityResult;
|
||||||
import net.Indyuce.mmoitems.api.ability.VectorAbilityResult;
|
import net.Indyuce.mmoitems.api.ability.VectorAbilityResult;
|
||||||
import net.Indyuce.mmoitems.api.player.PlayerStats.CachedStats;
|
import net.Indyuce.mmoitems.api.player.PlayerStats.CachedStats;
|
||||||
|
import net.Indyuce.mmoitems.api.util.TemporaryListener;
|
||||||
import net.Indyuce.mmoitems.stat.data.AbilityData;
|
import net.Indyuce.mmoitems.stat.data.AbilityData;
|
||||||
import net.mmogroup.mmolib.api.AttackResult;
|
import net.mmogroup.mmolib.api.AttackResult;
|
||||||
import net.mmogroup.mmolib.api.DamageType;
|
import net.mmogroup.mmolib.api.DamageType;
|
||||||
|
|
||||||
public class Corrupted_Fangs extends Ability implements Listener {
|
public class Corrupted_Fangs extends Ability implements Listener {
|
||||||
public Corrupted_Fangs() {
|
public Corrupted_Fangs() {
|
||||||
super(CastingMode.ON_HIT, CastingMode.WHEN_HIT, CastingMode.LEFT_CLICK, CastingMode.RIGHT_CLICK, CastingMode.SHIFT_LEFT_CLICK, CastingMode.SHIFT_RIGHT_CLICK);
|
super(CastingMode.ON_HIT, CastingMode.WHEN_HIT, CastingMode.LEFT_CLICK, CastingMode.RIGHT_CLICK, CastingMode.SHIFT_LEFT_CLICK,
|
||||||
|
CastingMode.SHIFT_RIGHT_CLICK);
|
||||||
|
|
||||||
addModifier("damage", 5);
|
addModifier("damage", 5);
|
||||||
addModifier("cooldown", 12);
|
addModifier("cooldown", 12);
|
||||||
@ -39,39 +44,45 @@ public class Corrupted_Fangs extends Ability implements Listener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void whenCast(CachedStats stats, AbilityResult ability, ItemAttackResult result) {
|
public void whenCast(CachedStats stats, AbilityResult ability, ItemAttackResult result) {
|
||||||
double damage = ability.getModifier("damage");
|
|
||||||
|
|
||||||
stats.getPlayer().getWorld().playSound(stats.getPlayer().getLocation(), Sound.ENTITY_WITHER_SHOOT, 2, 2);
|
stats.getPlayer().getWorld().playSound(stats.getPlayer().getLocation(), Sound.ENTITY_WITHER_SHOOT, 2, 2);
|
||||||
new BukkitRunnable() {
|
new BukkitRunnable() {
|
||||||
Vector vec = ((VectorAbilityResult) ability).getTarget().setY(0).multiply(2);
|
Vector vec = ((VectorAbilityResult) ability).getTarget().setY(0).multiply(2);
|
||||||
Location loc = stats.getPlayer().getLocation();
|
Location loc = stats.getPlayer().getLocation();
|
||||||
double ti = 0;
|
double ti = 0;
|
||||||
|
FangsHandler handler = new FangsHandler(stats, ability.getModifier("damage"));
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
ti += 2;
|
if (ti++ > 6) {
|
||||||
loc.add(vec);
|
handler.close(3 * 20);
|
||||||
|
|
||||||
EvokerFangs evokerFangs = (EvokerFangs) stats.getPlayer().getWorld().spawnEntity(loc, EntityType.EVOKER_FANGS);
|
|
||||||
MMOItems.plugin.getEntities().registerCustomEntity(evokerFangs, stats, damage);
|
|
||||||
|
|
||||||
if (ti > 12)
|
|
||||||
cancel();
|
cancel();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
loc.add(vec);
|
||||||
|
EvokerFangs evokerFangs = (EvokerFangs) stats.getPlayer().getWorld().spawnEntity(loc, EntityType.EVOKER_FANGS);
|
||||||
|
handler.entities.add(evokerFangs.getEntityId());
|
||||||
}
|
}
|
||||||
}.runTaskTimer(MMOItems.plugin, 0, 1);
|
}.runTaskTimer(MMOItems.plugin, 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class FangsHandler extends TemporaryListener {
|
||||||
|
private final List<Integer> entities = new ArrayList<>();
|
||||||
|
private final CachedStats stats;
|
||||||
|
private final double damage;
|
||||||
|
|
||||||
|
public FangsHandler(CachedStats stats, double damage) {
|
||||||
|
super(EntityDamageByEntityEvent.getHandlerList());
|
||||||
|
|
||||||
|
this.stats = stats;
|
||||||
|
this.damage = damage;
|
||||||
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void a(EntityDamageByEntityEvent event) {
|
public void a(EntityDamageByEntityEvent event) {
|
||||||
if (event.getDamager() instanceof EvokerFangs && event.getEntity() instanceof LivingEntity) {
|
if (event.getDamager() instanceof EvokerFangs && entities.contains(event.getDamager().getEntityId())
|
||||||
EvokerFangs damager = (EvokerFangs) event.getDamager();
|
&& MMOUtils.canDamage(stats.getPlayer(), event.getEntity()))
|
||||||
if (!MMOItems.plugin.getEntities().isCustomEntity(damager))
|
new AttackResult(damage, DamageType.SKILL, DamageType.MAGIC).damage(stats.getPlayer(), (LivingEntity) event.getEntity());
|
||||||
return;
|
|
||||||
|
|
||||||
event.setCancelled(true);
|
|
||||||
Object[] data = MMOItems.plugin.getEntities().getEntityData(damager);
|
|
||||||
CachedStats stats = (CachedStats) data[0];
|
|
||||||
if (MMOUtils.canDamage(stats.getPlayer(), event.getEntity()))
|
|
||||||
new AttackResult((double) data[1], DamageType.SKILL, DamageType.MAGIC).damage(stats.getPlayer(), (LivingEntity) event.getEntity());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,13 +20,15 @@ import net.Indyuce.mmoitems.api.ability.Ability;
|
|||||||
import net.Indyuce.mmoitems.api.ability.AbilityResult;
|
import net.Indyuce.mmoitems.api.ability.AbilityResult;
|
||||||
import net.Indyuce.mmoitems.api.ability.SimpleAbilityResult;
|
import net.Indyuce.mmoitems.api.ability.SimpleAbilityResult;
|
||||||
import net.Indyuce.mmoitems.api.player.PlayerStats.CachedStats;
|
import net.Indyuce.mmoitems.api.player.PlayerStats.CachedStats;
|
||||||
|
import net.Indyuce.mmoitems.api.util.TemporaryListener;
|
||||||
import net.Indyuce.mmoitems.stat.data.AbilityData;
|
import net.Indyuce.mmoitems.stat.data.AbilityData;
|
||||||
import net.mmogroup.mmolib.api.AttackResult;
|
import net.mmogroup.mmolib.api.AttackResult;
|
||||||
import net.mmogroup.mmolib.api.DamageType;
|
import net.mmogroup.mmolib.api.DamageType;
|
||||||
|
|
||||||
public class Explosive_Turkey extends Ability implements Listener {
|
public class Explosive_Turkey extends Ability implements Listener {
|
||||||
public Explosive_Turkey() {
|
public Explosive_Turkey() {
|
||||||
super(CastingMode.ON_HIT, CastingMode.WHEN_HIT, CastingMode.LEFT_CLICK, CastingMode.RIGHT_CLICK, CastingMode.SHIFT_LEFT_CLICK, CastingMode.SHIFT_RIGHT_CLICK);
|
super(CastingMode.ON_HIT, CastingMode.WHEN_HIT, CastingMode.LEFT_CLICK, CastingMode.RIGHT_CLICK, CastingMode.SHIFT_LEFT_CLICK,
|
||||||
|
CastingMode.SHIFT_RIGHT_CLICK);
|
||||||
|
|
||||||
addModifier("damage", 6);
|
addModifier("damage", 6);
|
||||||
addModifier("radius", 4);
|
addModifier("radius", 4);
|
||||||
@ -37,8 +39,6 @@ public class Explosive_Turkey extends Ability implements Listener {
|
|||||||
addModifier("stamina", 0);
|
addModifier("stamina", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
Chicken chicken = null;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AbilityResult whenRan(CachedStats stats, LivingEntity target, AbilityData ability, ItemAttackResult result) {
|
public AbilityResult whenRan(CachedStats stats, LivingEntity target, AbilityData ability, ItemAttackResult result) {
|
||||||
return new SimpleAbilityResult(ability);
|
return new SimpleAbilityResult(ability);
|
||||||
@ -53,16 +53,20 @@ public class Explosive_Turkey extends Ability implements Listener {
|
|||||||
|
|
||||||
Vector vec = stats.getPlayer().getEyeLocation().getDirection().clone().multiply(.6);
|
Vector vec = stats.getPlayer().getEyeLocation().getDirection().clone().multiply(.6);
|
||||||
|
|
||||||
chicken = (Chicken) stats.getPlayer().getWorld().spawnEntity(stats.getPlayer().getLocation().add(0, 1.3, 0).add(vec), EntityType.CHICKEN);
|
Chicken chicken = (Chicken) stats.getPlayer().getWorld().spawnEntity(stats.getPlayer().getLocation().add(0, 1.3, 0).add(vec),
|
||||||
|
EntityType.CHICKEN);
|
||||||
|
ChickenHandler chickenHandler = new ChickenHandler(chicken);
|
||||||
chicken.setInvulnerable(true);
|
chicken.setInvulnerable(true);
|
||||||
chicken.setSilent(true);
|
chicken.setSilent(true);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sets the health to 2048 (Default max Spigot value)
|
* Sets the health to 2048 (Default max Spigot value) which stops the
|
||||||
* which stops the bug where you can kill the chicken for a brief
|
* bug where you can kill the chicken for a brief few ticks after it
|
||||||
* few ticks after it spawns in!
|
* spawns in!
|
||||||
*/
|
*/
|
||||||
chicken.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(2048);
|
chicken.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(2048);
|
||||||
chicken.setHealth(2048);
|
chicken.setHealth(2048);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* when items are moving through the air, they loose a percent of their
|
* when items are moving through the air, they loose a percent of their
|
||||||
* velocity proportionally to their coordinates in each axis. this means
|
* velocity proportionally to their coordinates in each axis. this means
|
||||||
@ -75,47 +79,71 @@ public class Explosive_Turkey extends Ability implements Listener {
|
|||||||
final double trajRatio = chicken.getVelocity().getX() / chicken.getVelocity().getZ();
|
final double trajRatio = chicken.getVelocity().getX() / chicken.getVelocity().getZ();
|
||||||
|
|
||||||
new BukkitRunnable() {
|
new BukkitRunnable() {
|
||||||
double ti = 0;
|
int ti = 0;
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
if (ti++ > duration || chicken.isDead() || chicken == null) {
|
if (ti++ > duration || chicken.isDead()) {
|
||||||
chicken.remove();
|
chickenHandler.close();
|
||||||
cancel();
|
cancel();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
chicken.setVelocity(vec);
|
||||||
if (ti % 4 == 0)
|
if (ti % 4 == 0)
|
||||||
chicken.getWorld().playSound(chicken.getLocation(), Sound.ENTITY_CHICKEN_HURT, 2, 1);
|
chicken.getWorld().playSound(chicken.getLocation(), Sound.ENTITY_CHICKEN_HURT, 2, 1);
|
||||||
chicken.getWorld().spawnParticle(Particle.EXPLOSION_NORMAL, chicken.getLocation().add(0, .3, 0), 0);
|
chicken.getWorld().spawnParticle(Particle.EXPLOSION_NORMAL, chicken.getLocation().add(0, .3, 0), 0);
|
||||||
chicken.getWorld().spawnParticle(Particle.FIREWORKS_SPARK, chicken.getLocation().add(0, .3, 0), 1, 0, 0, 0, .05);
|
chicken.getWorld().spawnParticle(Particle.FIREWORKS_SPARK, chicken.getLocation().add(0, .3, 0), 1, 0, 0, 0, .05);
|
||||||
double currentTrajRatio = chicken.getVelocity().getX() / chicken.getVelocity().getZ();
|
double currentTrajRatio = chicken.getVelocity().getX() / chicken.getVelocity().getZ();
|
||||||
if (chicken.isOnGround() || Math.abs(trajRatio - currentTrajRatio) > .1) {
|
if (chicken.isOnGround() || Math.abs(trajRatio - currentTrajRatio) > .1) {
|
||||||
chicken.remove();
|
|
||||||
|
chickenHandler.close();
|
||||||
|
cancel();
|
||||||
|
|
||||||
chicken.getWorld().spawnParticle(Particle.FIREWORKS_SPARK, chicken.getLocation().add(0, .3, 0), 128, 0, 0, 0, .25);
|
chicken.getWorld().spawnParticle(Particle.FIREWORKS_SPARK, chicken.getLocation().add(0, .3, 0), 128, 0, 0, 0, .25);
|
||||||
chicken.getWorld().spawnParticle(Particle.EXPLOSION_NORMAL, chicken.getLocation().add(0, .3, 0), 24, 0, 0, 0, .25);
|
chicken.getWorld().spawnParticle(Particle.EXPLOSION_NORMAL, chicken.getLocation().add(0, .3, 0), 24, 0, 0, 0, .25);
|
||||||
chicken.getWorld().playSound(chicken.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 2, 1.5f);
|
chicken.getWorld().playSound(chicken.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 2, 1.5f);
|
||||||
for (Entity entity : MMOUtils.getNearbyChunkEntities(chicken.getLocation()))
|
for (Entity entity : MMOUtils.getNearbyChunkEntities(chicken.getLocation()))
|
||||||
if (!entity.isDead() && entity.getLocation().distanceSquared(chicken.getLocation()) < radiusSquared && MMOUtils.canDamage(stats.getPlayer(), entity)) {
|
if (!entity.isDead() && entity.getLocation().distanceSquared(chicken.getLocation()) < radiusSquared
|
||||||
new AttackResult(damage, DamageType.SKILL, DamageType.MAGIC, DamageType.PROJECTILE).damage(stats.getPlayer(), (LivingEntity) entity);
|
&& MMOUtils.canDamage(stats.getPlayer(), entity)) {
|
||||||
entity.setVelocity(entity.getLocation().toVector().subtract(chicken.getLocation().toVector()).multiply(.1 * knockback).setY(.4 * knockback));
|
new AttackResult(damage, DamageType.SKILL, DamageType.MAGIC, DamageType.PROJECTILE).damage(stats.getPlayer(),
|
||||||
|
(LivingEntity) entity);
|
||||||
|
entity.setVelocity(entity.getLocation().toVector().subtract(chicken.getLocation().toVector()).multiply(.1 * knockback)
|
||||||
|
.setY(.4 * knockback));
|
||||||
}
|
}
|
||||||
cancel();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
chicken.setVelocity(vec);
|
|
||||||
}
|
}
|
||||||
}.runTaskTimer(MMOItems.plugin, 0, 1);
|
}.runTaskTimer(MMOItems.plugin, 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* this fixes an issue where chickens sometimes drop
|
||||||
|
*/
|
||||||
|
public class ChickenHandler extends TemporaryListener {
|
||||||
|
private final Chicken chicken;
|
||||||
|
|
||||||
|
public ChickenHandler(Chicken chicken) {
|
||||||
|
super(EntityDeathEvent.getHandlerList());
|
||||||
|
|
||||||
|
this.chicken = chicken;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* make sure the chicken is ALWAYS killed, this class really uses
|
||||||
|
* overkill methods but there are plently issues with chickens remaining
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void close() {
|
||||||
|
chicken.remove();
|
||||||
|
super.close();
|
||||||
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void a(EntityDeathEvent event) {
|
public void a(EntityDeathEvent event) {
|
||||||
if (event.getEntity() == null || !event.getEntityType().equals(EntityType.CHICKEN))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (event.getEntity().equals(chicken)) {
|
if (event.getEntity().equals(chicken)) {
|
||||||
event.getDrops().clear();
|
event.getDrops().clear();
|
||||||
event.setDroppedExp(0);
|
event.setDroppedExp(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,5 @@
|
|||||||
package net.Indyuce.mmoitems.ability;
|
package net.Indyuce.mmoitems.ability;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Particle;
|
import org.bukkit.Particle;
|
||||||
@ -26,10 +22,9 @@ import net.Indyuce.mmoitems.stat.data.AbilityData;
|
|||||||
import net.mmogroup.mmolib.version.VersionSound;
|
import net.mmogroup.mmolib.version.VersionSound;
|
||||||
|
|
||||||
public class Shadow_Veil extends Ability implements Listener {
|
public class Shadow_Veil extends Ability implements Listener {
|
||||||
public final List<UUID> shadowVeil = new ArrayList<>();
|
|
||||||
|
|
||||||
public Shadow_Veil() {
|
public Shadow_Veil() {
|
||||||
super(CastingMode.ON_HIT, CastingMode.WHEN_HIT, CastingMode.LEFT_CLICK, CastingMode.RIGHT_CLICK, CastingMode.SHIFT_LEFT_CLICK, CastingMode.SHIFT_RIGHT_CLICK);
|
super(CastingMode.ON_HIT, CastingMode.WHEN_HIT, CastingMode.LEFT_CLICK, CastingMode.RIGHT_CLICK, CastingMode.SHIFT_LEFT_CLICK,
|
||||||
|
CastingMode.SHIFT_RIGHT_CLICK);
|
||||||
|
|
||||||
addModifier("cooldown", 35);
|
addModifier("cooldown", 35);
|
||||||
addModifier("duration", 5);
|
addModifier("duration", 5);
|
||||||
@ -46,69 +41,85 @@ public class Shadow_Veil extends Ability implements Listener {
|
|||||||
public void whenCast(CachedStats stats, AbilityResult ability, ItemAttackResult result) {
|
public void whenCast(CachedStats stats, AbilityResult ability, ItemAttackResult result) {
|
||||||
double duration = ability.getModifier("duration");
|
double duration = ability.getModifier("duration");
|
||||||
|
|
||||||
shadowVeil.add(stats.getPlayer().getUniqueId());
|
|
||||||
stats.getPlayer().getWorld().playSound(stats.getPlayer().getLocation(), VersionSound.ENTITY_ENDERMAN_TELEPORT.toSound(), 3, 0);
|
stats.getPlayer().getWorld().playSound(stats.getPlayer().getLocation(), VersionSound.ENTITY_ENDERMAN_TELEPORT.toSound(), 3, 0);
|
||||||
for (Player online : Bukkit.getOnlinePlayers())
|
for (Player online : Bukkit.getOnlinePlayers())
|
||||||
online.hidePlayer(MMOItems.plugin, stats.getPlayer());
|
online.hidePlayer(MMOItems.plugin, stats.getPlayer());
|
||||||
|
|
||||||
|
/*
|
||||||
|
* clears the target of any entity around the player
|
||||||
|
*/
|
||||||
for (Mob serverEntities : stats.getPlayer().getWorld().getEntitiesByClass(Mob.class))
|
for (Mob serverEntities : stats.getPlayer().getWorld().getEntitiesByClass(Mob.class))
|
||||||
if (serverEntities.getTarget() != null && serverEntities.getTarget().equals(stats.getPlayer()))
|
if (serverEntities.getTarget() != null && serverEntities.getTarget().equals(stats.getPlayer()))
|
||||||
serverEntities.setTarget(null);
|
serverEntities.setTarget(null);
|
||||||
new BukkitRunnable() {
|
|
||||||
double ti = 0;
|
|
||||||
double y = 0;
|
|
||||||
Location loc = stats.getPlayer().getLocation();
|
|
||||||
|
|
||||||
public void run() {
|
new ShadowVeilHandler(stats.getPlayer(), duration);
|
||||||
ti++;
|
|
||||||
if (ti > duration * 20) {
|
|
||||||
for (Player online : Bukkit.getOnlinePlayers())
|
|
||||||
online.showPlayer(MMOItems.plugin, stats.getPlayer());
|
|
||||||
|
|
||||||
shadowVeil.remove(stats.getPlayer().getUniqueId());
|
|
||||||
stats.getPlayer().getWorld().spawnParticle(Particle.SMOKE_LARGE, stats.getPlayer().getLocation().add(0, 1, 0), 32, 0, 0, 0, .13);
|
|
||||||
stats.getPlayer().getWorld().playSound(stats.getPlayer().getLocation(), VersionSound.ENTITY_ENDERMAN_TELEPORT.toSound(), 3, 0);
|
|
||||||
cancel();
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!shadowVeil.contains(stats.getPlayer().getUniqueId())) {
|
public class ShadowVeilHandler extends BukkitRunnable implements Listener {
|
||||||
for (Player online : Bukkit.getOnlinePlayers())
|
private final Player player;
|
||||||
online.showPlayer(MMOItems.plugin, stats.getPlayer());
|
private final double duration;
|
||||||
|
private final Location loc;
|
||||||
|
|
||||||
|
double ti = 0;
|
||||||
|
double y = 0;
|
||||||
|
boolean cancelled;
|
||||||
|
|
||||||
|
public ShadowVeilHandler(Player player, double duration) {
|
||||||
|
this.player = player;
|
||||||
|
this.duration = duration;
|
||||||
|
this.loc = player.getLocation();
|
||||||
|
|
||||||
|
runTaskTimer(MMOItems.plugin, 0, 1);
|
||||||
|
Bukkit.getPluginManager().registerEvents(this, MMOItems.plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void close() {
|
||||||
|
if (ti < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
player.getWorld().spawnParticle(Particle.SMOKE_LARGE, player.getLocation().add(0, 1, 0), 32, 0, 0, 0, .13);
|
||||||
|
player.getWorld().playSound(player.getLocation(), VersionSound.ENTITY_ENDERMAN_TELEPORT.toSound(), 3, 0);
|
||||||
|
|
||||||
|
// sets time to -1 so that next calls know the handler has already
|
||||||
|
// been closed
|
||||||
|
ti = -1;
|
||||||
|
EntityDamageByEntityEvent.getHandlerList().unregister(this);
|
||||||
|
EntityTargetEvent.getHandlerList().unregister(this);
|
||||||
|
|
||||||
|
for (Player online : Bukkit.getOnlinePlayers())
|
||||||
|
online.showPlayer(MMOItems.plugin, player);
|
||||||
|
|
||||||
stats.getPlayer().getWorld().spawnParticle(Particle.SMOKE_LARGE, stats.getPlayer().getLocation().add(0, 1, 0), 32, 0, 0, 0, .13);
|
|
||||||
stats.getPlayer().getWorld().playSound(stats.getPlayer().getLocation(), VersionSound.ENTITY_ENDERMAN_TELEPORT.toSound(), 3, 0);
|
|
||||||
cancel();
|
cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (ti++ > duration * 20 || !player.isOnline()) {
|
||||||
|
close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (y < 4)
|
if (y < 4)
|
||||||
for (int j1 = 0; j1 < 5; j1++) {
|
for (int j1 = 0; j1 < 5; j1++) {
|
||||||
y += .04;
|
y += .04;
|
||||||
for (int j = 0; j < 4; j++) {
|
for (int j = 0; j < 4; j++) {
|
||||||
double xz = y * Math.PI * .8 + (j * Math.PI / 2);
|
double a = y * Math.PI * .8 + (j * Math.PI / 2);
|
||||||
stats.getPlayer().getWorld().spawnParticle(Particle.SMOKE_LARGE, loc.clone().add(Math.cos(xz) * 2.5, y, Math.sin(xz) * 2.5), 0);
|
player.getWorld().spawnParticle(Particle.SMOKE_LARGE, loc.clone().add(Math.cos(a) * 2.5, y, Math.sin(a) * 2.5), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}.runTaskTimer(MMOItems.plugin, 0, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void a(EntityDamageByEntityEvent event) {
|
public void cancelShadowVeil(EntityDamageByEntityEvent event) {
|
||||||
if (!(event.getDamager() instanceof Player))
|
if (event.getDamager().equals(player))
|
||||||
return;
|
close();
|
||||||
|
|
||||||
Player player = (Player) event.getDamager();
|
|
||||||
if (shadowVeil.contains(player.getUniqueId()))
|
|
||||||
shadowVeil.remove(player.getUniqueId());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void b(EntityTargetEvent event) {
|
public void cancelMobTarget(EntityTargetEvent event) {
|
||||||
if (!(event.getTarget() instanceof Player))
|
if (event.getTarget().equals(player))
|
||||||
return;
|
|
||||||
|
|
||||||
Player player = (Player) event.getTarget();
|
|
||||||
if (shadowVeil.contains(player.getUniqueId()))
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
@ -30,7 +30,8 @@ import net.mmogroup.mmolib.api.item.NBTItem;
|
|||||||
|
|
||||||
public class Shulker_Missile extends Ability implements Listener {
|
public class Shulker_Missile extends Ability implements Listener {
|
||||||
public Shulker_Missile() {
|
public Shulker_Missile() {
|
||||||
super(CastingMode.ON_HIT, CastingMode.WHEN_HIT, CastingMode.LEFT_CLICK, CastingMode.RIGHT_CLICK, CastingMode.SHIFT_LEFT_CLICK, CastingMode.SHIFT_RIGHT_CLICK);
|
super(CastingMode.ON_HIT, CastingMode.WHEN_HIT, CastingMode.LEFT_CLICK, CastingMode.RIGHT_CLICK, CastingMode.SHIFT_LEFT_CLICK,
|
||||||
|
CastingMode.SHIFT_RIGHT_CLICK);
|
||||||
|
|
||||||
addModifier("cooldown", 12);
|
addModifier("cooldown", 12);
|
||||||
addModifier("damage", 5);
|
addModifier("damage", 5);
|
||||||
@ -53,16 +54,19 @@ public class Shulker_Missile extends Ability implements Listener {
|
|||||||
double n = 0;
|
double n = 0;
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
n++;
|
if (n++ > 3) {
|
||||||
if (n > 3) {
|
|
||||||
cancel();
|
cancel();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector vec = ((VectorAbilityResult) ability).getTarget();
|
Vector vec = ((VectorAbilityResult) ability).getTarget();
|
||||||
stats.getPlayer().getWorld().playSound(stats.getPlayer().getLocation(), Sound.ENTITY_WITHER_SHOOT, 2, 2);
|
stats.getPlayer().getWorld().playSound(stats.getPlayer().getLocation(), Sound.ENTITY_WITHER_SHOOT, 2, 2);
|
||||||
ShulkerBullet shulkerBullet = (ShulkerBullet) stats.getPlayer().getWorld().spawnEntity(stats.getPlayer().getLocation().add(0, 1, 0), EntityType.SHULKER_BULLET);
|
ShulkerBullet shulkerBullet = (ShulkerBullet) stats.getPlayer().getWorld().spawnEntity(stats.getPlayer().getLocation().add(0, 1, 0),
|
||||||
|
EntityType.SHULKER_BULLET);
|
||||||
shulkerBullet.setShooter(stats.getPlayer());
|
shulkerBullet.setShooter(stats.getPlayer());
|
||||||
MMOItems.plugin.getEntities().registerCustomEntity(shulkerBullet, new AttackResult(ability.getModifier("damage"), DamageType.SKILL, DamageType.MAGIC, DamageType.PROJECTILE), ability.getModifier("effect-duration"));
|
MMOItems.plugin.getEntities().registerCustomEntity(shulkerBullet,
|
||||||
|
new AttackResult(ability.getModifier("damage"), DamageType.SKILL, DamageType.MAGIC, DamageType.PROJECTILE),
|
||||||
|
ability.getModifier("effect-duration"));
|
||||||
new BukkitRunnable() {
|
new BukkitRunnable() {
|
||||||
double ti = 0;
|
double ti = 0;
|
||||||
|
|
||||||
@ -117,7 +121,8 @@ public class Shulker_Missile extends Ability implements Listener {
|
|||||||
y += .04;
|
y += .04;
|
||||||
for (int j = 0; j < 2; j++) {
|
for (int j = 0; j < 2; j++) {
|
||||||
double xz = y * Math.PI * 1.3 + (j * Math.PI);
|
double xz = y * Math.PI * 1.3 + (j * Math.PI);
|
||||||
MMOLib.plugin.getVersion().getWrapper().spawnParticle(Particle.REDSTONE, loc.clone().add(Math.cos(xz), y, Math.sin(xz)), Color.MAROON);
|
MMOLib.plugin.getVersion().getWrapper().spawnParticle(Particle.REDSTONE, loc.clone().add(Math.cos(xz), y, Math.sin(xz)),
|
||||||
|
Color.MAROON);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (y >= 2)
|
if (y >= 2)
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
package net.Indyuce.mmoitems.ability;
|
package net.Indyuce.mmoitems.ability;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Particle;
|
import org.bukkit.Particle;
|
||||||
import org.bukkit.Sound;
|
import org.bukkit.Sound;
|
||||||
@ -8,6 +12,9 @@ import org.bukkit.entity.EntityType;
|
|||||||
import org.bukkit.entity.LivingEntity;
|
import org.bukkit.entity.LivingEntity;
|
||||||
import org.bukkit.entity.Snowball;
|
import org.bukkit.entity.Snowball;
|
||||||
import org.bukkit.entity.Snowman;
|
import org.bukkit.entity.Snowman;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||||
import org.bukkit.potion.PotionEffect;
|
import org.bukkit.potion.PotionEffect;
|
||||||
import org.bukkit.potion.PotionEffectType;
|
import org.bukkit.potion.PotionEffectType;
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
@ -19,12 +26,14 @@ import net.Indyuce.mmoitems.api.ability.Ability;
|
|||||||
import net.Indyuce.mmoitems.api.ability.AbilityResult;
|
import net.Indyuce.mmoitems.api.ability.AbilityResult;
|
||||||
import net.Indyuce.mmoitems.api.ability.LocationAbilityResult;
|
import net.Indyuce.mmoitems.api.ability.LocationAbilityResult;
|
||||||
import net.Indyuce.mmoitems.api.player.PlayerStats.CachedStats;
|
import net.Indyuce.mmoitems.api.player.PlayerStats.CachedStats;
|
||||||
|
import net.Indyuce.mmoitems.api.util.TemporaryListener;
|
||||||
import net.Indyuce.mmoitems.stat.data.AbilityData;
|
import net.Indyuce.mmoitems.stat.data.AbilityData;
|
||||||
import net.mmogroup.mmolib.version.VersionSound;
|
import net.mmogroup.mmolib.version.VersionSound;
|
||||||
|
|
||||||
public class Snowman_Turret extends Ability {
|
public class Snowman_Turret extends Ability {
|
||||||
public Snowman_Turret() {
|
public Snowman_Turret() {
|
||||||
super(CastingMode.ON_HIT, CastingMode.WHEN_HIT, CastingMode.LEFT_CLICK, CastingMode.RIGHT_CLICK, CastingMode.SHIFT_LEFT_CLICK, CastingMode.SHIFT_RIGHT_CLICK);
|
super(CastingMode.ON_HIT, CastingMode.WHEN_HIT, CastingMode.LEFT_CLICK, CastingMode.RIGHT_CLICK, CastingMode.SHIFT_LEFT_CLICK,
|
||||||
|
CastingMode.SHIFT_RIGHT_CLICK);
|
||||||
|
|
||||||
addModifier("duration", 6);
|
addModifier("duration", 6);
|
||||||
addModifier("cooldown", 35);
|
addModifier("cooldown", 35);
|
||||||
@ -44,7 +53,6 @@ public class Snowman_Turret extends Ability {
|
|||||||
Location loc = ((LocationAbilityResult) ability).getTarget();
|
Location loc = ((LocationAbilityResult) ability).getTarget();
|
||||||
double duration = Math.min(ability.getModifier("duration") * 20, 300);
|
double duration = Math.min(ability.getModifier("duration") * 20, 300);
|
||||||
double radiusSquared = Math.pow(ability.getModifier("radius"), 2);
|
double radiusSquared = Math.pow(ability.getModifier("radius"), 2);
|
||||||
double damage1 = ability.getModifier("damage");
|
|
||||||
|
|
||||||
loc.getWorld().playSound(loc, VersionSound.ENTITY_ENDERMAN_TELEPORT.toSound(), 2, 1);
|
loc.getWorld().playSound(loc, VersionSound.ENTITY_ENDERMAN_TELEPORT.toSound(), 2, 1);
|
||||||
final Snowman snowman = (Snowman) loc.getWorld().spawnEntity(loc.add(0, 1, 0), EntityType.SNOWMAN);
|
final Snowman snowman = (Snowman) loc.getWorld().spawnEntity(loc.add(0, 1, 0), EntityType.SNOWMAN);
|
||||||
@ -53,28 +61,50 @@ public class Snowman_Turret extends Ability {
|
|||||||
new BukkitRunnable() {
|
new BukkitRunnable() {
|
||||||
int ti = 0;
|
int ti = 0;
|
||||||
double j = 0;
|
double j = 0;
|
||||||
|
TurretHandler turret = new TurretHandler(ability.getModifier("damage"));
|
||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
if (ti++ > duration || stats.getPlayer().isDead() || snowman == null || snowman.isDead()) {
|
if (ti++ > duration || stats.getPlayer().isDead() || snowman == null || snowman.isDead()) {
|
||||||
|
turret.close(3 * 20);
|
||||||
snowman.remove();
|
snowman.remove();
|
||||||
cancel();
|
cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
j += Math.PI / 24 % (2 * Math.PI);
|
j += Math.PI / 24 % (2 * Math.PI);
|
||||||
for (double k = 0; k < 3; k++)
|
for (double k = 0; k < 3; k++)
|
||||||
snowman.getWorld().spawnParticle(Particle.SPELL_INSTANT, snowman.getLocation().add(Math.cos(j + k / 3 * 2 * Math.PI) * 1.3, 1, Math.sin(j + k / 3 * 2 * Math.PI) * 1.3), 0);
|
snowman.getWorld().spawnParticle(Particle.SPELL_INSTANT,
|
||||||
|
snowman.getLocation().add(Math.cos(j + k / 3 * 2 * Math.PI) * 1.3, 1, Math.sin(j + k / 3 * 2 * Math.PI) * 1.3), 0);
|
||||||
snowman.getWorld().spawnParticle(Particle.SPELL_INSTANT, snowman.getLocation().add(0, 1, 0), 1, 0, 0, 0, .2);
|
snowman.getWorld().spawnParticle(Particle.SPELL_INSTANT, snowman.getLocation().add(0, 1, 0), 1, 0, 0, 0, .2);
|
||||||
|
|
||||||
if (ti % 2 == 0)
|
if (ti % 2 == 0)
|
||||||
for (Entity entity : snowman.getWorld().getEntities())
|
for (Entity entity : MMOUtils.getNearbyChunkEntities(snowman.getLocation()))
|
||||||
if (!entity.equals(snowman) && MMOUtils.canDamage(stats.getPlayer(), entity) && entity.getLocation().distanceSquared(snowman.getLocation()) < radiusSquared) {
|
if (!entity.equals(snowman) && MMOUtils.canDamage(stats.getPlayer(), entity)
|
||||||
|
&& entity.getLocation().distanceSquared(snowman.getLocation()) < radiusSquared) {
|
||||||
snowman.getWorld().playSound(snowman.getLocation(), Sound.ENTITY_SNOWBALL_THROW, 1, 1.3f);
|
snowman.getWorld().playSound(snowman.getLocation(), Sound.ENTITY_SNOWBALL_THROW, 1, 1.3f);
|
||||||
Snowball snowball = snowman.launchProjectile(Snowball.class);
|
Snowball snowball = snowman.launchProjectile(Snowball.class);
|
||||||
snowball.setVelocity(entity.getLocation().add(0, entity.getHeight() / 2, 0).toVector().subtract(snowman.getLocation().add(0, 1, 0).toVector()).normalize().multiply(1.3));
|
snowball.setVelocity(entity.getLocation().add(0, entity.getHeight() / 2, 0).toVector()
|
||||||
MMOItems.plugin.getEntities().registerCustomEntity(snowball, damage1);
|
.subtract(snowman.getLocation().add(0, 1, 0).toVector()).normalize().multiply(1.3));
|
||||||
|
turret.entities.add(snowball.getUniqueId());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}.runTaskTimer(MMOItems.plugin, 0, 1);
|
}.runTaskTimer(MMOItems.plugin, 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class TurretHandler extends TemporaryListener {
|
||||||
|
private final List<UUID> entities = new ArrayList<>();
|
||||||
|
private final double damage;
|
||||||
|
|
||||||
|
public TurretHandler(double damage) {
|
||||||
|
super(EntityDamageByEntityEvent.getHandlerList());
|
||||||
|
|
||||||
|
this.damage = damage;
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||||
|
public void a(EntityDamageByEntityEvent event) {
|
||||||
|
if (entities.contains(event.getDamager().getUniqueId()))
|
||||||
|
event.setDamage(damage);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,27 +2,29 @@ package net.Indyuce.mmoitems.ability;
|
|||||||
|
|
||||||
import org.bukkit.Particle;
|
import org.bukkit.Particle;
|
||||||
import org.bukkit.Sound;
|
import org.bukkit.Sound;
|
||||||
import org.bukkit.entity.Entity;
|
|
||||||
import org.bukkit.entity.EntityType;
|
import org.bukkit.entity.EntityType;
|
||||||
import org.bukkit.entity.LivingEntity;
|
import org.bukkit.entity.LivingEntity;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.entity.TNTPrimed;
|
import org.bukkit.entity.TNTPrimed;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||||
import org.bukkit.util.Vector;
|
import org.bukkit.util.Vector;
|
||||||
|
|
||||||
import net.Indyuce.mmoitems.MMOItems;
|
|
||||||
import net.Indyuce.mmoitems.MMOUtils;
|
import net.Indyuce.mmoitems.MMOUtils;
|
||||||
import net.Indyuce.mmoitems.api.ItemAttackResult;
|
import net.Indyuce.mmoitems.api.ItemAttackResult;
|
||||||
import net.Indyuce.mmoitems.api.ability.Ability;
|
import net.Indyuce.mmoitems.api.ability.Ability;
|
||||||
import net.Indyuce.mmoitems.api.ability.AbilityResult;
|
import net.Indyuce.mmoitems.api.ability.AbilityResult;
|
||||||
import net.Indyuce.mmoitems.api.ability.VectorAbilityResult;
|
import net.Indyuce.mmoitems.api.ability.VectorAbilityResult;
|
||||||
import net.Indyuce.mmoitems.api.player.PlayerStats.CachedStats;
|
import net.Indyuce.mmoitems.api.player.PlayerStats.CachedStats;
|
||||||
|
import net.Indyuce.mmoitems.api.util.TemporaryListener;
|
||||||
import net.Indyuce.mmoitems.stat.data.AbilityData;
|
import net.Indyuce.mmoitems.stat.data.AbilityData;
|
||||||
|
|
||||||
public class TNT_Throw extends Ability implements Listener {
|
public class TNT_Throw extends Ability implements Listener {
|
||||||
public TNT_Throw() {
|
public TNT_Throw() {
|
||||||
super(CastingMode.ON_HIT, CastingMode.WHEN_HIT, CastingMode.LEFT_CLICK, CastingMode.RIGHT_CLICK, CastingMode.SHIFT_LEFT_CLICK, CastingMode.SHIFT_RIGHT_CLICK);
|
super(CastingMode.ON_HIT, CastingMode.WHEN_HIT, CastingMode.LEFT_CLICK, CastingMode.RIGHT_CLICK, CastingMode.SHIFT_LEFT_CLICK,
|
||||||
|
CastingMode.SHIFT_RIGHT_CLICK);
|
||||||
|
|
||||||
addModifier("cooldown", 10);
|
addModifier("cooldown", 10);
|
||||||
addModifier("force", 1);
|
addModifier("force", 1);
|
||||||
@ -41,18 +43,31 @@ public class TNT_Throw extends Ability implements Listener {
|
|||||||
TNTPrimed tnt = (TNTPrimed) stats.getPlayer().getWorld().spawnEntity(stats.getPlayer().getLocation().add(0, 1, 0), EntityType.PRIMED_TNT);
|
TNTPrimed tnt = (TNTPrimed) stats.getPlayer().getWorld().spawnEntity(stats.getPlayer().getLocation().add(0, 1, 0), EntityType.PRIMED_TNT);
|
||||||
tnt.setFuseTicks(80);
|
tnt.setFuseTicks(80);
|
||||||
tnt.setVelocity(vec);
|
tnt.setVelocity(vec);
|
||||||
MMOItems.plugin.getEntities().registerCustomEntity(tnt);
|
new CancelTeamDamage(stats.getPlayer(), tnt);
|
||||||
stats.getPlayer().getWorld().playSound(stats.getPlayer().getLocation(), Sound.ENTITY_SNOWBALL_THROW, 1, 0);
|
stats.getPlayer().getWorld().playSound(stats.getPlayer().getLocation(), Sound.ENTITY_SNOWBALL_THROW, 1, 0);
|
||||||
stats.getPlayer().getWorld().spawnParticle(Particle.EXPLOSION_NORMAL, stats.getPlayer().getLocation().add(0, 1, 0), 12, 0, 0, 0, .1);
|
stats.getPlayer().getWorld().spawnParticle(Particle.EXPLOSION_NORMAL, stats.getPlayer().getLocation().add(0, 1, 0), 12, 0, 0, 0, .1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* used to cancel team damage and other things
|
||||||
|
*/
|
||||||
|
public class CancelTeamDamage extends TemporaryListener {
|
||||||
|
private final Player player;
|
||||||
|
private final TNTPrimed tnt;
|
||||||
|
|
||||||
@EventHandler
|
public CancelTeamDamage(Player player, TNTPrimed tnt) {
|
||||||
|
super(EntityDamageByEntityEvent.getHandlerList());
|
||||||
|
|
||||||
|
this.player = player;
|
||||||
|
this.tnt = tnt;
|
||||||
|
|
||||||
|
close(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||||
public void a(EntityDamageByEntityEvent event) {
|
public void a(EntityDamageByEntityEvent event) {
|
||||||
Entity damager = event.getDamager();
|
if (event.getDamager().equals(tnt) && !MMOUtils.canDamage(player, event.getEntity()))
|
||||||
if (damager instanceof TNTPrimed)
|
|
||||||
if (MMOItems.plugin.getEntities().isCustomEntity(damager))
|
|
||||||
if (!MMOUtils.canDamage(event.getEntity()))
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
@ -115,8 +115,8 @@ public class Weaken_Target extends Ability implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public class WeakenedInfo {
|
public class WeakenedInfo {
|
||||||
private long date = System.currentTimeMillis();
|
private final long date = System.currentTimeMillis();
|
||||||
private double extraDamage;
|
private final double extraDamage;
|
||||||
|
|
||||||
public WeakenedInfo(double extraDamage) {
|
public WeakenedInfo(double extraDamage) {
|
||||||
this.extraDamage = extraDamage / 100;
|
this.extraDamage = extraDamage / 100;
|
||||||
|
@ -0,0 +1,43 @@
|
|||||||
|
package net.Indyuce.mmoitems.api.util;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
|
import net.Indyuce.mmoitems.MMOItems;
|
||||||
|
|
||||||
|
public abstract class TemporaryListener implements Listener {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* handler lists which must be called when the temporary listener is closed
|
||||||
|
* so that the listener is entirely unregistered.
|
||||||
|
*/
|
||||||
|
private final HandlerList[] lists;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sometimes the close method is called twice because of a safe delayed task
|
||||||
|
* not being cancelled when the listener is closed.
|
||||||
|
*/
|
||||||
|
private boolean closed;
|
||||||
|
|
||||||
|
public TemporaryListener(HandlerList... events) {
|
||||||
|
lists = events;
|
||||||
|
Bukkit.getPluginManager().registerEvents(this, MMOItems.plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* used to close the temporary listener after some delay
|
||||||
|
*/
|
||||||
|
public void close(long duration) {
|
||||||
|
Bukkit.getScheduler().runTaskLater(MMOItems.plugin, () -> close(), duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void close() {
|
||||||
|
if (closed)
|
||||||
|
return;
|
||||||
|
|
||||||
|
closed = true;
|
||||||
|
for (HandlerList list : lists)
|
||||||
|
list.unregister(this);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user