From 70c398c41e73fa8155ea0d3de143c524211e3bc3 Mon Sep 17 00:00:00 2001 From: Oribuin <38044508+Oribuin@users.noreply.github.com> Date: Sun, 23 May 2021 11:19:00 +0100 Subject: [PATCH] Death Particle Style (#79) * Death Style * Update ParticleStyleDeath.java * Move duration check --- .../playerparticles/styles/DefaultStyles.java | 3 + .../styles/ParticleStyleDeath.java | 104 ++++++++++++++++++ .../styles/ParticleStyleFeet.java | 3 +- 3 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 src/main/java/dev/esophose/playerparticles/styles/ParticleStyleDeath.java diff --git a/src/main/java/dev/esophose/playerparticles/styles/DefaultStyles.java b/src/main/java/dev/esophose/playerparticles/styles/DefaultStyles.java index 633524a..e1ec3ba 100644 --- a/src/main/java/dev/esophose/playerparticles/styles/DefaultStyles.java +++ b/src/main/java/dev/esophose/playerparticles/styles/DefaultStyles.java @@ -23,6 +23,7 @@ public class DefaultStyles implements Listener { public static final ParticleStyle CHAINS = new ParticleStyleChains(); public static final ParticleStyle COMPANION = new ParticleStyleCompanion(); public static final ParticleStyle CUBE = new ParticleStyleCube(); + public static final ParticleStyle DEATH = new ParticleStyleDeath(); public static final ParticleStyle FEET = new ParticleStyleFeet(); public static final ParticleStyle FISHING = new ParticleStyleFishing(); public static final ParticleStyle HALO = new ParticleStyleHalo(); @@ -65,6 +66,7 @@ public class DefaultStyles implements Listener { pluginManager.registerEvents((Listener) ARROWS, playerParticles); pluginManager.registerEvents((Listener) BLOCKBREAK, playerParticles); pluginManager.registerEvents((Listener) BLOCKPLACE, playerParticles); + pluginManager.registerEvents((Listener) DEATH, playerParticles); pluginManager.registerEvents((Listener) FISHING, playerParticles); pluginManager.registerEvents((Listener) HURT, playerParticles); pluginManager.registerEvents((Listener) MOVE, playerParticles); @@ -84,6 +86,7 @@ public class DefaultStyles implements Listener { event.registerStyle(CHAINS); event.registerStyle(COMPANION); event.registerStyle(CUBE); + event.registerEventStyle(DEATH); event.registerStyle(FEET); event.registerStyle(FISHING); event.registerStyle(HALO); diff --git a/src/main/java/dev/esophose/playerparticles/styles/ParticleStyleDeath.java b/src/main/java/dev/esophose/playerparticles/styles/ParticleStyleDeath.java new file mode 100644 index 0000000..90e0ade --- /dev/null +++ b/src/main/java/dev/esophose/playerparticles/styles/ParticleStyleDeath.java @@ -0,0 +1,104 @@ +package dev.esophose.playerparticles.styles; + +import dev.esophose.playerparticles.PlayerParticles; +import dev.esophose.playerparticles.config.CommentedFileConfiguration; +import dev.esophose.playerparticles.manager.ConfigurationManager; +import dev.esophose.playerparticles.manager.DataManager; +import dev.esophose.playerparticles.manager.ParticleManager; +import dev.esophose.playerparticles.particles.PParticle; +import dev.esophose.playerparticles.particles.PPlayer; +import dev.esophose.playerparticles.particles.ParticlePair; +import org.bukkit.Location; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class ParticleStyleDeath extends DefaultParticleStyle implements Listener { + + private String style; + private List causes; + private int targetDuration; + private final long ticksPerParticle = ConfigurationManager.Setting.TICKS_PER_PARTICLE.getLong(); + + protected ParticleStyleDeath() { + super("death", false, false, 0); + } + + @Override + public List getParticles(ParticlePair particle, Location location) { + ParticleStyle style = ParticleStyle.fromName(this.style); + if (style == null || style == this) + style = DefaultStyles.WHIRL; + + return style.getParticles(particle, location); + } + + @Override + public void updateTimers() { + + } + + @Override + protected List getGuiIconMaterialNames() { + return Arrays.asList("TOTEM_OF_UNDYING", "TOTEM", "BED"); + } + + @Override + protected void setDefaultSettings(CommentedFileConfiguration config) { + this.setIfNotExists("style", "whirl", "The name of the style to be displayed."); + this.setIfNotExists("target-duration", 60, "How long to display the particles for."); + this.setIfNotExists("disabled-causes", Collections.singletonList("DROWNING"), "What damage types shouldn't spawn particles?"); + } + + @Override + protected void loadSettings(CommentedFileConfiguration config) { + this.style = config.getString("style"); + this.targetDuration = config.getInt("target-duration"); + + // Nicole you may wanna clean this up a bit + this.causes = config.getStringList("disabled-causes").stream() + .map(s -> EntityDamageEvent.DamageCause.valueOf(s.toUpperCase())) + .collect(Collectors.toList()); + + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onDeath(PlayerDeathEvent event) { + + final EntityDamageEvent damageEvent = event.getEntity().getLastDamageCause(); + if (damageEvent == null) return; + + if (causes.contains(damageEvent.getCause())) return; + + ParticleManager particleManager = PlayerParticles.getInstance().getManager(ParticleManager.class); + PPlayer pplayer = PlayerParticles.getInstance().getManager(DataManager.class).getPPlayer(event.getEntity().getUniqueId()); + + new BukkitRunnable() { + private int totalDuration = 0; + final Location loc = event.getEntity().getLocation().clone().add(0, 1, 0); + + @Override + public void run() { + for (ParticlePair particle : pplayer.getActiveParticlesForStyle(DefaultStyles.DEATH)) { + particleManager.displayParticles(pplayer, event.getEntity().getWorld(), particle, DefaultStyles.DEATH.getParticles(particle, loc), false); + } + + this.totalDuration += ticksPerParticle; + if (this.totalDuration > targetDuration) + this.cancel(); + + } + + }.runTaskTimer(PlayerParticles.getInstance(), 0, ticksPerParticle); + + } + +} diff --git a/src/main/java/dev/esophose/playerparticles/styles/ParticleStyleFeet.java b/src/main/java/dev/esophose/playerparticles/styles/ParticleStyleFeet.java index b28effc..848b7db 100644 --- a/src/main/java/dev/esophose/playerparticles/styles/ParticleStyleFeet.java +++ b/src/main/java/dev/esophose/playerparticles/styles/ParticleStyleFeet.java @@ -4,6 +4,7 @@ import dev.esophose.playerparticles.config.CommentedFileConfiguration; import dev.esophose.playerparticles.particles.PParticle; import dev.esophose.playerparticles.particles.ParticlePair; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import org.bukkit.Location; @@ -34,7 +35,7 @@ public class ParticleStyleFeet extends DefaultParticleStyle { @Override protected List getGuiIconMaterialNames() { - return Collections.singletonList("GRASS"); + return Arrays.asList("GRASS_BLOCK", "GRASS"); } @Override