Added 1.17 particles

This commit is contained in:
Esophose 2021-06-21 13:26:50 -06:00
parent 70c398c41e
commit dc72e39f46
No known key found for this signature in database
GPG Key ID: DE0E013CAE5C630A
62 changed files with 1378 additions and 379 deletions

View File

@ -1,16 +1,16 @@
import org.apache.tools.ant.filters.ReplaceTokens
plugins {
id 'com.github.johnrengelman.shadow' version '5.1.0'
id 'com.github.johnrengelman.shadow' version '7.0.0'
id 'maven-publish'
id 'java'
id 'java-library'
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
compileJava.options.encoding = 'UTF-8'
group = 'dev.esophose'
version = '7.19'
version = '7.20'
java {
withJavadocJar()
@ -19,25 +19,24 @@ java {
repositories {
mavenCentral()
jcenter()
maven { url = 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' }
maven { url = 'https://repo.codemc.org/repository/maven-public' }
maven { url = 'http://repo.extendedclip.com/content/repositories/placeholderapi/' }
maven { url = 'https://repo.extendedclip.com/content/repositories/placeholderapi/' }
maven { url = 'https://repo.rosewooddev.io/repository/public/' }
}
dependencies {
compile 'org.slf4j:slf4j-api:1.7.25'
compile 'org.slf4j:slf4j-nop:1.7.25'
compile 'com.zaxxer:HikariCP:3.2.0'
compile 'org.bstats:bstats-bukkit-lite:1.7'
compile 'org.codemc.worldguardwrapper:worldguardwrapper:1.2.0-SNAPSHOT'
api 'org.slf4j:slf4j-api:1.7.25'
api 'org.slf4j:slf4j-nop:1.7.25'
api 'com.zaxxer:HikariCP:3.2.0'
api 'org.bstats:bstats-bukkit-lite:1.7'
api 'org.codemc.worldguardwrapper:worldguardwrapper:1.2.0-SNAPSHOT'
compileOnly 'com.googlecode.json-simple:json-simple:1.1.1'
compileOnly 'org.jetbrains:annotations:16.0.2'
compileOnly 'me.clip:placeholderapi:2.10.4'
compileOnly 'org.xerial:sqlite-jdbc:3.23.1'
compileOnly 'org.spigotmc:spigot:1.16.3'
compileOnly 'org.spigotmc:spigot:1.17'
}
shadowJar {
@ -54,6 +53,7 @@ processResources {
from (sourceSets.main.resources.srcDirs) {
include '**/*.yml'
filter ReplaceTokens, tokens: ["version": project.property("version")]
duplicatesStrategy DuplicatesStrategy.INCLUDE
}
}

Binary file not shown.

View File

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

2
gradlew vendored
View File

@ -82,6 +82,7 @@ esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
@ -129,6 +130,7 @@ fi
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath

25
gradlew.bat vendored
View File

@ -29,6 +29,9 @@ if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@ -37,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@ -51,7 +54,7 @@ goto fail
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
@ -61,28 +64,14 @@ echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell

View File

@ -1 +1 @@
rootProject.name = 'playerparticles'
rootProject.name = 'PlayerParticles'

View File

@ -10,8 +10,10 @@ import dev.esophose.playerparticles.particles.PPlayer;
import dev.esophose.playerparticles.particles.ParticleEffect;
import dev.esophose.playerparticles.particles.ParticleGroup;
import dev.esophose.playerparticles.particles.ParticlePair;
import dev.esophose.playerparticles.particles.data.ColorTransition;
import dev.esophose.playerparticles.particles.data.NoteColor;
import dev.esophose.playerparticles.particles.data.OrdinaryColor;
import dev.esophose.playerparticles.particles.data.Vibration;
import dev.esophose.playerparticles.styles.ParticleStyle;
import java.util.ArrayList;
import java.util.Collection;
@ -163,7 +165,7 @@ public final class PlayerParticlesAPI {
*/
@Nullable
public ParticlePair addActivePlayerParticle(@NotNull Player player, @NotNull ParticleEffect effect, @NotNull ParticleStyle style) {
return this.addActivePlayerParticle(player, effect, style, null, null, null);
return this.addActivePlayerParticle(player, effect, style, null, null, null, null, null);
}
/**
@ -177,7 +179,7 @@ public final class PlayerParticlesAPI {
*/
@Nullable
public ParticlePair addActivePlayerParticle(@NotNull Player player, @NotNull ParticleEffect effect, @NotNull ParticleStyle style, @NotNull OrdinaryColor colorData) {
return this.addActivePlayerParticle(player, effect, style, colorData, null, null);
return this.addActivePlayerParticle(player, effect, style, colorData, null, null, null, null);
}
/**
@ -191,7 +193,7 @@ public final class PlayerParticlesAPI {
*/
@Nullable
public ParticlePair addActivePlayerParticle(@NotNull Player player, @NotNull ParticleEffect effect, @NotNull ParticleStyle style, @NotNull NoteColor noteColorData) {
return this.addActivePlayerParticle(player, effect, style, null, noteColorData, null);
return this.addActivePlayerParticle(player, effect, style, null, noteColorData, null, null, null);
}
/**
@ -205,7 +207,35 @@ public final class PlayerParticlesAPI {
*/
@Nullable
public ParticlePair addActivePlayerParticle(@NotNull Player player, @NotNull ParticleEffect effect, @NotNull ParticleStyle style, @NotNull Material materialData) {
return this.addActivePlayerParticle(player, effect, style, null, null, materialData);
return this.addActivePlayerParticle(player, effect, style, null, null, materialData, null, null);
}
/**
* Adds an active particle to a Player's particles
*
* @param player The player to add to
* @param effect The effect of the particle
* @param style The style of the particle
* @param colorTransitionData The color transition data of the particle
* @return The ParticlePair that was added or null if failed
*/
@Nullable
public ParticlePair addActivePlayerParticle(@NotNull Player player, @NotNull ParticleEffect effect, @NotNull ParticleStyle style, @NotNull ColorTransition colorTransitionData) {
return this.addActivePlayerParticle(player, effect, style, null, null, null, colorTransitionData, null);
}
/**
* Adds an active particle to a Player's particles
*
* @param player The player to add to
* @param effect The effect of the particle
* @param style The style of the particle
* @param vibrationData The vibration data of the particle
* @return The ParticlePair that was added or null if failed
*/
@Nullable
public ParticlePair addActivePlayerParticle(@NotNull Player player, @NotNull ParticleEffect effect, @NotNull ParticleStyle style, @NotNull Vibration vibrationData) {
return this.addActivePlayerParticle(player, effect, style, null, null, null, null, vibrationData);
}
/**
@ -216,9 +246,10 @@ public final class PlayerParticlesAPI {
* @param noteColorData The note color data of the particle
* @param materialData The material data of the particle
* @return The ParticlePair that was added or null if failed
* @deprecated Use
*/
@Nullable
private ParticlePair addActivePlayerParticle(@NotNull Player player, @NotNull ParticleEffect effect, @NotNull ParticleStyle style, @Nullable OrdinaryColor colorData, @Nullable NoteColor noteColorData, @Nullable Material materialData) {
private ParticlePair addActivePlayerParticle(@NotNull Player player, @NotNull ParticleEffect effect, @NotNull ParticleStyle style, @Nullable OrdinaryColor colorData, @Nullable NoteColor noteColorData, @Nullable Material materialData, @Nullable ColorTransition colorTransitionData, @Nullable Vibration vibrationData) {
Objects.requireNonNull(effect);
Objects.requireNonNull(style);
@ -236,7 +267,7 @@ public final class PlayerParticlesAPI {
}
}
ParticlePair particle = new ParticlePair(player.getUniqueId(), pplayer.getNextActiveParticleId(), effect, style, itemMaterialData, blockMaterialData, colorData, noteColorData);
ParticlePair particle = new ParticlePair(player.getUniqueId(), pplayer.getNextActiveParticleId(), effect, style, itemMaterialData, blockMaterialData, colorData, noteColorData, colorTransitionData, vibrationData);
this.addActivePlayerParticle(player, particle);
return particle;
}
@ -677,7 +708,7 @@ public final class PlayerParticlesAPI {
*/
@Nullable
public FixedParticleEffect createFixedParticleEffect(@NotNull CommandSender sender, @NotNull Location location, @NotNull ParticleEffect effect, @NotNull ParticleStyle style) {
return this.createFixedParticleEffect(sender, location, effect, style, null, null, null);
return this.createFixedParticleEffect(sender, location, effect, style, null, null, null, null, null);
}
/**
@ -692,7 +723,7 @@ public final class PlayerParticlesAPI {
*/
@Nullable
public FixedParticleEffect createFixedParticleEffect(@NotNull CommandSender sender, @NotNull Location location, @NotNull ParticleEffect effect, @NotNull ParticleStyle style, @NotNull OrdinaryColor colorData) {
return this.createFixedParticleEffect(sender, location, effect, style, colorData, null, null);
return this.createFixedParticleEffect(sender, location, effect, style, colorData, null, null, null, null);
}
/**
@ -707,7 +738,7 @@ public final class PlayerParticlesAPI {
*/
@Nullable
public FixedParticleEffect createFixedParticleEffect(@NotNull CommandSender sender, @NotNull Location location, @NotNull ParticleEffect effect, @NotNull ParticleStyle style, @NotNull NoteColor noteColorData) {
return this.createFixedParticleEffect(sender, location, effect, style, null, noteColorData, null);
return this.createFixedParticleEffect(sender, location, effect, style, null, noteColorData, null, null, null);
}
/**
@ -722,7 +753,37 @@ public final class PlayerParticlesAPI {
*/
@Nullable
public FixedParticleEffect createFixedParticleEffect(@NotNull CommandSender sender, @NotNull Location location, @NotNull ParticleEffect effect, @NotNull ParticleStyle style, @NotNull Material materialData) {
return this.createFixedParticleEffect(sender, location, effect, style, null, null, materialData);
return this.createFixedParticleEffect(sender, location, effect, style, null, null, materialData, null, null);
}
/**
* Creates a fixed particle effect for a player
*
* @param sender The sender to create for, either a Player or ConsoleCommandSender
* @param location The location to create at
* @param effect The effect of the particle
* @param style The style of the particle
* @param colorTransitionData The color transition data of the particle
* @return The FixedParticleEffect that was created or null if failed
*/
@Nullable
public FixedParticleEffect createFixedParticleEffect(@NotNull CommandSender sender, @NotNull Location location, @NotNull ParticleEffect effect, @NotNull ParticleStyle style, @NotNull ColorTransition colorTransitionData) {
return this.createFixedParticleEffect(sender, location, effect, style, null, null, null, colorTransitionData, null);
}
/**
* Creates a fixed particle effect for a player
*
* @param sender The sender to create for, either a Player or ConsoleCommandSender
* @param location The location to create at
* @param effect The effect of the particle
* @param style The style of the particle
* @param vibrationData The vibration data of the particle
* @return The FixedParticleEffect that was created or null if failed
*/
@Nullable
public FixedParticleEffect createFixedParticleEffect(@NotNull CommandSender sender, @NotNull Location location, @NotNull ParticleEffect effect, @NotNull ParticleStyle style, @NotNull Vibration vibrationData) {
return this.createFixedParticleEffect(sender, location, effect, style, null, null, null, null, vibrationData);
}
/**
@ -738,7 +799,7 @@ public final class PlayerParticlesAPI {
* @return The FixedParticleEffect that was created or null if failed
*/
@Nullable
private FixedParticleEffect createFixedParticleEffect(@NotNull CommandSender sender, @NotNull Location location, @NotNull ParticleEffect effect, @NotNull ParticleStyle style, @Nullable OrdinaryColor colorData, @Nullable NoteColor noteColorData, @Nullable Material materialData) {
private FixedParticleEffect createFixedParticleEffect(@NotNull CommandSender sender, @NotNull Location location, @NotNull ParticleEffect effect, @NotNull ParticleStyle style, @Nullable OrdinaryColor colorData, @Nullable NoteColor noteColorData, @Nullable Material materialData, @Nullable ColorTransition colorTransitionData, @Nullable Vibration vibrationData) {
Objects.requireNonNull(location);
Objects.requireNonNull(location.getWorld());
Objects.requireNonNull(effect);
@ -758,7 +819,7 @@ public final class PlayerParticlesAPI {
}
}
ParticlePair particle = new ParticlePair(pplayer.getUniqueId(), 1, effect, style, itemMaterialData, blockMaterialData, colorData, noteColorData);
ParticlePair particle = new ParticlePair(pplayer.getUniqueId(), 1, effect, style, itemMaterialData, blockMaterialData, colorData, noteColorData, colorTransitionData, vibrationData);
return this.createFixedParticleEffect(sender, location, particle);
}
@ -961,7 +1022,7 @@ public final class PlayerParticlesAPI {
ParticleManager particleManager = this.playerParticles.getManager(ParticleManager.class);
int removedAmount = 0;
for (PPlayer pplayer : particleManager.getPPlayers()) {
for (PPlayer pplayer : particleManager.getPPlayers().values()) {
Set<Integer> removedIds = new HashSet<>();
for (FixedParticleEffect fixedEffect : pplayer.getFixedParticles())
if (fixedEffect.getLocation().getWorld() == location.getWorld() && fixedEffect.getLocation().distance(location) <= radius)

View File

@ -10,14 +10,17 @@ import dev.esophose.playerparticles.particles.ParticleEffect;
import dev.esophose.playerparticles.particles.ParticleEffect.ParticleProperty;
import dev.esophose.playerparticles.particles.ParticleGroup;
import dev.esophose.playerparticles.particles.ParticlePair;
import dev.esophose.playerparticles.particles.data.ColorTransition;
import dev.esophose.playerparticles.particles.data.NoteColor;
import dev.esophose.playerparticles.particles.data.OrdinaryColor;
import dev.esophose.playerparticles.particles.data.Vibration;
import dev.esophose.playerparticles.styles.ParticleStyle;
import dev.esophose.playerparticles.util.ParticleUtils;
import dev.esophose.playerparticles.util.StringPlaceholders;
import dev.esophose.playerparticles.util.inputparser.InputParser;
import dev.esophose.playerparticles.util.inputparser.parsable.ParsableOrdinaryColor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.bukkit.Material;
import org.bukkit.util.StringUtil;
@ -64,6 +67,8 @@ public class AddCommandModule implements CommandModule {
Material blockData = null;
OrdinaryColor colorData = null;
NoteColor noteColorData = null;
ColorTransition colorTransitionData = null;
Vibration vibrationData = null;
if (args.length > 2) {
if (effect.hasProperty(ParticleProperty.COLORABLE)) {
@ -94,11 +99,23 @@ public class AddCommandModule implements CommandModule {
return;
}
}
} else if (effect.hasProperty(ParticleProperty.COLORABLE_TRANSITION)) {
colorTransitionData = inputParser.next(ColorTransition.class);
if (colorTransitionData == null) {
localeManager.sendMessage(pplayer, "data-invalid-color-transition");
return;
}
} else if (effect.hasProperty(ParticleProperty.VIBRATION)) {
vibrationData = inputParser.next(Vibration.class);
if (vibrationData == null) {
localeManager.sendMessage(pplayer, "data-invalid-vibration");
return;
}
}
}
ParticleGroup group = pplayer.getActiveParticleGroup();
ParticlePair newParticle = new ParticlePair(pplayer.getUniqueId(), pplayer.getNextActiveParticleId(), effect, style, itemData, blockData, colorData, noteColorData);
ParticlePair newParticle = new ParticlePair(pplayer.getUniqueId(), pplayer.getNextActiveParticleId(), effect, style, itemData, blockData, colorData, noteColorData, colorTransitionData, vibrationData);
group.getParticles().put(newParticle.getId(), newParticle);
PlayerParticlesAPI.getInstance().savePlayerParticleGroup(pplayer.getPlayer(), group);
@ -136,11 +153,11 @@ public class AddCommandModule implements CommandModule {
} else { // Color data
if (args.length <= 3) {
possibleValues.add("<0-255> <0-255> <0-255>");
possibleValues.addAll(ParsableOrdinaryColor.getColorNameMap().keySet());
possibleValues.addAll(ParsableOrdinaryColor.COLOR_NAME_MAP.keySet());
possibleValues.add("<#hexCode>");
} else if (args.length <= 4 && !ParsableOrdinaryColor.getColorNameMap().containsKey(args[2].toLowerCase())) {
} else if (args.length <= 4 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[2].toLowerCase())) {
possibleValues.add("<0-255> <0-255>");
} else if (args.length <= 5 && !ParsableOrdinaryColor.getColorNameMap().containsKey(args[2].toLowerCase())) {
} else if (args.length <= 5 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[2].toLowerCase())) {
possibleValues.add("<0-255>");
}
}
@ -151,6 +168,37 @@ public class AddCommandModule implements CommandModule {
} else if (effect == ParticleEffect.ITEM) { // Item material
StringUtil.copyPartialMatches(args[2], ParticleUtils.ITEM_MATERIALS_STRING, matches);
}
} else if (effect.hasProperty(ParticleProperty.COLORABLE_TRANSITION)) {
String[] dataArgs = Arrays.copyOfRange(args, 2, args.length);
InputParser inputParser = new InputParser(pplayer, dataArgs);
List<String> possibleValues = new ArrayList<>();
boolean firstComplete = inputParser.next(OrdinaryColor.class) == null;
int argsRemaining = inputParser.numRemaining();
int nextStart = 2 + dataArgs.length - argsRemaining;
if (firstComplete) {
if (args.length <= 3) {
possibleValues.add("<0-255> <0-255> <0-255>");
possibleValues.addAll(ParsableOrdinaryColor.COLOR_NAME_MAP.keySet());
possibleValues.add("<#hexCode>");
} else if (args.length <= 4 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[2].toLowerCase())) {
possibleValues.add("<0-255> <0-255>");
} else if (args.length <= 5 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[2].toLowerCase())) {
possibleValues.add("<0-255>");
}
} else if (inputParser.next(OrdinaryColor.class) == null) {
if (argsRemaining == 1) {
possibleValues.add("<0-255> <0-255> <0-255>");
possibleValues.addAll(ParsableOrdinaryColor.COLOR_NAME_MAP.keySet());
possibleValues.add("<#hexCode>");
} else if (argsRemaining == 2 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[nextStart].toLowerCase())) {
possibleValues.add("<0-255> <0-255>");
} else if (argsRemaining == 3 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[nextStart].toLowerCase())) {
possibleValues.add("<0-255>");
}
}
StringUtil.copyPartialMatches(args[args.length - 1], possibleValues, matches);
} else if (args.length == 3 && effect.hasProperty(ParticleProperty.VIBRATION)) {
return Arrays.asList("<duration>", "20", "40", "60");
}
}
}

View File

@ -36,6 +36,10 @@ public class DataCommandModule implements CommandModule {
} else {
localeManager.sendMessage(pplayer, "data-usage-block", StringPlaceholders.single("effect", effect.getName()));
}
} else if (effect.hasProperty(ParticleProperty.COLORABLE_TRANSITION)) {
localeManager.sendMessage(pplayer, "data-usage-color-transition", StringPlaceholders.single("effect", effect.getName()));
} else if (effect.hasProperty(ParticleProperty.VIBRATION)) {
localeManager.sendMessage(pplayer, "data-usage-vibration", StringPlaceholders.single("effect", effect.getName()));
} else {
localeManager.sendMessage(pplayer, "data-usage-none", StringPlaceholders.single("effect", effect.getName()));
}

View File

@ -9,14 +9,17 @@ import dev.esophose.playerparticles.particles.ParticleEffect;
import dev.esophose.playerparticles.particles.ParticleEffect.ParticleProperty;
import dev.esophose.playerparticles.particles.ParticleGroup;
import dev.esophose.playerparticles.particles.ParticlePair;
import dev.esophose.playerparticles.particles.data.ColorTransition;
import dev.esophose.playerparticles.particles.data.NoteColor;
import dev.esophose.playerparticles.particles.data.OrdinaryColor;
import dev.esophose.playerparticles.particles.data.Vibration;
import dev.esophose.playerparticles.styles.ParticleStyle;
import dev.esophose.playerparticles.util.ParticleUtils;
import dev.esophose.playerparticles.util.StringPlaceholders;
import dev.esophose.playerparticles.util.inputparser.InputParser;
import dev.esophose.playerparticles.util.inputparser.parsable.ParsableOrdinaryColor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.bukkit.Material;
import org.bukkit.util.StringUtil;
@ -147,6 +150,8 @@ public class EditCommandModule implements CommandModule {
Material blockData = null;
OrdinaryColor colorData = null;
NoteColor noteColorData = null;
ColorTransition colorTransitionData = null;
Vibration vibrationData = null;
ParticleEffect effect = pplayer.getActiveParticle(id).getEffect();
@ -179,6 +184,18 @@ public class EditCommandModule implements CommandModule {
return;
}
}
} else if (effect.hasProperty(ParticleProperty.COLORABLE_TRANSITION)) {
colorTransitionData = inputParser.next(ColorTransition.class);
if (colorTransitionData == null) {
localeManager.sendMessage(pplayer, "data-invalid-color-transition");
return;
}
} else if (effect.hasProperty(ParticleProperty.VIBRATION)) {
vibrationData = inputParser.next(Vibration.class);
if (vibrationData == null) {
localeManager.sendMessage(pplayer, "data-invalid-vibration");
return;
}
}
String updatedDataString = null;
@ -189,6 +206,8 @@ public class EditCommandModule implements CommandModule {
if (blockData != null) particle.setBlockMaterial(blockData);
if (colorData != null) particle.setColor(colorData);
if (noteColorData != null) particle.setNoteColor(noteColorData);
if (colorTransitionData != null) particle.setColorTransition(colorTransitionData);
if (vibrationData != null) particle.setVibration(vibrationData);
updatedDataString = particle.getDataString();
break;
}
@ -248,11 +267,11 @@ public class EditCommandModule implements CommandModule {
} else { // Color data
if (args.length <= 3) {
possibleValues.add("<0-255> <0-255> <0-255>");
possibleValues.addAll(ParsableOrdinaryColor.getColorNameMap().keySet());
possibleValues.addAll(ParsableOrdinaryColor.COLOR_NAME_MAP.keySet());
possibleValues.add("<#hexCode>");
} else if (args.length <= 4 && !ParsableOrdinaryColor.getColorNameMap().containsKey(args[2].toLowerCase())) {
} else if (args.length <= 4 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[2].toLowerCase())) {
possibleValues.add("<0-255> <0-255>");
} else if (args.length <= 5 && !ParsableOrdinaryColor.getColorNameMap().containsKey(args[2].toLowerCase())) {
} else if (args.length <= 5 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[2].toLowerCase())) {
possibleValues.add("<0-255>");
}
}
@ -263,6 +282,37 @@ public class EditCommandModule implements CommandModule {
} else if (effect == ParticleEffect.ITEM) { // Item material
StringUtil.copyPartialMatches(args[2], ParticleUtils.ITEM_MATERIALS_STRING, matches);
}
} else if (effect.hasProperty(ParticleProperty.COLORABLE_TRANSITION)) {
String[] dataArgs = Arrays.copyOfRange(args, 2, args.length);
InputParser inputParser = new InputParser(pplayer, dataArgs);
List<String> possibleValues = new ArrayList<>();
boolean firstComplete = inputParser.next(OrdinaryColor.class) == null;
int argsRemaining = inputParser.numRemaining();
int nextStart = 2 + dataArgs.length - argsRemaining;
if (firstComplete) {
if (args.length <= 3) {
possibleValues.add("<0-255> <0-255> <0-255>");
possibleValues.addAll(ParsableOrdinaryColor.COLOR_NAME_MAP.keySet());
possibleValues.add("<#hexCode>");
} else if (args.length <= 4 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[2].toLowerCase())) {
possibleValues.add("<0-255> <0-255>");
} else if (args.length <= 5 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[2].toLowerCase())) {
possibleValues.add("<0-255>");
}
} else if (inputParser.next(OrdinaryColor.class) == null) {
if (argsRemaining == 1) {
possibleValues.add("<0-255> <0-255> <0-255>");
possibleValues.addAll(ParsableOrdinaryColor.COLOR_NAME_MAP.keySet());
possibleValues.add("<#hexCode>");
} else if (argsRemaining == 2 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[nextStart].toLowerCase())) {
possibleValues.add("<0-255> <0-255>");
} else if (argsRemaining == 3 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[nextStart].toLowerCase())) {
possibleValues.add("<0-255>");
}
}
StringUtil.copyPartialMatches(args[args.length - 1], possibleValues, matches);
} else if (args.length == 3 && effect.hasProperty(ParticleProperty.VIBRATION)) {
return Arrays.asList("<duration>", "20", "40", "60");
}
break;
}

View File

@ -9,8 +9,10 @@ import dev.esophose.playerparticles.particles.PPlayer;
import dev.esophose.playerparticles.particles.ParticleEffect;
import dev.esophose.playerparticles.particles.ParticleEffect.ParticleProperty;
import dev.esophose.playerparticles.particles.ParticlePair;
import dev.esophose.playerparticles.particles.data.ColorTransition;
import dev.esophose.playerparticles.particles.data.NoteColor;
import dev.esophose.playerparticles.particles.data.OrdinaryColor;
import dev.esophose.playerparticles.particles.data.Vibration;
import dev.esophose.playerparticles.styles.ParticleStyle;
import dev.esophose.playerparticles.util.ParticleUtils;
import dev.esophose.playerparticles.util.StringPlaceholders;
@ -194,8 +196,10 @@ public class FixedCommandModule implements CommandModule {
Material blockData = null;
OrdinaryColor colorData = null;
NoteColor noteColorData = null;
ColorTransition colorTransitionData = null;
Vibration vibrationData = null;
if (inputParser.hasNext() && (effect.hasProperty(ParticleProperty.COLORABLE) || effect.hasProperty(ParticleProperty.REQUIRES_MATERIAL_DATA))) {
if (inputParser.hasNext()) {
if (effect.hasProperty(ParticleProperty.COLORABLE)) {
if (effect == ParticleEffect.NOTE) {
noteColorData = inputParser.next(NoteColor.class);
@ -224,10 +228,22 @@ public class FixedCommandModule implements CommandModule {
return;
}
}
} else if (effect.hasProperty(ParticleProperty.COLORABLE_TRANSITION)) {
colorTransitionData = inputParser.next(ColorTransition.class);
if (colorTransitionData == null) {
localeManager.sendMessage(pplayer, "fixed-create-data-error");
return;
}
} else if (effect.hasProperty(ParticleProperty.VIBRATION)) {
vibrationData = inputParser.next(Vibration.class);
if (vibrationData == null) {
localeManager.sendMessage(pplayer, "fixed-create-data-error");
return;
}
}
}
ParticlePair particle = new ParticlePair(pplayer.getUniqueId(), pplayer.getNextFixedEffectId(), effect, style, itemData, blockData, colorData, noteColorData);
ParticlePair particle = new ParticlePair(pplayer.getUniqueId(), pplayer.getNextFixedEffectId(), effect, style, itemData, blockData, colorData, noteColorData, colorTransitionData, vibrationData);
PlayerParticlesAPI.getInstance().createFixedParticleEffect(player == null ? Bukkit.getConsoleSender() : player, location, particle);
localeManager.sendMessage(pplayer, "fixed-create-success");
}
@ -319,6 +335,8 @@ public class FixedCommandModule implements CommandModule {
Material blockData = null;
OrdinaryColor colorData = null;
NoteColor noteColorData = null;
ColorTransition colorTransitionData = null;
Vibration vibrationData = null;
ParticleEffect effect = fixedEffect.getParticlePair().getEffect();
if (effect.hasProperty(ParticleProperty.COLORABLE)) {
@ -349,6 +367,18 @@ public class FixedCommandModule implements CommandModule {
return;
}
}
} else if (effect.hasProperty(ParticleProperty.COLORABLE_TRANSITION)) {
colorTransitionData = inputParser.next(ColorTransition.class);
if (colorTransitionData == null) {
localeManager.sendMessage(pplayer, "fixed-edit-data-error");
return;
}
} else if (effect.hasProperty(ParticleProperty.VIBRATION)) {
vibrationData = inputParser.next(Vibration.class);
if (vibrationData == null) {
localeManager.sendMessage(pplayer, "fixed-edit-data-error");
return;
}
} else {
localeManager.sendMessage(pplayer, "fixed-edit-data-none");
return;
@ -358,6 +388,8 @@ public class FixedCommandModule implements CommandModule {
fixedEffect.getParticlePair().setNoteColor(noteColorData);
fixedEffect.getParticlePair().setItemMaterial(itemData);
fixedEffect.getParticlePair().setBlockMaterial(blockData);
fixedEffect.getParticlePair().setColorTransition(colorTransitionData);
fixedEffect.getParticlePair().setVibration(vibrationData);
break;
}
default:
@ -638,11 +670,11 @@ public class FixedCommandModule implements CommandModule {
} else { // Color data
if (args.length <= 7) {
possibleValues.add("<0-255> <0-255> <0-255>");
possibleValues.addAll(ParsableOrdinaryColor.getColorNameMap().keySet());
possibleValues.addAll(ParsableOrdinaryColor.COLOR_NAME_MAP.keySet());
possibleValues.add("<#hexCode>");
} else if (args.length <= 8 && !ParsableOrdinaryColor.getColorNameMap().containsKey(args[2].toLowerCase())) {
} else if (args.length <= 8 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[6].toLowerCase())) {
possibleValues.add("<0-255> <0-255>");
} else if (args.length <= 9 && !ParsableOrdinaryColor.getColorNameMap().containsKey(args[2].toLowerCase())) {
} else if (args.length <= 9 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[6].toLowerCase())) {
possibleValues.add("<0-255>");
}
}
@ -653,6 +685,37 @@ public class FixedCommandModule implements CommandModule {
} else if (effect == ParticleEffect.ITEM) { // Item material
StringUtil.copyPartialMatches(args[6], ParticleUtils.ITEM_MATERIALS_STRING, matches);
}
} else if (effect.hasProperty(ParticleProperty.COLORABLE_TRANSITION)) {
String[] dataArgs = Arrays.copyOfRange(args, 6, args.length);
InputParser inputParser = new InputParser(pplayer, dataArgs);
List<String> possibleValues = new ArrayList<>();
boolean firstComplete = inputParser.next(OrdinaryColor.class) == null;
int argsRemaining = inputParser.numRemaining();
int nextStart = 6 + dataArgs.length - argsRemaining;
if (firstComplete) {
if (args.length <= 7) {
possibleValues.add("<0-255> <0-255> <0-255>");
possibleValues.addAll(ParsableOrdinaryColor.COLOR_NAME_MAP.keySet());
possibleValues.add("<#hexCode>");
} else if (args.length <= 8 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[6].toLowerCase())) {
possibleValues.add("<0-255> <0-255>");
} else if (args.length <= 9 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[6].toLowerCase())) {
possibleValues.add("<0-255>");
}
} else if (inputParser.next(OrdinaryColor.class) == null) {
if (argsRemaining == 1) {
possibleValues.add("<0-255> <0-255> <0-255>");
possibleValues.addAll(ParsableOrdinaryColor.COLOR_NAME_MAP.keySet());
possibleValues.add("<#hexCode>");
} else if (argsRemaining == 2 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[nextStart].toLowerCase())) {
possibleValues.add("<0-255> <0-255>");
} else if (argsRemaining == 3 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[nextStart].toLowerCase())) {
possibleValues.add("<0-255>");
}
}
StringUtil.copyPartialMatches(args[args.length - 1], possibleValues, matches);
} else if (args.length == 7 && effect.hasProperty(ParticleProperty.VIBRATION)) {
return Arrays.asList("<duration>", "20", "40", "60");
}
}
}
@ -701,7 +764,7 @@ public class FixedCommandModule implements CommandModule {
int id = -1;
try {
id = Integer.parseInt(args[1]);
} catch (Exception e) { }
} catch (Exception ignored) { }
FixedParticleEffect fixedEffect = pplayer.getFixedEffectById(id);
if (fixedEffect != null) {
@ -717,11 +780,11 @@ public class FixedCommandModule implements CommandModule {
} else { // Color data
if (args.length <= 4) {
possibleValues.add("<0-255> <0-255> <0-255>");
possibleValues.addAll(ParsableOrdinaryColor.getColorNameMap().keySet());
possibleValues.addAll(ParsableOrdinaryColor.COLOR_NAME_MAP.keySet());
possibleValues.add("<#hexCode>");
} else if (args.length <= 5 && !ParsableOrdinaryColor.getColorNameMap().containsKey(args[3].toLowerCase())) {
} else if (args.length <= 5 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[3].toLowerCase())) {
possibleValues.add("<0-255> <0-255>");
} else if (args.length <= 6 && !ParsableOrdinaryColor.getColorNameMap().containsKey(args[3].toLowerCase())) {
} else if (args.length <= 6 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[3].toLowerCase())) {
possibleValues.add("<0-255>");
}
}
@ -732,6 +795,37 @@ public class FixedCommandModule implements CommandModule {
} else if (effect == ParticleEffect.ITEM) { // Item material
StringUtil.copyPartialMatches(args[3], ParticleUtils.ITEM_MATERIALS_STRING, matches);
}
} else if (effect.hasProperty(ParticleProperty.COLORABLE_TRANSITION)) {
String[] dataArgs = Arrays.copyOfRange(args, 3, args.length);
InputParser inputParser = new InputParser(pplayer, dataArgs);
List<String> possibleValues = new ArrayList<>();
boolean firstComplete = inputParser.next(OrdinaryColor.class) == null;
int argsRemaining = inputParser.numRemaining();
int nextStart = 3 + dataArgs.length - argsRemaining;
if (firstComplete) {
if (args.length <= 4) {
possibleValues.add("<0-255> <0-255> <0-255>");
possibleValues.addAll(ParsableOrdinaryColor.COLOR_NAME_MAP.keySet());
possibleValues.add("<#hexCode>");
} else if (args.length <= 5 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[3].toLowerCase())) {
possibleValues.add("<0-255> <0-255>");
} else if (args.length <= 6 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[3].toLowerCase())) {
possibleValues.add("<0-255>");
}
} else if (inputParser.next(OrdinaryColor.class) == null) {
if (argsRemaining == 1) {
possibleValues.add("<0-255> <0-255> <0-255>");
possibleValues.addAll(ParsableOrdinaryColor.COLOR_NAME_MAP.keySet());
possibleValues.add("<#hexCode>");
} else if (argsRemaining == 2 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[nextStart].toLowerCase())) {
possibleValues.add("<0-255> <0-255>");
} else if (argsRemaining == 3 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[nextStart].toLowerCase())) {
possibleValues.add("<0-255>");
}
}
StringUtil.copyPartialMatches(args[args.length - 1], possibleValues, matches);
} else if (args.length == 4 && effect.hasProperty(ParticleProperty.VIBRATION)) {
return Arrays.asList("<duration>", "20", "40", "60");
}
}
}

View File

@ -9,8 +9,10 @@ import dev.esophose.playerparticles.particles.ParticleEffect;
import dev.esophose.playerparticles.particles.ParticleEffect.ParticleProperty;
import dev.esophose.playerparticles.particles.ParticleGroup;
import dev.esophose.playerparticles.particles.ParticlePair;
import dev.esophose.playerparticles.particles.data.ColorTransition;
import dev.esophose.playerparticles.particles.data.NoteColor;
import dev.esophose.playerparticles.particles.data.OrdinaryColor;
import dev.esophose.playerparticles.particles.data.Vibration;
import dev.esophose.playerparticles.styles.ParticleStyle;
import dev.esophose.playerparticles.util.ParticleUtils;
import dev.esophose.playerparticles.util.StringPlaceholders;
@ -100,6 +102,20 @@ public class UseCommandModule implements CommandModule {
}
primaryParticle.setItemMaterial(itemData);
}
} else if (effect.hasProperty(ParticleProperty.COLORABLE_TRANSITION)) {
ColorTransition colorTransitionData = inputParser.next(ColorTransition.class);
if (colorTransitionData == null) {
localeManager.sendMessage(pplayer, "data-invalid-color-transition");
return;
}
primaryParticle.setColorTransition(colorTransitionData);
} else if (effect.hasProperty(ParticleProperty.VIBRATION)) {
Vibration vibrationData = inputParser.next(Vibration.class);
if (vibrationData == null) {
localeManager.sendMessage(pplayer, "data-invalid-vibration");
return;
}
primaryParticle.setVibration(vibrationData);
}
break;
}
@ -152,20 +168,49 @@ public class UseCommandModule implements CommandModule {
} else { // Color data
if (args.length == 2) {
possibleValues.add("<0-255> <0-255> <0-255>");
possibleValues.addAll(ParsableOrdinaryColor.getColorNameMap().keySet());
possibleValues.addAll(ParsableOrdinaryColor.COLOR_NAME_MAP.keySet());
possibleValues.add("<#hexCode>");
} else if (args.length <= 3 && !ParsableOrdinaryColor.getColorNameMap().containsKey(args[1].toLowerCase())) {
} else if (args.length <= 3 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[1].toLowerCase())) {
possibleValues.add("<0-255> <0-255>");
} else if (args.length <= 4 && !ParsableOrdinaryColor.getColorNameMap().containsKey(args[1].toLowerCase())) {
} else if (args.length <= 4 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[1].toLowerCase())) {
possibleValues.add("<0-255>");
}
}
} else if (args.length == 3 && effect.hasProperty(ParticleProperty.REQUIRES_MATERIAL_DATA)) {
} else if (args.length == 2 && effect.hasProperty(ParticleProperty.REQUIRES_MATERIAL_DATA)) {
if (effect == ParticleEffect.BLOCK || effect == ParticleEffect.FALLING_DUST) { // Block material
possibleValues.addAll(ParticleUtils.BLOCK_MATERIALS_STRING);
} else if (effect == ParticleEffect.ITEM) { // Item material
possibleValues.addAll(ParticleUtils.ITEM_MATERIALS_STRING);
}
} else if (effect.hasProperty(ParticleProperty.COLORABLE_TRANSITION)) {
String[] dataArgs = Arrays.copyOfRange(args, 1, args.length);
InputParser inputParser = new InputParser(pplayer, dataArgs);
boolean firstComplete = inputParser.next(OrdinaryColor.class) == null;
int argsRemaining = inputParser.numRemaining();
int nextStart = 1 + dataArgs.length - argsRemaining;
if (firstComplete) {
if (args.length <= 2) {
possibleValues.add("<0-255> <0-255> <0-255>");
possibleValues.addAll(ParsableOrdinaryColor.COLOR_NAME_MAP.keySet());
possibleValues.add("<#hexCode>");
} else if (args.length <= 3 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[1].toLowerCase())) {
possibleValues.add("<0-255> <0-255>");
} else if (args.length <= 4 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[1].toLowerCase())) {
possibleValues.add("<0-255>");
}
} else if (inputParser.next(OrdinaryColor.class) == null) {
if (argsRemaining == 1) {
possibleValues.add("<0-255> <0-255> <0-255>");
possibleValues.addAll(ParsableOrdinaryColor.COLOR_NAME_MAP.keySet());
possibleValues.add("<#hexCode>");
} else if (argsRemaining == 2 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[nextStart].toLowerCase())) {
possibleValues.add("<0-255> <0-255>");
} else if (argsRemaining == 3 && !ParsableOrdinaryColor.COLOR_NAME_MAP.containsKey(args[nextStart].toLowerCase())) {
possibleValues.add("<0-255>");
}
}
} else if (args.length == 2 && effect.hasProperty(ParticleProperty.VIBRATION)) {
possibleValues.addAll(Arrays.asList("<duration>", "20", "40", "60"));
}
break;
}

View File

@ -0,0 +1,27 @@
package dev.esophose.playerparticles.database.migrations;
import dev.esophose.playerparticles.database.DataMigration;
import dev.esophose.playerparticles.database.DatabaseConnector;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
public class _2_Add_Data_Columns extends DataMigration {
public _2_Add_Data_Columns() {
super(2);
}
@Override
public void migrate(DatabaseConnector connector, Connection connection, String tablePrefix) throws SQLException {
try (Statement statement = connection.createStatement()) {
statement.addBatch("ALTER TABLE " + tablePrefix + "particle ADD COLUMN r_end SMALLINT DEFAULT 0");
statement.addBatch("ALTER TABLE " + tablePrefix + "particle ADD COLUMN g_end SMALLINT DEFAULT 0");
statement.addBatch("ALTER TABLE " + tablePrefix + "particle ADD COLUMN b_end SMALLINT DEFAULT 0");
statement.addBatch("ALTER TABLE " + tablePrefix + "particle ADD COLUMN duration INT DEFAULT 20");
statement.executeBatch();
}
}
}

View File

@ -8,7 +8,6 @@ import dev.esophose.playerparticles.manager.LocaleManager;
import dev.esophose.playerparticles.manager.ParticleGroupPresetManager;
import dev.esophose.playerparticles.manager.PermissionManager;
import dev.esophose.playerparticles.particles.PPlayer;
import dev.esophose.playerparticles.particles.ParticleEffect.ParticleProperty;
import dev.esophose.playerparticles.particles.ParticleGroup;
import dev.esophose.playerparticles.particles.ParticlePair;
import dev.esophose.playerparticles.util.ParticleUtils;
@ -121,7 +120,7 @@ public class GuiInventoryDefault extends GuiInventory {
final ParticlePair editingParticle = pplayer.getPrimaryParticle();
boolean canEditPrimaryStyleAndData = pplayer.getActiveParticle(1) != null;
boolean doesEffectUseData = editingParticle.getEffect().hasProperty(ParticleProperty.COLORABLE) || editingParticle.getEffect().hasProperty(ParticleProperty.REQUIRES_MATERIAL_DATA);
boolean doesEffectUseData = editingParticle.getEffect().hasProperties();
// Edit Primary Effect
GuiActionButton editPrimaryEffect = new GuiActionButton(
@ -217,7 +216,7 @@ public class GuiInventoryDefault extends GuiInventory {
List<Runnable> callbacks = new ArrayList<>();
callbacks.add(() -> guiManager.transition(new GuiInventoryDefault(pplayer)));
callbacks.add(() -> guiManager.transition(new GuiInventoryEditData(pplayer, editingParticle, 1, callbacks, 1)));
callbacks.add(() -> guiManager.transition(new GuiInventoryEditData(pplayer, editingParticle, 1, callbacks, 1, null)));
callbacks.add(() -> {
ParticleGroup group = pplayer.getActiveParticleGroup();
for (ParticlePair particle : group.getParticles().values()) {

View File

@ -8,8 +8,10 @@ import dev.esophose.playerparticles.particles.PPlayer;
import dev.esophose.playerparticles.particles.ParticleEffect;
import dev.esophose.playerparticles.particles.ParticleEffect.ParticleProperty;
import dev.esophose.playerparticles.particles.ParticlePair;
import dev.esophose.playerparticles.particles.data.ColorTransition;
import dev.esophose.playerparticles.particles.data.NoteColor;
import dev.esophose.playerparticles.particles.data.OrdinaryColor;
import dev.esophose.playerparticles.particles.data.Vibration;
import dev.esophose.playerparticles.util.NMSUtil;
import dev.esophose.playerparticles.util.ParticleUtils;
import dev.esophose.playerparticles.util.StringPlaceholders;
@ -20,6 +22,9 @@ import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.block.data.type.Light;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BlockDataMeta;
@SuppressWarnings("deprecation")
public class GuiInventoryEditData extends GuiInventory {
@ -118,7 +123,7 @@ public class GuiInventoryEditData extends GuiInventory {
};
}
public GuiInventoryEditData(PPlayer pplayer, ParticlePair editingParticle, int pageNumber, List<Runnable> callbackList, int callbackListPosition) {
public GuiInventoryEditData(PPlayer pplayer, ParticlePair editingParticle, int pageNumber, List<Runnable> callbackList, int callbackListPosition, OrdinaryColor startColor) {
super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, PlayerParticles.getInstance().getManager(LocaleManager.class).getLocaleMessage("gui-select-data")));
LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class);
@ -138,6 +143,10 @@ public class GuiInventoryEditData extends GuiInventory {
} else { // Block data
this.populateBlockData(editingParticle, pageNumber, callbackList, callbackListPosition);
}
} else if (pe.hasProperty(ParticleProperty.COLORABLE_TRANSITION)) {
this.populateColorTransitionData(editingParticle, callbackList, callbackListPosition, startColor);
} else if (pe.hasProperty(ParticleProperty.VIBRATION)) {
this.populateVibrationData(editingParticle, callbackList, callbackListPosition);
}
// Back Button
@ -198,7 +207,7 @@ public class GuiInventoryEditData extends GuiInventory {
});
this.actionButtons.add(setRainbowColorButton);
// Rainbow Color Data Button
// Random Color Data Button
List<ColorData> randomizedColorsList = Arrays.asList(colorMapping.clone());
Collections.shuffle(randomizedColorsList);
ColorData[] randomizedColors = new ColorData[randomizedColorsList.size()];
@ -294,7 +303,7 @@ public class GuiInventoryEditData extends GuiInventory {
GuiIcon.PREVIOUS_PAGE.get(),
localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-previous-page-button", StringPlaceholders.builder("start", pageNumber - 1).addPlaceholder("end", maxPages).build()),
new String[]{},
(button, isShiftClick) -> guiManager.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber - 1, callbackList, callbackListPosition)));
(button, isShiftClick) -> guiManager.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber - 1, callbackList, callbackListPosition, null)));
this.actionButtons.add(previousPageButton);
}
@ -305,7 +314,7 @@ public class GuiInventoryEditData extends GuiInventory {
GuiIcon.NEXT_PAGE.get(),
localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-next-page-button", StringPlaceholders.builder("start", pageNumber + 1).addPlaceholder("end", maxPages).build()),
new String[]{},
(button, isShiftClick) -> guiManager.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber + 1, callbackList, callbackListPosition)));
(button, isShiftClick) -> guiManager.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber + 1, callbackList, callbackListPosition, null)));
this.actionButtons.add(nextPageButton);
}
}
@ -358,7 +367,7 @@ public class GuiInventoryEditData extends GuiInventory {
GuiIcon.PREVIOUS_PAGE.get(),
localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-previous-page-button", StringPlaceholders.builder("start", pageNumber - 1).addPlaceholder("end", maxPages).build()),
new String[]{},
(button, isShiftClick) -> guiManager.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber - 1, callbackList, callbackListPosition)));
(button, isShiftClick) -> guiManager.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber - 1, callbackList, callbackListPosition, null)));
this.actionButtons.add(previousPageButton);
}
@ -369,7 +378,7 @@ public class GuiInventoryEditData extends GuiInventory {
GuiIcon.NEXT_PAGE.get(),
localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-next-page-button", StringPlaceholders.builder("start", pageNumber + 1).addPlaceholder("end", maxPages).build()),
new String[]{},
(button, isShiftClick) -> guiManager.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber + 1, callbackList, callbackListPosition)));
(button, isShiftClick) -> guiManager.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber + 1, callbackList, callbackListPosition, null)));
this.actionButtons.add(nextPageButton);
}
}
@ -422,7 +431,7 @@ public class GuiInventoryEditData extends GuiInventory {
GuiIcon.PREVIOUS_PAGE.get(),
localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-previous-page-button", StringPlaceholders.builder("start", pageNumber - 1).addPlaceholder("end", maxPages).build()),
new String[]{},
(button, isShiftClick) -> guiManager.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber - 1, callbackList, callbackListPosition)));
(button, isShiftClick) -> guiManager.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber - 1, callbackList, callbackListPosition, null)));
this.actionButtons.add(previousPageButton);
}
@ -433,19 +442,142 @@ public class GuiInventoryEditData extends GuiInventory {
GuiIcon.NEXT_PAGE.get(),
localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-next-page-button", StringPlaceholders.builder("start", pageNumber + 1).addPlaceholder("end", maxPages).build()),
new String[]{},
(button, isShiftClick) -> guiManager.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber + 1, callbackList, callbackListPosition)));
(button, isShiftClick) -> guiManager.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber + 1, callbackList, callbackListPosition, null)));
this.actionButtons.add(nextPageButton);
}
}
/**
* Populates the Inventory with available color transition data options.
* This is a copy of the Color data options, but it will be displayed twice.
*
* @param editingParticle The ParticlePair that's being edited
* @param callbackList The List of GuiInventoryEditFinishedCallbacks
* @param callbackListPosition The index of the callbackList we're currently at
* @param startColor The start color of the color transition, will be null if no start color has been selected yet
*/
private void populateColorTransitionData(ParticlePair editingParticle, List<Runnable> callbackList, int callbackListPosition, OrdinaryColor startColor) {
LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class);
int index = 10;
int nextWrap = 17;
for (ColorData colorData : colorMapping) {
String formattedDisplayColor = ChatColor.RED.toString() + colorData.getOrdinaryColor().getRed() + " " + ChatColor.GREEN + colorData.getOrdinaryColor().getGreen() + " " + ChatColor.AQUA + colorData.getOrdinaryColor().getBlue();
// Color Data Buttons
GuiActionButton setColorButton = new GuiActionButton(
index,
colorData,
colorData.getName(),
new String[]{localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-select-data-description", StringPlaceholders.single("data", formattedDisplayColor))},
(button, isShiftClick) -> {
if (startColor == null) {
PlayerParticles.getInstance().getManager(GuiManager.class).transition(new GuiInventoryEditData(this.pplayer, editingParticle, 1, callbackList, callbackListPosition, colorData.getOrdinaryColor()));
} else {
editingParticle.setColorTransition(new ColorTransition(startColor, colorData.getOrdinaryColor()));
callbackList.get(callbackListPosition + 1).run();
}
});
this.actionButtons.add(setColorButton);
index++;
if (index == nextWrap) { // Loop around border
nextWrap += 9;
index += 2;
}
}
// Rainbow Color Data Button
GuiActionButton setRainbowColorButton = new GuiActionButton(
39,
rainbowColorMapping,
localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("rainbow"),
new String[]{localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-select-data-description", StringPlaceholders.single("data", localeManager.getLocaleMessage("rainbow")))},
(button, isShiftClick) -> {
if (startColor == null) {
PlayerParticles.getInstance().getManager(GuiManager.class).transition(new GuiInventoryEditData(this.pplayer, editingParticle, 1, callbackList, callbackListPosition, OrdinaryColor.RAINBOW));
} else {
editingParticle.setColorTransition(new ColorTransition(startColor, OrdinaryColor.RAINBOW));
callbackList.get(callbackListPosition + 1).run();
}
});
this.actionButtons.add(setRainbowColorButton);
// Random Color Data Button
List<ColorData> randomizedColorsList = Arrays.asList(colorMapping.clone());
Collections.shuffle(randomizedColorsList);
ColorData[] randomizedColors = new ColorData[randomizedColorsList.size()];
randomizedColors = randomizedColorsList.toArray(randomizedColors);
GuiActionButton setRandomColorButton = new GuiActionButton(41,
randomizedColors,
localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("random"),
new String[]{localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-select-data-description", StringPlaceholders.single("data", localeManager.getLocaleMessage("random")))},
(button, isShiftClick) -> {
if (startColor == null) {
PlayerParticles.getInstance().getManager(GuiManager.class).transition(new GuiInventoryEditData(this.pplayer, editingParticle, 1, callbackList, callbackListPosition, OrdinaryColor.RANDOM));
} else {
editingParticle.setColorTransition(new ColorTransition(startColor, OrdinaryColor.RANDOM));
callbackList.get(callbackListPosition + 1).run();
}
});
this.actionButtons.add(setRandomColorButton);
// Which particle are we selecting?
// Display a light with either the number 1 or 2
ItemStack light = new ItemStack(Material.LIGHT);
BlockDataMeta blockDataMeta = (BlockDataMeta) light.getItemMeta();
if (blockDataMeta != null) {
Light lightData = (Light) Material.LIGHT.createBlockData();
lightData.setLevel(startColor == null ? 1 : 2);
blockDataMeta.setBlockData(lightData);
blockDataMeta.setDisplayName(localeManager.getLocaleMessage("gui-select-data-color-transition-" + (startColor == null ? "start" : "end")));
}
light.setItemMeta(blockDataMeta);
this.inventory.setItem(4, light);
}
/**
* Populates the Inventory with available vibration data options
*
* @param editingParticle The ParticlePair that's being edited
* @param callbackList The List of GuiInventoryEditFinishedCallbacks
* @param callbackListPosition The index of the callbackList we're currently at
*/
private void populateVibrationData(ParticlePair editingParticle, List<Runnable> callbackList, int callbackListPosition) {
LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class);
int slot = 21;
for (int i = 1; i <= 6; i++) {
int vibration = i * 10;
String formattedDisplayName = localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("gui-select-data-vibration", StringPlaceholders.single("ticks", vibration));
String formattedDescription = localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-select-data-description", StringPlaceholders.single("data", localeManager.getLocaleMessage("gui-select-data-vibration", StringPlaceholders.single("ticks", vibration))));
// Vibration Buttons
GuiActionButton setColorButton = new GuiActionButton(
slot,
Material.SCULK_SENSOR,
formattedDisplayName,
new String[]{formattedDescription},
(button, isShiftClick) -> {
editingParticle.setVibration(new Vibration(vibration));
callbackList.get(callbackListPosition + 1).run();
});
this.actionButtons.add(setColorButton);
if (slot++ == 23) // Loop around
slot = 30;
}
}
/**
* A data class used for storing information about the color data
*/
protected static class ColorData {
private DyeColor dyeColor;
private Material material;
private OrdinaryColor ordinaryColor;
private String nameKey;
private final DyeColor dyeColor;
private final Material material;
private final OrdinaryColor ordinaryColor;
private final String nameKey;
public ColorData(DyeColor dyeColor, Material material, OrdinaryColor ordinaryColor, String nameKey) {
this.dyeColor = dyeColor;

View File

@ -6,7 +6,6 @@ import dev.esophose.playerparticles.manager.ConfigurationManager.GuiIcon;
import dev.esophose.playerparticles.manager.GuiManager;
import dev.esophose.playerparticles.manager.LocaleManager;
import dev.esophose.playerparticles.particles.PPlayer;
import dev.esophose.playerparticles.particles.ParticleEffect.ParticleProperty;
import dev.esophose.playerparticles.particles.ParticleGroup;
import dev.esophose.playerparticles.particles.ParticlePair;
import dev.esophose.playerparticles.util.StringPlaceholders;
@ -93,7 +92,7 @@ public class GuiInventoryEditParticle extends GuiInventory {
this.actionButtons.add(editStyleButton);
// Edit Data Button
boolean usesData = editingParticle.getEffect().hasProperty(ParticleProperty.COLORABLE) || editingParticle.getEffect().hasProperty(ParticleProperty.REQUIRES_MATERIAL_DATA);
boolean usesData = editingParticle.getEffect().hasProperties();
GuiActionButton editDataButton = new GuiActionButton(42,
GuiIcon.EDIT_DATA.get(),
localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("gui-edit-data"),
@ -103,7 +102,7 @@ public class GuiInventoryEditParticle extends GuiInventory {
if (usesData) {
List<Runnable> callbacks = new ArrayList<>();
callbacks.add(() -> guiManager.transition(new GuiInventoryEditParticle(pplayer, editingParticle)));
callbacks.add(() -> guiManager.transition(new GuiInventoryEditData(pplayer, editingParticle, 1, callbacks, 1)));
callbacks.add(() -> guiManager.transition(new GuiInventoryEditData(pplayer, editingParticle, 1, callbacks, 1, null)));
callbacks.add(() -> {
ParticleGroup group = pplayer.getActiveParticleGroup();
for (ParticlePair particle : group.getParticles().values()) {

View File

@ -7,7 +7,6 @@ import dev.esophose.playerparticles.manager.GuiManager;
import dev.esophose.playerparticles.manager.LocaleManager;
import dev.esophose.playerparticles.manager.PermissionManager;
import dev.esophose.playerparticles.particles.PPlayer;
import dev.esophose.playerparticles.particles.ParticleEffect.ParticleProperty;
import dev.esophose.playerparticles.particles.ParticleGroup;
import dev.esophose.playerparticles.particles.ParticlePair;
import dev.esophose.playerparticles.util.ParticleUtils;
@ -89,8 +88,8 @@ public class GuiInventoryManageParticles extends GuiInventory {
callbacks.add(() -> guiManager.transition(new GuiInventoryEditEffect(pplayer, editingParticle, 1, callbacks, 1)));
callbacks.add(() -> guiManager.transition(new GuiInventoryEditStyle(pplayer, editingParticle, 1, callbacks, 2)));
callbacks.add(() -> {
if (editingParticle.getEffect().hasProperty(ParticleProperty.COLORABLE) || editingParticle.getEffect().hasProperty(ParticleProperty.REQUIRES_MATERIAL_DATA)) {
guiManager.transition(new GuiInventoryEditData(pplayer, editingParticle, 1, callbacks, 3));
if (editingParticle.getEffect().hasProperties()) {
guiManager.transition(new GuiInventoryEditData(pplayer, editingParticle, 1, callbacks, 3, null));
} else {
callbacks.get(4).run();
}

View File

@ -154,12 +154,16 @@ public class EnglishLocale implements Locale {
this.put("data-usage-none", "&eThe effect &b%effect% &edoes not use any data!");
this.put("data-usage-block", "&eThe effect &b%effect% &erequires &bblock &edata! &bFormat: <blockName>");
this.put("data-usage-item", "&eThe effect &b%effect% &erequires &bitem &edata! &bFormat: <itemName>");
this.put("data-usage-color", "&eThe effect &b%effect% &erequires &bcolor &edata! &bFormat: <<0-255> <0-255> <0-255>>|<rainbow>|<random>");
this.put("data-usage-note", "&eThe effect &b%effect% &erequires &bnote &edata! &bFormat: <0-24>|<rainbow>|<random>");
this.put("data-usage-color", "&eThe effect &b%effect% &erequires &bcolor &edata! &bFormat: <<0-255> <0-255> <0-255>>|<&brainbow>|<random>");
this.put("data-usage-note", "&eThe effect &b%effect% &erequires &bnote &edata! &bFormat: <0-24>|<&brainbow>|<random>");
this.put("data-usage-color-transition", "&eThe effect &b%effect% &erequires &bcolor transition &edata! &bFormat: <<0-255> <0-255> <0-255>>|<&brainbow>|<random> <<0-255> <0-255> <0-255>>|<&brainbow>|<random>");
this.put("data-usage-vibration", "&eThe effect &b%effect% &erequires &bvibration &edata! &bFormat: <duration>");
this.put("data-invalid-block", "&cThe &bblock &cdata you entered is invalid! &bFormat: <blockName>");
this.put("data-invalid-item", "&cThe &bitem &cdata you entered is invalid! &bFormat: <itemName>");
this.put("data-invalid-color", "&cThe &bcolor &cdata you entered is invalid! &bFormat: <<0-255> <0-255> <0-255>>|<rainbow>|<random>");
this.put("data-invalid-note", "&cThe &bnote &cdata you entered is invalid! &bFormat: <0-24>|<rainbow>|<random>");
this.put("data-invalid-color", "&cThe &bcolor &cdata you entered is invalid! &bFormat: <<0-255> <0-255> <0-255>>|<&brainbow>|<random>");
this.put("data-invalid-note", "&cThe &bnote &cdata you entered is invalid! &bFormat: <0-24>|<&brainbow>|<random>");
this.put("data-invalid-color-transition", "&cThe &bcolor transition &cdata you entered is invalid! &bFormat: <<0-255> <0-255> <0-255>>|<&brainbow>|<random> <<0-255> <0-255> <0-255>>|<&brainbow>|<random>");
this.put("data-invalid-vibration", "&cThe &bvibration &cdata you entered is invalid! &bFormat: <duration>");
this.put("data-invalid-material-not-item", "&cThe &bitem &cmaterial &b%material% &cyou entered is not an item!");
this.put("data-invalid-material-not-block", "&cThe &bblock &cmaterial &b%material% &cyou entered is not a block!");
this.put("data-invalid-material-item", "&cThe &bitem &cmaterial &b%material% you entered does not exist!");
@ -325,25 +329,28 @@ public class EnglishLocale implements Locale {
this.put("gui-select-style-description", "Sets the particle style to &b%style%");
this.put("gui-select-data", "Select Particle Data");
this.put("gui-select-data-description", "Sets the particle data to &b%data%");
this.put("gui-select-data-note", "note #%note%");
this.put("gui-select-data-note", "Note #%note%");
this.put("gui-select-data-color-transition-start", "&eSelect the &bstart &ecolor");
this.put("gui-select-data-color-transition-end", "&eSelect the &bend &ecolor");
this.put("gui-select-data-vibration", "&b%ticks% &eticks");
this.put("#38", "GUI Color Name Messages");
this.put("gui-edit-data-color-red", "&cred");
this.put("gui-edit-data-color-orange", "&6orange");
this.put("gui-edit-data-color-yellow", "&eyellow");
this.put("gui-edit-data-color-lime-green", "&alime green");
this.put("gui-edit-data-color-green", "&2green");
this.put("gui-edit-data-color-blue", "&1blue");
this.put("gui-edit-data-color-cyan", "&3cyan");
this.put("gui-edit-data-color-light-blue", "&blight blue");
this.put("gui-edit-data-color-purple", "&5purple");
this.put("gui-edit-data-color-magenta", "&dmagenta");
this.put("gui-edit-data-color-pink", "&dpink");
this.put("gui-edit-data-color-brown", "&6brown");
this.put("gui-edit-data-color-black", "&8black");
this.put("gui-edit-data-color-gray", "&8gray");
this.put("gui-edit-data-color-light-gray", "&7light gray");
this.put("gui-edit-data-color-white", "&fwhite");
this.put("gui-edit-data-color-red", "#ff0000Red");
this.put("gui-edit-data-color-orange", "#ff8c00Orange");
this.put("gui-edit-data-color-yellow", "#ffff00Yellow");
this.put("gui-edit-data-color-lime-green", "#32cd32Lime Green");
this.put("gui-edit-data-color-green", "#008000Green");
this.put("gui-edit-data-color-blue", "#0000ffBlue");
this.put("gui-edit-data-color-cyan", "#008b8bCyan");
this.put("gui-edit-data-color-light-blue", "#add8e6Light Blue");
this.put("gui-edit-data-color-purple", "#8a2be2Purple");
this.put("gui-edit-data-color-magenta", "#ca1f7bMagenta");
this.put("gui-edit-data-color-pink", "#ffb6c1Pink");
this.put("gui-edit-data-color-brown", "#8b4513Brown");
this.put("gui-edit-data-color-black", "#000000Black");
this.put("gui-edit-data-color-gray", "#808080Gray");
this.put("gui-edit-data-color-light-gray", "#c0c0c0Light Gray");
this.put("gui-edit-data-color-white", "#ffffffWhite");
}};
}

View File

@ -154,16 +154,20 @@ public class FrenchLocale implements Locale {
this.put("data-usage-none", "&eL'effet &b%effect% &en'est pas paramétrable.");
this.put("data-usage-block", "&eL'effet &b%effect% &erequière l'ID du bloc ! &bFormat: <blockName>");
this.put("data-usage-item", "&eL'effet &b%effect% &erequière l'ID de l'item ! &bFormat: <itemName>");
this.put("data-usage-color", "&eL'effet &b%effect% &erequière l'ID de la couleur ! &bFormat: <<0-255> <0-255> <0-255>>|<rainbow>|<random>");
this.put("data-usage-note", "&eL'effet&b%effect% &erequière l'ID de la note ! &bFormat: <0-24>|<rainbow>|<random>");
this.put("data-usage-color", "&eL'effet &b%effect% &erequière l'ID de la couleur ! &bFormat: <<0-255> <0-255> <0-255>>|<&brainbow>|<random>");
this.put("data-usage-note", "&eL'effet &b%effect% &erequière l'ID de la note ! &bFormat: <0-24>|<&brainbow>|<random>");
this.put("data-usage-color-transition", "&eL'effet &b%effect% &erequière l'ID de transition de couleur ! &bFormat: <<0-255> <0-255> <0-255>>|<&brainbow>|<random> <<0-255> <0-255> <0-255>>|<&brainbow>|<random>");
this.put("data-usage-vibration", "&eL'effet &b%effect% &erequière l'ID de la vibration ! &bFormat: <duration>");
this.put("data-invalid-block", "&cL'ID du bloc que vous avez rentré n'est pas valide ! &bFormat: <blockName>");
this.put("data-invalid-item", "&cL'ID de l'item que vous avez rentré n'est pas valide ! &bFormat: <itemName>");
this.put("data-invalid-color", "&cL'ID de la couleur que vous avez rentré n'est pas valide ! &bFormat: <<0-255> <0-255> <0-255>>|<rainbow>|<random>");
this.put("data-invalid-note", "&cL'ID du bloc que vous avez rentré n'est pas valide ! &bFormat: <0-24>|<rainbow>|<random>");
this.put("data-invalid-color", "&cL'ID de la couleur que vous avez rentré n'est pas valide ! &bFormat: <<0-255> <0-255> <0-255>>|<&brainbow>|<random>");
this.put("data-invalid-note", "&cL'ID de la note que vous avez rentré n'est pas valide ! &bFormat: <0-24>|<&brainbow>|<random>");
this.put("data-invalid-color-transition", "&cL'ID de transition de couleur que vous avez rentré n'est pas valide ! &bFormat: <<0-255> <0-255> <0-255>>|<&brainbow>|<random> <<0-255> <0-255> <0-255>>|<&brainbow>|<random>");
this.put("data-invalid-vibration", "&cL'ID de la vibration que vous avez rentré n'est pas valide ! &bFormat: <duration>");
this.put("data-invalid-material-not-item", "&cL'ID &b%material% &cne correspond pas à un item !");
this.put("data-invalid-material-not-block", "&cL'ID &b%material% &cne correspond pas à un bloc !");
this.put("data-invalid-material-item", "&cL'ID &b%material% n'existe pas !");
this.put("data-invalid-material-block", "&cL'ID&b%material% n'existe pas !");
this.put("data-invalid-material-block", "&cL'ID &b%material% n'existe pas !");
this.put("#16", "World Messages");
this.put("disabled-worlds", "&eLes particules sont désactivées dans ces mondes : &b%worlds%");
@ -325,25 +329,28 @@ public class FrenchLocale implements Locale {
this.put("gui-select-style-description", "Mets le style de la particule à &b%style%");
this.put("gui-select-data", "Sélectionnez les paramètres");
this.put("gui-select-data-description", "Mets les paramètres de la particule à &b%data%");
this.put("gui-select-data-note", "note #%note%");
this.put("gui-select-data-note", "Note #%note%");
this.put("gui-select-data-color-transition-start", "&eSélectionnez la couleur de &bdépart");
this.put("gui-select-data-color-transition-end", "&eSélectionnez la couleur de &bfin");
this.put("gui-select-data-vibration", "&b%ticks% &eticks");
this.put("#38", "GUI Color Name Messages");
this.put("gui-edit-data-color-red", "&crouge");
this.put("gui-edit-data-color-orange", "&6orange");
this.put("gui-edit-data-color-yellow", "&ejaune");
this.put("gui-edit-data-color-lime-green", "&avert citron");
this.put("gui-edit-data-color-green", "&2vert");
this.put("gui-edit-data-color-blue", "&1bleu");
this.put("gui-edit-data-color-cyan", "&3cyan");
this.put("gui-edit-data-color-light-blue", "&bbleu clair");
this.put("gui-edit-data-color-purple", "&5mauve");
this.put("gui-edit-data-color-magenta", "&dmagenta");
this.put("gui-edit-data-color-pink", "&drose");
this.put("gui-edit-data-color-brown", "&6brun");
this.put("gui-edit-data-color-black", "&8noir");
this.put("gui-edit-data-color-gray", "&8gris");
this.put("gui-edit-data-color-light-gray", "&7gris clair");
this.put("gui-edit-data-color-white", "&fblanc");
this.put("gui-edit-data-color-red", "#ff0000Rouge");
this.put("gui-edit-data-color-orange", "#ff8c00Orange");
this.put("gui-edit-data-color-yellow", "#ffff00Jaune");
this.put("gui-edit-data-color-lime-green", "#32cd32Vert Citron");
this.put("gui-edit-data-color-green", "#008000Vert");
this.put("gui-edit-data-color-blue", "#0000ffBleu");
this.put("gui-edit-data-color-cyan", "#008b8bCyan");
this.put("gui-edit-data-color-light-blue", "#add8e6Bleu Clair");
this.put("gui-edit-data-color-purple", "#8a2be2Mauve");
this.put("gui-edit-data-color-magenta", "#ca1f7bMagenta");
this.put("gui-edit-data-color-pink", "#ffb6c1Rose");
this.put("gui-edit-data-color-brown", "#8b4513Brun");
this.put("gui-edit-data-color-black", "#000000Noir");
this.put("gui-edit-data-color-gray", "#808080Gris");
this.put("gui-edit-data-color-light-gray", "#c0c0c0Gris Clair");
this.put("gui-edit-data-color-white", "#ffffffBlanc");
}};
}
}

View File

@ -154,12 +154,16 @@ public class GermanLocale implements Locale {
this.put("data-usage-none", "&eDer Effekt &b%effect% &everwendet keine Daten!");
this.put("data-usage-block", "&eFür den Effekt &b%effect% &ewerden &bBlockdaten &ebenötigt! &bFormat: <blockName>");
this.put("data-usage-item", "&eFür den Effekt &b%effect% &esind &bItem &eDaten erforderlich! &bFormat: <itemName>");
this.put("data-usage-color", "&eFür den Effekt &b%effect% &esind &bFarbdaten &eerforderlich! &bFormat: <<0-255> <0-255> <0-255>>|<rainbow>|<random>");
this.put("data-usage-note", "&eFür den Effekt &b%effect% &esind &bAnmeldedaten &eerforderlich! &bFormat: <0-24>|<rainbow>|<random>");
this.put("data-usage-color", "&eFür den Effekt &b%effect% &esind &bFarbdaten &eerforderlich! &bFormat: <<0-255> <0-255> <0-255>>|<&brainbow>|<random>");
this.put("data-usage-note", "&eFür den Effekt &b%effect% &esind &bAnmeldedaten &eerforderlich! &bFormat: <0-24>|<&brainbow>|<random>");
this.put("data-usage-color-transition", "&eFür den Effekt &b%effect% &esind &bFarbübergang &eerforderlich! &bFormat: <<0-255> <0-255> <0-255>>|<&brainbow>|<random> <<0-255> <0-255> <0-255>>|<&brainbow>|<random>");
this.put("data-usage-vibration", "&eFür den Effekt &b%effect% &esind &bVibration &eerforderlich! &bFormat: <duration>");
this.put("data-invalid-block", "&cDie von Ihnen eingegebenen &bBlock &cDaten sind ungültig! &bFormat: <blockName>");
this.put("data-invalid-item", "&cDie von Ihnen eingegebenen &bItem &cDaten sind ungültig! &bFormat: <itemName>");
this.put("data-invalid-color", "&cDie von Ihnen eingegebenen &bFarbdaten &csind ungültig! &bFormat: <<0-255> <0-255> <0-255>>|<rainbow>|<random>");
this.put("data-invalid-note", "&cDie von Ihnen eingegebenen &bNotizdaten &csind ungültig! &bFormat: <0-24>|<rainbow>|<random>");
this.put("data-invalid-color", "&cDie von Ihnen eingegebenen &bFarbdaten &csind ungültig! &bFormat: <<0-255> <0-255> <0-255>>|<&brainbow>|<random>");
this.put("data-invalid-note", "&cDie von Ihnen eingegebenen &bNotizdaten &csind ungültig! &bFormat: <0-24>|<&brainbow>|<random>");
this.put("data-invalid-color-transition", "&cDie von Ihnen eingegebenen &bFarbübergang &csind ungültig! &bFormat: <<0-255> <0-255> <0-255>>|<&brainbow>|<random> <<0-255> <0-255> <0-255>>|<&brainbow>|<random>");
this.put("data-invalid-vibration", "&cDie von Ihnen eingegebenen &bVibration &csind ungültig! &bFormat: <duration>");
this.put("data-invalid-material-not-item", "&cDas von Ihnen eingegebene &bItem &cMaterial &b%material% &cist kein Item!");
this.put("data-invalid-material-not-block", "&cDas von Ihnen eingegebene &bBlock &cMaterial &b%material% &cist kein Block!");
this.put("data-invalid-material-item", "&cDas von Ihnen eingegebene &bItem &cMaterial &b%material% &cexistiert nicht!");
@ -326,24 +330,27 @@ public class GermanLocale implements Locale {
this.put("gui-select-data", "Wählen Sie Partikeldaten");
this.put("gui-select-data-description", "Setzt die Partikeldaten auf &b%data%");
this.put("gui-select-data-note", "Hinweis #%note%");
this.put("gui-select-data-color-transition-start", "&eWählen Sie die &bStartfarbe");
this.put("gui-select-data-color-transition-end", "&eWählen Sie die &bEndfarbe");
this.put("gui-select-data-vibration", "&b%ticks% &eticks");
this.put("#38", "GUI Color Name Messages");
this.put("gui-edit-data-color-red", "Rot");
this.put("gui-edit-data-color-orange", "Orange");
this.put("gui-edit-data-color-yellow", "Gelb");
this.put("gui-edit-data-color-lime-green", "Limetten-Grün");
this.put("gui-edit-data-color-green", "Grün");
this.put("gui-edit-data-color-blue", "Blau");
this.put("gui-edit-data-color-cyan", "Cyan");
this.put("gui-edit-data-color-light-blue", "Hellblau");
this.put("gui-edit-data-color-purple", "Lila");
this.put("gui-edit-data-color-magenta", "Magenta");
this.put("gui-edit-data-color-pink", "Pink");
this.put("gui-edit-data-color-brown", "Braun");
this.put("gui-edit-data-color-black", "Schwarz");
this.put("gui-edit-data-color-gray", "Grau");
this.put("gui-edit-data-color-light-gray", "Hellgrau");
this.put("gui-edit-data-color-white", "Weiss");
this.put("gui-edit-data-color-red", "#ff0000Rot");
this.put("gui-edit-data-color-orange", "#ff8c00Orange");
this.put("gui-edit-data-color-yellow", "#ffff00Gelb");
this.put("gui-edit-data-color-lime-green", "#32cd32Limetten-Grün");
this.put("gui-edit-data-color-green", "#008000Grün");
this.put("gui-edit-data-color-blue", "#0000ffBlau");
this.put("gui-edit-data-color-cyan", "#008b8bCyan");
this.put("gui-edit-data-color-light-blue", "#add8e6Hellblau");
this.put("gui-edit-data-color-purple", "#8a2be2Lila");
this.put("gui-edit-data-color-magenta", "#ca1f7bMagenta");
this.put("gui-edit-data-color-pink", "#ffb6c1Pink");
this.put("gui-edit-data-color-brown", "#8b4513Braun");
this.put("gui-edit-data-color-black", "#000000Schwarz");
this.put("gui-edit-data-color-gray", "#808080Grau");
this.put("gui-edit-data-color-light-gray", "#c0c0c0Hellgrau");
this.put("gui-edit-data-color-white", "#ffffffWeiss");
}};
}
}

View File

@ -154,12 +154,16 @@ public class RussianLocale implements Locale {
this.put("data-usage-none", "&eЭффект &b%effect% &eне использует какие-либо данные!");
this.put("data-usage-block", "&eЭффект &b%effect% &eзапрашивает &bблок &eданных! &bФормат: <названиеБлока>");
this.put("data-usage-item", "&eЭффект &b%effect% &eзапрашивает &bпредмет &eданных! &bФормат: <названиеПредмета>");
this.put("data-usage-color", "&eЭффект &b%effect% &eзапрашивает &bцвет &eданных! &bФормат: <0-255> <0-255> <0-255>|<rainbow>|<random>");
this.put("data-usage-note", "&eЭффект &b%effect% &eзапрашивает &bноту &eданных! &bФормат: <0-24>|<rainbow>|<random>");
this.put("data-usage-color", "&eЭффект &b%effect% &eзапрашивает &bцвет &eданных! &bФормат: <0-255> <0-255> <0-255>|<&brainbow>|<random>");
this.put("data-usage-note", "&eЭффект &b%effect% &eзапрашивает &bноту &eданных! &bФормат: <0-24>|<&brainbow>|<random>");
this.put("data-usage-color-transition", "&eЭффект &b%effect% &eзапрашивает &bпереход цвета &eданных! &bФормат: <<0-255> <0-255> <0-255>>|<&brainbow>|<random> <<0-255> <0-255> <0-255>>|<&brainbow>|<random>");
this.put("data-usage-vibration", "&eЭффект &b%effect% &eзапрашивает &bвибрация &eданных! &bФормат: <продолжительность>");
this.put("data-invalid-block", "&bБлок &cданных, который Вы ввели, недействителен! &bФормат: <названиеБлока>");
this.put("data-invalid-item", "&bПредмет &cданных, который Вы ввели, недействителен! &bФормат: <названиеПредмета>");
this.put("data-invalid-color", "&bЦвет &cданных, который Вы ввели, недействителен! &bФормат: <0-255> <0-255> <0-255>|<rainbow>|<random>");
this.put("data-invalid-note", "&bНота &cданных, которую Вы ввели, недействительна! &bФормат: <0-24>|<rainbow>|<random>");
this.put("data-invalid-color", "&bЦвет &cданных, который Вы ввели, недействителен! &bФормат: <0-255> <0-255> <0-255>|<&brainbow>|<random>");
this.put("data-invalid-note", "&bНота &cданных, которую Вы ввели, недействительна! &bФормат: <0-24>|<&brainbow>|<random>");
this.put("data-invalid-color-transition", "&bпереход цвета &cданных, которую Вы ввели, недействительна! &bFormat: <<0-255> <0-255> <0-255>>|<&brainbow>|<random> <<0-255> <0-255> <0-255>>|<&brainbow>|<random>");
this.put("data-invalid-vibration", "&bвибрация &cданных, которую Вы ввели, недействительна! &bFormat: <duration>");
this.put("data-invalid-material-not-item", "&bМатериал &cпредмета&b%material%&c, который Вы ввели, не является предметом!");
this.put("data-invalid-material-not-block", "&bМатериал &cблока&b%material%&c, который Вы ввели, не является блоком!");
this.put("data-invalid-material-item", "&bМатериал &cпредмета&b%material%, который Вы ввели, не существует!");
@ -326,24 +330,27 @@ public class RussianLocale implements Locale {
this.put("gui-select-data", "Выбор данных частиц");
this.put("gui-select-data-description", "Выбрать данные для частиц &b%data%");
this.put("gui-select-data-note", "записка #%note%");
this.put("gui-select-data-color-transition-start", "&eВыберите &bначальный &eцвет");
this.put("gui-select-data-color-transition-end", "&eВыберите &bконечный &eцвет");
this.put("gui-select-data-vibration", "&b%ticks% &eticks");
this.put("#38", "GUI Color Name Messages");
this.put("gui-edit-data-color-red", "&cкрасный");
this.put("gui-edit-data-color-orange", "&6оранжевый");
this.put("gui-edit-data-color-yellow", "&eжелтый");
this.put("gui-edit-data-color-lime-green", "&aзеленый лайм");
this.put("gui-edit-data-color-green", "&2зеленый");
this.put("gui-edit-data-color-blue", "&1синий");
this.put("gui-edit-data-color-cyan", "&3циан");
this.put("gui-edit-data-color-light-blue", "&bсветло-синий");
this.put("gui-edit-data-color-purple", "&5фиолетовый");
this.put("gui-edit-data-color-magenta", "&dфуксин");
this.put("gui-edit-data-color-pink", "&dрозовый");
this.put("gui-edit-data-color-brown", "&6коричневый");
this.put("gui-edit-data-color-black", "&8черный");
this.put("gui-edit-data-color-gray", "&8серый");
this.put("gui-edit-data-color-light-gray", "&7светло-серый");
this.put("gui-edit-data-color-white", "&fбелый");
this.put("gui-edit-data-color-red", "#ff0000красный");
this.put("gui-edit-data-color-orange", "#ff8c00оранжевый");
this.put("gui-edit-data-color-yellow", "#ffff00желтый");
this.put("gui-edit-data-color-lime-green", "#32cd32зеленый лайм");
this.put("gui-edit-data-color-green", "#008000зеленый");
this.put("gui-edit-data-color-blue", "#0000ffсиний");
this.put("gui-edit-data-color-cyan", "#008b8bциан");
this.put("gui-edit-data-color-light-blue", "#add8e6светло-синий");
this.put("gui-edit-data-color-purple", "#8a2be2фиолетовый");
this.put("gui-edit-data-color-magenta", "#ca1f7bфуксин");
this.put("gui-edit-data-color-pink", "#ffb6c1розовый");
this.put("gui-edit-data-color-brown", "#8b4513коричневый");
this.put("gui-edit-data-color-black", "#000000черный");
this.put("gui-edit-data-color-gray", "#808080серый");
this.put("gui-edit-data-color-light-gray", "#c0c0c0светло-серый");
this.put("gui-edit-data-color-white", "#ffffffбелый");
}};
}
}

View File

@ -154,12 +154,16 @@ public class SimplifiedChineseLocale implements Locale {
this.put("data-usage-none", "&e粒子特效&b%effect%&e不使用任何数据!");
this.put("data-usage-block", "&e粒子特效&b%effect%&e需要设置&b方块&e数据! &b格式: <方块ID>");
this.put("data-usage-item", "&e粒子特效&b%effect%&e需要设置&b物品&e数据! &b格式: <物品ID>");
this.put("data-usage-color", "&e粒子特效&b%effect%&e需要设置&b颜色&e数据! &b格式: <<0-255> <0-255> <0-255>>|<rainbow>|<random>");
this.put("data-usage-note", "&e粒子特效&b%effect%&e需要设置&b音符&e数据! &b格式: <0-24>|<rainbow>|<random>");
this.put("data-usage-color", "&e粒子特效&b%effect%&e需要设置&b颜色&e数据! &b格式: <<0-255> <0-255> <0-255>>|<&brainbow>|<random>");
this.put("data-usage-note", "&e粒子特效&b%effect%&e需要设置&b音符&e数据! &b格式: <0-24>|<&brainbow>|<random>");
this.put("data-usage-color-transition", "&e粒子特效&b%effect%&e需要设置&b颜色过渡&e数据! &b格式: <<0-255> <0-255> <0-255>>|<&brainbow>|<random> <<0-255> <0-255> <0-255>>|<&brainbow>|<random>");
this.put("data-usage-vibration", "&e粒子特效&b%effect%&e需要设置&b振动&e数据! &b格式: <持续时间>");
this.put("data-invalid-block", "&c你输入的&b方块&c数据 无效! &b格式: <方块ID>");
this.put("data-invalid-item", "&c你输入的&b物品&c数据 无效! &b格式: <物品ID>");
this.put("data-invalid-color", "&c你输入的&b颜色&c数据 无效! &b格式: <<0-255> <0-255> <0-255>>|<rainbow>|<random>");
this.put("data-invalid-note", "&c你输入的&b音符&c数据 无效! &b格式: <0-24>|<rainbow>|<random>");
this.put("data-invalid-color", "&c你输入的&b颜色&c数据 无效! &b格式: <<0-255> <0-255> <0-255>>|<&brainbow>|<random>");
this.put("data-invalid-note", "&c你输入的&b音符&c数据 无效! &b格式: <0-24>|<&brainbow>|<random>");
this.put("data-invalid-color-transition", "&c你输入的&b颜色过渡&c数据 无效! &b格式: <<0-255> <0-255> <0-255>>|<&brainbow>|<random> <<0-255> <0-255> <0-255>>|<&brainbow>|<random>");
this.put("data-invalid-vibration", "&c你输入的&b振动&c数据 无效! &b格式: <duration>");
this.put("data-invalid-material-not-item", "&c你输入的&b物品&c材料名 &b%material%&c不是一件物品!");
this.put("data-invalid-material-not-block", "&c你输入的&b方块&c材料名&b%material%&c不是一个方块!");
this.put("data-invalid-material-item", "&c你输入的&b物品&c材料&b%material%不存在!");
@ -325,25 +329,28 @@ public class SimplifiedChineseLocale implements Locale {
this.put("gui-select-style-description", "将粒子风格设置为 &b%style%");
this.put("gui-select-data", "选择粒子数据");
this.put("gui-select-data-description", "将粒子数据设置为&b%data%");
this.put("gui-select-data-note", "note #%note%");
this.put("gui-select-data-note", "Note #%note%");
this.put("gui-select-data-color-transition-start", "&e选择起始颜色");
this.put("gui-select-data-color-transition-end", "&e选择末端颜色");
this.put("gui-select-data-vibration", "&b%ticks% &eticks");
this.put("#38", "GUI Color Name Messages");
this.put("gui-edit-data-color-red", "&c红色");
this.put("gui-edit-data-color-orange", "&6橙黄");
this.put("gui-edit-data-color-yellow", "&e黄色");
this.put("gui-edit-data-color-lime-green", "&a淡绿");
this.put("gui-edit-data-color-green", "&2绿色");
this.put("gui-edit-data-color-blue", "&1蓝色");
this.put("gui-edit-data-color-cyan", "&3青色");
this.put("gui-edit-data-color-light-blue", "&b淡蓝色");
this.put("gui-edit-data-color-purple", "&5紫色");
this.put("gui-edit-data-color-magenta", "&d洋红");
this.put("gui-edit-data-color-pink", "&d粉色");
this.put("gui-edit-data-color-brown", "&6棕色");
this.put("gui-edit-data-color-black", "&8黑色");
this.put("gui-edit-data-color-gray", "&8灰色");
this.put("gui-edit-data-color-light-gray", "&7淡灰");
this.put("gui-edit-data-color-white", "&f白色");
this.put("gui-edit-data-color-red", "#ff0000红色");
this.put("gui-edit-data-color-orange", "#ff8c00橙黄");
this.put("gui-edit-data-color-yellow", "#ffff00黄色");
this.put("gui-edit-data-color-lime-green", "#32cd32淡绿");
this.put("gui-edit-data-color-green", "#008000绿色");
this.put("gui-edit-data-color-blue", "#0000ff蓝色");
this.put("gui-edit-data-color-cyan", "#008b8b青色");
this.put("gui-edit-data-color-light-blue", "#add8e6淡蓝色");
this.put("gui-edit-data-color-purple", "#8a2be2紫色");
this.put("gui-edit-data-color-magenta", "#ca1f7b洋红");
this.put("gui-edit-data-color-pink", "#ffb6c1粉色");
this.put("gui-edit-data-color-brown", "#8b4513棕色");
this.put("gui-edit-data-color-black", "#000000黑色");
this.put("gui-edit-data-color-gray", "#808080灰色");
this.put("gui-edit-data-color-light-gray", "#c0c0c0淡灰");
this.put("gui-edit-data-color-white", "#ffffff白色");
}};
}

View File

@ -154,12 +154,16 @@ public class VietnameseLocale implements Locale {
this.put("data-usage-none", "&eHiệu ứng &b%effect% &ekhông sử dụng bất kì Dữ liệu nào!");
this.put("data-usage-block", "&eHiệu ứng &b%effect% &eyêu cầu dữ liệu &bblock ! &bĐịnh dạng: <blockName>");
this.put("data-usage-item", "&eHiệu ứng &b%effect% &eyêu cầu dữ liệu &bitem! &bĐịnh dạng: <itemName>");
this.put("data-usage-color", "&eHiệu ứng &b%effect% &eyêu cầu dữ liệu &bcolor! &bĐịnh dạng: <<0-255> <0-255> <0-255>>|<rainbow>|<random>");
this.put("data-usage-note", "&eHiệu ứng &b%effect% &eyêu cầu dữ liệu &bnote! &bĐịnh dạng: <0-24>|<rainbow>|<random>");
this.put("data-usage-color", "&eHiệu ứng &b%effect% &eyêu cầu dữ liệu &bcolor! &bĐịnh dạng: <<0-255> <0-255> <0-255>>|<&brainbow>|<random>");
this.put("data-usage-note", "&eHiệu ứng &b%effect% &eyêu cầu dữ liệu &bnote! &bĐịnh dạng: <0-24>|<&brainbow>|<random>");
this.put("data-usage-color-transition", "&eHiệu ứng &b%effect% &eyêu cầu dữ liệu &bcolor transition! &bĐịnh dạng: &bFormat: <<0-255> <0-255> <0-255>>|<&brainbow>|<random> <<0-255> <0-255> <0-255>>|<&brainbow>|<random>");
this.put("data-usage-vibration", "&eHiệu ứng &b%effect% &eyêu cầu dữ liệu &bvibration! &bĐịnh dạng: <duration>");
this.put("data-invalid-block", "&cDữ liệu &bblock &cbạn đã nhập không hợp lệ! &bĐịnh dạng: <blockName>");
this.put("data-invalid-item", "&cDữ liệu &bitem &cbạn đã nhập không hợp lệ! &bĐịnh dạng: <itemName>");
this.put("data-invalid-color", "&cDữ liệu &bcolor &cbạn đã nhập không hợp lệ! &bĐịnh dạng: <<0-255> <0-255> <0-255>>|<rainbow>|<random>");
this.put("data-invalid-note", "&cDữ liệu &bnote &cbạn đã nhập không hợp lệ! &bĐịnh dạng: <0-24>|<rainbow>|<random>");
this.put("data-invalid-color", "&cDữ liệu &bcolor &cbạn đã nhập không hợp lệ! &bĐịnh dạng: <<0-255> <0-255> <0-255>>|<&brainbow>|<random>");
this.put("data-invalid-note", "&cDữ liệu &bnote &cbạn đã nhập không hợp lệ! &bĐịnh dạng: <0-24>|<&brainbow>|<random>");
this.put("data-invalid-color-transition", "&cDữ liệu &bcolor transition &cbạn đã nhập không hợp lệ! &bĐịnh dạng: <<0-255> <0-255> <0-255>>|<&brainbow>|<random> <<0-255> <0-255> <0-255>>|<&brainbow>|<random>");
this.put("data-invalid-vibration", "&cDữ liệu &bvibration &cbạn đã nhập không hợp lệ! &bĐịnh dạng: <duration>");
this.put("data-invalid-material-not-item", "&cDữ liệu &bitem &c: Vật phẩm &b%material% &cbạn đã nhập không phải là một vật phẩm!");
this.put("data-invalid-material-not-block", "&cDữ liệu &bblock &c: Vật phẩm &b%material% &cbạn đã nhập không phải là một khối!");
this.put("data-invalid-material-item", "&cDữ liệu &bitem &c: Vật phẩm &b%material% bạn đã nhập không tồn tại!");
@ -325,25 +329,28 @@ public class VietnameseLocale implements Locale {
this.put("gui-select-style-description", "Thiết lập Kiểu hiệu ứng của Hạt thành &b%style%");
this.put("gui-select-data", "Chọn Dữ liệu của Hạt");
this.put("gui-select-data-description", "Thiết lập DỮ liệu của Hạt thành &b%data%");
this.put("gui-select-data-note", "note #%note%");
this.put("gui-select-data-note", "Note #%note%");
this.put("gui-select-data-color-transition-start", "&eChọn màu &bbắt đầu");
this.put("gui-select-data-color-transition-end", "&eChọn màu &bkết thúc");
this.put("gui-select-data-vibration", "&b%ticks% &eticks");
this.put("#38", "GUI Color Name Messages");
this.put("gui-edit-data-color-red", "&cĐỏ mạnh mẽ");
this.put("gui-edit-data-color-orange", "&6Cam dịu dàng");
this.put("gui-edit-data-color-yellow", "&eVàng yêu thương");
this.put("gui-edit-data-color-lime-green", "&aXanh nhẹ nhàng");
this.put("gui-edit-data-color-green", "&2Xanh đen tối");
this.put("gui-edit-data-color-blue", "&1Xanh lam");
this.put("gui-edit-data-color-cyan", "&3Lục lam");
this.put("gui-edit-data-color-light-blue", "&bXanh Da trời");
this.put("gui-edit-data-color-purple", "&5Tím cá tính");
this.put("gui-edit-data-color-magenta", "&dĐỏ tươi");
this.put("gui-edit-data-color-pink", "&dHồng nam tính");
this.put("gui-edit-data-color-brown", "&6Nâu thâm thâm");
this.put("gui-edit-data-color-black", "&8Đen như tâm hồn");
this.put("gui-edit-data-color-gray", "&8Xám");
this.put("gui-edit-data-color-light-gray", "&7Xám nhạt");
this.put("gui-edit-data-color-white", "&fTrắng tinh khiết");
this.put("gui-edit-data-color-red", "#ff0000Đỏ mạnh mẽ");
this.put("gui-edit-data-color-orange", "#ff8c00Cam dịu dàng");
this.put("gui-edit-data-color-yellow", "#ffff00Vàng yêu thương");
this.put("gui-edit-data-color-lime-green", "#32cd32Xanh nhẹ nhàng");
this.put("gui-edit-data-color-green", "#008000Xanh đen tối");
this.put("gui-edit-data-color-blue", "#0000ffXanh lam");
this.put("gui-edit-data-color-cyan", "#008b8bLục lam");
this.put("gui-edit-data-color-light-blue", "#add8e6Xanh Da trời");
this.put("gui-edit-data-color-purple", "#8a2be2Tím cá tính");
this.put("gui-edit-data-color-magenta", "#ca1f7bĐỏ tươi");
this.put("gui-edit-data-color-pink", "#ffb6c1Hồng nam tính");
this.put("gui-edit-data-color-brown", "#8b4513Nâu thâm thâm");
this.put("gui-edit-data-color-black", "#000000Đen như tâm hồn");
this.put("gui-edit-data-color-gray", "#808080Xám");
this.put("gui-edit-data-color-light-gray", "#c0c0c0Xám nhạt");
this.put("gui-edit-data-color-white", "#ffffffTrắng tinh khiết");
}};
}
}

View File

@ -24,11 +24,13 @@ import dev.esophose.playerparticles.command.UseCommandModule;
import dev.esophose.playerparticles.command.VersionCommandModule;
import dev.esophose.playerparticles.command.WorldsCommandModule;
import dev.esophose.playerparticles.particles.PPlayer;
import dev.esophose.playerparticles.util.ParticleUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.BlockCommandSender;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
@ -157,7 +159,7 @@ public class CommandManager extends Manager implements CommandExecutor, TabCompl
sender.sendMessage(ChatColor.RED + "Error: This command can only be executed by a player.");
return;
}
} else if (sender instanceof ConsoleCommandSender) {
} else if (sender instanceof ConsoleCommandSender || sender instanceof BlockCommandSender) {
commandModule.onCommandExecute(PlayerParticlesAPI.getInstance().getConsolePPlayer(), cmdArgs);
return;
}
@ -194,7 +196,13 @@ public class CommandManager extends Manager implements CommandExecutor, TabCompl
@Override
public List<String> onTabComplete(CommandSender sender, Command cmd, String alias, String[] args) {
if (cmd.getName().equalsIgnoreCase("pp")) {
PPlayer pplayer = PlayerParticlesAPI.getInstance().getPPlayer(sender);
PPlayer pplayer;
if (sender instanceof Player && !ParticleUtils.getTargetBlock((Player) sender).getType().name().contains("COMMAND_BLOCK")) {
pplayer = PlayerParticlesAPI.getInstance().getPPlayer(sender);
} else {
pplayer = PlayerParticlesAPI.getInstance().getConsolePPlayer();
}
if (pplayer == null)
return new ArrayList<>();
@ -204,7 +212,7 @@ public class CommandManager extends Manager implements CommandExecutor, TabCompl
} else {
CommandModule commandModule = this.findMatchingCommand(args[0]);
if (commandModule != null) {
if (sender instanceof ConsoleCommandSender && !commandModule.canConsoleExecute())
if (pplayer.getPlayer() == null && !commandModule.canConsoleExecute())
return new ArrayList<>();
String[] cmdArgs = Arrays.copyOfRange(args, 1, args.length);

View File

@ -11,8 +11,10 @@ import dev.esophose.playerparticles.particles.PPlayer;
import dev.esophose.playerparticles.particles.ParticleEffect;
import dev.esophose.playerparticles.particles.ParticleGroup;
import dev.esophose.playerparticles.particles.ParticlePair;
import dev.esophose.playerparticles.particles.data.ColorTransition;
import dev.esophose.playerparticles.particles.data.NoteColor;
import dev.esophose.playerparticles.particles.data.OrdinaryColor;
import dev.esophose.playerparticles.particles.data.Vibration;
import dev.esophose.playerparticles.styles.ParticleStyle;
import dev.esophose.playerparticles.util.ParticleUtils;
import java.sql.PreparedStatement;
@ -91,10 +93,7 @@ public class DataManager extends Manager {
* @return The PPlayer from cache
*/
public PPlayer getPPlayer(UUID playerUUID) {
for (PPlayer pp : this.playerParticles.getManager(ParticleManager.class).getPPlayers())
if (pp.getUniqueId().equals(playerUUID))
return pp;
return null;
return this.playerParticles.getManager(ParticleManager.class).getPPlayers().get(playerUUID);
}
/**
@ -160,7 +159,9 @@ public class DataManager extends Manager {
Material blockMaterial = ParticleUtils.closestMatchWithFallback(true, result.getString("block_material"));
NoteColor noteColor = new NoteColor(result.getInt("note"));
OrdinaryColor color = new OrdinaryColor(result.getInt("r"), result.getInt("g"), result.getInt("b"));
ParticlePair particle = new ParticlePair(playerUUID, id, effect, style, itemMaterial, blockMaterial, color, noteColor);
ColorTransition colorTransition = new ColorTransition(new OrdinaryColor(result.getInt("r"), result.getInt("g"), result.getInt("b")), new OrdinaryColor(result.getInt("r_end"), result.getInt("g_end"), result.getInt("b_end")));
Vibration vibration = new Vibration(result.getInt("duration"));
ParticlePair particle = new ParticlePair(playerUUID, id, effect, style, itemMaterial, blockMaterial, color, noteColor, colorTransition, vibration);
boolean invalid = effect == null || style == null;
if (invalid) // Effect or style is now missing or disabled, remove the particle
@ -197,7 +198,7 @@ public class DataManager extends Manager {
}
// Load fixed effects
String fixedQuery = "SELECT f.id AS f_id, f.world, f.xPos, f.yPos, f.zPos, p.id AS p_id, p.effect, p.style, p.item_material, p.block_material, p.note, p.r, p.g, p.b FROM " + this.getTablePrefix() + "fixed f " +
String fixedQuery = "SELECT f.id AS f_id, f.world, f.xPos, f.yPos, f.zPos, p.id AS p_id, p.effect, p.style, p.item_material, p.block_material, p.note, p.r, p.g, p.b, p.r_end, p.g_end, p.b_end, p.duration FROM " + this.getTablePrefix() + "fixed f " +
"JOIN " + this.getTablePrefix() + "particle p ON f.particle_uuid = p.uuid " +
"WHERE f.owner_uuid = ?";
try (PreparedStatement statement = connection.prepareStatement(fixedQuery)) {
@ -227,7 +228,9 @@ public class DataManager extends Manager {
Material blockMaterial = ParticleUtils.closestMatchWithFallback(true, result.getString("block_material"));
NoteColor noteColor = new NoteColor(result.getInt("note"));
OrdinaryColor color = new OrdinaryColor(result.getInt("r"), result.getInt("g"), result.getInt("b"));
ParticlePair particle = new ParticlePair(playerUUID, particleId, effect, style, itemMaterial, blockMaterial, color, noteColor);
ColorTransition colorTransition = new ColorTransition(new OrdinaryColor(result.getInt("r"), result.getInt("g"), result.getInt("b")), new OrdinaryColor(result.getInt("r_end"), result.getInt("g_end"), result.getInt("b_end")));
Vibration vibration = new Vibration(result.getInt("duration"));
ParticlePair particle = new ParticlePair(playerUUID, particleId, effect, style, itemMaterial, blockMaterial, color, noteColor, colorTransition, vibration);
// Effect or style is now missing or disabled, remove the fixed effect
if (effect == null || style == null) {
@ -351,7 +354,7 @@ public class DataManager extends Manager {
}
// Fill group with new particles
String createParticlesQuery = "INSERT INTO " + this.getTablePrefix() + "particle (uuid, group_uuid, id, effect, style, item_material, block_material, note, r, g, b) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
String createParticlesQuery = "INSERT INTO " + this.getTablePrefix() + "particle (uuid, group_uuid, id, effect, style, item_material, block_material, note, r, g, b, r_end, g_end, b_end, duration) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
try (PreparedStatement particlesStatement = connection.prepareStatement(createParticlesQuery)) {
for (ParticlePair particle : group.getParticles().values()) {
particlesStatement.setString(1, UUID.randomUUID().toString());
@ -365,6 +368,10 @@ public class DataManager extends Manager {
particlesStatement.setInt(9, particle.getColor().getRed());
particlesStatement.setInt(10, particle.getColor().getGreen());
particlesStatement.setInt(11, particle.getColor().getBlue());
particlesStatement.setInt(12, particle.getColorTransition().getEndColor().getRed());
particlesStatement.setInt(13, particle.getColorTransition().getEndColor().getGreen());
particlesStatement.setInt(14, particle.getColorTransition().getEndColor().getBlue());
particlesStatement.setInt(15, particle.getVibration().getDuration());
particlesStatement.addBatch();
}
@ -444,7 +451,7 @@ public class DataManager extends Manager {
this.async(() -> this.databaseConnector.connect((connection) -> {
String particleUUID = UUID.randomUUID().toString();
String particleQuery = "INSERT INTO " + this.getTablePrefix() + "particle (uuid, id, effect, style, item_material, block_material, note, r, g, b) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
String particleQuery = "INSERT INTO " + this.getTablePrefix() + "particle (uuid, id, effect, style, item_material, block_material, note, r, g, b, r_end, g_end, b_end, duration) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
try (PreparedStatement statement = connection.prepareStatement(particleQuery)) {
ParticlePair particle = fixedEffect.getParticlePair();
statement.setString(1, particleUUID);
@ -457,6 +464,10 @@ public class DataManager extends Manager {
statement.setInt(8, particle.getColor().getRed());
statement.setInt(9, particle.getColor().getGreen());
statement.setInt(10, particle.getColor().getBlue());
statement.setInt(11, particle.getColorTransition().getEndColor().getRed());
statement.setInt(12, particle.getColorTransition().getEndColor().getGreen());
statement.setInt(13, particle.getColorTransition().getEndColor().getBlue());
statement.setInt(14, particle.getVibration().getDuration());
statement.executeUpdate();
}
@ -494,7 +505,7 @@ public class DataManager extends Manager {
// Update particle
String particleUpdateQuery = "UPDATE " + this.getTablePrefix() + "particle " +
"SET effect = ?, style = ?, item_material = ?, block_material = ?, note = ?, r = ?, g = ?, b = ? " +
"SET effect = ?, style = ?, item_material = ?, block_material = ?, note = ?, r = ?, g = ?, b = ?, r_end = ?, g_end = ?, b_end = ?, duration = ? " +
"WHERE uuid = (SELECT particle_uuid FROM " + this.getTablePrefix() + "fixed WHERE owner_uuid = ? AND id = ?)";
try (PreparedStatement statement = connection.prepareStatement(particleUpdateQuery)) {
ParticlePair particle = fixedEffect.getParticlePair();
@ -506,8 +517,12 @@ public class DataManager extends Manager {
statement.setInt(6, particle.getColor().getRed());
statement.setInt(7, particle.getColor().getGreen());
statement.setInt(8, particle.getColor().getBlue());
statement.setString(9, fixedEffect.getOwnerUniqueId().toString());
statement.setInt(10, fixedEffect.getId());
statement.setInt(9, particle.getColorTransition().getEndColor().getRed());
statement.setInt(10, particle.getColorTransition().getEndColor().getGreen());
statement.setInt(11, particle.getColorTransition().getEndColor().getBlue());
statement.setInt(12, particle.getVibration().getDuration());
statement.setString(13, fixedEffect.getOwnerUniqueId().toString());
statement.setInt(14, fixedEffect.getId());
statement.executeUpdate();
}
}));

View File

@ -5,6 +5,7 @@ import dev.esophose.playerparticles.database.DataMigration;
import dev.esophose.playerparticles.database.DatabaseConnector;
import dev.esophose.playerparticles.database.SQLiteConnector;
import dev.esophose.playerparticles.database.migrations._1_InitialMigration;
import dev.esophose.playerparticles.database.migrations._2_Add_Data_Columns;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Arrays;
@ -20,7 +21,8 @@ public class DataMigrationManager extends Manager {
super(playerParticles);
this.migrations = Arrays.asList(
new _1_InitialMigration()
new _1_InitialMigration(),
new _2_Add_Data_Columns()
);
}

View File

@ -9,8 +9,10 @@ import dev.esophose.playerparticles.particles.ParticleEffect;
import dev.esophose.playerparticles.particles.ParticleEffect.ParticleProperty;
import dev.esophose.playerparticles.particles.ParticleGroup;
import dev.esophose.playerparticles.particles.ParticlePair;
import dev.esophose.playerparticles.particles.data.ColorTransition;
import dev.esophose.playerparticles.particles.data.NoteColor;
import dev.esophose.playerparticles.particles.data.OrdinaryColor;
import dev.esophose.playerparticles.particles.data.Vibration;
import dev.esophose.playerparticles.particles.preset.ParticleGroupPreset;
import dev.esophose.playerparticles.particles.preset.ParticleGroupPresetPage;
import dev.esophose.playerparticles.styles.ParticleStyle;
@ -147,6 +149,8 @@ public class ParticleGroupPresetManager extends Manager {
Material blockData = null;
OrdinaryColor colorData = null;
NoteColor noteColorData = null;
ColorTransition colorTransitionData = null;
Vibration vibrationData = null;
String dataString = particleSection.getString("data");
if (dataString != null && !dataString.isEmpty()) {
@ -181,10 +185,22 @@ public class ParticleGroupPresetManager extends Manager {
continue;
}
}
} else if (effect.hasProperty(ParticleProperty.COLORABLE_TRANSITION)) {
colorTransitionData = inputParser.next(ColorTransition.class);
if (colorTransitionData == null) {
PlayerParticles.getInstance().getLogger().severe("Invalid color transition: '" + dataString + "'!");
return;
}
} else if (effect.hasProperty(ParticleProperty.VIBRATION)) {
vibrationData = inputParser.next(Vibration.class);
if (vibrationData == null) {
PlayerParticles.getInstance().getLogger().severe("Invalid vibration: '" + dataString + "'!");
return;
}
}
}
particles.put(id, new ParticlePair(null, id, effect, style, itemData, blockData, colorData, noteColorData));
particles.put(id, new ParticlePair(null, id, effect, style, itemData, blockData, colorData, noteColorData, colorTransitionData, vibrationData));
}
presets.add(new ParticleGroupPreset(displayName, guiIcon, guiSlot, lore, permission, allowPermissionOverride, new ParticleGroup(groupName, particles)));

View File

@ -14,7 +14,7 @@ import dev.esophose.playerparticles.particles.data.OrdinaryColor;
import dev.esophose.playerparticles.styles.DefaultStyles;
import dev.esophose.playerparticles.util.ParticleUtils;
import java.awt.Color;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@ -160,8 +160,8 @@ public class ParticleManager extends Manager implements Listener, Runnable {
*
* @return The loaded PPlayers
*/
public Collection<PPlayer> getPPlayers() {
return this.particlePlayers.values();
public Map<UUID, PPlayer> getPPlayers() {
return Collections.unmodifiableMap(this.particlePlayers);
}
/**
@ -312,6 +312,16 @@ public class ParticleManager extends Manager implements Listener, Runnable {
return new OrdinaryColor(rgb.getRed(), rgb.getGreen(), rgb.getBlue());
}
/**
* Gets the rainbow OrdinaryColor for particle spawning with data 'rainbow', shifted half way through the HSB spectrum
*
* @return The rainbow OrdinaryColor for particle spawning with data 'rainbow', shifted half way through the HSB spectrum
*/
public OrdinaryColor getShiftedRainbowParticleColor() {
Color rgb = Color.getHSBColor((this.hue / 360F) + 0.5F, 1.0F, 1.0F);
return new OrdinaryColor(rgb.getRed(), rgb.getGreen(), rgb.getBlue());
}
/**
* Gets the rainbow NoteColor for particle spawning with data 'rainbow'
*

View File

@ -7,7 +7,7 @@ import dev.esophose.playerparticles.styles.ParticleStyle;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@ -25,8 +25,8 @@ public class ParticleStyleManager extends Manager {
public ParticleStyleManager(PlayerParticles playerParticles) {
super(playerParticles);
this.stylesByName = new HashMap<>();
this.stylesByInternalName = new HashMap<>();
this.stylesByName = new LinkedHashMap<>();
this.stylesByInternalName = new LinkedHashMap<>();
this.eventStyles = new ArrayList<>();
DefaultStyles.initStyles();

View File

@ -3,9 +3,11 @@ package dev.esophose.playerparticles.particles;
import com.google.common.collect.ObjectArrays;
import dev.esophose.playerparticles.PlayerParticles;
import dev.esophose.playerparticles.config.CommentedFileConfiguration;
import dev.esophose.playerparticles.particles.data.ColorTransition;
import dev.esophose.playerparticles.particles.data.NoteColor;
import dev.esophose.playerparticles.particles.data.OrdinaryColor;
import dev.esophose.playerparticles.particles.data.ParticleColor;
import dev.esophose.playerparticles.particles.data.Vibration;
import dev.esophose.playerparticles.particles.spawning.ParticleSpawner;
import dev.esophose.playerparticles.particles.spawning.ParticleSpawner.ParticleColorException;
import dev.esophose.playerparticles.particles.spawning.ParticleSpawner.ParticleDataException;
@ -46,28 +48,37 @@ public enum ParticleEffect {
DAMAGE_INDICATOR("DAMAGE_INDICATOR", Collections.singletonList("BOW")),
DOLPHIN("DOLPHIN", Collections.singletonList("DOLPHIN_SPAWN_EGG")),
DRAGON_BREATH("DRAGON_BREATH", Arrays.asList("DRAGON_BREATH", "DRAGONS_BREATH")),
DRIPPING_DRIPSTONE_LAVA("DRIPPING_DRIPSTONE_LAVA", Collections.singletonList("POINTED_DRIPSTONE")),
DRIPPING_DRIPSTONE_WATER("DRIPPING_DRIPSTONE_WATER", Collections.singletonList("DRIPSTONE_BLOCK")),
DRIPPING_HONEY("DRIPPING_HONEY", Collections.singletonList("BEE_NEST")),
DRIPPING_LAVA("DRIP_LAVA", Collections.singletonList("LAVA_BUCKET")),
DRIPPING_OBSIDIAN_TEAR("DRIPPING_OBSIDIAN_TEAR", Collections.singletonList("CRYING_OBSIDIAN")),
DRIPPING_WATER("DRIP_WATER", Collections.singletonList("WATER_BUCKET")),
DUST("REDSTONE", Collections.singletonList("REDSTONE"), ParticleProperty.COLORABLE),
DUST_COLOR_TRANSITION("DUST_COLOR_TRANSITION", Collections.singletonList("DEEPSLATE_REDSTONE_ORE"), ParticleProperty.COLORABLE_TRANSITION),
ELDER_GUARDIAN("MOB_APPEARANCE", Arrays.asList("ELDER_GUARDIAN_SPAWN_EGG", "PRISMARINE_CRYSTALS"), false), // No thank you
ELECTRIC_SPARK("ELECTRIC_SPARK", Collections.singletonList("LIGHTNING_ROD")),
ENCHANT("ENCHANTMENT_TABLE", Arrays.asList("ENCHANTING_TABLE", "ENCHANTMENT_TABLE")),
ENCHANTED_HIT("CRIT_MAGIC", Collections.singletonList("DIAMOND_SWORD")),
END_ROD("END_ROD", Collections.singletonList("END_ROD")),
ENTITY_EFFECT("SPELL_MOB", Collections.singletonList("GLOWSTONE_DUST"), ParticleProperty.COLORABLE),
EXPLOSION("EXPLOSION_LARGE", Arrays.asList("FIRE_CHARGE", "FIREBALL")),
EXPLOSION_EMITTER("EXPLOSION_HUGE", Collections.singletonList("TNT")),
FALLING_DRIPSTONE_LAVA("FALLING_DRIPSTONE_LAVA", Collections.singletonList("SMOOTH_BASALT")),
FALLING_DRIPSTONE_WATER("FALLING_DRIPSTONE_WATER", Collections.singletonList("CALCITE")),
FALLING_DUST("FALLING_DUST", Collections.singletonList("SAND"), ParticleProperty.REQUIRES_MATERIAL_DATA),
FALLING_HONEY("FALLING_HONEY", Collections.singletonList("HONEY_BOTTLE")),
FALLING_LAVA("FALLING_LAVA", Collections.singletonList("RED_DYE")),
FALLING_NECTAR("FALLING_NECTAR", Collections.singletonList("HONEYCOMB")),
FALLING_OBSIDIAN_TEAR("FALLING_OBSIDIAN_TEAR", Collections.singletonList("ANCIENT_DEBRIS")),
FALLING_SPORE_BLOSSOM("FALLING_SPORE_BLOSSOM", Collections.singletonList("FLOWERING_AZALEA")),
FALLING_WATER("FALLING_WATER", Collections.singletonList("BLUE_DYE")),
FIREWORK("FIREWORKS_SPARK", Arrays.asList("FIREWORK_ROCKET", "FIREWORK")),
FISHING("WATER_WAKE", Collections.singletonList("FISHING_ROD")),
FLAME("FLAME", Collections.singletonList("BLAZE_POWDER")),
FLASH("FLASH", Collections.singletonList("GOLD_INGOT"), false), // Also no thank you
GLOW("GLOW", Collections.singletonList("GLOW_ITEM_FRAME")),
GLOW_SQUID_INK("GLOW_SQUID_INK", Collections.singletonList("GLOW_INK_SAC")),
FOOTSTEP("FOOTSTEP", Collections.singletonList("GRASS")), // Removed in Minecraft 1.13 :(
HAPPY_VILLAGER("VILLAGER_HAPPY", Arrays.asList("DARK_OAK_DOOR_ITEM", "DARK_OAK_DOOR")),
HEART("HEART", Arrays.asList("POPPY", "RED_ROSE")),
@ -80,6 +91,7 @@ public enum ParticleEffect {
LANDING_OBSIDIAN_TEAR("LANDING_OBSIDIAN_TEAR", Collections.singletonList("NETHERITE_BLOCK")),
LARGE_SMOKE("SMOKE_LARGE", Arrays.asList("COBWEB", "WEB")),
LAVA("LAVA", Collections.singletonList("MAGMA_CREAM")),
LIGHT("LIGHT", Collections.singletonList("LIGHT")),
MYCELIUM("TOWN_AURA", Arrays.asList("MYCELIUM", "MYCEL")),
NAUTILUS("NAUTILUS", Collections.singletonList("HEART_OF_THE_SEA")),
NOTE("NOTE", Collections.singletonList("NOTE_BLOCK"), ParticleProperty.COLORABLE),
@ -87,25 +99,29 @@ public enum ParticleEffect {
PORTAL("PORTAL", Collections.singletonList("OBSIDIAN")),
RAIN("WATER_DROP", Arrays.asList("PUFFERFISH_BUCKET", "LAPIS_BLOCK")),
REVERSE_PORTAL("REVERSE_PORTAL", Collections.singletonList("FLINT_AND_STEEL")),
SCRAPE("SCRAPE", Collections.singletonList("GOLDEN_AXE")),
SMALL_FLAME("SMALL_FLAME", Collections.singletonList("CANDLE")),
SMOKE("SMOKE_NORMAL", Collections.singletonList("TORCH")),
SNEEZE("SNEEZE", Collections.singletonList("BAMBOO")),
SNOWFLAKE("SNOWFLAKE", Collections.singletonList("POWDER_SNOW_BUCKET")),
SOUL("SOUL", Collections.singletonList("SOUL_LANTERN")),
SOUL_FIRE_FLAME("SOUL_FIRE_FLAME", Collections.singletonList("SOUL_CAMPFIRE")),
SPELL("SPELL", Arrays.asList("POTION", "GLASS_BOTTLE")), // The Minecraft internal name for this is actually "effect", but that's the command name, so it's SPELL for the plugin instead
SPIT("SPIT", Arrays.asList("LLAMA_SPAWN_EGG", "PUMPKIN_SEEDS")),
SPLASH("WATER_SPLASH", Arrays.asList("SALMON", "FISH", "RAW_FISH")),
SPORE_BLOSSOM_AIR("SPORE_BLOSSOM_AIR", Collections.singletonList("SPORE_BLOSSOM")),
SQUID_INK("SQUID_INK", Collections.singletonList("INK_SAC")),
SWEEP_ATTACK("SWEEP_ATTACK", Arrays.asList("GOLDEN_SWORD", "GOLD_SWORD")),
TOTEM_OF_UNDYING("TOTEM", Arrays.asList("TOTEM_OF_UNDYING", "TOTEM")),
UNDERWATER("SUSPENDED_DEPTH", Arrays.asList("TURTLE_HELMET", "SPONGE")),
VIBRATION("VIBRATION", Collections.singletonList("SCULK_SENSOR"), false, ParticleProperty.VIBRATION),
WARPED_SPORE("WARPED_SPORE", Collections.singletonList("WARPED_FUNGUS")),
WAX_OFF("WAX_OFF", Collections.singletonList("OXIDIZED_COPPER")),
WAX_ON("WAX_ON", Collections.singletonList("WAXED_COPPER_BLOCK")),
WHITE_ASH("WHITE_ASH", Collections.singletonList("BASALT")),
WITCH("SPELL_WITCH", Collections.singletonList("CAULDRON"));
private final static ParticleSpawner particleSpawner;
static {
particleSpawner = NMSUtil.getVersionNumber() >= 9 ? new SpigotParticleSpawner() : new ReflectiveParticleSpawner();
}
private final static ParticleSpawner particleSpawner = NMSUtil.getVersionNumber() >= 9 ? new SpigotParticleSpawner() : new ReflectiveParticleSpawner();
private Particle internalEnum;
private List<ParticleProperty> properties;
@ -266,6 +282,13 @@ public enum ParticleEffect {
return this.properties.contains(property);
}
/**
* @return true if this effect has any properties
*/
public boolean hasProperties() {
return !this.properties.isEmpty();
}
/**
* Determine if this particle effect is supported by the current server version
*
@ -345,6 +368,22 @@ public enum ParticleEffect {
data = particle.getSpawnColor();
}
effect.display(data, pparticle.getLocation(true), isLongRange, owner);
} else if (effect.hasProperty(ParticleProperty.COLORABLE_TRANSITION)) {
ColorTransition data;
if (pparticle.getOverrideData() instanceof ColorTransition) {
data = (ColorTransition) pparticle.getOverrideData();
} else {
data = particle.getSpawnColorTransition();
}
effect.display(data, pparticle.getXOff(), pparticle.getYOff(), pparticle.getZOff(), 1, pparticle.getLocation(false), isLongRange, owner);
} else if (effect.hasProperty(ParticleProperty.VIBRATION)) {
Vibration data;
if (pparticle.getOverrideData() instanceof Vibration) {
data = (Vibration) pparticle.getOverrideData();
} else {
data = particle.getVibration();
}
effect.display(data, pparticle.getXOff(), pparticle.getYOff(), pparticle.getZOff(), 1, pparticle.getLocation(false), isLongRange, owner);
} else {
effect.display(pparticle.getXOff(), pparticle.getYOff(), pparticle.getZOff(), pparticle.getSpeed(), count, pparticle.getLocation(false), isLongRange, owner);
}
@ -400,14 +439,46 @@ public enum ParticleEffect {
particleSpawner.display(this, spawnMaterial, offsetX, offsetY, offsetZ, speed, amount, center, isLongRange, owner);
}
/**
* Displays a particle effect which requires additional data and is only
* visible for all players within a certain range in the world of @param
* center
*
* @param colorTransition Color transition of the effect
* @param offsetX Maximum distance particles can fly away from the center on the x-axis
* @param offsetY Maximum distance particles can fly away from the center on the y-axis
* @param offsetZ Maximum distance particles can fly away from the center on the z-axis
* @param amount Amount of particles
* @param center Center location of the effect
* @param isLongRange If the particle can be viewed from long range
* @param owner The player that owns the particles
* @throws ParticleDataException If the particle effect does not require additional data or if the data type is incorrect
*/
public void display(ColorTransition colorTransition, double offsetX, double offsetY, double offsetZ, int amount, Location center, boolean isLongRange, Player owner) {
particleSpawner.display(this, colorTransition, offsetX, offsetY, offsetZ, amount, center, isLongRange, owner);
}
/**
* Displays a particle effect which requires additional data and is only
* visible for all players within a certain range in the world of @param
* center
*
* @param vibration Vibration of the effect
* @param offsetX Maximum distance particles can fly away from the center on the x-axis
* @param offsetY Maximum distance particles can fly away from the center on the y-axis
* @param offsetZ Maximum distance particles can fly away from the center on the z-axis
* @param amount Amount of particles
* @param center Center location of the effect
* @param isLongRange If the particle can be viewed from long range
* @param owner The player that owns the particles
* @throws ParticleDataException If the particle effect does not require additional data or if the data type is incorrect
*/
public void display(Vibration vibration, double offsetX, double offsetY, double offsetZ, int amount, Location center, boolean isLongRange, Player owner) {
particleSpawner.display(this, vibration, offsetX, offsetY, offsetZ, amount, center, isLongRange, owner);
}
/**
* Represents the property of a particle effect
* <p>
* This class is part of the <b>ParticleEffect Library</b> and follows the
* same usage conditions
*
* @author DarkBlade12
* @since 1.7
*/
public enum ParticleProperty {
/**
@ -417,7 +488,15 @@ public enum ParticleEffect {
/**
* The particle effect uses the offsets as color values
*/
COLORABLE
COLORABLE,
/**
* The particle effect uses two color values to transition between
*/
COLORABLE_TRANSITION,
/**
* The particle effect uses an origin location, destination location, and duration in ticks
*/
VIBRATION
}
}

View File

@ -5,9 +5,11 @@ import dev.esophose.playerparticles.manager.LocaleManager;
import dev.esophose.playerparticles.manager.ParticleManager;
import dev.esophose.playerparticles.manager.PermissionManager;
import dev.esophose.playerparticles.particles.ParticleEffect.ParticleProperty;
import dev.esophose.playerparticles.particles.data.ColorTransition;
import dev.esophose.playerparticles.particles.data.NoteColor;
import dev.esophose.playerparticles.particles.data.OrdinaryColor;
import dev.esophose.playerparticles.particles.data.ParticleColor;
import dev.esophose.playerparticles.particles.data.Vibration;
import dev.esophose.playerparticles.styles.DefaultStyles;
import dev.esophose.playerparticles.styles.ParticleStyle;
import dev.esophose.playerparticles.util.ParticleUtils;
@ -30,8 +32,10 @@ public class ParticlePair {
private Material blockMaterial;
private OrdinaryColor color;
private NoteColor noteColor;
private ColorTransition colorTransition;
private Vibration vibration;
public ParticlePair(UUID ownerUUID, int id, ParticleEffect effect, ParticleStyle style, Material itemMaterial, Material blockMaterial, OrdinaryColor color, NoteColor noteColor) {
public ParticlePair(UUID ownerUUID, int id, ParticleEffect effect, ParticleStyle style, Material itemMaterial, Material blockMaterial, OrdinaryColor color, NoteColor noteColor, ColorTransition colorTransition, Vibration vibration) {
this.ownerUUID = ownerUUID;
this.id = id;
@ -44,6 +48,13 @@ public class ParticlePair {
this.setBlockMaterial(blockMaterial);
this.setColor(color);
this.setNoteColor(noteColor);
this.setColorTransition(colorTransition);
this.setVibration(vibration);
}
@Deprecated
public ParticlePair(UUID ownerUUID, int id, ParticleEffect effect, ParticleStyle style, Material itemMaterial, Material blockMaterial, OrdinaryColor color, NoteColor noteColor) {
this(ownerUUID, id, effect, style, itemMaterial, blockMaterial, color, noteColor, null, null);
}
/**
@ -58,79 +69,114 @@ public class ParticlePair {
/**
* Sets the player's particle effect
*
*
* @param effect The player's new particle effect
*/
public void setEffect(ParticleEffect effect) {
if (effect == null)
if (effect == null) {
this.effect = getDefault().getEffect();
else
} else {
this.effect = effect;
}
}
/**
* Sets the player's particle style
*
*
* @param style The player's new particle style
*/
public void setStyle(ParticleStyle style) {
if (style == null)
if (style == null) {
this.style = getDefault().getStyle();
else
} else {
this.style = style;
}
}
/**
* Sets the player's item material
*
*
* @param itemMaterial The player's new item material
*/
public void setItemMaterial(Material itemMaterial) {
if (itemMaterial == null || itemMaterial.isBlock())
if (itemMaterial == null || itemMaterial.isBlock()) {
this.itemMaterial = getDefault().getItemMaterial();
else
} else {
this.itemMaterial = itemMaterial;
}
}
/**
* Sets the player's block material
*
*
* @param blockMaterial The player's new block material
*/
public void setBlockMaterial(Material blockMaterial) {
if (blockMaterial == null || !blockMaterial.isBlock())
if (blockMaterial == null || !blockMaterial.isBlock()) {
this.blockMaterial = getDefault().getBlockMaterial();
else
} else {
this.blockMaterial = blockMaterial;
}
}
/**
* Sets the player's color data
*
*
* @param colorData The player's new color data
*/
public void setColor(OrdinaryColor colorData) {
if (colorData == null)
if (colorData == null) {
this.color = getDefault().getColor();
else
} else {
this.color = colorData;
if (this.colorTransition != null)
this.colorTransition = new ColorTransition(this.color, this.colorTransition.getEndColor());
}
}
/**
* Sets the player's note color data
*
*
* @param noteColorData The player's new note color data
*/
public void setNoteColor(NoteColor noteColorData) {
if (noteColorData == null)
if (noteColorData == null) {
this.noteColor = getDefault().getNoteColor();
else
} else {
this.noteColor = noteColorData;
}
}
/**
* Sets the player's color transition data
*
* @param colorTransitionData The player's new color transition data
*/
public void setColorTransition(ColorTransition colorTransitionData) {
if (colorTransitionData == null) {
this.colorTransition = new ColorTransition(this.getColor(), getDefault().getColorTransition().getEndColor());
} else {
this.color = colorTransitionData.getStartColor();
this.colorTransition = colorTransitionData;
}
}
/**
* Sets the player's vibration data
*
* @param vibrationData The player's new vibration data
*/
public void setVibration(Vibration vibrationData) {
if (vibrationData == null) {
this.vibration = getDefault().getVibration();
} else {
this.vibration = vibrationData;
}
}
/**
* Get the UUID of the PPlayer that owns this ParticlePair
*
*
* @return The owner's UUID
*/
public UUID getOwnerUniqueId() {
@ -139,7 +185,7 @@ public class ParticlePair {
/**
* Get the id of this particle
*
*
* @return The id of this particle
*/
public int getId() {
@ -148,7 +194,7 @@ public class ParticlePair {
/**
* Get the ParticleEffect that this ParticlePair represents
*
*
* @return The effect
*/
public ParticleEffect getEffect() {
@ -157,7 +203,7 @@ public class ParticlePair {
/**
* Get the ParticleStyle that this ParticlePair represents
*
*
* @return The style
*/
public ParticleStyle getStyle() {
@ -166,7 +212,7 @@ public class ParticlePair {
/**
* Get the item Material this particle uses
*
*
* @return The item Material
*/
public Material getItemMaterial() {
@ -175,7 +221,7 @@ public class ParticlePair {
/**
* Get the block Material this particle uses
*
*
* @return The block Material
*/
public Material getBlockMaterial() {
@ -184,7 +230,7 @@ public class ParticlePair {
/**
* Get the color this particle uses
*
*
* @return The color
*/
public OrdinaryColor getColor() {
@ -193,17 +239,35 @@ public class ParticlePair {
/**
* Get the note color this particle uses
*
*
* @return The note color
*/
public NoteColor getNoteColor() {
return this.noteColor;
}
/**
* Get the color transition this particle uses
*
* @return The color transition
*/
public ColorTransition getColorTransition() {
return this.colorTransition;
}
/**
* Get the vibration this particle uses
*
* @return The vibration
*/
public Vibration getVibration() {
return this.vibration;
}
/**
* Gets the color the current particle effect will spawn with
*
* @return Gets the ParticleColor the current particle effect will spawn with
*
* @return The ParticleColor the current particle effect will spawn with
*/
public ParticleColor getSpawnColor() {
ParticleManager particleManager = PlayerParticles.getInstance().getManager(ParticleManager.class);
@ -226,12 +290,45 @@ public class ParticlePair {
}
}
}
return null;
}
/**
* Gets the color transition the current particle effect will spawn with
*
* @return The ColorTransition the current particle effect will spawn with
*/
public ColorTransition getSpawnColorTransition() {
ParticleManager particleManager = PlayerParticles.getInstance().getManager(ParticleManager.class);
if (this.effect.hasProperty(ParticleProperty.COLORABLE_TRANSITION)) {
OrdinaryColor startColor, endColor;
if (this.colorTransition.getStartColor().equals(OrdinaryColor.RAINBOW)) {
startColor = particleManager.getRainbowParticleColor();
} else if (this.colorTransition.getStartColor().equals(OrdinaryColor.RANDOM)) {
startColor = particleManager.getRandomParticleColor();
} else {
startColor = this.colorTransition.getStartColor();
}
if (this.colorTransition.getEndColor().equals(OrdinaryColor.RAINBOW)) {
endColor = particleManager.getShiftedRainbowParticleColor();
} else if (this.colorTransition.getEndColor().equals(OrdinaryColor.RANDOM)) {
endColor = particleManager.getRandomParticleColor();
} else {
endColor = this.colorTransition.getEndColor();
}
return new ColorTransition(startColor, endColor);
}
return null;
}
/**
* Gets the material the current particle effect will spawn with
*
*
* @return The Material the current particle effect requires
*/
public Material getSpawnMaterial() {
@ -247,7 +344,7 @@ public class ParticlePair {
/**
* Gets the current particle data as a string
*
*
* @return The particle data in a human-readable string
*/
public String getDataString() {
@ -270,40 +367,64 @@ public class ParticlePair {
} else if (this.color.equals(OrdinaryColor.RANDOM)) {
return localeManager.getLocaleMessage("random");
} else {
return ChatColor.RED + "" + this.color.getRed() + " " + ChatColor.GREEN + this.color.getGreen() + " " + ChatColor.AQUA + this.color.getBlue();
return ChatColor.AQUA + "#" + ChatColor.AQUA + ParticleUtils.rgbToHex(this.color.getRed(), this.color.getGreen(), this.color.getBlue());
}
}
} else if (this.effect.hasProperty(ParticleProperty.COLORABLE_TRANSITION)) {
String start, end;
if (this.colorTransition.getStartColor().equals(OrdinaryColor.RAINBOW)) {
start = localeManager.getLocaleMessage("rainbow");
} else if (this.colorTransition.getStartColor().equals(OrdinaryColor.RANDOM)) {
start = localeManager.getLocaleMessage("random");
} else {
start = "#" + ChatColor.AQUA + ParticleUtils.rgbToHex(this.colorTransition.getStartColor().getRed(), this.colorTransition.getStartColor().getGreen(), this.colorTransition.getStartColor().getBlue());
}
if (this.colorTransition.getEndColor().equals(OrdinaryColor.RAINBOW)) {
end = localeManager.getLocaleMessage("rainbow");
} else if (this.colorTransition.getEndColor().equals(OrdinaryColor.RANDOM)) {
end = localeManager.getLocaleMessage("random");
} else {
end = "#" + ChatColor.AQUA + ParticleUtils.rgbToHex(this.colorTransition.getEndColor().getRed(), this.colorTransition.getEndColor().getGreen(), this.colorTransition.getEndColor().getBlue());
}
return ChatColor.AQUA + start + " " + ChatColor.AQUA + end;
} else if (this.effect.hasProperty(ParticleProperty.VIBRATION)) {
return String.valueOf(this.vibration.getDuration());
}
return localeManager.getLocaleMessage("gui-data-none");
}
/**
* Gets a copy of this ParticlePair
*/
public ParticlePair clone() {
return new ParticlePair(this.ownerUUID, this.id, this.effect, this.style, this.itemMaterial, this.blockMaterial, this.color, this.noteColor);
return new ParticlePair(this.ownerUUID, this.id, this.effect, this.style, this.itemMaterial, this.blockMaterial, this.color, this.noteColor, this.colorTransition, this.vibration);
}
/**
* Gets a ParticlePair with the default values applied
* Used for getting internal default values in the cases that null is specified
*
*
* @return A ParticlePair with default values
*/
private static ParticlePair getDefault() {
return new ParticlePair(null, // @formatter:off
-1,
ParticleEffect.FLAME,
DefaultStyles.NORMAL,
ParticleUtils.closestMatchWithFallback(true, "IRON_SHOVEL", "IRON_SPADE"),
Material.STONE,
new OrdinaryColor(0, 0, 0),
new NoteColor(0)); // @formatter:on
return new ParticlePair(null,
-1,
ParticleEffect.FLAME,
DefaultStyles.NORMAL,
ParticleUtils.closestMatchWithFallback(true, "IRON_SHOVEL", "IRON_SPADE"),
Material.STONE,
new OrdinaryColor(0, 0, 0),
new NoteColor(0),
new ColorTransition(new OrdinaryColor(0, 0, 0), new OrdinaryColor(255, 255, 255)),
new Vibration(20)
);
}
/**
* Gets a ParticlePair for a PPlayer with the default values applied
*
*
* @param pplayer The PPlayer that will own this ParticlePair
* @return A ParticlePair with default values
*/
@ -320,14 +441,17 @@ public class ParticlePair {
styles = permissionManager.getStylesUserHasPermissionFor(pplayer);
}
return new ParticlePair(pplayer.getUniqueId(), // @formatter:off
pplayer.getNextActiveParticleId(),
effects.stream().findFirst().orElse(ParticleEffect.FLAME),
styles.stream().findFirst().orElse(DefaultStyles.NORMAL),
ParticleUtils.closestMatchWithFallback(true, "IRON_SHOVEL", "IRON_SPADE"),
Material.STONE,
new OrdinaryColor(0, 0, 0),
new NoteColor(0)); // @formatter:on
return new ParticlePair(pplayer.getUniqueId(),
pplayer.getNextActiveParticleId(),
effects.stream().findFirst().orElse(ParticleEffect.FLAME),
styles.stream().findFirst().orElse(DefaultStyles.NORMAL),
ParticleUtils.closestMatchWithFallback(true, "IRON_SHOVEL", "IRON_SPADE"),
Material.STONE,
new OrdinaryColor(0, 0, 0),
new NoteColor(0),
new ColorTransition(new OrdinaryColor(0, 0, 0), new OrdinaryColor(255, 255, 255)),
new Vibration(20)
);
}
}

View File

@ -0,0 +1,20 @@
package dev.esophose.playerparticles.particles.data;
public class ColorTransition {
private final OrdinaryColor startColor, endColor;
public ColorTransition(OrdinaryColor startColor, OrdinaryColor endColor) {
this.startColor = startColor;
this.endColor = endColor;
}
public OrdinaryColor getStartColor() {
return this.startColor;
}
public OrdinaryColor getEndColor() {
return this.endColor;
}
}

View File

@ -2,6 +2,7 @@ package dev.esophose.playerparticles.particles.data;
import dev.esophose.playerparticles.particles.ParticleEffect;
import java.util.Objects;
import org.bukkit.Color;
/**
* Represents the color for effects like {@link ParticleEffect#ENTITY_EFFECT},
@ -135,4 +136,11 @@ public final class OrdinaryColor extends ParticleColor {
public int hashCode() {
return Objects.hash(this.red, this.green, this.blue);
}
public Color toSpigot() {
if (this == RAINBOW || this == RANDOM)
throw new IllegalStateException("Cannot convert special value to Spigot Color");
return Color.fromRGB(this.red, this.green, this.blue);
}
}

View File

@ -0,0 +1,15 @@
package dev.esophose.playerparticles.particles.data;
public class Vibration {
private final int duration;
public Vibration(int duration) {
this.duration = duration;
}
public int getDuration() {
return this.duration;
}
}

View File

@ -5,7 +5,9 @@ import dev.esophose.playerparticles.manager.ConfigurationManager.Setting;
import dev.esophose.playerparticles.manager.ParticleManager;
import dev.esophose.playerparticles.particles.PPlayer;
import dev.esophose.playerparticles.particles.ParticleEffect;
import dev.esophose.playerparticles.particles.data.ColorTransition;
import dev.esophose.playerparticles.particles.data.ParticleColor;
import dev.esophose.playerparticles.particles.data.Vibration;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Location;
@ -62,6 +64,42 @@ public abstract class ParticleSpawner {
*/
public abstract void display(ParticleEffect particleEffect, Material spawnMaterial, double offsetX, double offsetY, double offsetZ, double speed, int amount, Location center, boolean isLongRange, Player owner);
/**
* Displays a particle effect which requires additional data and is only
* visible for all players within a certain range in the world of @param
* center
*
* @param particleEffect The particle type to display
* @param colorTransition Color transition of the effect
* @param offsetX Maximum distance particles can fly away from the center on the x-axis
* @param offsetY Maximum distance particles can fly away from the center on the y-axis
* @param offsetZ Maximum distance particles can fly away from the center on the z-axis
* @param amount Amount of particles
* @param center Center location of the effect
* @param isLongRange If the particle can be viewed from long range
* @param owner The player that owns the particles
* @throws ParticleDataException If the particle effect does not require additional data or if the data type is incorrect
*/
public abstract void display(ParticleEffect particleEffect, ColorTransition colorTransition, double offsetX, double offsetY, double offsetZ, int amount, Location center, boolean isLongRange, Player owner);
/**
* Displays a particle effect which requires additional data and is only
* visible for all players within a certain range in the world of @param
* center
*
* @param particleEffect The particle type to display
* @param vibration Vibration of the effect
* @param offsetX Maximum distance particles can fly away from the center on the x-axis
* @param offsetY Maximum distance particles can fly away from the center on the y-axis
* @param offsetZ Maximum distance particles can fly away from the center on the z-axis
* @param amount Amount of particles
* @param center Center location of the effect
* @param isLongRange If the particle can be viewed from long range
* @param owner The player that owns the particles
* @throws ParticleDataException If the particle effect does not require additional data or if the data type is incorrect
*/
public abstract void display(ParticleEffect particleEffect, Vibration vibration, double offsetX, double offsetY, double offsetZ, int amount, Location center, boolean isLongRange, Player owner);
/**
* Gets a List of Players within the particle display range
*
@ -70,14 +108,14 @@ public abstract class ParticleSpawner {
* @param owner The player that owns the particles
* @return A List of Players within the particle display range
*/
protected List<Player> getPlayersInRange(Location center, boolean isLongRange, Player owner) {
public static List<Player> getPlayersInRange(Location center, boolean isLongRange, Player owner) {
List<Player> players = new ArrayList<>();
int range = !isLongRange ? Setting.PARTICLE_RENDER_RANGE_PLAYER.getInt() : Setting.PARTICLE_RENDER_RANGE_FIXED_EFFECT.getInt();
range *= range;
for (PPlayer pplayer : PlayerParticles.getInstance().getManager(ParticleManager.class).getPPlayers()) {
for (PPlayer pplayer : PlayerParticles.getInstance().getManager(ParticleManager.class).getPPlayers().values()) {
Player p = pplayer.getPlayer();
if (!this.canSee(p, owner))
if (!canSee(p, owner))
continue;
if (p != null && pplayer.canSeeParticles() && p.getWorld().equals(center.getWorld()) && center.distanceSquared(p.getLocation()) <= range)
@ -94,7 +132,7 @@ public abstract class ParticleSpawner {
* @param target The target
* @return True if player can see target, otherwise false
*/
private boolean canSee(Player player, Player target) {
public static boolean canSee(Player player, Player target) {
if (player == null || target == null)
return true;

View File

@ -2,8 +2,10 @@ package dev.esophose.playerparticles.particles.spawning;
import dev.esophose.playerparticles.particles.ParticleEffect;
import dev.esophose.playerparticles.particles.ParticleEffect.ParticleProperty;
import dev.esophose.playerparticles.particles.data.ColorTransition;
import dev.esophose.playerparticles.particles.data.OrdinaryColor;
import dev.esophose.playerparticles.particles.data.ParticleColor;
import dev.esophose.playerparticles.particles.data.Vibration;
import dev.esophose.playerparticles.particles.spawning.reflective.ReflectionUtils;
import dev.esophose.playerparticles.particles.spawning.reflective.ReflectionUtils.PackageType;
import dev.esophose.playerparticles.particles.spawning.reflective.ReflectiveParticleEffectMapping;
@ -24,7 +26,7 @@ public class ReflectiveParticleSpawner extends ParticleSpawner {
if (particleEffect.hasProperty(ParticleProperty.REQUIRES_MATERIAL_DATA))
throw new ParticleDataException("This particle effect requires additional data");
List<Player> players = this.getPlayersInRange(center, isLongRange, owner);
List<Player> players = getPlayersInRange(center, isLongRange, owner);
if (players.isEmpty())
return;
@ -36,11 +38,11 @@ public class ReflectiveParticleSpawner extends ParticleSpawner {
if (!particleEffect.hasProperty(ParticleProperty.COLORABLE))
throw new ParticleColorException("This particle effect is not colorable");
List<Player> players = this.getPlayersInRange(center, isLongRange, owner);
List<Player> players = getPlayersInRange(center, isLongRange, owner);
if (players.isEmpty())
return;
new ParticlePacket(particleEffect, color, true).sendTo(center, this.getPlayersInRange(center, isLongRange, owner));
new ParticlePacket(particleEffect, color, true).sendTo(center, getPlayersInRange(center, isLongRange, owner));
}
@Override
@ -48,11 +50,21 @@ public class ReflectiveParticleSpawner extends ParticleSpawner {
if (!particleEffect.hasProperty(ParticleProperty.REQUIRES_MATERIAL_DATA))
throw new ParticleDataException("This particle effect does not require additional data");
List<Player> players = this.getPlayersInRange(center, isLongRange, owner);
List<Player> players = getPlayersInRange(center, isLongRange, owner);
if (players.isEmpty())
return;
new ParticlePacket(particleEffect, offsetX, offsetY, offsetZ, speed, amount, true, spawnMaterial).sendTo(center, this.getPlayersInRange(center, isLongRange, owner));
new ParticlePacket(particleEffect, offsetX, offsetY, offsetZ, speed, amount, true, spawnMaterial).sendTo(center, getPlayersInRange(center, isLongRange, owner));
}
@Override
public void display(ParticleEffect particleEffect, ColorTransition colorTransition, double offsetX, double offsetY, double offsetZ, int amount, Location center, boolean isLongRange, Player owner) {
throw new IllegalStateException("This method is unavailable for legacy versions");
}
@Override
public void display(ParticleEffect particleEffect, Vibration vibration, double offsetX, double offsetY, double offsetZ, int amount, Location center, boolean isLongRange, Player owner) {
throw new IllegalStateException("This method is unavailable for legacy versions");
}
/**

View File

@ -3,10 +3,12 @@ package dev.esophose.playerparticles.particles.spawning;
import dev.esophose.playerparticles.manager.ConfigurationManager.Setting;
import dev.esophose.playerparticles.particles.ParticleEffect;
import dev.esophose.playerparticles.particles.ParticleEffect.ParticleProperty;
import dev.esophose.playerparticles.particles.data.ColorTransition;
import dev.esophose.playerparticles.particles.data.OrdinaryColor;
import dev.esophose.playerparticles.particles.data.ParticleColor;
import dev.esophose.playerparticles.particles.data.Vibration;
import dev.esophose.playerparticles.util.NMSUtil;
import org.bukkit.Color;
import dev.esophose.playerparticles.util.VibrationUtil;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Particle.DustOptions;
@ -21,7 +23,7 @@ public class SpigotParticleSpawner extends ParticleSpawner {
if (particleEffect.hasProperty(ParticleProperty.REQUIRES_MATERIAL_DATA))
throw new ParticleDataException("This particle effect requires additional data");
for (Player player : this.getPlayersInRange(center, isLongRange, owner))
for (Player player : getPlayersInRange(center, isLongRange, owner))
player.spawnParticle(particleEffect.getSpigotEnum(), center.getX(), center.getY(), center.getZ(), amount, offsetX, offsetY, offsetZ, speed);
}
@ -32,11 +34,11 @@ public class SpigotParticleSpawner extends ParticleSpawner {
if (particleEffect == ParticleEffect.DUST && NMSUtil.getVersionNumber() >= 13) { // DUST uses a special data object for spawning in 1.13+
OrdinaryColor dustColor = (OrdinaryColor) color;
DustOptions dustOptions = new DustOptions(Color.fromRGB(dustColor.getRed(), dustColor.getGreen(), dustColor.getBlue()), Setting.DUST_SIZE.getFloat());
for (Player player : this.getPlayersInRange(center, isLongRange, owner))
DustOptions dustOptions = new DustOptions(dustColor.toSpigot(), Setting.DUST_SIZE.getFloat());
for (Player player : getPlayersInRange(center, isLongRange, owner))
player.spawnParticle(particleEffect.getSpigotEnum(), center.getX(), center.getY(), center.getZ(), 1, 0, 0, 0, 0, dustOptions);
} else {
for (Player player : this.getPlayersInRange(center, isLongRange, owner)) {
for (Player player : getPlayersInRange(center, isLongRange, owner)) {
// Minecraft clients require that you pass a non-zero value if the Red value should be zero
player.spawnParticle(particleEffect.getSpigotEnum(), center.getX(), center.getY(), center.getZ(), 0, particleEffect == ParticleEffect.DUST && color.getValueX() == 0 ? Float.MIN_VALUE : color.getValueX(), color.getValueY(), color.getValueZ(), 1);
}
@ -58,8 +60,29 @@ public class SpigotParticleSpawner extends ParticleSpawner {
extraData = new MaterialData(spawnMaterial); // Deprecated, only used in versions < 1.13
}
for (Player player : this.getPlayersInRange(center, isLongRange, owner))
for (Player player : getPlayersInRange(center, isLongRange, owner))
player.spawnParticle(particleEffect.getSpigotEnum(), center.getX(), center.getY(), center.getZ(), amount, offsetX, offsetY, offsetZ, speed, extraData);
}
@Override
public void display(ParticleEffect particleEffect, ColorTransition colorTransition, double offsetX, double offsetY, double offsetZ, int amount, Location center, boolean isLongRange, Player owner) {
if (NMSUtil.getVersionNumber() < 17)
return;
if (!particleEffect.hasProperty(ParticleProperty.COLORABLE_TRANSITION))
throw new ParticleDataException("This particle effect does not require additional data");
org.bukkit.Particle.DustTransition dustTransition = new org.bukkit.Particle.DustTransition(colorTransition.getStartColor().toSpigot(), colorTransition.getEndColor().toSpigot(), Setting.DUST_SIZE.getFloat());
for (Player player : getPlayersInRange(center, isLongRange, owner))
player.spawnParticle(particleEffect.getSpigotEnum(), center.getX(), center.getY(), center.getZ(), amount, offsetX, offsetY, offsetZ, dustTransition);
}
@Override
public void display(ParticleEffect particleEffect, Vibration vibration, double offsetX, double offsetY, double offsetZ, int amount, Location center, boolean isLongRange, Player owner) {
if (NMSUtil.getVersionNumber() < 17)
return;
VibrationUtil.spawnParticles(particleEffect, vibration, offsetX, offsetY, offsetZ, amount, center, isLongRange, owner);
}
}

View File

@ -13,6 +13,7 @@ import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.ProjectileLaunchEvent;
@ -84,7 +85,7 @@ public class ParticleStyleArrows extends DefaultParticleStyle implements Listene
*
* @param event The ProjectileLaunchEvent
*/
@EventHandler
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onProjectileLaunch(ProjectileLaunchEvent event) {
if (!(event.getEntity().getShooter() instanceof Player))
return;

View File

@ -63,7 +63,7 @@ public class ParticleStyleBlockBreak extends DefaultParticleStyle implements Lis
this.particleSpeed = config.getDouble("particle-speed");
}
@EventHandler(priority = EventPriority.MONITOR)
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockBreak(BlockBreakEvent event) {
ParticleManager particleManager = PlayerParticles.getInstance().getManager(ParticleManager.class);

View File

@ -63,7 +63,7 @@ public class ParticleStyleBlockPlace extends DefaultParticleStyle implements Lis
this.particleSpeed = config.getDouble("particle-speed");
}
@EventHandler(priority = EventPriority.MONITOR)
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockPlace(BlockPlaceEvent event) {
ParticleManager particleManager = PlayerParticles.getInstance().getManager(ParticleManager.class);

View File

@ -59,7 +59,7 @@ public class ParticleStyleCelebration extends DefaultParticleStyle {
this.step = 0;
Random random = new Random();
for (PPlayer pplayer : particleManager.getPPlayers()) {
for (PPlayer pplayer : particleManager.getPPlayers().values()) {
Player player = pplayer.getPlayer();
if (player != null && (NMSUtil.getVersionNumber() < 8 || player.getGameMode() != GameMode.SPECTATOR) && permissionManager.isWorldEnabled(player.getWorld().getName()))
for (ParticlePair particle : pplayer.getActiveParticles())

View File

@ -8,6 +8,10 @@ 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 java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import org.bukkit.Location;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@ -16,11 +20,6 @@ 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;
@ -70,7 +69,7 @@ public class ParticleStyleDeath extends DefaultParticleStyle implements Listener
}
@EventHandler(priority = EventPriority.MONITOR)
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onDeath(PlayerDeathEvent event) {
final EntityDamageEvent damageEvent = event.getEntity().getLastDamageCause();

View File

@ -5,7 +5,6 @@ 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;

View File

@ -15,6 +15,7 @@ import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerFishEvent;
import org.bukkit.projectiles.ProjectileSource;
@ -71,7 +72,7 @@ public class ParticleStyleFishing extends DefaultParticleStyle implements Listen
return false;
}
@EventHandler
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerFish(PlayerFishEvent event) {
// Done through a string switch for 1.9.4 compatibility
switch (event.getState().toString()) {

View File

@ -45,7 +45,7 @@ public class ParticleStyleHurt extends DefaultParticleStyle implements Listener
return Collections.singletonList("CACTUS");
}
@EventHandler(priority = EventPriority.MONITOR)
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onEntityDamage(EntityDamageEvent event) {
ParticleManager particleManager = PlayerParticles.getInstance().getManager(ParticleManager.class);

View File

@ -70,6 +70,13 @@ public class ParticleStyleInvocation extends DefaultParticleStyle {
case DAMAGE_INDICATOR:
case ENCHANTED_HIT:
return 2;
case ELECTRIC_SPARK:
return 3;
case SCRAPE:
return 2.5;
case WAX_OFF:
case WAX_ON:
return 4.5;
case DRAGON_BREATH:
return 0.01;
case ENCHANT:

View File

@ -19,6 +19,9 @@ import org.bukkit.event.player.PlayerMoveEvent;
public class ParticleStyleMove extends DefaultParticleStyle implements Listener {
private final ParticleManager particleManager = PlayerParticles.getInstance().getManager(ParticleManager.class);
private final DataManager dataManager = PlayerParticles.getInstance().getManager(DataManager.class);
private int multiplier;
protected ParticleStyleMove() {
@ -55,19 +58,22 @@ public class ParticleStyleMove extends DefaultParticleStyle implements Listener
this.multiplier = config.getInt("multiplier");
}
@EventHandler(priority = EventPriority.MONITOR)
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerMove(PlayerMoveEvent event) {
ParticleManager particleManager = PlayerParticles.getInstance().getManager(ParticleManager.class);
Location from = event.getFrom();
Location to = event.getTo();
if (to == null || (from.getX() == to.getX() && from.getY() == to.getY() && from.getZ() == to.getZ()))
return;
Player player = event.getPlayer();
PPlayer pplayer = PlayerParticles.getInstance().getManager(DataManager.class).getPPlayer(player.getUniqueId());
PPlayer pplayer = this.dataManager.getPPlayer(player.getUniqueId());
if (pplayer == null)
return;
for (ParticlePair particle : pplayer.getActiveParticlesForStyle(DefaultStyles.MOVE)) {
Location loc = player.getLocation().clone();
loc.setY(loc.getY() + 0.05);
particleManager.displayParticles(pplayer, player.getWorld(), particle, DefaultStyles.MOVE.getParticles(particle, loc), false);
this.particleManager.displayParticles(pplayer, player.getWorld(), particle, DefaultStyles.MOVE.getParticles(particle, loc), false);
}
}

View File

@ -34,7 +34,7 @@ public class ParticleStyleOutline extends DefaultParticleStyle {
ParticleManager particleManager = PlayerParticles.getInstance().getManager(ParticleManager.class);
boolean fixed = false;
for (PPlayer pplayer : particleManager.getPPlayers()) {
for (PPlayer pplayer : particleManager.getPPlayers().values()) {
if (!pplayer.getUniqueId().equals(particle.getOwnerUniqueId()))
continue;

View File

@ -50,6 +50,12 @@ public class ParticleStylePulse extends DefaultParticleStyle {
case DAMAGE_INDICATOR:
case ENCHANTED_HIT:
return 1;
case ELECTRIC_SPARK:
case SCRAPE:
return 2;
case WAX_OFF:
case WAX_ON:
return 3;
case DRAGON_BREATH:
return 0.01;
case ENCHANT:

View File

@ -69,7 +69,7 @@ public class ParticleStyleSwords extends DefaultParticleStyle implements Listene
this.swordNames = config.getStringList("sword-materials");
}
@EventHandler(priority = EventPriority.MONITOR)
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onEntityDamageEntity(EntityDamageByEntityEvent event) {
ParticleManager particleManager = PlayerParticles.getInstance().getManager(ParticleManager.class);

View File

@ -70,7 +70,7 @@ public class ParticleStyleTeleport extends DefaultParticleStyle implements Liste
this.speed = config.getDouble("speed");
}
@EventHandler(priority = EventPriority.MONITOR)
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerTeleport(PlayerTeleportEvent event) {
TeleportCause cause = event.getCause();
if (cause == TeleportCause.UNKNOWN)

View File

@ -18,6 +18,9 @@ import org.bukkit.event.player.PlayerMoveEvent;
public class ParticleStyleTrail extends DefaultParticleStyle implements Listener {
private final ParticleManager particleManager = PlayerParticles.getInstance().getManager(ParticleManager.class);
private final DataManager dataManager = PlayerParticles.getInstance().getManager(DataManager.class);
private double offset;
private double spread;
private double speed;
@ -55,19 +58,22 @@ public class ParticleStyleTrail extends DefaultParticleStyle implements Listener
this.speed = config.getDouble("speed");
}
@EventHandler(priority = EventPriority.MONITOR)
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerMove(PlayerMoveEvent event) {
ParticleManager particleManager = PlayerParticles.getInstance().getManager(ParticleManager.class);
Location from = event.getFrom();
Location to = event.getTo();
if (to == null || (from.getX() == to.getX() && from.getY() == to.getY() && from.getZ() == to.getZ()))
return;
Player player = event.getPlayer();
PPlayer pplayer = PlayerParticles.getInstance().getManager(DataManager.class).getPPlayer(player.getUniqueId());
PPlayer pplayer = this.dataManager.getPPlayer(player.getUniqueId());
if (pplayer == null)
return;
for (ParticlePair particle : pplayer.getActiveParticlesForStyle(DefaultStyles.TRAIL)) {
Location loc = player.getLocation().clone();
loc.setY(loc.getY() + 1);
particleManager.displayParticles(pplayer, player.getWorld(), particle, DefaultStyles.TRAIL.getParticles(particle, loc), false);
this.particleManager.displayParticles(pplayer, player.getWorld(), particle, DefaultStyles.TRAIL.getParticles(particle, loc), false);
}
}

View File

@ -47,6 +47,12 @@ public class ParticleStyleWhirl extends DefaultParticleStyle {
case DAMAGE_INDICATOR:
case ENCHANTED_HIT:
return 1;
case ELECTRIC_SPARK:
case SCRAPE:
return 2;
case WAX_OFF:
case WAX_ON:
return 3;
case DRAGON_BREATH:
return 0.01;
case ENCHANT:

View File

@ -48,6 +48,12 @@ public class ParticleStyleWhirlwind extends DefaultParticleStyle {
case DAMAGE_INDICATOR:
case ENCHANTED_HIT:
return 1;
case ELECTRIC_SPARK:
case SCRAPE:
return 2;
case WAX_OFF:
case WAX_ON:
return 3;
case DRAGON_BREATH:
return 0.01;
case ENCHANT:

View File

@ -15,7 +15,7 @@ public final class NMSUtil {
public static String getVersion() {
if (cachedVersion == null) {
String name = Bukkit.getServer().getClass().getPackage().getName();
cachedVersion = name.substring(name.lastIndexOf('.') + 1) + ".";
cachedVersion = name.substring(name.lastIndexOf('.') + 1);
}
return cachedVersion;
}
@ -28,7 +28,7 @@ public final class NMSUtil {
public static int getVersionNumber() {
if (cachedVersionNumber == -1) {
String name = getVersion().substring(3);
cachedVersionNumber = Integer.parseInt(name.substring(0, name.length() - 4));
cachedVersionNumber = Integer.parseInt(name.substring(0, name.length() - 3));
}
return cachedVersionNumber;
}

View File

@ -1,14 +1,19 @@
package dev.esophose.playerparticles.util;
import dev.esophose.playerparticles.manager.ConfigurationManager.Setting;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import org.apache.commons.lang.WordUtils;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
@ -19,6 +24,7 @@ public final class ParticleUtils {
public static final Material FALLBACK_MATERIAL;
public static final List<Material> BLOCK_MATERIALS, ITEM_MATERIALS;
public static final List<String> BLOCK_MATERIALS_STRING, ITEM_MATERIALS_STRING;
private static Method LivingEntity_getTargetBlock;
static {
if (NMSUtil.getVersionNumber() > 7) {
@ -48,6 +54,14 @@ public final class ParticleUtils {
BLOCK_MATERIALS_STRING = BLOCK_MATERIALS.stream().map(Enum::name).map(String::toLowerCase).collect(Collectors.toList());
ITEM_MATERIALS_STRING = ITEM_MATERIALS.stream().map(Enum::name).map(String::toLowerCase).collect(Collectors.toList());
if (NMSUtil.getVersionNumber() < 8) {
try {
LivingEntity_getTargetBlock = LivingEntity.class.getDeclaredMethod("getTargetBlock", HashSet.class, int.class);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
}
private ParticleUtils() {
@ -137,4 +151,21 @@ public final class ParticleUtils {
&& !player.hasPotionEffect(PotionEffectType.INVISIBILITY));
}
public static String rgbToHex(int r, int g, int b) {
return String.format("%02x%02x%02x", r, g, b);
}
public static Block getTargetBlock(Player player) {
if (NMSUtil.getVersionNumber() > 7) {
return player.getTargetBlock((Set<Material>) null, 8); // Need the Set<Material> cast for 1.9 support
} else {
try {
return (Block) LivingEntity_getTargetBlock.invoke(player, null, 8);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
return player.getLocation().getBlock();
}
}
}
}

View File

@ -0,0 +1,25 @@
package dev.esophose.playerparticles.util;
import dev.esophose.playerparticles.particles.ParticleEffect;
import dev.esophose.playerparticles.particles.data.Vibration;
import dev.esophose.playerparticles.particles.spawning.ParticleSpawner;
import dev.esophose.playerparticles.particles.spawning.SpigotParticleSpawner;
import org.bukkit.Location;
import org.bukkit.entity.Player;
/**
* For some reason the Classloader absolutely needs this to not be loaded for versions lower than 1.17.
* It really likes complaining about org.bukkit.Vibration$Destination being missing even before it's accessed.
*/
public class VibrationUtil {
public static void spawnParticles(ParticleEffect particleEffect, Vibration vibration, double offsetX, double offsetY, double offsetZ, int amount, Location center, boolean isLongRange, Player owner) {
if (!particleEffect.hasProperty(ParticleEffect.ParticleProperty.VIBRATION))
throw new ParticleSpawner.ParticleDataException("This particle effect does not require additional data");
org.bukkit.Vibration data = new org.bukkit.Vibration(center, new org.bukkit.Vibration.Destination.BlockDestination(center), vibration.getDuration());
for (Player player : SpigotParticleSpawner.getPlayersInRange(center, isLongRange, owner))
player.spawnParticle(particleEffect.getSpigotEnum(), center.getX(), center.getY(), center.getZ(), amount, offsetX, offsetY, offsetZ, data);
}
}

View File

@ -2,9 +2,12 @@ package dev.esophose.playerparticles.util.inputparser;
import dev.esophose.playerparticles.particles.PPlayer;
import dev.esophose.playerparticles.particles.ParticleEffect;
import dev.esophose.playerparticles.particles.data.ColorTransition;
import dev.esophose.playerparticles.particles.data.NoteColor;
import dev.esophose.playerparticles.particles.data.OrdinaryColor;
import dev.esophose.playerparticles.particles.data.Vibration;
import dev.esophose.playerparticles.styles.ParticleStyle;
import dev.esophose.playerparticles.util.inputparser.parsable.ParsableColorTransition;
import dev.esophose.playerparticles.util.inputparser.parsable.ParsableInteger;
import dev.esophose.playerparticles.util.inputparser.parsable.ParsableLocation;
import dev.esophose.playerparticles.util.inputparser.parsable.ParsableMaterial;
@ -13,6 +16,7 @@ import dev.esophose.playerparticles.util.inputparser.parsable.ParsableOrdinaryCo
import dev.esophose.playerparticles.util.inputparser.parsable.ParsableParticleEffect;
import dev.esophose.playerparticles.util.inputparser.parsable.ParsableParticleStyle;
import dev.esophose.playerparticles.util.inputparser.parsable.ParsableString;
import dev.esophose.playerparticles.util.inputparser.parsable.ParsableVibration;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@ -32,6 +36,8 @@ public class InputParser {
this.put(Material.class, new ParsableMaterial());
this.put(NoteColor.class, new ParsableNoteColor());
this.put(OrdinaryColor.class, new ParsableOrdinaryColor());
this.put(ColorTransition.class, new ParsableColorTransition());
this.put(Vibration.class, new ParsableVibration());
this.put(ParticleEffect.class, new ParsableParticleEffect());
this.put(ParticleStyle.class, new ParsableParticleStyle());
this.put(String.class, new ParsableString());
@ -72,4 +78,11 @@ public class InputParser {
return !this.input.isEmpty();
}
/**
* @return the number of input values remaining
*/
public int numRemaining() {
return this.input.size();
}
}

View File

@ -0,0 +1,46 @@
package dev.esophose.playerparticles.util.inputparser.parsable;
import dev.esophose.playerparticles.particles.PPlayer;
import dev.esophose.playerparticles.particles.data.ColorTransition;
import dev.esophose.playerparticles.particles.data.OrdinaryColor;
import dev.esophose.playerparticles.util.inputparser.Parsable;
import java.awt.Color;
import java.util.List;
public class ParsableColorTransition extends Parsable<ColorTransition> {
public ParsableColorTransition() {
super(ColorTransition.class);
}
@Override
public ColorTransition parse(PPlayer pplayer, List<String> inputs) {
OrdinaryColor startColor = this.parseColor(inputs);
OrdinaryColor endColor = this.parseColor(inputs);
return new ColorTransition(startColor, endColor);
}
private OrdinaryColor parseColor(List<String> inputs) {
String input = inputs.remove(0);
// Try hex values first
if (input.startsWith("#")) {
try {
Color color = Color.decode(input);
return new OrdinaryColor(color.getRed(), color.getGreen(), color.getBlue());
} catch (NumberFormatException ignored) { }
}
// Try color names
OrdinaryColor namedColor = ParsableOrdinaryColor.COLOR_NAME_MAP.get(input.toLowerCase());
if (namedColor != null)
return namedColor;
String input2 = inputs.remove(0);
String input3 = inputs.remove(0);
// Use rgb
return new OrdinaryColor(Integer.parseInt(input), Integer.parseInt(input2), Integer.parseInt(input3));
}
}

View File

@ -1,33 +1,17 @@
package dev.esophose.playerparticles.util.inputparser.parsable;
import dev.esophose.playerparticles.particles.PPlayer;
import dev.esophose.playerparticles.util.NMSUtil;
import dev.esophose.playerparticles.util.ParticleUtils;
import dev.esophose.playerparticles.util.inputparser.Parsable;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
public class ParsableLocation extends Parsable<Location> {
private static Method LivingEntity_getTargetBlock;
static {
if (NMSUtil.getVersionNumber() < 8) {
try {
LivingEntity_getTargetBlock = LivingEntity.class.getDeclaredMethod("getTargetBlock", HashSet.class, int.class);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
}
public ParsableLocation() {
super(Location.class);
}
@ -38,17 +22,7 @@ public class ParsableLocation extends Parsable<Location> {
Player player = pplayer.getPlayer();
if (player != null && input.equalsIgnoreCase("looking")) {
Block targetBlock;
if (NMSUtil.getVersionNumber() > 7) {
targetBlock = player.getTargetBlock((Set<Material>) null, 8); // Need the Set<Material> cast for 1.9 support
} else {
try {
targetBlock = (Block) LivingEntity_getTargetBlock.invoke(player, null, 8);
} catch (ReflectiveOperationException e) {
targetBlock = player.getLocation().getBlock();
e.printStackTrace();
}
}
Block targetBlock = ParticleUtils.getTargetBlock(player);
int maxDistanceSqrd = 6 * 6;
if (targetBlock.getLocation().distanceSquared(player.getLocation()) > maxDistanceSqrd)

View File

@ -4,17 +4,16 @@ import dev.esophose.playerparticles.particles.PPlayer;
import dev.esophose.playerparticles.particles.data.OrdinaryColor;
import dev.esophose.playerparticles.util.inputparser.Parsable;
import java.awt.Color;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ParsableOrdinaryColor extends Parsable<OrdinaryColor> {
private static Map<String, OrdinaryColor> colorNameMap;
public static final Map<String, OrdinaryColor> COLOR_NAME_MAP;
static {
colorNameMap = new HashMap<String, OrdinaryColor>() {{
COLOR_NAME_MAP = new HashMap<String, OrdinaryColor>() {{
this.put("red", new OrdinaryColor(255, 0, 0));
this.put("orange", new OrdinaryColor(255, 140, 0));
this.put("yellow", new OrdinaryColor(255, 255, 0));
@ -53,7 +52,7 @@ public class ParsableOrdinaryColor extends Parsable<OrdinaryColor> {
}
// Try color names
OrdinaryColor namedColor = colorNameMap.get(input.toLowerCase());
OrdinaryColor namedColor = COLOR_NAME_MAP.get(input.toLowerCase());
if (namedColor != null)
return namedColor;
@ -63,12 +62,5 @@ public class ParsableOrdinaryColor extends Parsable<OrdinaryColor> {
// Use rgb
return new OrdinaryColor(Integer.parseInt(input), Integer.parseInt(input2), Integer.parseInt(input3));
}
/**
* @return the color String to OrdinaryColor mapping
*/
public static Map<String, OrdinaryColor> getColorNameMap() {
return Collections.unmodifiableMap(colorNameMap);
}
}

View File

@ -0,0 +1,20 @@
package dev.esophose.playerparticles.util.inputparser.parsable;
import dev.esophose.playerparticles.particles.PPlayer;
import dev.esophose.playerparticles.particles.data.Vibration;
import dev.esophose.playerparticles.util.inputparser.Parsable;
import java.util.List;
public class ParsableVibration extends Parsable<Vibration> {
public ParsableVibration() {
super(Vibration.class);
}
@Override
public Vibration parse(PPlayer pplayer, List<String> inputs) {
String input = inputs.remove(0);
return new Vibration(Math.abs(Integer.parseInt(input)));
}
}