GUI Finished, remove message when opening the GUI with /pp, note data range is now 0-24

This commit is contained in:
Esophose 2018-11-07 03:21:46 -07:00
parent 98a570a236
commit b1e23b6812
30 changed files with 934 additions and 117 deletions

View file

@ -23,8 +23,6 @@
<configuration>
<source>1.8</source>
<target>1.8</target>
<fork>true</fork>
<executable>C:\Program Files\Java\jdk1.8.0_161\bin\javac</executable>
</configuration>
</plugin>
<plugin>

View file

@ -1,9 +1,9 @@
/*
* TODO: v5.3
* TODO: v5.3 (actually v6)
* + Add new style 'tornado'
* + Add new style 'doubleorbit'
* * Adjust PParticles to use a Vector instead of a Location
* * Setting in config.yml to disable non-event styles while the player is moving
* * Finish rewriting the GUI
*/
package com.esophose.playerparticles;

View file

@ -73,7 +73,7 @@ public class AddCommandModule implements CommandModule {
return;
}
if (note < 0 || note > 23) {
if (note < 0 || note > 24) {
LangManager.sendMessage(pplayer, Lang.DATA_INVALID_NOTE);
return;
}
@ -143,10 +143,10 @@ public class AddCommandModule implements CommandModule {
List<String> matches = new ArrayList<String>();
if (args.length <= 1) { // Effect name
if (args.length == 0) matches = PermissionManager.getEffectsUserHasPermissionFor(p);
else StringUtil.copyPartialMatches(args[0], PermissionManager.getEffectsUserHasPermissionFor(p), matches);
if (args.length == 0) matches = PermissionManager.getEffectNamesUserHasPermissionFor(p);
else StringUtil.copyPartialMatches(args[0], PermissionManager.getEffectNamesUserHasPermissionFor(p), matches);
} else if (args.length == 2) { // Style name
StringUtil.copyPartialMatches(args[1], PermissionManager.getStylesUserHasPermissionFor(p), matches);
StringUtil.copyPartialMatches(args[1], PermissionManager.getStyleNamesUserHasPermissionFor(p), matches);
} else if (args.length >= 3) { // Data
ParticleEffect effect = ParticleEffect.fromName(args[0]);
if (effect != null) {
@ -154,7 +154,7 @@ public class AddCommandModule implements CommandModule {
List<String> possibleValues = new ArrayList<String>();
if (effect == ParticleEffect.NOTE) { // Note data
if (args.length == 3) {
possibleValues.add("<0-23>");
possibleValues.add("<0-24>");
possibleValues.add("rainbow");
}
} else { // Color data

View file

@ -45,8 +45,8 @@ public class DataCommandModule implements CommandModule {
public List<String> onTabComplete(PPlayer pplayer, String[] args) {
List<String> matches = new ArrayList<String>();
if (args.length <= 1) {
if (args.length == 0) matches = PermissionManager.getEffectsUserHasPermissionFor(pplayer.getPlayer());
else StringUtil.copyPartialMatches(args[0], PermissionManager.getEffectsUserHasPermissionFor(pplayer.getPlayer()), matches);
if (args.length == 0) matches = PermissionManager.getEffectNamesUserHasPermissionFor(pplayer.getPlayer());
else StringUtil.copyPartialMatches(args[0], PermissionManager.getEffectNamesUserHasPermissionFor(pplayer.getPlayer()), matches);
}
return matches;
}

View file

@ -154,7 +154,7 @@ public class EditCommandModule implements CommandModule {
return;
}
if (note < 0 || note > 23) {
if (note < 0 || note > 24) {
LangManager.sendMessage(pplayer, Lang.DATA_INVALID_NOTE);
return;
}
@ -253,11 +253,11 @@ public class EditCommandModule implements CommandModule {
switch (args[1].toLowerCase()) {
case "effect":
if (args.length == 3)
StringUtil.copyPartialMatches(args[2], PermissionManager.getEffectsUserHasPermissionFor(p), matches);
StringUtil.copyPartialMatches(args[2], PermissionManager.getEffectNamesUserHasPermissionFor(p), matches);
break;
case "style":
if (args.length == 3)
StringUtil.copyPartialMatches(args[2], PermissionManager.getStylesUserHasPermissionFor(p), matches);
StringUtil.copyPartialMatches(args[2], PermissionManager.getStyleNamesUserHasPermissionFor(p), matches);
break;
case "data":
ParticleEffect effect = pplayer.getActiveParticle(id).getEffect();
@ -265,7 +265,7 @@ public class EditCommandModule implements CommandModule {
List<String> possibleValues = new ArrayList<String>();
if (effect == ParticleEffect.NOTE) { // Note data
if (args.length == 3) {
possibleValues.add("<0-23>");
possibleValues.add("<0-24>");
possibleValues.add("rainbow");
}
} else { // Color data

View file

@ -15,7 +15,7 @@ public class EffectsCommandModule implements CommandModule {
public void onCommandExecute(PPlayer pplayer, String[] args) {
Player p = pplayer.getPlayer();
List<String> effectList = PermissionManager.getEffectsUserHasPermissionFor(p);
List<String> effectList = PermissionManager.getEffectNamesUserHasPermissionFor(p);
if (effectList.isEmpty()) {
LangManager.sendMessage(p, Lang.EFFECT_LIST_EMPTY);
return;

View file

@ -201,7 +201,7 @@ public class FixedCommandModule implements CommandModule {
return;
}
if (note < 0 || note > 23) {
if (note < 0 || note > 24) {
LangManager.sendMessage(p, Lang.FIXED_CREATE_DATA_ERROR);
return;
}
@ -445,9 +445,9 @@ public class FixedCommandModule implements CommandModule {
}
if (args.length == 5) {
StringUtil.copyPartialMatches(args[4], PermissionManager.getEffectsUserHasPermissionFor(p), matches);
StringUtil.copyPartialMatches(args[4], PermissionManager.getEffectNamesUserHasPermissionFor(p), matches);
} else if (args.length == 6) {
StringUtil.copyPartialMatches(args[5], PermissionManager.getStylesUserHasPermissionFor(p), matches);
StringUtil.copyPartialMatches(args[5], PermissionManager.getStyleNamesUserHasPermissionFor(p), matches);
} else if (args.length >= 7) {
ParticleEffect effect = ParticleEffect.fromName(args[4]);
if (effect != null) {
@ -455,7 +455,7 @@ public class FixedCommandModule implements CommandModule {
List<String> possibleValues = new ArrayList<String>();
if (effect == ParticleEffect.NOTE) { // Note data
if (args.length == 7) {
possibleValues.add("<0-23>");
possibleValues.add("<0-24>");
possibleValues.add("rainbow");
}
} else { // Color data

View file

@ -26,7 +26,7 @@ public class GUICommandModule implements CommandModule {
return;
}
if (PermissionManager.getEffectsUserHasPermissionFor(pplayer.getPlayer()).isEmpty()) {
if (PermissionManager.getEffectNamesUserHasPermissionFor(pplayer.getPlayer()).isEmpty()) {
if (byDefault) {
LangManager.sendMessage(pplayer, Lang.COMMAND_ERROR_UNKNOWN);
} else {
@ -35,10 +35,6 @@ public class GUICommandModule implements CommandModule {
return;
}
if (byDefault) {
LangManager.sendMessage(pplayer, Lang.GUI_BY_DEFAULT);
}
GuiHandler.openDefault(pplayer);
}

View file

@ -102,7 +102,7 @@ public class ParticleCommandHandler implements CommandExecutor, TabCompleter {
CommandModule commandModule = findMatchingCommand(commandName);
if (commandModule != null) {
if (commandModule.requiresEffects() && PermissionManager.getEffectsUserHasPermissionFor(p).isEmpty()) {
if (commandModule.requiresEffects() && PermissionManager.getEffectNamesUserHasPermissionFor(p).isEmpty()) {
LangManager.sendMessage(p, Lang.COMMAND_ERROR_NO_EFFECTS);
} else {
String[] cmdArgs = new String[0];

View file

@ -15,7 +15,7 @@ public class StylesCommandModule implements CommandModule {
public void onCommandExecute(PPlayer pplayer, String[] args) {
Player p = pplayer.getPlayer();
List<String> styleNames = PermissionManager.getStylesUserHasPermissionFor(p);
List<String> styleNames = PermissionManager.getStyleNamesUserHasPermissionFor(p);
String toSend = "";
for (String name : styleNames) {
toSend += name + ", ";

View file

@ -6,29 +6,80 @@ import org.bukkit.Material;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.material.Dye;
import com.esophose.playerparticles.gui.GuiInventoryEditData.ColorData;
public class GuiActionButton {
private int slot;
private Material[] icons;
private String[] names;
private ColorData[] colors;
private String name;
private String[] lore;
private GuiActionButtonClickCallback onClick;
private int iconIndex;
public GuiActionButton(int slot, Material[] icons, String[] names, String[] lore, GuiActionButtonClickCallback onClick) {
/**
* Constructor for creating animated icons
*
* @param slot The slot ID of the inventory
* @param icons The Materials that this icon will cycle through
* @param name The name that this icon will use
* @param lore The lore of this icon
* @param onClick The callback to execute when this button is clicked
*/
public GuiActionButton(int slot, Material[] icons, String name, String[] lore, GuiActionButtonClickCallback onClick) {
this.slot = slot;
this.icons = icons;
this.names = names;
this.colors = null;
this.name = name;
this.lore = lore;
this.onClick = onClick;
if (icons.length != names.length)
throw new IllegalArgumentException("icons and names must have the same length!");
}
/**
* Constructor for creating non-animated icons
*
* @param slot The slot ID of the inventory
* @param icons The Materials that this icon will use
* @param name The name that this icon will use
* @param lore The lore of this icon
* @param onClick The callback to execute when this button is clicked
*/
public GuiActionButton(int slot, Material icon, String name, String[] lore, GuiActionButtonClickCallback onClick) {
this(slot, new Material[] { icon }, new String[] { name }, lore, onClick);
this(slot, new Material[] { icon }, name, lore, onClick);
}
/**
* Constructor for creating animated icons using dyes
*
* @param slot The slot ID of the inventory
* @param iconColors The ColorData that this icon will cycle through
* @param name The name that this icon will use
* @param lore The lore of this icon
* @param onClick The callback to execute when this button is clicked
*/
public GuiActionButton(int slot, ColorData[] iconColors, String name, String[] lore, GuiActionButtonClickCallback onClick) {
this.slot = slot;
this.icons = null;
this.colors = iconColors;
this.name = name;
this.lore = lore;
this.onClick = onClick;
}
/**
* Constructor for creating non-animated icons using dyes
*
* @param slot The slot ID of the inventory
* @param iconColor The ColorData that this icon will use
* @param name The name that this icon will use
* @param lore The lore of this icon
* @param onClick The callback to execute when this button is clicked
*/
public GuiActionButton(int slot, ColorData iconColor, String name, String[] lore, GuiActionButtonClickCallback onClick) {
this(slot, new ColorData[] { iconColor }, name, lore, onClick);
}
/**
@ -45,11 +96,22 @@ public class GuiActionButton {
*
* @return The icon ItemStack for the GUI
*/
@SuppressWarnings("deprecation")
public ItemStack getIcon() {
ItemStack itemStack = new ItemStack(icons[this.iconIndex]);
ItemStack itemStack;
if (this.icons != null) {
itemStack = new ItemStack(this.icons[this.iconIndex]);
} else {
if (this.colors[0].getMaterial() != null) { // Use Materials
itemStack = new ItemStack(this.colors[this.iconIndex].getMaterial());
} else { // Use Dyes
itemStack = new Dye(this.colors[this.iconIndex].getDyeColor()).toItemStack(1);
}
}
ItemMeta itemMeta = itemStack.getItemMeta();
itemMeta.setDisplayName(this.names[this.iconIndex]);
itemMeta.setDisplayName(this.name);
itemMeta.setLore(Arrays.asList(this.lore));
itemMeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES, ItemFlag.HIDE_POTION_EFFECTS);
@ -72,7 +134,7 @@ public class GuiActionButton {
* Ticked at an interval to allow the icon/name to update
*/
public void onTick() {
this.iconIndex = (this.iconIndex + 1) % this.names.length;
this.iconIndex = (this.iconIndex + 1) % (this.icons != null ? this.icons.length : this.colors.length);
}
/**
@ -81,7 +143,7 @@ public class GuiActionButton {
* @return If this GuiActionButton has more than one icon/name
*/
public boolean isTickable() {
return this.icons.length > 1;
return this.icons != null ? this.icons.length > 1 : this.colors.length > 1;
}
/**

View file

@ -3,14 +3,12 @@ package com.esophose.playerparticles.gui;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.material.Dye;
import com.esophose.playerparticles.particles.PPlayer;
import com.esophose.playerparticles.util.ParticleUtils;
@ -18,17 +16,17 @@ import com.esophose.playerparticles.util.ParticleUtils;
public abstract class GuiInventory {
protected enum BorderColor {
WHITE(DyeColor.WHITE, "WHITE_STAINED_GLASS_PANE"),
ORANGE(DyeColor.ORANGE, "ORANGE_STAINED_GLASS_PANE"),
RED(DyeColor.RED, "RED_STAINED_GLASS_PANE"),
BROWN(DyeColor.BROWN, "BROWN_STAINED_GLASS_PANE"),
GREEN(DyeColor.GREEN, "GREEN_STAINED_GLASS_PANE");
WHITE(0, "WHITE_STAINED_GLASS_PANE"),
ORANGE(1, "ORANGE_STAINED_GLASS_PANE"),
RED(14, "RED_STAINED_GLASS_PANE"),
BROWN(12, "BROWN_STAINED_GLASS_PANE"),
GREEN(13, "GREEN_STAINED_GLASS_PANE");
private DyeColor dyeColor;
private short data;
private Material material;
private BorderColor(DyeColor dyeColor, String materialName) {
this.dyeColor = dyeColor;
private BorderColor(int data, String materialName) {
this.data = (short)data;
this.material = ParticleUtils.closestMatch(materialName);
}
@ -37,8 +35,8 @@ public abstract class GuiInventory {
ItemStack borderIcon;
if (this.material != null) { // Use 1.13 materials
borderIcon = new ItemStack(this.material, 1);
} else { // Use < 1.13 dye colors
borderIcon = new Dye(this.dyeColor).toItemStack(1);
} else { // Use < 1.13 data values
borderIcon = new ItemStack(Material.GLASS_PANE, 1, this.data);
}
ItemMeta meta = borderIcon.getItemMeta();
@ -128,9 +126,11 @@ public abstract class GuiInventory {
/**
* Handles clicks of GuiActionButtons
*
* @param event The InventoryClickEvent triggered when the player clicks a GuiActionButton
* @param event The InventoryClickEvent triggered when the player clicks in a GuiInventory
*/
public void onClick(InventoryClickEvent event) {
if (event.getClickedInventory() == null || !event.getClickedInventory().equals(this.inventory)) return;
int slot = event.getSlot();
boolean isShiftClick = event.isShiftClick();
@ -141,5 +141,10 @@ public abstract class GuiInventory {
}
}
}
@FunctionalInterface
public static interface GuiInventoryEditFinishedCallback {
public void execute();
}
}

View file

@ -10,7 +10,7 @@ import org.bukkit.inventory.meta.SkullMeta;
import com.esophose.playerparticles.manager.LangManager;
import com.esophose.playerparticles.manager.LangManager.Lang;
import com.esophose.playerparticles.manager.SettingManager.GUIIcon;
import com.esophose.playerparticles.manager.SettingManager.GuiIcon;
import com.esophose.playerparticles.particles.PPlayer;
import com.esophose.playerparticles.util.ParticleUtils;
@ -36,7 +36,9 @@ public class GuiInventoryDefault extends GuiInventory {
String[] currentIconLore = new String[] {
LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_ACTIVE_PARTICLES, pplayer.getActiveParticles().size()),
LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SAVED_GROUPS, pplayer.getParticleGroups().size()),
LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_FIXED_EFFECTS, pplayer.getFixedEffectIds().size())
LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_FIXED_EFFECTS, pplayer.getFixedEffectIds().size()),
"",
LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_COMMANDS_INFO)
};
currentIconMeta.setLore(Arrays.asList(currentIconLore));
currentIconMeta.setOwner(pplayer.getPlayer().getName());
@ -46,32 +48,32 @@ public class GuiInventoryDefault extends GuiInventory {
// Manage Your Particles button
GuiActionButton manageYourParticlesButton = new GuiActionButton(38,
GUIIcon.PARTICLES.get(),
GuiIcon.PARTICLES.get(),
LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_MANAGE_YOUR_PARTICLES),
new String[] { LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_MANAGE_YOUR_PARTICLES_DESCRIPTION) },
(button, isShiftClick) -> {
GuiHandler.transition(new GuiInventoryManageParticles(pplayer));
});
GuiHandler.transition(new GuiInventoryManageParticles(pplayer));
});
this.actionButtons.add(manageYourParticlesButton);
// Manage Your Groups button
GuiActionButton manageYourGroupsButton = new GuiActionButton(40,
GUIIcon.GROUPS.get(),
GuiIcon.GROUPS.get(),
LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_MANAGE_YOUR_GROUPS),
new String[] { LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_MANAGE_YOUR_GROUPS_DESCRIPTION) },
(button, isShiftClick) -> {
GuiHandler.transition(new GuiInventoryManageGroups(pplayer));
});
GuiHandler.transition(new GuiInventoryManageGroups(pplayer));
});
this.actionButtons.add(manageYourGroupsButton);
// Load Preset Groups
GuiActionButton loadPresetGroups = new GuiActionButton(42,
GUIIcon.PRESET_GROUPS.get(),
GuiIcon.PRESET_GROUPS.get(),
LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_LOAD_A_PRESET_GROUP),
new String[] { LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_LOAD_A_PRESET_GROUP_DESCRIPTION) },
(button, isShiftClick) -> {
GuiHandler.transition(new GuiInventoryLoadPresetGroups(pplayer));
});
GuiHandler.transition(new GuiInventoryLoadPresetGroups(pplayer));
});
this.actionButtons.add(loadPresetGroups);
this.populate();

View file

@ -0,0 +1,324 @@
package com.esophose.playerparticles.gui;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import com.esophose.playerparticles.manager.LangManager;
import com.esophose.playerparticles.manager.LangManager.Lang;
import com.esophose.playerparticles.manager.SettingManager.GuiIcon;
import com.esophose.playerparticles.particles.PPlayer;
import com.esophose.playerparticles.particles.ParticleEffect;
import com.esophose.playerparticles.particles.ParticleEffect.NoteColor;
import com.esophose.playerparticles.particles.ParticleEffect.OrdinaryColor;
import com.esophose.playerparticles.particles.ParticleEffect.ParticleProperty;
import com.esophose.playerparticles.particles.ParticlePair;
import com.esophose.playerparticles.util.ParticleUtils;
@SuppressWarnings("deprecation")
public class GuiInventoryEditData extends GuiInventory {
private static Random RANDOM = new Random();
private static List<Material> BLOCK_MATERIALS, ITEM_MATERIALS;
private static ColorData[] colorMapping;
private static ColorData[] rainbowColorMapping;
private static ColorData[] noteColorMapping;
static {
colorMapping = new ColorData[] {
new ColorData(DyeColor.RED, ParticleUtils.closestMatch("ROSE_RED"), new OrdinaryColor(255, 0, 0), Lang.GUI_EDIT_DATA_COLOR_RED),
new ColorData(DyeColor.ORANGE, ParticleUtils.closestMatch("ORANGE_DYE"), new OrdinaryColor(255, 140, 0), Lang.GUI_EDIT_DATA_COLOR_ORANGE),
new ColorData(DyeColor.YELLOW, ParticleUtils.closestMatch("DANDELION_YELLOW"), new OrdinaryColor(255, 255, 0), Lang.GUI_EDIT_DATA_COLOR_YELLOW),
new ColorData(DyeColor.LIME, ParticleUtils.closestMatch("LIME_DYE"), new OrdinaryColor(50, 205, 50), Lang.GUI_EDIT_DATA_COLOR_LIME_GREEN),
new ColorData(DyeColor.GREEN, ParticleUtils.closestMatch("CACTUS_GREEN"), new OrdinaryColor(0, 128, 0), Lang.GUI_EDIT_DATA_COLOR_GREEN),
new ColorData(DyeColor.BLUE, ParticleUtils.closestMatch("LAPIS_LAZULI"), new OrdinaryColor(0, 0, 255), Lang.GUI_EDIT_DATA_COLOR_BLUE),
new ColorData(DyeColor.CYAN, ParticleUtils.closestMatch("CYAN_DYE"), new OrdinaryColor(0, 139, 139), Lang.GUI_EDIT_DATA_COLOR_CYAN),
new ColorData(DyeColor.LIGHT_BLUE, ParticleUtils.closestMatch("LIGHT_BLUE_DYE"), new OrdinaryColor(173, 216, 230), Lang.GUI_EDIT_DATA_COLOR_LIGHT_BLUE),
new ColorData(DyeColor.PURPLE, ParticleUtils.closestMatch("PURPLE_DYE"), new OrdinaryColor(138, 43, 226), Lang.GUI_EDIT_DATA_COLOR_PURPLE),
new ColorData(DyeColor.MAGENTA, ParticleUtils.closestMatch("MAGENTA_DYE"), new OrdinaryColor(202, 31, 123), Lang.GUI_EDIT_DATA_COLOR_MAGENTA),
new ColorData(DyeColor.PINK, ParticleUtils.closestMatch("PINK_DYE"), new OrdinaryColor(255, 182, 193), Lang.GUI_EDIT_DATA_COLOR_PINK),
new ColorData(DyeColor.BROWN, ParticleUtils.closestMatch("COCOA_BEANS"), new OrdinaryColor(139, 69, 19), Lang.GUI_EDIT_DATA_COLOR_BROWN),
new ColorData(DyeColor.BLACK, ParticleUtils.closestMatch("INK_SAC"), new OrdinaryColor(0, 0, 0), Lang.GUI_EDIT_DATA_COLOR_BLACK),
new ColorData(DyeColor.GRAY, ParticleUtils.closestMatch("GRAY_DYE"), new OrdinaryColor(128, 128, 128), Lang.GUI_EDIT_DATA_COLOR_GRAY),
new ColorData(DyeColor.getByDyeData((byte)7), ParticleUtils.closestMatch("LIGHT_GRAY_DYE"), new OrdinaryColor(192, 192, 192), Lang.GUI_EDIT_DATA_COLOR_LIGHT_GRAY),
new ColorData(DyeColor.WHITE, ParticleUtils.closestMatch("BONE_MEAL"), new OrdinaryColor(255, 255, 255), Lang.GUI_EDIT_DATA_COLOR_WHITE),
};
rainbowColorMapping = new ColorData[] {
colorMapping[0], // Red
colorMapping[1], // Orange
colorMapping[2], // Yellow
colorMapping[3], // Lime
colorMapping[7], // Light Blue
colorMapping[5], // Blue
colorMapping[8] // Purple
};
// Note: This is supposed to be a rainbow but there's actually a bug in Minecraft since 1.8 that makes a bunch of them gray
noteColorMapping = new ColorData[] {
colorMapping[7], // Light Blue
colorMapping[7], // Light Blue
colorMapping[13], // Gray
colorMapping[10], // Pink
colorMapping[9], // Magenta
colorMapping[9], // Magenta
colorMapping[0], // Red
colorMapping[2], // Yellow
colorMapping[2], // Yellow
colorMapping[14], // Light Gray
colorMapping[13], // Gray
colorMapping[6], // Cyan
colorMapping[6], // Cyan
colorMapping[6], // Cyan
colorMapping[5], // Blue
colorMapping[8], // Purple
colorMapping[8], // Purple
colorMapping[8], // Purple
colorMapping[13], // Gray
colorMapping[4], // Green
colorMapping[3], // Lime
colorMapping[2], // Yellow
colorMapping[4], // Green
colorMapping[7], // Light Blue
colorMapping[7] // Light Blue
};
BLOCK_MATERIALS = new ArrayList<Material>();
ITEM_MATERIALS = new ArrayList<Material>();
Inventory tempInventory = Bukkit.createInventory(null, 9);
for (Material mat : Material.values()) {
// Verify an ItemStack of the material can be placed into an inventory. In 1.12 and up this can easily be checked with mat.isItem(), but that doesn't exist pre-1.12
tempInventory.clear();
tempInventory.setItem(0, new ItemStack(mat, 1));
ItemStack itemStack = tempInventory.getItem(0);
if (itemStack != null) {
if (mat.isBlock()) {
BLOCK_MATERIALS.add(mat);
} else if (!mat.isBlock()) {
ITEM_MATERIALS.add(mat);
}
}
}
}
public GuiInventoryEditData(PPlayer pplayer, ParticlePair editingParticle, List<GuiInventoryEditFinishedCallback> callbackList, int callbackListPosition) {
super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, LangManager.getText(Lang.GUI_SELECT_DATA)));
ParticleEffect pe = editingParticle.getEffect();
if (pe.hasProperty(ParticleProperty.COLORABLE)) {
if (pe == ParticleEffect.NOTE) { // Note data
this.populateNoteData(editingParticle, callbackList, callbackListPosition);
} else { // Color data
this.populateColorData(editingParticle, callbackList, callbackListPosition);
}
} else if (pe.hasProperty(ParticleProperty.REQUIRES_MATERIAL_DATA)) {
if (pe == ParticleEffect.ITEM) { // Item data
this.populateItemData(editingParticle, callbackList, callbackListPosition);
} else { // Block data
this.populateBlockData(editingParticle, callbackList, callbackListPosition);
}
}
// Back Button
GuiActionButton backButton = new GuiActionButton(INVENTORY_SIZE - 1, GuiIcon.BACK.get(), LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_BACK_BUTTON), new String[] {}, (button, isShiftClick) -> {
callbackList.get(callbackListPosition - 1).execute();
});
this.actionButtons.add(backButton);
this.populate();
}
private void populateColorData(ParticlePair editingParticle, List<GuiInventoryEditFinishedCallback> callbackList, int callbackListPosition) {
int index = 10;
int nextWrap = 17;
for (int i = 0; i < colorMapping.length; i++) {
ColorData colorData = colorMapping[i];
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[] { LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SELECT_DATA_DESCRIPTION, formattedDisplayColor) },
(button, isShiftClick) -> {
editingParticle.setColor(colorData.getOrdinaryColor());
callbackList.get(callbackListPosition + 1).execute();
});
this.actionButtons.add(setColorButton);
index++;
if (index == nextWrap) { // Loop around border
nextWrap += 9;
index += 2;
}
}
// Rainbow Color Data Button
GuiActionButton setRainbowColorButton = new GuiActionButton(40,
rainbowColorMapping,
LangManager.getText(Lang.RAINBOW),
new String[] { LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SELECT_DATA_DESCRIPTION, LangManager.getText(Lang.RAINBOW)) },
(button, isShiftClick) -> {
editingParticle.setColor(new OrdinaryColor(999, 999, 999));
callbackList.get(callbackListPosition + 1).execute();
});
this.actionButtons.add(setRainbowColorButton);
}
private void populateNoteData(ParticlePair editingParticle, List<GuiInventoryEditFinishedCallback> callbackList, int callbackListPosition) {
for (int i = 0; i < noteColorMapping.length; i++) {
ColorData colorData = noteColorMapping[i];
String formattedDisplayName = LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_SELECT_DATA_NOTE, i) + " (" + colorData.getName() + LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + ")";
String formattedDescription = LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SELECT_DATA_DESCRIPTION, LangManager.getText(Lang.GUI_SELECT_DATA_NOTE, i));
// Note Color Buttons
int noteIndex = i;
GuiActionButton setColorButton = new GuiActionButton(i,
colorData,
formattedDisplayName,
new String[] { formattedDescription },
(button, isShiftClick) -> {
editingParticle.setNoteColor(new NoteColor(noteIndex));
callbackList.get(callbackListPosition + 1).execute();
});
this.actionButtons.add(setColorButton);
}
// Rainbow Color Data Button
GuiActionButton setRainbowColorButton = new GuiActionButton(40,
rainbowColorMapping,
LangManager.getText(Lang.RAINBOW),
new String[] { LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SELECT_DATA_DESCRIPTION, LangManager.getText(Lang.RAINBOW)) },
(button, isShiftClick) -> {
editingParticle.setNoteColor(new NoteColor(99));
callbackList.get(callbackListPosition + 1).execute();
});
this.actionButtons.add(setRainbowColorButton);
}
private void populateItemData(ParticlePair editingParticle, List<GuiInventoryEditFinishedCallback> callbackList, int callbackListPosition) {
List<Material> materialBag = new ArrayList<Material>();
while (materialBag.size() < 36) { // Grab 36 random materials that are an item
Material randomMaterial = ITEM_MATERIALS.get(RANDOM.nextInt(ITEM_MATERIALS.size()));
if (!materialBag.contains(randomMaterial)) materialBag.add(randomMaterial);
}
for (int i = 0; i < materialBag.size(); i++) {
// Item Data Button
Material material = materialBag.get(i);
GuiActionButton setRainbowColorButton = new GuiActionButton(i,
material,
LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + material.name().toLowerCase(),
new String[] { LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SELECT_DATA_DESCRIPTION, material.name().toLowerCase()) },
(button, isShiftClick) -> {
editingParticle.setItemMaterial(material);
callbackList.get(callbackListPosition + 1).execute();
});
this.actionButtons.add(setRainbowColorButton);
}
// Randomize Button, re-randomizes the icons
GuiActionButton randomizeButton = new GuiActionButton(45,
GuiIcon.RANDOMIZE.get(),
LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_SELECT_DATA_RANDOMIZE_ITEMS),
new String[] { LangManager.getText(Lang.GUI_COLOR_SUBTEXT) + LangManager.getText(Lang.GUI_SELECT_DATA_RANDOMIZE_ITEMS_DESCRIPTION) },
(block, isShiftClick) -> {
callbackList.get(callbackListPosition).execute(); // Just reopen the same inventory
});
this.actionButtons.add(randomizeButton);
}
private void populateBlockData(ParticlePair editingParticle, List<GuiInventoryEditFinishedCallback> callbackList, int callbackListPosition) {
List<Material> materialBag = new ArrayList<Material>();
while (materialBag.size() < 36) { // Grab 36 random materials that are an item
Material randomMaterial = BLOCK_MATERIALS.get(RANDOM.nextInt(BLOCK_MATERIALS.size()));
if (!materialBag.contains(randomMaterial)) materialBag.add(randomMaterial);
}
for (int i = 0; i < materialBag.size(); i++) {
// Item Data Button
Material material = materialBag.get(i);
GuiActionButton setRainbowColorButton = new GuiActionButton(i,
material,
LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + material.name().toLowerCase(),
new String[] { LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SELECT_DATA_DESCRIPTION, material.name().toLowerCase()) },
(button, isShiftClick) -> {
editingParticle.setBlockMaterial(material);
callbackList.get(callbackListPosition + 1).execute();
});
this.actionButtons.add(setRainbowColorButton);
}
// Randomize Button, re-randomizes the icons
GuiActionButton randomizeButton = new GuiActionButton(45,
GuiIcon.RANDOMIZE.get(),
LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_SELECT_DATA_RANDOMIZE_BLOCKS),
new String[] { LangManager.getText(Lang.GUI_COLOR_SUBTEXT) + LangManager.getText(Lang.GUI_SELECT_DATA_RANDOMIZE_BLOCKS_DESCRIPTION) },
(block, isShiftClick) -> {
callbackList.get(callbackListPosition).execute(); // Just reopen the same inventory
});
this.actionButtons.add(randomizeButton);
}
/**
* 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 Lang name;
public ColorData(DyeColor dyeColor, Material material, OrdinaryColor ordinaryColor, Lang name) {
this.dyeColor = dyeColor;
this.material = material;
this.ordinaryColor = ordinaryColor;
this.name = name;
}
/**
* Get the DyeColor
*
* @return The DyeColor
*/
public DyeColor getDyeColor() {
return this.dyeColor;
}
/**
* Get the Material representing this color
*
* @return The Material
*/
public Material getMaterial() {
return this.material;
}
/**
* Get the OrdinaryColor representing this color
*
* @return The OrdinaryColor
*/
public OrdinaryColor getOrdinaryColor() {
return this.ordinaryColor;
}
/**
* Get the name of this color
*
* @return The name of this color
*/
public String getName() {
return LangManager.getText(this.name);
}
}
}

View file

@ -0,0 +1,44 @@
package com.esophose.playerparticles.gui;
import java.util.List;
import org.bukkit.Bukkit;
import com.esophose.playerparticles.manager.LangManager;
import com.esophose.playerparticles.manager.LangManager.Lang;
import com.esophose.playerparticles.manager.PermissionManager;
import com.esophose.playerparticles.manager.SettingManager.GuiIcon;
import com.esophose.playerparticles.particles.PPlayer;
import com.esophose.playerparticles.particles.ParticleEffect;
import com.esophose.playerparticles.particles.ParticlePair;
public class GuiInventoryEditEffect extends GuiInventory {
public GuiInventoryEditEffect(PPlayer pplayer, ParticlePair editingParticle, List<GuiInventoryEditFinishedCallback> callbackList, int callbackListPosition) {
super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, LangManager.getText(Lang.GUI_SELECT_EFFECT)));
// Select Effect Buttons
List<ParticleEffect> effectsUserHasPermissionFor = PermissionManager.getEffectsUserHasPermissionFor(pplayer.getPlayer());
for (int i = 0; i < effectsUserHasPermissionFor.size(); i++) {
ParticleEffect effect = effectsUserHasPermissionFor.get(i);
GuiActionButton selectButton = new GuiActionButton(i,
GuiIcon.EFFECT.get(effect.getName()),
LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + effect.getName(),
new String[] { LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SELECT_EFFECT_DESCRIPTION, effect.getName()) },
(button, isShiftClick) -> {
editingParticle.setEffect(effect);
callbackList.get(callbackListPosition + 1).execute();
});
this.actionButtons.add(selectButton);
}
// Back Button
GuiActionButton backButton = new GuiActionButton(INVENTORY_SIZE - 1, GuiIcon.BACK.get(), LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_BACK_BUTTON), new String[] {}, (button, isShiftClick) -> {
callbackList.get(callbackListPosition - 1).execute();
});
this.actionButtons.add(backButton);
this.populate();
}
}

View file

@ -0,0 +1,127 @@
package com.esophose.playerparticles.gui;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Bukkit;
import com.esophose.playerparticles.manager.DataManager;
import com.esophose.playerparticles.manager.LangManager;
import com.esophose.playerparticles.manager.LangManager.Lang;
import com.esophose.playerparticles.manager.SettingManager.GuiIcon;
import com.esophose.playerparticles.particles.PPlayer;
import com.esophose.playerparticles.particles.ParticleEffect.ParticleProperty;
import com.esophose.playerparticles.particles.ParticleGroup;
import com.esophose.playerparticles.particles.ParticlePair;
public class GuiInventoryEditParticle extends GuiInventory {
public GuiInventoryEditParticle(PPlayer pplayer, ParticlePair editingParticle) {
super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, LangManager.getText(Lang.GUI_EDITING_PARTICLE, editingParticle.getId())));
this.fillBorder(BorderColor.RED);
// Particle Info Icon
String particleInfo = LangManager.getText(Lang.GUI_PARTICLE_INFO, editingParticle.getId(), editingParticle.getEffect().getName(), editingParticle.getStyle().getName(), editingParticle.getDataString());
GuiActionButton particleInfoIcon = new GuiActionButton(13,
GuiIcon.PARTICLES.get(),
LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_PARTICLE_NAME, editingParticle.getId()),
new String[] { LangManager.getText(Lang.GUI_COLOR_INFO) + particleInfo },
(button, isShiftClick) -> {});
this.actionButtons.add(particleInfoIcon);
// Edit Effect Button
GuiActionButton editEffectButton = new GuiActionButton(38,
GuiIcon.EDIT_EFFECT.get(),
LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_EDIT_EFFECT),
new String[] { LangManager.getText(Lang.GUI_COLOR_SUBTEXT) + LangManager.getText(Lang.GUI_EDIT_EFFECT_DESCRIPTION) },
(button, isShiftClick) -> {
List<GuiInventoryEditFinishedCallback> callbacks = new ArrayList<GuiInventoryEditFinishedCallback>();
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditParticle(pplayer, editingParticle)));
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditEffect(pplayer, editingParticle, callbacks, 1)));
callbacks.add(() -> {
ParticleGroup group = pplayer.getActiveParticleGroup();
for (ParticlePair particle : group.getParticles()) {
if (particle.getId() == editingParticle.getId()) {
particle.setEffect(editingParticle.getEffect());
break;
}
}
DataManager.saveParticleGroup(pplayer.getUniqueId(), group);
GuiHandler.transition(new GuiInventoryEditParticle(pplayer, editingParticle));
});
callbacks.get(1).execute();
});
this.actionButtons.add(editEffectButton);
// Edit Style Button
GuiActionButton editStyleButton = new GuiActionButton(40,
GuiIcon.EDIT_STYLE.get(),
LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_EDIT_STYLE),
new String[] { LangManager.getText(Lang.GUI_COLOR_SUBTEXT) + LangManager.getText(Lang.GUI_EDIT_STYLE_DESCRIPTION) },
(button, isShiftClick) -> {
List<GuiInventoryEditFinishedCallback> callbacks = new ArrayList<GuiInventoryEditFinishedCallback>();
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditParticle(pplayer, editingParticle)));
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditStyle(pplayer, editingParticle, callbacks, 1)));
callbacks.add(() -> {
ParticleGroup group = pplayer.getActiveParticleGroup();
for (ParticlePair particle : group.getParticles()) {
if (particle.getId() == editingParticle.getId()) {
particle.setStyle(editingParticle.getStyle());
break;
}
}
DataManager.saveParticleGroup(pplayer.getUniqueId(), group);
GuiHandler.transition(new GuiInventoryEditParticle(pplayer, editingParticle));
});
callbacks.get(1).execute();
});
this.actionButtons.add(editStyleButton);
// Edit Data Button
boolean usesData = editingParticle.getEffect().hasProperty(ParticleProperty.COLORABLE) || editingParticle.getEffect().hasProperty(ParticleProperty.REQUIRES_MATERIAL_DATA);
GuiActionButton editDataButton = new GuiActionButton(42,
GuiIcon.EDIT_DATA.get(),
LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_EDIT_DATA),
usesData ? new String[] { LangManager.getText(Lang.GUI_COLOR_SUBTEXT) + LangManager.getText(Lang.GUI_EDIT_DATA_DESCRIPTION) } :
new String[] { LangManager.getText(Lang.GUI_COLOR_UNAVAILABLE) + LangManager.getText(Lang.GUI_EDIT_DATA_UNAVAILABLE) },
(button, isShiftClick) -> {
if (usesData) {
List<GuiInventoryEditFinishedCallback> callbacks = new ArrayList<GuiInventoryEditFinishedCallback>();
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditParticle(pplayer, editingParticle)));
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditData(pplayer, editingParticle, callbacks, 1)));
callbacks.add(() -> {
ParticleGroup group = pplayer.getActiveParticleGroup();
for (ParticlePair particle : group.getParticles()) {
if (particle.getId() == editingParticle.getId()) {
particle.setColor(editingParticle.getColor());
particle.setNoteColor(editingParticle.getNoteColor());
particle.setItemMaterial(editingParticle.getItemMaterial());
particle.setBlockMaterial(editingParticle.getBlockMaterial());
break;
}
}
DataManager.saveParticleGroup(pplayer.getUniqueId(), group);
GuiHandler.transition(new GuiInventoryEditParticle(pplayer, editingParticle));
});
callbacks.get(1).execute();
}
});
this.actionButtons.add(editDataButton);
// Back Button
GuiActionButton backButton = new GuiActionButton(INVENTORY_SIZE - 1, GuiIcon.BACK.get(), LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_BACK_BUTTON), new String[] {}, (button, isShiftClick) -> {
GuiHandler.transition(new GuiInventoryManageParticles(pplayer));
});
this.actionButtons.add(backButton);
this.populate();
}
}

View file

@ -0,0 +1,44 @@
package com.esophose.playerparticles.gui;
import java.util.List;
import org.bukkit.Bukkit;
import com.esophose.playerparticles.manager.LangManager;
import com.esophose.playerparticles.manager.LangManager.Lang;
import com.esophose.playerparticles.manager.PermissionManager;
import com.esophose.playerparticles.manager.SettingManager.GuiIcon;
import com.esophose.playerparticles.particles.PPlayer;
import com.esophose.playerparticles.particles.ParticlePair;
import com.esophose.playerparticles.styles.api.ParticleStyle;
public class GuiInventoryEditStyle extends GuiInventory {
public GuiInventoryEditStyle(PPlayer pplayer, ParticlePair editingParticle, List<GuiInventoryEditFinishedCallback> callbackList, int callbackListPosition) {
super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, LangManager.getText(Lang.GUI_SELECT_STYLE)));
// Select Style Buttons
List<ParticleStyle> stylesUserHasPermissionFor = PermissionManager.getStylesUserHasPermissionFor(pplayer.getPlayer());
for (int i = 0; i < stylesUserHasPermissionFor.size(); i++) {
ParticleStyle style = stylesUserHasPermissionFor.get(i);
GuiActionButton selectButton = new GuiActionButton(i,
GuiIcon.STYLE.get(style.getName()),
LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + style.getName(),
new String[] { LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SELECT_EFFECT_DESCRIPTION, style.getName()) },
(button, isShiftClick) -> {
editingParticle.setStyle(style);
callbackList.get(callbackListPosition + 1).execute();
});
this.actionButtons.add(selectButton);
}
// Back Button
GuiActionButton backButton = new GuiActionButton(INVENTORY_SIZE - 1, GuiIcon.BACK.get(), LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_BACK_BUTTON), new String[] {}, (button, isShiftClick) -> {
callbackList.get(callbackListPosition - 1).execute();
});
this.actionButtons.add(backButton);
this.populate();
}
}

View file

@ -10,7 +10,7 @@ import org.bukkit.Material;
import com.esophose.playerparticles.manager.DataManager;
import com.esophose.playerparticles.manager.LangManager;
import com.esophose.playerparticles.manager.LangManager.Lang;
import com.esophose.playerparticles.manager.SettingManager.GUIIcon;
import com.esophose.playerparticles.manager.SettingManager.GuiIcon;
import com.esophose.playerparticles.particles.PPlayer;
import com.esophose.playerparticles.particles.ParticleGroup;
import com.esophose.playerparticles.particles.ParticlePair;
@ -61,7 +61,7 @@ public class GuiInventoryLoadPresetGroups extends GuiInventory {
}
// Back Button
GuiActionButton backButton = new GuiActionButton(INVENTORY_SIZE - 1, GUIIcon.BACK.get(), LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_BACK_BUTTON), new String[] {}, (button, isShiftClick) -> {
GuiActionButton backButton = new GuiActionButton(INVENTORY_SIZE - 1, GuiIcon.BACK.get(), LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_BACK_BUTTON), new String[] {}, (button, isShiftClick) -> {
GuiHandler.transition(new GuiInventoryDefault(pplayer));
});
this.actionButtons.add(backButton);

View file

@ -8,7 +8,7 @@ import org.bukkit.Bukkit;
import com.esophose.playerparticles.manager.DataManager;
import com.esophose.playerparticles.manager.LangManager;
import com.esophose.playerparticles.manager.LangManager.Lang;
import com.esophose.playerparticles.manager.SettingManager.GUIIcon;
import com.esophose.playerparticles.manager.SettingManager.GuiIcon;
import com.esophose.playerparticles.particles.PPlayer;
import com.esophose.playerparticles.particles.ParticleGroup;
import com.esophose.playerparticles.particles.ParticlePair;
@ -42,7 +42,7 @@ public class GuiInventoryManageGroups extends GuiInventory {
lore[i] = LangManager.getText(Lang.GUI_COLOR_UNAVAILABLE) + LangManager.getText(Lang.GUI_SHIFT_CLICK_TO_DELETE);
// Load Group Buttons
GuiActionButton groupButton = new GuiActionButton(index, GUIIcon.GROUPS.get(), LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + group.getName(), lore, (button, isShiftClick) -> {
GuiActionButton groupButton = new GuiActionButton(index, GuiIcon.GROUPS.get(), LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + group.getName(), lore, (button, isShiftClick) -> {
if (isShiftClick) {
DataManager.removeParticleGroup(pplayer.getUniqueId(), group);
@ -70,7 +70,7 @@ public class GuiInventoryManageGroups extends GuiInventory {
// Save Group Button
GuiActionButton saveGroupButton = new GuiActionButton(40,
GUIIcon.CREATE.get(),
GuiIcon.CREATE.get(),
LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_SAVE_GROUP),
new String[] {
LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SAVE_GROUP_DESCRIPTION),
@ -80,7 +80,7 @@ public class GuiInventoryManageGroups extends GuiInventory {
this.actionButtons.add(saveGroupButton);
// Back Button
GuiActionButton backButton = new GuiActionButton(INVENTORY_SIZE - 1, GUIIcon.BACK.get(), LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_BACK_BUTTON), new String[] {}, (button, isShiftClick) -> {
GuiActionButton backButton = new GuiActionButton(INVENTORY_SIZE - 1, GuiIcon.BACK.get(), LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_BACK_BUTTON), new String[] {}, (button, isShiftClick) -> {
GuiHandler.transition(new GuiInventoryDefault(pplayer));
});
this.actionButtons.add(backButton);

View file

@ -1,11 +1,19 @@
package com.esophose.playerparticles.gui;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import org.bukkit.Bukkit;
import com.esophose.playerparticles.manager.DataManager;
import com.esophose.playerparticles.manager.LangManager;
import com.esophose.playerparticles.manager.LangManager.Lang;
import com.esophose.playerparticles.manager.SettingManager.GuiIcon;
import com.esophose.playerparticles.particles.PPlayer;
import com.esophose.playerparticles.particles.ParticleGroup;
import com.esophose.playerparticles.particles.ParticlePair;
import com.esophose.playerparticles.particles.ParticleEffect.ParticleProperty;
public class GuiInventoryManageParticles extends GuiInventory {
@ -14,10 +22,101 @@ public class GuiInventoryManageParticles extends GuiInventory {
this.fillBorder(BorderColor.ORANGE);
GuiActionButton testButton = new GuiActionButton(0, new Material[] { Material.BLAZE_POWDER, Material.BLAZE_ROD }, new String[] { "Test 2!", "Look at that!" } , new String[] { "To be continued..." }, (button, isShiftClick) -> {
// Manage/Delete Particle Buttons
List<ParticlePair> particles = pplayer.getActiveParticles();
particles.sort(Comparator.comparingInt(ParticlePair::getId));
int index = 10;
int nextWrap = 17;
int maxIndex = 35;
for (ParticlePair particle : particles) {
GuiActionButton selectButton = new GuiActionButton(index,
GuiIcon.PARTICLES.get(),
LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_PARTICLE_NAME, particle.getId()),
new String[] {
LangManager.getText(Lang.GUI_COLOR_SUBTEXT) + LangManager.getText(Lang.GUI_CLICK_TO_EDIT_PARTICLE, particles.size()),
LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_PARTICLE_INFO, particle.getId(), particle.getEffect().getName(), particle.getStyle().getName(), particle.getDataString()),
LangManager.getText(Lang.GUI_COLOR_UNAVAILABLE) + LangManager.getText(Lang.GUI_SHIFT_CLICK_TO_DELETE)
},
(button, isShiftClick) -> {
if (!isShiftClick) {
GuiHandler.transition(new GuiInventoryEditParticle(pplayer, particle));
} else {
// Delete particle
ParticleGroup activeGroup = pplayer.getActiveParticleGroup();
for (ParticlePair pp : activeGroup.getParticles()) {
if (pp.getId() == particle.getId()) {
activeGroup.getParticles().remove(pp);
break;
}
}
DataManager.saveParticleGroup(pplayer.getUniqueId(), activeGroup);
// Update inventory to reflect deletion
this.actionButtons.remove(button);
this.inventory.setItem(button.getSlot(), null);
}
});
this.actionButtons.add(selectButton);
index++;
if (index == nextWrap) { // Loop around border
nextWrap += 9;
index += 2;
}
if (index > maxIndex) break; // Overflowed the available space
}
// Create New Particle Button
GuiActionButton createNewParticle = new GuiActionButton(38,
GuiIcon.CREATE.get(),
LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_CREATE_PARTICLE),
new String[] { LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_CREATE_PARTICLE_DESCRIPTION) },
(button, isShiftClick) -> {
ParticlePair editingParticle = ParticlePair.getNextDefault(pplayer);
List<GuiInventoryEditFinishedCallback> callbacks = new ArrayList<GuiInventoryEditFinishedCallback>();
callbacks.add(() -> GuiHandler.transition(new GuiInventoryManageParticles(pplayer)));
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditEffect(pplayer, editingParticle, callbacks, 1)));
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditStyle(pplayer, editingParticle, callbacks, 2)));
callbacks.add(() -> {
if (editingParticle.getEffect().hasProperty(ParticleProperty.COLORABLE) || editingParticle.getEffect().hasProperty(ParticleProperty.REQUIRES_MATERIAL_DATA)) {
GuiHandler.transition(new GuiInventoryEditData(pplayer, editingParticle, callbacks, 3));
} else {
callbacks.get(4).execute();
}
});
callbacks.add(() -> {
// Save new particle
ParticleGroup group = pplayer.getActiveParticleGroup();
group.getParticles().add(editingParticle);
DataManager.saveParticleGroup(pplayer.getUniqueId(), group);
// Reopen the manage particle inventory
GuiHandler.transition(new GuiInventoryManageParticles(pplayer));
});
callbacks.get(1).execute();
});
this.actionButtons.add(createNewParticle);
// Reset Particles Button
GuiActionButton resetParticles = new GuiActionButton(42,
GuiIcon.RESET.get(),
LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_RESET_PARTICLES),
new String[] { LangManager.getText(Lang.GUI_COLOR_UNAVAILABLE) + LangManager.getText(Lang.GUI_RESET_PARTICLES_DESCRIPTION) },
(button, isShiftClick) -> {
// Reset particles
DataManager.saveParticleGroup(pplayer.getUniqueId(), ParticleGroup.getDefaultGroup());
// Reopen this same inventory to refresh it
GuiHandler.transition(new GuiInventoryManageParticles(pplayer));
});
this.actionButtons.add(resetParticles);
// Back Button
GuiActionButton backButton = new GuiActionButton(INVENTORY_SIZE - 1, GuiIcon.BACK.get(), LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_BACK_BUTTON), new String[] {}, (button, isShiftClick) -> {
GuiHandler.transition(new GuiInventoryDefault(pplayer));
});
this.actionButtons.add(testButton);
this.actionButtons.add(backButton);
this.populate();
}

View file

@ -176,11 +176,11 @@ public class LangManager {
// GUI
GUI_DISABLED,
GUI_BY_DEFAULT,
GUI_COLOR_ICON_NAME,
GUI_COLOR_INFO,
GUI_COLOR_SUBTEXT,
GUI_COLOR_UNAVAILABLE,
GUI_COMMANDS_INFO,
GUI_BACK_BUTTON,
GUI_CLICK_TO_LOAD,
GUI_SHIFT_CLICK_TO_DELETE,
@ -197,7 +197,48 @@ public class LangManager {
GUI_LOAD_A_PRESET_GROUP_DESCRIPTION,
GUI_SAVE_GROUP,
GUI_SAVE_GROUP_DESCRIPTION,
GUI_SAVE_GROUP_DESCRIPTION_2;
GUI_SAVE_GROUP_DESCRIPTION_2,
GUI_RESET_PARTICLES,
GUI_RESET_PARTICLES_DESCRIPTION,
GUI_PARTICLE_NAME,
GUI_CLICK_TO_EDIT_PARTICLE,
GUI_EDITING_PARTICLE,
GUI_EDIT_EFFECT,
GUI_EDIT_EFFECT_DESCRIPTION,
GUI_EDIT_STYLE,
GUI_EDIT_STYLE_DESCRIPTION,
GUI_EDIT_DATA,
GUI_EDIT_DATA_DESCRIPTION,
GUI_EDIT_DATA_UNAVAILABLE,
GUI_CREATE_PARTICLE,
GUI_CREATE_PARTICLE_DESCRIPTION,
GUI_SELECT_EFFECT,
GUI_SELECT_EFFECT_DESCRIPTION,
GUI_SELECT_STYLE,
GUI_SELECT_STYLE_DESCRIPTION,
GUI_SELECT_DATA,
GUI_SELECT_DATA_DESCRIPTION,
GUI_SELECT_DATA_NOTE,
GUI_SELECT_DATA_RANDOMIZE_ITEMS,
GUI_SELECT_DATA_RANDOMIZE_ITEMS_DESCRIPTION,
GUI_SELECT_DATA_RANDOMIZE_BLOCKS,
GUI_SELECT_DATA_RANDOMIZE_BLOCKS_DESCRIPTION,
GUI_EDIT_DATA_COLOR_RED,
GUI_EDIT_DATA_COLOR_ORANGE,
GUI_EDIT_DATA_COLOR_YELLOW,
GUI_EDIT_DATA_COLOR_LIME_GREEN,
GUI_EDIT_DATA_COLOR_GREEN,
GUI_EDIT_DATA_COLOR_BLUE,
GUI_EDIT_DATA_COLOR_CYAN,
GUI_EDIT_DATA_COLOR_LIGHT_BLUE,
GUI_EDIT_DATA_COLOR_PURPLE,
GUI_EDIT_DATA_COLOR_MAGENTA,
GUI_EDIT_DATA_COLOR_PINK,
GUI_EDIT_DATA_COLOR_BROWN,
GUI_EDIT_DATA_COLOR_BLACK,
GUI_EDIT_DATA_COLOR_GRAY,
GUI_EDIT_DATA_COLOR_LIGHT_GRAY,
GUI_EDIT_DATA_COLOR_WHITE;
// @formatter:on
private String message;

View file

@ -92,7 +92,7 @@ public class ParticleManager extends BukkitRunnable implements Listener {
if (hue % 5 == 0) { // Only increment note by 4 notes per second
note++;
note %= 24;
note %= 25;
}
// Loop over backwards so we can remove pplayers if need be

View file

@ -175,7 +175,7 @@ public class PermissionManager {
* @param p The player to get effect names for
* @return A String List of all effect names the given player has permission for
*/
public static List<String> getEffectsUserHasPermissionFor(Player p) {
public static List<String> getEffectNamesUserHasPermissionFor(Player p) {
List<String> list = new ArrayList<String>();
for (ParticleEffect pe : ParticleEffect.getSupportedEffects())
if (hasEffectPermission(p, pe))
@ -189,13 +189,41 @@ public class PermissionManager {
* @param p The player to get style names for
* @return A String List of all style names the given player has permission for
*/
public static List<String> getStylesUserHasPermissionFor(Player p) {
public static List<String> getStyleNamesUserHasPermissionFor(Player p) {
List<String> list = new ArrayList<String>();
for (ParticleStyle ps : ParticleStyleManager.getStyles())
if (hasStylePermission(p, ps))
list.add(ps.getName());
return list;
}
/**
* Gets a List of all effects a player has permission for
*
* @param p The player to get effects for
* @return A List of all effects the given player has permission for
*/
public static List<ParticleEffect> getEffectsUserHasPermissionFor(Player p) {
List<ParticleEffect> list = new ArrayList<ParticleEffect>();
for (ParticleEffect pe : ParticleEffect.getSupportedEffects())
if (hasEffectPermission(p, pe))
list.add(pe);
return list;
}
/**
* Gets a List of all styles a player has permission for
*
* @param p The player to get styles for
* @return A List of all styles the given player has permission for
*/
public static List<ParticleStyle> getStylesUserHasPermissionFor(Player p) {
List<ParticleStyle> list = new ArrayList<ParticleStyle>();
for (ParticleStyle ps : ParticleStyleManager.getStyles())
if (hasStylePermission(p, ps))
list.add(ps);
return list;
}
/**
* Checks if a player has permission to created fixed effects

View file

@ -21,8 +21,7 @@ public class SettingManager {
LONG,
DOUBLE,
STRING,
STRING_LIST,
MATERIAL
STRING_LIST
}
/**
@ -100,15 +99,6 @@ public class SettingManager {
case STRING_LIST:
this.value = PlayerParticles.getPlugin().getConfig().getStringList(configPath);
break;
case MATERIAL:
String materialName = PlayerParticles.getPlugin().getConfig().getString(configPath);
Material material = ParticleUtils.closestMatch(materialName);
if (material == null) {
material = Material.BARRIER;
PlayerParticles.getPlugin().getLogger().severe("Invalid block/item name for '" + this.name().toLowerCase().replace('_', '-') + "' in config.yml: '" + materialName + "'");
}
this.value = material;
break;
}
}
return this.value;
@ -179,7 +169,10 @@ public class SettingManager {
}
}
public enum GUIIcon {
/**
* Used for grabbing/caching configurable GUI Icons from the config.yml
*/
public enum GuiIcon {
PARTICLES,
GROUPS,
PRESET_GROUPS,
@ -189,13 +182,14 @@ public class SettingManager {
EDIT_STYLE,
EDIT_DATA,
RANDOMIZE,
RESET,
EFFECT,
STYLE;
private Map<String, Material> materials;
private GUIIcon() {
private GuiIcon() {
this.materials = new HashMap<String, Material>();
}

View file

@ -312,10 +312,10 @@ public enum ParticleEffect {
*/
private List<Player> getPlayersInRange(Location center, boolean isFixedEffect) {
List<Player> players = new ArrayList<Player>();
int range = isFixedEffect ? PSetting.PARTICLE_RENDER_RANGE_PLAYER.getInt() : PSetting.PARTICLE_RENDER_RANGE_FIXED_EFFECT.getInt();
int range = !isFixedEffect ? PSetting.PARTICLE_RENDER_RANGE_PLAYER.getInt() : PSetting.PARTICLE_RENDER_RANGE_FIXED_EFFECT.getInt();
for (Player p : Bukkit.getOnlinePlayers())
if (p.getWorld().equals(center.getWorld()) && center.distanceSquared(p.getLocation()) <= range * range)
if (p.getWorld().equals(center.getWorld()) && center.distanceSquared(p.getLocation()) <= range * range)
players.add(p);
return players;

View file

@ -260,15 +260,33 @@ public class ParticlePair {
public ParticlePair clone() {
return new ParticlePair(this.ownerUUID, this.id, this.effect, this.style, this.itemMaterial, this.blockMaterial, this.color, this.noteColor);
}
/**
* 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
*/
public static ParticlePair getDefault() {
private static ParticlePair getDefault() {
return new ParticlePair(null, // @formatter:off
-1,
-1,
ParticleEffect.FLAME,
DefaultStyles.NORMAL,
ParticleUtils.closestMatchWithFallback("IRON_SHOVEL", "IRON_SPADE"),
Material.STONE,
new OrdinaryColor(0, 0, 0),
new NoteColor(0)); // @formatter:on
}
/**
* 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
*/
public static ParticlePair getNextDefault(PPlayer pplayer) {
return new ParticlePair(pplayer.getUniqueId(), // @formatter:off
pplayer.getNextActiveParticleId(),
ParticleEffect.FLAME,
DefaultStyles.NORMAL,
ParticleUtils.closestMatchWithFallback("IRON_SHOVEL", "IRON_SPADE"),
@ -277,22 +295,4 @@ public class ParticlePair {
new NoteColor(0)); // @formatter:on
}
/**
* Gets a ParticlePair with the default values applied
*
* @param ownerUUID The owner of this ParticlePair
* @return A ParticlePair with default values
*/
@Deprecated // TODO: REMOVE ONCE NEW GUI IS DONE
public static ParticlePair getDefault(UUID ownerUUID) {
return new ParticlePair(ownerUUID, // @formatter:off
1,
ParticleEffect.FLAME,
DefaultStyles.NORMAL,
ParticleUtils.closestMatchWithFallback("IRON_SHOVEL", "IRON_SPADE"),
Material.STONE,
new OrdinaryColor(0, 0, 0),
new NoteColor(0)); // @formatter:on
}
}

View file

@ -18,7 +18,7 @@ public class ParticleStyleWings implements ParticleStyle {
public List<PParticle> getParticles(ParticlePair particle, Location location) {
List<PParticle> particles = new ArrayList<PParticle>();
if (spawnTimer == 0) {
for (double t = 0; t < Math.PI * 2; t += Math.PI / 64) {
for (double t = 0; t < Math.PI * 2; t += Math.PI / 48) {
double x = Math.sin(t) * (Math.pow(Math.E, Math.cos(t)) - 2 * Math.cos(t * 4) - Math.pow(Math.sin(t / 12), 5)) / 2;
double y = Math.cos(t) * (Math.pow(Math.E, Math.cos(t)) - 2 * Math.cos(t * 4) - Math.pow(Math.sin(t / 12), 5)) / 2;
Vector v = VectorUtils.rotateAroundAxisY(new Vector(x, y, -0.3), -Math.toRadians(location.getYaw()));

View file

@ -59,10 +59,20 @@ public class ParticleUtils {
return mat;
}
/**
* Gets all block materials in the game
*
* @return A List of all block material names available in the game
*/
public static List<String> getAllBlockMaterials() {
return blockMaterials;
}
/**
* Gets all item materials in the game
*
* @return A List of all item material names available in the game
*/
public static List<String> getAllItemMaterials() {
return itemMaterials;
}

View file

@ -158,6 +158,8 @@ gui-icon:
- BOOK
randomize:
- HOPPER
reset:
- BARRIER
effect:
ambient_entity_effect:
- BEACON

View file

@ -113,11 +113,11 @@ data-usage-none: '&eThe effect &b{0} &edoes not use any data!'
data-usage-block: '&eThe effect &b{0} &erequires &bblock &edata! &bFormat: <blockName>'
data-usage-item: '&eThe effect &b{0} &erequires &bitem &edata! &bFormat: <itemName>'
data-usage-color: '&eThe effect &b{0} &erequires &bcolor &edata! &bFormat: <<0-255> <0-255> <0-255>>|<rainbow>'
data-usage-note: '&eThe effect &b{0} &erequires &bnote &edata! &bFormat: <0-23>|<rainbow>'
data-usage-note: '&eThe effect &b{0} &erequires &bnote &edata! &bFormat: <0-24>|<rainbow>'
data-invalid-block: '&cThe &bblock &cdata you entered is invalid! &bFormat: <blockName>'
data-invalid-item: '&cThe &bitem &cdata you entered is invalid! &bFormat: <itemName>'
data-invalid-color: '&cThe &bcolor &cdata you entered is invalid! &bFormat: <<0-255> <0-255> <0-255>>|<rainbow>'
data-invalid-note: '&cThe &bnote &cdata you entered is invalid! &bFormat: <0-23>|<rainbow>'
data-invalid-note: '&cThe &bnote &cdata you entered is invalid! &bFormat: <0-24>|<rainbow>'
data-invalid-material-not-item: '&cThe &bitem &cmaterial &b{0} &cyou entered is not an item!'
data-invalid-material-not-block: '&cThe &bblock &cmaterial &b{0} &cyou entered is not a block!'
data-invalid-material-item: '&cThe &bitem &cmaterial &b{0} you entered does not exist!'
@ -162,11 +162,11 @@ fixed-invalid-command: '&cInvalid sub-command for &b/pp fixed&c!'
# GUI
gui-disabled: '&cThe server administrator has disabled the GUI!'
gui-by-default: '&eWe opened the GUI for you because you did not specify a command. View other commands with &b/pp help&e or use &b/pp gui&e to avoid this message.'
gui-color-icon-name: '&a'
gui-color-info: '&e'
gui-color-subtext: '&b'
gui-color-unavailable: '&c'
gui-commands-info: 'Find info about commands with &b/pp help'
gui-back-button: 'Go Back'
gui-click-to-load: 'Click to load the following {0} particle(s):'
gui-shift-click-to-delete: 'Shift click to delete'
@ -184,3 +184,44 @@ gui-load-a-preset-group-description: 'Load a premade particle group'
gui-save-group: 'Save New Group'
gui-save-group-description: 'You can save a new group using the following command:'
gui-save-group-description-2: '/pp group save <groupName>'
gui-reset-particles: 'Reset Your Particles'
gui-reset-particles-description: 'Deletes all your active particles'
gui-particle-name: 'Particle #{0}'
gui-click-to-edit-particle: 'Click to edit the effect, style, or data of this particle'
gui-editing-particle: 'Editing Particle #{0}'
gui-edit-effect: 'Edit Effect'
gui-edit-effect-description: 'Click to edit the effect of this particle'
gui-edit-style: 'Edit Style'
gui-edit-style-description: 'Click to edit the style of this particle'
gui-edit-data: 'Edit Data'
gui-edit-data-description: 'Click to edit the data of this particle'
gui-edit-data-unavailable: 'The effect of this particle does not use any data'
gui-create-particle: 'Create A New Particle'
gui-create-particle-description: 'Create a new particle with an effect, style, and data'
gui-select-effect: 'Select Particle Effect'
gui-select-effect-description: 'Sets the particle effect to &b{0}'
gui-select-style: 'Select Particle Style'
gui-select-style-description: 'Sets the particle style to &b{0}'
gui-select-data: 'Select Particle Data'
gui-select-data-description: 'Sets the particle data to &b{0}'
gui-select-data-note: 'note #{0}'
gui-select-data-randomize-items: 'Randomize Items'
gui-select-data-randomize-items-description: 'Randomizes the items displayed'
gui-select-data-randomize-blocks: 'Randomize Blocks'
gui-select-data-randomize-blocks-description: 'Randomizes the blocks displayed'
gui-edit-data-color-red: '&cred'
gui-edit-data-color-orange: '&6orange'
gui-edit-data-color-yellow: '&eyellow'
gui-edit-data-color-lime-green: '&alime green'
gui-edit-data-color-green: '&2green'
gui-edit-data-color-blue: '&1blue'
gui-edit-data-color-cyan: '&3cyan'
gui-edit-data-color-light-blue: '&blight blue'
gui-edit-data-color-purple: '&5purple'
gui-edit-data-color-magenta: '&dmagenta'
gui-edit-data-color-pink: '&dpink'
gui-edit-data-color-brown: '&6brown'
gui-edit-data-color-black: '&8black'
gui-edit-data-color-gray: '&8gray'
gui-edit-data-color-light-gray: '&7light gray'
gui-edit-data-color-white: '&fwhite'