GUI Pagination

This commit is contained in:
Esophose 2019-04-28 02:56:35 -06:00
parent 6bf75f81da
commit bf5f50c1d0
17 changed files with 439 additions and 385 deletions

2
.gitignore vendored
View file

@ -54,4 +54,4 @@ Network Trash Folder
Temporary Items
.apdisk
images/
*.iml
*.iml

View file

@ -22,10 +22,20 @@ public abstract class GuiInventory implements InventoryHolder {
protected enum BorderColor {
WHITE(0, "WHITE_STAINED_GLASS_PANE"),
ORANGE(1, "ORANGE_STAINED_GLASS_PANE"),
RED(14, "RED_STAINED_GLASS_PANE"),
MAGENTA(2, "MAGENTA_STAINED_GLASS_PANE"),
LIGHT_BLUE(3, "LIGHT_BLUE_STAINED_GLASS_PANE"),
YELLOW(4, "YELLOW_STAINED_GLASS_PANE"),
LIME(5, "LIME_STAINED_GLASS_PANE"),
PINK(6, "PINK_STAINED_GLASS_PANE"),
GRAY(7, "GRAY_STAINED_GLASS_PANE"),
LIGHT_GRAY(8, "LIGHT_GRAY_STAINED_GLASS_PANE"),
CYAN(9, "CYAN_STAINED_GLASS_PANE"),
PURPLE(10, "PURPLE_STAINED_GLASS_PANE"),
BLUE(11, "BLUE_STAINED_GLASS_PANE"),
BROWN(12, "BROWN_STAINED_GLASS_PANE"),
GREEN(13, "GREEN_STAINED_GLASS_PANE"),
YELLOW(4, "YELLOW_STAINED_GLASS_PANE");
RED(14, "RED_STAINED_GLASS_PANE"),
BLACK(15, "BLACK_STAINED_GLASS_PANE");
private short data;
private Material material;

View file

@ -117,7 +117,7 @@ public class GuiInventoryDefault extends GuiInventory {
(button, isShiftClick) -> {
List<GuiInventoryEditFinishedCallback> callbacks = new ArrayList<>();
callbacks.add(() -> GuiHandler.transition(new GuiInventoryDefault(pplayer)));
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditEffect(pplayer, editingParticle, callbacks, 1)));
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditEffect(pplayer, editingParticle, 1, callbacks, 1)));
callbacks.add(() -> {
ParticleGroup group = pplayer.getActiveParticleGroup();
if (canEditPrimaryStyleAndData) {
@ -159,7 +159,7 @@ public class GuiInventoryDefault extends GuiInventory {
List<GuiInventoryEditFinishedCallback> callbacks = new ArrayList<>();
callbacks.add(() -> GuiHandler.transition(new GuiInventoryDefault(pplayer)));
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditStyle(pplayer, editingParticle, callbacks, 1)));
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditStyle(pplayer, editingParticle, 1, callbacks, 1)));
callbacks.add(() -> {
ParticleGroup group = pplayer.getActiveParticleGroup();
for (ParticlePair particle : group.getParticles()) {
@ -202,7 +202,7 @@ public class GuiInventoryDefault extends GuiInventory {
List<GuiInventoryEditFinishedCallback> callbacks = new ArrayList<>();
callbacks.add(() -> GuiHandler.transition(new GuiInventoryDefault(pplayer)));
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditData(pplayer, editingParticle, callbacks, 1)));
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditData(pplayer, editingParticle, 1, callbacks, 1)));
callbacks.add(() -> {
ParticleGroup group = pplayer.getActiveParticleGroup();
for (ParticlePair particle : group.getParticles()) {

View file

@ -9,6 +9,7 @@ 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.NMSUtil;
import com.esophose.playerparticles.util.ParticleUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
@ -26,11 +27,10 @@ import java.util.Random;
@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;
private static ColorData[] noteColorMapping, noteColorMappingOld;
static {
colorMapping = new ColorData[]{
@ -58,37 +58,66 @@ public class GuiInventoryEditData extends GuiInventory {
colorMapping[2], // Yellow
colorMapping[3], // Lime
colorMapping[7], // Light Blue
colorMapping[6], // Cyan
colorMapping[5], // Blue
colorMapping[8] // Purple
colorMapping[8], // Purple
colorMapping[9] // Magenta
};
// 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
rainbowColorMapping[3], // 0 Lime
rainbowColorMapping[3], // 1 Lime
rainbowColorMapping[2], // 2 Yellow
rainbowColorMapping[1], // 3 Orange
rainbowColorMapping[1], // 4 Orange
rainbowColorMapping[0], // 5 Red
rainbowColorMapping[0], // 6 Red
rainbowColorMapping[0], // 7 Red
rainbowColorMapping[8], // 8 Magenta
rainbowColorMapping[8], // 9 Magenta
rainbowColorMapping[7], // 10 Purple
rainbowColorMapping[7], // 11 Purple
rainbowColorMapping[7], // 12 Purple
rainbowColorMapping[6], // 13 Blue
rainbowColorMapping[6], // 14 Blue
rainbowColorMapping[6], // 15 Blue
rainbowColorMapping[6], // 16 Blue
rainbowColorMapping[5], // 17 Cyan
rainbowColorMapping[5], // 18 Cyan
rainbowColorMapping[5], // 20 Lime
rainbowColorMapping[5], // 21 Lime
rainbowColorMapping[5], // 22 Lime
rainbowColorMapping[5], // 23 Lime
rainbowColorMapping[5] // 24 Lime
};
// Note: Minecraft 1.8 through 1.13 had screwed up note color values, they were thankfully fixed in 1.14
noteColorMappingOld = new ColorData[]{
colorMapping[7], // 0 Light Blue
colorMapping[7], // 1 Light Blue
colorMapping[13], // 2 Gray
colorMapping[10], // 3 Pink
colorMapping[9], // 4 Magenta
colorMapping[9], // 5 Magenta
colorMapping[0], // 6 Red
colorMapping[2], // 7 Yellow
colorMapping[2], // 8 Yellow
colorMapping[14], // 9 Light Gray
colorMapping[13], // 10 Gray
colorMapping[6], // 11 Cyan
colorMapping[6], // 12 Cyan
colorMapping[6], // 13 Cyan
colorMapping[5], // 14 Blue
colorMapping[8], // 15 Purple
colorMapping[8], // 16 Purple
colorMapping[8], // 17 Purple
colorMapping[13], // 18 Gray
colorMapping[4], // 19 Green
colorMapping[3], // 20 Lime
colorMapping[2], // 21 Yellow
colorMapping[4], // 22 Green
colorMapping[7], // 23 Light Blue
colorMapping[7] // 24 Light Blue
};
BLOCK_MATERIALS = new ArrayList<>();
@ -110,21 +139,23 @@ public class GuiInventoryEditData extends GuiInventory {
}
}
public GuiInventoryEditData(PPlayer pplayer, ParticlePair editingParticle, List<GuiInventoryEditFinishedCallback> callbackList, int callbackListPosition) {
public GuiInventoryEditData(PPlayer pplayer, ParticlePair editingParticle, int pageNumber, List<GuiInventoryEditFinishedCallback> callbackList, int callbackListPosition) {
super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, LangManager.getText(Lang.GUI_SELECT_DATA)));
this.fillBorder(BorderColor.MAGENTA);
ParticleEffect pe = editingParticle.getEffect();
if (pe.hasProperty(ParticleProperty.COLORABLE)) {
if (pe == ParticleEffect.NOTE) { // Note data
this.populateNoteData(editingParticle, callbackList, callbackListPosition);
this.populateNoteData(editingParticle, pageNumber, callbackList, callbackListPosition);
} else { // Color data
this.populateColorData(editingParticle, callbackList, callbackListPosition);
this.populateColorData(editingParticle, pageNumber, callbackList, callbackListPosition);
}
} else if (pe.hasProperty(ParticleProperty.REQUIRES_MATERIAL_DATA)) {
if (pe == ParticleEffect.ITEM) { // Item data
this.populateItemData(editingParticle, callbackList, callbackListPosition);
this.populateItemData(editingParticle, pageNumber, callbackList, callbackListPosition);
} else { // Block data
this.populateBlockData(editingParticle, callbackList, callbackListPosition);
this.populateBlockData(editingParticle, pageNumber, callbackList, callbackListPosition);
}
}
@ -144,14 +175,14 @@ public class GuiInventoryEditData extends GuiInventory {
* Populates the Inventory with available color data options
*
* @param editingParticle The ParticlePair that's being edited
* @param pageNumber The current page number
* @param callbackList The List of GuiInventoryEditFinishedCallbacks
* @param callbackListPosition The index of the callbackList we're currently at
*/
private void populateColorData(ParticlePair editingParticle, List<GuiInventoryEditFinishedCallback> callbackList, int callbackListPosition) {
private void populateColorData(ParticlePair editingParticle, int pageNumber, List<GuiInventoryEditFinishedCallback> callbackList, int callbackListPosition) {
int index = 10;
int nextWrap = 17;
for (int i = 0; i < colorMapping.length; i++) {
ColorData colorData = colorMapping[i];
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
@ -206,18 +237,26 @@ public class GuiInventoryEditData extends GuiInventory {
*
* @param editingParticle The ParticlePair that's being edited
* @param callbackList The List of GuiInventoryEditFinishedCallbacks
* @param pageNumber The current page number
* @param callbackListPosition The index of the callbackList we're currently at
*/
private void populateNoteData(ParticlePair editingParticle, List<GuiInventoryEditFinishedCallback> callbackList, int callbackListPosition) {
for (int i = 0; i < noteColorMapping.length; i++) {
ColorData colorData = noteColorMapping[i];
private void populateNoteData(ParticlePair editingParticle, int pageNumber, List<GuiInventoryEditFinishedCallback> callbackList, int callbackListPosition) {
int numberOfItems = noteColorMapping.length;
int maxPages = (int) Math.floor(numberOfItems / 28.0);
int itemsPerPage = 14;
int slot = 10;
int nextWrap = 17;
int maxSlot = 43;
for (int i = (pageNumber - 1) * itemsPerPage; i < numberOfItems; i++) {
ColorData colorData = NMSUtil.getVersionNumber() > 13 ? noteColorMapping[i] : noteColorMappingOld[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,
slot,
colorData,
formattedDisplayName,
new String[]{formattedDescription},
@ -226,6 +265,13 @@ public class GuiInventoryEditData extends GuiInventory {
callbackList.get(callbackListPosition + 1).execute();
});
this.actionButtons.add(setColorButton);
slot++;
if (slot == nextWrap) { // Loop around border
nextWrap += 9;
slot += 2;
}
if (slot > maxSlot) break; // Overflowed the available space
}
// Rainbow Note Data Button
@ -255,6 +301,28 @@ public class GuiInventoryEditData extends GuiInventory {
callbackList.get(callbackListPosition + 1).execute();
});
this.actionButtons.add(setRandomColorButton);
// Previous page button
if (pageNumber != 1) {
GuiActionButton previousPageButton = new GuiActionButton(
INVENTORY_SIZE - 6,
GuiIcon.PREVIOUS_PAGE.get(),
LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_PREVIOUS_PAGE_BUTTON, pageNumber - 1, maxPages),
new String[]{},
(button, isShiftClick) -> GuiHandler.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber - 1, callbackList, callbackListPosition)));
this.actionButtons.add(previousPageButton);
}
// Next page button
if (pageNumber != maxPages) {
GuiActionButton nextPageButton = new GuiActionButton(
INVENTORY_SIZE - 4,
GuiIcon.NEXT_PAGE.get(),
LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_NEXT_PAGE_BUTTON, pageNumber + 1, maxPages),
new String[]{},
(button, isShiftClick) -> GuiHandler.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber + 1, callbackList, callbackListPosition)));
this.actionButtons.add(nextPageButton);
}
}
/**
@ -262,20 +330,22 @@ public class GuiInventoryEditData extends GuiInventory {
*
* @param editingParticle The ParticlePair that's being edited
* @param callbackList The List of GuiInventoryEditFinishedCallbacks
* @param pageNumber The current page number
* @param callbackListPosition The index of the callbackList we're currently at
*/
private void populateItemData(ParticlePair editingParticle, List<GuiInventoryEditFinishedCallback> callbackList, int callbackListPosition) {
List<Material> materialBag = new ArrayList<>();
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);
}
private void populateItemData(ParticlePair editingParticle, int pageNumber, List<GuiInventoryEditFinishedCallback> callbackList, int callbackListPosition) {
int numberOfItems = ITEM_MATERIALS.size();
int maxPages = (int) Math.floor(numberOfItems / 28.0);
int itemsPerPage = 28;
int slot = 10;
int nextWrap = 17;
int maxSlot = 43;
for (int i = 0; i < materialBag.size(); i++) {
for (int i = (pageNumber - 1) * itemsPerPage; i < numberOfItems; i++) {
// Item Data Button
Material material = materialBag.get(i);
Material material = ITEM_MATERIALS.get(i);
GuiActionButton setRainbowColorButton = new GuiActionButton(
i,
slot,
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())},
@ -284,18 +354,36 @@ public class GuiInventoryEditData extends GuiInventory {
callbackList.get(callbackListPosition + 1).execute();
});
this.actionButtons.add(setRainbowColorButton);
slot++;
if (slot == nextWrap) { // Loop around border
nextWrap += 9;
slot += 2;
}
if (slot > maxSlot) break; // Overflowed the available space
}
// 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);
// Previous page button
if (pageNumber != 1) {
GuiActionButton previousPageButton = new GuiActionButton(
INVENTORY_SIZE - 6,
GuiIcon.PREVIOUS_PAGE.get(),
LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_PREVIOUS_PAGE_BUTTON, pageNumber - 1, maxPages),
new String[]{},
(button, isShiftClick) -> GuiHandler.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber - 1, callbackList, callbackListPosition)));
this.actionButtons.add(previousPageButton);
}
// Next page button
if (pageNumber != maxPages) {
GuiActionButton nextPageButton = new GuiActionButton(
INVENTORY_SIZE - 4,
GuiIcon.NEXT_PAGE.get(),
LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_NEXT_PAGE_BUTTON, pageNumber + 1, maxPages),
new String[]{},
(button, isShiftClick) -> GuiHandler.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber + 1, callbackList, callbackListPosition)));
this.actionButtons.add(nextPageButton);
}
}
/**
@ -303,20 +391,22 @@ public class GuiInventoryEditData extends GuiInventory {
*
* @param editingParticle The ParticlePair that's being edited
* @param callbackList The List of GuiInventoryEditFinishedCallbacks
* @param pageNumber The current page number
* @param callbackListPosition The index of the callbackList we're currently at
*/
private void populateBlockData(ParticlePair editingParticle, List<GuiInventoryEditFinishedCallback> callbackList, int callbackListPosition) {
List<Material> materialBag = new ArrayList<>();
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);
}
private void populateBlockData(ParticlePair editingParticle, int pageNumber, List<GuiInventoryEditFinishedCallback> callbackList, int callbackListPosition) {
int numberOfItems = BLOCK_MATERIALS.size();
int maxPages = (int) Math.floor(numberOfItems / 28.0);
int itemsPerPage = 28;
int slot = 10;
int nextWrap = 17;
int maxSlot = 43;
for (int i = 0; i < materialBag.size(); i++) {
for (int i = (pageNumber - 1) * itemsPerPage; i < numberOfItems; i++) {
// Item Data Button
Material material = materialBag.get(i);
Material material = BLOCK_MATERIALS.get(i);
GuiActionButton setRainbowColorButton = new GuiActionButton(
i,
slot,
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())},
@ -325,18 +415,36 @@ public class GuiInventoryEditData extends GuiInventory {
callbackList.get(callbackListPosition + 1).execute();
});
this.actionButtons.add(setRainbowColorButton);
slot++;
if (slot == nextWrap) { // Loop around border
nextWrap += 9;
slot += 2;
}
if (slot > maxSlot) break; // Overflowed the available space
}
// 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);
// Previous page button
if (pageNumber != 1) {
GuiActionButton previousPageButton = new GuiActionButton(
INVENTORY_SIZE - 6,
GuiIcon.PREVIOUS_PAGE.get(),
LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_PREVIOUS_PAGE_BUTTON, pageNumber - 1, maxPages),
new String[]{},
(button, isShiftClick) -> GuiHandler.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber - 1, callbackList, callbackListPosition)));
this.actionButtons.add(previousPageButton);
}
// Next page button
if (pageNumber != maxPages) {
GuiActionButton nextPageButton = new GuiActionButton(
INVENTORY_SIZE - 4,
GuiIcon.NEXT_PAGE.get(),
LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_NEXT_PAGE_BUTTON, pageNumber + 1, maxPages),
new String[]{},
(button, isShiftClick) -> GuiHandler.transition(new GuiInventoryEditData(this.pplayer, editingParticle, pageNumber + 1, callbackList, callbackListPosition)));
this.actionButtons.add(nextPageButton);
}
}
/**

View file

@ -14,16 +14,24 @@ import java.util.List;
public class GuiInventoryEditEffect extends GuiInventory {
public GuiInventoryEditEffect(PPlayer pplayer, ParticlePair editingParticle, List<GuiInventoryEditFinishedCallback> callbackList, int callbackListPosition) {
public GuiInventoryEditEffect(PPlayer pplayer, ParticlePair editingParticle, int pageNumber, List<GuiInventoryEditFinishedCallback> callbackList, int callbackListPosition) {
super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, LangManager.getText(Lang.GUI_SELECT_EFFECT)));
this.fillBorder(BorderColor.LIGHT_BLUE);
// Select Effect Buttons
List<ParticleEffect> effectsUserHasPermissionFor = PermissionManager.getEffectsUserHasPermissionFor(pplayer.getPlayer());
for (int i = 0; i < effectsUserHasPermissionFor.size(); i++) {
// TODO: Paginate when there are more effects than will fit normally
int numberOfItems = effectsUserHasPermissionFor.size();
int maxPages = (int) Math.floor(numberOfItems / 28.0);
int itemsPerPage = 28;
int slot = 10;
int nextWrap = 17;
int maxSlot = 43;
for (int i = (pageNumber - 1) * itemsPerPage; i < numberOfItems; i++) {
ParticleEffect effect = effectsUserHasPermissionFor.get(i);
GuiActionButton selectButton = new GuiActionButton(
i,
slot,
GuiIcon.EFFECT.get(effect.getName()),
LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + ParticleUtils.formatName(effect.getName()),
new String[]{LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SELECT_EFFECT_DESCRIPTION, ParticleUtils.formatName(effect.getName()))},
@ -32,6 +40,13 @@ public class GuiInventoryEditEffect extends GuiInventory {
callbackList.get(callbackListPosition + 1).execute();
});
this.actionButtons.add(selectButton);
slot++;
if (slot == nextWrap) { // Loop around border
nextWrap += 9;
slot += 2;
}
if (slot > maxSlot) break; // Overflowed the available space
}
// Back Button
@ -43,6 +58,28 @@ public class GuiInventoryEditEffect extends GuiInventory {
(button, isShiftClick) -> callbackList.get(callbackListPosition - 1).execute());
this.actionButtons.add(backButton);
// Previous page button
if (pageNumber != 1) {
GuiActionButton previousPageButton = new GuiActionButton(
INVENTORY_SIZE - 6,
GuiIcon.PREVIOUS_PAGE.get(),
LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_PREVIOUS_PAGE_BUTTON, pageNumber - 1, maxPages),
new String[]{},
(button, isShiftClick) -> GuiHandler.transition(new GuiInventoryEditEffect(pplayer, editingParticle, pageNumber - 1, callbackList, callbackListPosition)));
this.actionButtons.add(previousPageButton);
}
// Next page button
if (pageNumber != maxPages) {
GuiActionButton nextPageButton = new GuiActionButton(
INVENTORY_SIZE - 4,
GuiIcon.NEXT_PAGE.get(),
LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_NEXT_PAGE_BUTTON, pageNumber + 1, maxPages),
new String[]{},
(button, isShiftClick) -> GuiHandler.transition(new GuiInventoryEditEffect(pplayer, editingParticle, pageNumber + 1, callbackList, callbackListPosition)));
this.actionButtons.add(nextPageButton);
}
this.populate();
}

View file

@ -39,7 +39,7 @@ public class GuiInventoryEditParticle extends GuiInventory {
(button, isShiftClick) -> {
List<GuiInventoryEditFinishedCallback> callbacks = new ArrayList<>();
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditParticle(pplayer, editingParticle)));
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditEffect(pplayer, editingParticle, callbacks, 1)));
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditEffect(pplayer, editingParticle, 1, callbacks, 1)));
callbacks.add(() -> {
ParticleGroup group = pplayer.getActiveParticleGroup();
for (ParticlePair particle : group.getParticles()) {
@ -65,7 +65,7 @@ public class GuiInventoryEditParticle extends GuiInventory {
(button, isShiftClick) -> {
List<GuiInventoryEditFinishedCallback> callbacks = new ArrayList<>();
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditParticle(pplayer, editingParticle)));
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditStyle(pplayer, editingParticle, callbacks, 1)));
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditStyle(pplayer, editingParticle, 1, callbacks, 1)));
callbacks.add(() -> {
ParticleGroup group = pplayer.getActiveParticleGroup();
for (ParticlePair particle : group.getParticles()) {
@ -94,7 +94,7 @@ public class GuiInventoryEditParticle extends GuiInventory {
if (usesData) {
List<GuiInventoryEditFinishedCallback> callbacks = new ArrayList<>();
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditParticle(pplayer, editingParticle)));
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditData(pplayer, editingParticle, callbacks, 1)));
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditData(pplayer, editingParticle, 1, callbacks, 1)));
callbacks.add(() -> {
ParticleGroup group = pplayer.getActiveParticleGroup();
for (ParticlePair particle : group.getParticles()) {

View file

@ -14,15 +14,24 @@ import java.util.List;
public class GuiInventoryEditStyle extends GuiInventory {
public GuiInventoryEditStyle(PPlayer pplayer, ParticlePair editingParticle, List<GuiInventoryEditFinishedCallback> callbackList, int callbackListPosition) {
public GuiInventoryEditStyle(PPlayer pplayer, ParticlePair editingParticle, int pageNumber, List<GuiInventoryEditFinishedCallback> callbackList, int callbackListPosition) {
super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, LangManager.getText(Lang.GUI_SELECT_STYLE)));
this.fillBorder(BorderColor.BLUE);
// Select Style Buttons
List<ParticleStyle> stylesUserHasPermissionFor = PermissionManager.getStylesUserHasPermissionFor(pplayer.getPlayer());
for (int i = 0; i < stylesUserHasPermissionFor.size(); i++) {
int numberOfItems = stylesUserHasPermissionFor.size();
int maxPages = (int) Math.floor(numberOfItems / 28.0);
int itemsPerPage = 28;
int slot = 10;
int nextWrap = 17;
int maxSlot = 43;
for (int i = (pageNumber - 1) * itemsPerPage; i < numberOfItems; i++) {
ParticleStyle style = stylesUserHasPermissionFor.get(i);
GuiActionButton selectButton = new GuiActionButton(
i,
slot,
GuiIcon.STYLE.get(style.getName()),
LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + ParticleUtils.formatName(style.getName()),
new String[]{LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SELECT_EFFECT_DESCRIPTION, ParticleUtils.formatName(style.getName()))},
@ -31,6 +40,13 @@ public class GuiInventoryEditStyle extends GuiInventory {
callbackList.get(callbackListPosition + 1).execute();
});
this.actionButtons.add(selectButton);
slot++;
if (slot == nextWrap) { // Loop around border
nextWrap += 9;
slot += 2;
}
if (slot > maxSlot) break; // Overflowed the available space
}
// Back Button
@ -42,6 +58,28 @@ public class GuiInventoryEditStyle extends GuiInventory {
(button, isShiftClick) -> callbackList.get(callbackListPosition - 1).execute());
this.actionButtons.add(backButton);
// Previous page button
if (pageNumber != 1) {
GuiActionButton previousPageButton = new GuiActionButton(
INVENTORY_SIZE - 6,
GuiIcon.PREVIOUS_PAGE.get(),
LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_PREVIOUS_PAGE_BUTTON, pageNumber - 1, maxPages),
new String[]{},
(button, isShiftClick) -> GuiHandler.transition(new GuiInventoryEditStyle(pplayer, editingParticle, pageNumber - 1, callbackList, callbackListPosition)));
this.actionButtons.add(previousPageButton);
}
// Next page button
if (pageNumber != maxPages) {
GuiActionButton nextPageButton = new GuiActionButton(
INVENTORY_SIZE - 4,
GuiIcon.NEXT_PAGE.get(),
LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_NEXT_PAGE_BUTTON, pageNumber + 1, maxPages),
new String[]{},
(button, isShiftClick) -> GuiHandler.transition(new GuiInventoryEditStyle(pplayer, editingParticle, pageNumber + 1, callbackList, callbackListPosition)));
this.actionButtons.add(nextPageButton);
}
this.populate();
}

View file

@ -1,165 +0,0 @@
package com.esophose.playerparticles.gui;
import com.esophose.playerparticles.gui.hook.PlayerChatHook;
import com.esophose.playerparticles.gui.hook.PlayerChatHookData;
import com.esophose.playerparticles.manager.DataManager;
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.manager.SettingManager.PSetting;
import com.esophose.playerparticles.particles.PPlayer;
import com.esophose.playerparticles.particles.ParticleGroup;
import com.esophose.playerparticles.particles.ParticlePair;
import com.esophose.playerparticles.util.ParticleUtils;
import org.bukkit.Bukkit;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class GuiInventoryManageFixedEffects extends GuiInventory {
public GuiInventoryManageFixedEffects(PPlayer pplayer) {
super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, LangManager.getText(Lang.GUI_MANAGE_YOUR_GROUPS)));
this.fillBorder(BorderColor.YELLOW);
int index = 10;
int nextWrap = 17;
int maxIndex = 35;
List<ParticleGroup> groups = pplayer.getParticleGroups();
groups.sort(Comparator.comparing(ParticleGroup::getName));
for (ParticleGroup group : groups) {
if (group.getName().equals(ParticleGroup.DEFAULT_NAME)) continue;
List<ParticlePair> particles = group.getParticles();
particles.sort(Comparator.comparingInt(ParticlePair::getId));
String[] lore = new String[particles.size() + 2];
lore[0] = LangManager.getText(Lang.GUI_COLOR_SUBTEXT) + LangManager.getText(Lang.GUI_CLICK_TO_LOAD, particles.size());
int i = 1;
for (ParticlePair particle : particles) {
lore[i] = LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_PARTICLE_INFO, particle.getId(), ParticleUtils.formatName(particle.getEffect().getName()), ParticleUtils.formatName(particle.getStyle().getName()), particle.getDataString());
i++;
}
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) -> {
if (isShiftClick) {
DataManager.removeParticleGroup(pplayer.getUniqueId(), group);
this.actionButtons.remove(button);
this.inventory.setItem(button.getSlot(), null);
} else {
ParticleGroup activeGroup = pplayer.getActiveParticleGroup();
activeGroup.getParticles().clear();
for (ParticlePair particle : particles)
activeGroup.getParticles().add(particle.clone());
DataManager.saveParticleGroup(pplayer.getUniqueId(), activeGroup);
if (PSetting.GUI_CLOSE_AFTER_GROUP_SELECTED.getBoolean()) {
pplayer.getPlayer().closeInventory();
}
}
});
this.actionButtons.add(groupButton);
index++;
if (index == nextWrap) { // Loop around border
nextWrap += 9;
index += 2;
}
if (index > maxIndex) break; // Overflowed the available space
}
boolean hasReachedMax = PermissionManager.hasPlayerReachedMaxGroups(pplayer);
boolean hasParticles = !pplayer.getActiveParticles().isEmpty();
String[] lore;
if (hasReachedMax) {
lore = new String[]{
LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SAVE_GROUP_DESCRIPTION),
LangManager.getText(Lang.GUI_COLOR_UNAVAILABLE) + LangManager.getText(Lang.GUI_SAVE_GROUP_FULL)
};
} else if (!hasParticles) {
lore = new String[]{
LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SAVE_GROUP_DESCRIPTION),
LangManager.getText(Lang.GUI_COLOR_UNAVAILABLE) + LangManager.getText(Lang.GUI_SAVE_GROUP_NO_PARTICLES)
};
} else {
lore = new String[]{LangManager.getText(Lang.GUI_COLOR_INFO) + LangManager.getText(Lang.GUI_SAVE_GROUP_DESCRIPTION)};
}
// Save Group Button
GuiActionButton saveGroupButton = new GuiActionButton(
40,
GuiIcon.CREATE.get(),
LangManager.getText(Lang.GUI_COLOR_ICON_NAME) + LangManager.getText(Lang.GUI_SAVE_GROUP),
lore,
(button, isShiftClick) -> {
if (hasReachedMax || !hasParticles)
return;
PlayerChatHook.addHook(new PlayerChatHookData(pplayer.getUniqueId(), 15, (textEntered) -> {
if (textEntered == null || textEntered.equalsIgnoreCase("cancel")) {
GuiHandler.transition(new GuiInventoryManageGroups(pplayer));
} else {
String groupName = textEntered.split(" ")[0];
// Check that the groupName isn't the reserved name
if (groupName.equalsIgnoreCase(ParticleGroup.DEFAULT_NAME)) {
LangManager.sendMessage(pplayer, Lang.GROUP_RESERVED);
return;
}
// The database column can only hold up to 100 characters, cut it off there
if (groupName.length() >= 100) {
groupName = groupName.substring(0, 100);
}
// Use the existing group if available, otherwise create a new one
ParticleGroup group = pplayer.getParticleGroupByName(groupName);
boolean groupUpdated = false;
if (group == null) {
List<ParticlePair> particles = new ArrayList<ParticlePair>();
for (ParticlePair particle : pplayer.getActiveParticles())
particles.add(particle.clone()); // Make sure the ParticlePairs aren't the same references in both the active and saved group
group = new ParticleGroup(groupName, particles);
} else {
groupUpdated = true;
}
// Apply changes and notify player
DataManager.saveParticleGroup(pplayer.getUniqueId(), group);
if (groupUpdated) {
LangManager.sendMessage(pplayer, Lang.GROUP_SAVE_SUCCESS_OVERWRITE, groupName);
} else {
LangManager.sendMessage(pplayer, Lang.GROUP_SAVE_SUCCESS, groupName);
}
GuiHandler.transition(new GuiInventoryManageGroups(pplayer));
}
}));
pplayer.getPlayer().closeInventory();
});
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) -> GuiHandler.transition(new GuiInventoryDefault(pplayer)));
this.actionButtons.add(backButton);
this.populate();
}
}

View file

@ -82,11 +82,11 @@ public class GuiInventoryManageParticles extends GuiInventory {
ParticlePair editingParticle = ParticlePair.getNextDefault(pplayer);
List<GuiInventoryEditFinishedCallback> callbacks = new ArrayList<>();
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(() -> GuiHandler.transition(new GuiInventoryEditEffect(pplayer, editingParticle, 1, callbacks, 1)));
callbacks.add(() -> GuiHandler.transition(new GuiInventoryEditStyle(pplayer, editingParticle, 1, 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));
GuiHandler.transition(new GuiInventoryEditData(pplayer, editingParticle, 1, callbacks, 3));
} else {
callbacks.get(4).execute();
}

View file

@ -22,7 +22,7 @@ public class LangManager {
/**
* Contains the location in the .lang file of every chat message
*/
public static enum Lang { // @formatter:off
public enum Lang { // @formatter:off
// Command Errors
COMMAND_ERROR_NO_EFFECTS,
@ -231,6 +231,8 @@ public class LangManager {
GUI_COLOR_UNAVAILABLE,
GUI_COMMANDS_INFO,
GUI_BACK_BUTTON,
GUI_NEXT_PAGE_BUTTON,
GUI_PREVIOUS_PAGE_BUTTON,
GUI_CLICK_TO_LOAD,
GUI_SHIFT_CLICK_TO_DELETE,
GUI_PARTICLE_INFO,
@ -281,10 +283,6 @@ public class LangManager {
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,

View file

@ -188,11 +188,12 @@ public class SettingManager {
GROUPS,
PRESET_GROUPS,
BACK,
NEXT_PAGE,
PREVIOUS_PAGE,
CREATE,
EDIT_EFFECT,
EDIT_STYLE,
EDIT_DATA,
RANDOMIZE,
RESET,
EFFECT,

View file

@ -9,6 +9,7 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.esophose.playerparticles.util.NMSUtil;
import org.bukkit.Color;
import org.bukkit.Location;
import org.bukkit.Material;
@ -99,12 +100,15 @@ public enum ParticleEffect {
if (effect.isSupported())
NAME_MAP.put(effect.getName(), effect);
try {
Particle.valueOf("NAUTILUS");
if (NMSUtil.getVersionNumber() > 12) {
VERSION_13 = true;
DustOptions_CONSTRUCTOR = Particle.REDSTONE.getDataType().getConstructor(Color.class, float.class);
createBlockData_METHOD = Material.class.getMethod("createBlockData");
} catch (Exception e) {
try {
DustOptions_CONSTRUCTOR = Particle.REDSTONE.getDataType().getConstructor(Color.class, float.class);
createBlockData_METHOD = Material.class.getMethod("createBlockData");
} catch (Exception ex) {
ex.printStackTrace();
}
} else {
DustOptions_CONSTRUCTOR = null;
createBlockData_METHOD = null;
VERSION_13 = false;

View file

@ -0,0 +1,27 @@
package com.esophose.playerparticles.util;
import org.bukkit.Bukkit;
public class NMSUtil {
/**
* Gets the server version
*
* @return The server version
*/
public static String getVersion() {
String name = Bukkit.getServer().getClass().getPackage().getName();
return name.substring(name.lastIndexOf('.') + 1) + ".";
}
/**
* Gets the server version major release number
*
* @return The server version major release number
*/
public static int getVersionNumber() {
String name = getVersion().substring(3);
return Integer.valueOf(name.substring(0, name.length() - 4));
}
}

View file

@ -187,6 +187,10 @@ gui-icon:
- ENDER_CHEST
back:
- ARROW
next_page:
- PAPER
previous_page:
- PAPER
create:
- WRITABLE_BOOK
- BOOK_AND_QUILL
@ -197,8 +201,6 @@ gui-icon:
- NETHER_STAR
edit_data:
- BOOK
randomize:
- HOPPER
reset:
- BARRIER
effect:

View file

@ -217,6 +217,8 @@ 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-next-page-button: "Next Page ({0}/{1})"
gui-previous-page-button: "Previous Page ({0}/{1})"
gui-click-to-load: "Click to load the following {0} particle(s):"
gui-shift-click-to-delete: "Shift click to delete"
gui-particle-info: " - ID: &b{0} &eEffect: &b{1} &eStyle: &b{2} &eData: &b{3}"
@ -267,10 +269,6 @@ 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"

View file

@ -8,10 +8,10 @@
# * PLEASE MAKE YOUR OWN .lang FILE IF YOU WANT CUSTOM MESSAGES! #
# * This file will be overridden almost every plugin update! #
# ================================================================ #
# Translator: maxime_n2
# Translator: maxime_n2 & SevenX
# Command Errors
command-error-no-effects: "&cVous n avez pas la permission d utiliser cette commande."
command-error-no-effects: "&cVous n'avez pas la permission d'utiliser cette commande."
command-error-unknown: "&cCommande inconnue, utilisez &b/pp help &cpour afficher la liste des commandes disponibles pour ce plugin."
# Command Descriptions
@ -19,87 +19,87 @@ command-descriptions: "&eLes commandes suivantes sont disponibles :"
command-descriptions-usage: "&e/pp {0} {1}"
command-descriptions-help-1: "&7> &b/pp {0} &e- {1}"
command-descriptions-help-2: "&7> &b/pp {0} {1} &e- {2}"
command-descriptions-help-other: "&7> &b/ppo <player> <command> &e- Exécute une commande /pp en tant qu un autre joueur."
command-descriptions-help-other: "&7> &b/ppo <player> <command> &e- Exécute une commande /pp en tant qu'un autre joueur."
command-description-add: "Ajoutez une nouvelle particule"
command-description-data: "Voir les paramètres utilisées par la particule"
command-description-default: "Commande principale. Par défaut elle ouvre l interface."
command-description-default: "Commande principale. Par défaut elle ouvre l'interface."
command-description-edit: "Modifiez une particule"
command-description-effects: "Affichez une liste des effets utilisés"
command-description-fixed: "Gérez vos effets fixes"
command-description-group: "Gérez vos groupes d effets"
command-description-gui: "Affichez l interface pour modifier facilement les effets"
command-description-help: "Affichez le menu d aide... Vous y êtes déjà !"
command-description-info: "Voir la description d une de vos particules actives"
command-description-group: "Gérez vos groupes d'effets"
command-description-gui: "Affichez l'interface pour modifier facilement les effets"
command-description-help: "Affichez le menu d'aide... Vous y êtes déjà !"
command-description-info: "Voir la description d'une de vos particules actives"
command-description-list: "Listez les IDs de vos particules actives"
command-description-reload: "Rechargez le fichier config.yml et de langue"
command-description-remove: "Supprimez vos particules actives."
command-description-reset: "Supprimez toutes vos particules actives"
command-description-styles: "Affichez une liste des styles de particules que vous utilisez"
command-description-toggle: "Activez ou déativez vos particules actives"
command-description-toggle: "Activez ou désactivez vos particules actives"
command-description-version: "Affichez la version du plugin et son créateur"
command-description-worlds: "Voir les mondes où ce plugin n est pas autorisé"
command-description-worlds: "Voir les mondes où ce plugin n'est pas autorisé"
# Sub-Command Usage
command-description-fixed-create: "&e/pp fixed create <<x> <y> <z>|<looking>> <effect> <style> [data] - Créez une particule fixe"
command-description-fixed-edit: "&e/pp fixed edit <id> <effect|style|data> <args> - Modifiez une partie d une particule fixe par son ID"
command-description-fixed-edit: "&e/pp fixed edit <id> <effect|style|data> <args> - Modifiez une partie d'une particule fixe par son ID"
command-description-fixed-remove: "&e/pp fixed remove <ID> - Supprimez une particule fixe par son ID"
command-description-fixed-list: "&e/pp fixed list - Affiche l ID de tous vos effets fixes"
command-description-fixed-info: "&e/pp fixed info <ID> - Voir des informations sur l une de vos particules fixe"
command-description-fixed-clear: "&e/pp fixed clear <radius> - Supprimez tous les effets fixe de tous les joueurs d un rayon"
command-description-fixed-list: "&e/pp fixed list - Affiche l'ID de tous vos effets fixes"
command-description-fixed-info: "&e/pp fixed info <ID> - Voir des informations sur l'une de vos particules fixe"
command-description-fixed-clear: "&e/pp fixed clear <radius> - Supprimez tous les effets fixe de tous les joueurs d'un rayon"
command-description-group-save: "&e/pp group save <name> - Sauvegardez toutes les particules actives dans un nouveau groupe"
command-description-group-load: "&e/pp group load <name> - Chargez toutes les particules sauvegardées dans un groupe"
command-description-group-remove: "&e/pp group remove <name> - Supprimez un groupe que vous avez créé"
command-description-group-list: "&e/pp group list <name> - Voir toutes les particules sauvegardées d un groupe que vous avez créé"
command-description-group-list: "&e/pp group list <name> - Voir toutes les particules sauvegardées d'un groupe que vous avez créé"
command-description-group-info: "&e/pp group info <name> - Voir toutes les particules sauvegardées du groupe"
# Command ID Lookup
id-invalid: "&cL ID rentrée n est pas valide, il doit être un nombre entier positif"
id-unknown: "&cVous n avez pas de particules appliquées avec : &b{0} &c!"
id-invalid: "&cL'ID rentrée n'est pas valide, il doit être un nombre entier positif"
id-unknown: "&cVous n'avez pas de particules appliquées avec : &b{0} &c!"
# Other Command
other-no-permission: "&cVous n avez pas la permission pour exécuter une commande /pp en tant qu un autre joueur."
other-no-permission: "&cVous n'avez pas la permission pour exécuter une commande /pp en tant qu'un autre joueur."
other-missing-args: "&cVous oubliez des arguments dans votre commande. &b/ppo <player> <command>"
other-unknown-player: "&cLe joueur &b{0} &cn a pas été trouvé. Il doit être en ligne."
other-unknown-player: "&cLe joueur &b{0} &cn'a pas été trouvé. Il doit être en ligne."
other-unknown-command: "&cLa commande &b/pp {0} &cn existe pas."
other-success: "&Commande /pp exécutée. &b{0}&e. Retour de la commande :"
# Add Command
add-reached-max: "Impossible d appliquer la particule, vous avez atteint la limite de particules qui est de &b{0} &c!"
add-particle-applied: "&aUne nouvelle particule est appliquée avec l effet &b{0}&a, le style &b{1}&a, et les paramètres &b{2} &a!"
add-reached-max: "Impossible d'appliquer la particule, vous avez atteint la limite de particules qui est de &b{0} &c!"
add-particle-applied: "&aUne nouvelle particule est appliquée avec l'effet &b{0}&a, le style &b{1}&a, et les paramètres &b{2} &a!"
# Data Command
data-no-args: "&cVous oubliez des arguments dans l effet. Utilisation de la commande: &b/pp data <effect>"
data-no-args: "&cVous oubliez des arguments dans l'effet. Utilisation de la commande: &b/pp data <effect>"
# Edit Command
edit-invalid-property: "cLa propriété &b{0} &cest interdite. Propriétés valides : &beffect&c, &bstyle&c, &bdata"
edit-success-effect: "&aVotre particule avec l ID de &b{0} &aa son effet changé à &b{1} &a!"
edit-success-style: "&aVotre particule avec l ID de &b{0} &aa son style changé à &b{1} &a!"
edit-success-data: "&aVotre particule avec l ID de &b{0} &aa ses paramètres changés à &b{1} &a!"
edit-success-effect: "&aVotre particule avec l'ID de &b{0} &aa son effet changé à &b{1} &a!"
edit-success-style: "&aVotre particule avec l'ID de &b{0} &aa son style changé à &b{1} &a!"
edit-success-data: "&aVotre particule avec l'ID de &b{0} &aa ses paramètres changés à &b{1} &a!"
# Group Command
group-invalid: "&cUn groupe ou un preset de groupe sauvegardé n existe pas avec le nom &b{0} &c!"
group-preset-no-permission: "&cVous oubliez une permission pour un style ou un effet afin d utiliser les persets du groupe &b{0} &c!"
group-invalid: "&cUn groupe ou un preset de groupe sauvegardé n'existe pas avec le nom &b{0} &c!"
group-preset-no-permission: "&cVous oubliez une permission pour un style ou un effet afin d'utiliser les presets du groupe &b{0} &c!"
group-reserved: "&cLe nom de groupe &bactive &cest réservé et ne peut pas être utiliser !"
group-no-name: "&cVous n avez pas rentré de nom de groupe ! &b/pp {0} <groupName>"
group-no-name: "&cVous n'avez pas rentré de nom de groupe ! &b/pp {0} <groupName>"
group-save-reached-max: "&cImpossible de sauvegarder le groupe, vous avez atteint le nombre maximun de groupes !"
group-save-no-particles: "&cImpossible de sauvegarder le groupe, vous n avez pas appliqué de particules !"
group-save-success: "&aVos particules actuelles on été sauvegardées sous le nom de groupe &b{0} &a!"
group-save-no-particles: "&cImpossible de sauvegarder le groupe, vous n'avez pas appliqué de particules !"
group-save-success: "&aVos particules actuelles ont été sauvegardées sous le nom de groupe &b{0} &a!"
group-save-success-overwrite: "&aLe groupe &b{0} &aa été mis à jour avec vos particules actuelle !"
group-load-success: "&b{0} &aparticule(s) appliqués venant du groupe sauvegardé nommé &b{1} &a!"
group-load-preset-success: "&b{0} &aparticule(s) appliqués venant du preset sauvegardé nommé &b{1} &a!"
group-remove-preset: "&cVous ne pouvez pas supprimer un groupe de presets !"
group-remove-success: "&aGroupe de particules &b{0} &asupprimé !"
group-info-header: "&eLe groupe &b{0} &eposséde les particules suivantes :"
group-list-none: "&eVous n avez pas de groupes de particules sauvegardés !"
group-list-none: "&eVous n'avez pas de groupes de particules sauvegardés !"
group-list-output: "&eVous avez ces groupes suivants sauvegardés : &b{0}"
group-list-presets: "&eCes presets de groupes suivants sont disponibles : &b{0}"
# Reload Command
reload-success: "&aLe plugin a été rechargé..."
reload-no-permission: "&cVous n avez pas la permission pour recharger la configuration de ce plugin !"
reload-no-permission: "&cVous n'avez pas la permission pour recharger la configuration de ce plugin !"
# Remove Command
remove-no-args: "&cVous n avez pas rentrer d ID à supprimer ! &b/pp remove <ID>"
remove-no-args: "&cVous n'avez pas rentrer d'ID à supprimer ! &b/pp remove <ID>"
remove-id-success: "&aVotre particule avec l'ID &b{0} &aa été supprimée !"
remove-effect-success: "&aSuppression de &b{0} &ade votre particule avec l'effet &b{1} &a!"
remove-effect-none: "&cVous n'avez pas de particules appliquées avec l'effet &b{0} &c!"
@ -108,7 +108,7 @@ remove-style-none: "&cVous n'avez pas de particules appliquées avec le style &b
remove-unknown: "&cL'effect avec le nom ou le style &b{0} &cn'existe pas !"
# List Command
list-none: "&eVous n avez pas de particules actives."
list-none: "&eVous n'avez pas de particules actives."
list-you-have: "&eVous avez les particules suivantes appliquées :"
list-output: "&eID: &b{0} &eEffet: &b{1} &eStyle: &b{2} &eParamètre: &b{3}"
@ -123,31 +123,31 @@ rainbow: "&cr&6a&ei&an&bb&9o&dw"
random: "aléatoire"
# Effects
effect-no-permission: "&cVous n avez pas la permission pour utiliser la particule &b{0} &c!"
effect-invalid: "&cL effet &b{0} &cn existe pas ! Utilisez &b/pp effects &cpour afficher les effets disponibles."
effect-no-permission: "&cVous n'avez pas la permission pour utiliser la particule &b{0} &c!"
effect-invalid: "&cL'effet &b{0} &cn existe pas ! Utilisez &b/pp effects &cpour afficher les effets disponibles."
effect-list: "&eVous pouvez utiliser les effets suivants : &b{0}"
effect-list-empty: "&cVous n avez pas la permission pour utiliser des effets !"
effect-list-empty: "&cVous n'avez pas la permission pour utiliser des effets !"
# Styles
style-no-permission: "&cVous n avez pas la permission pour utiliser le style &b{0} &c!"
style-event-spawning-info: "&eNote: Le style &b{0} &efait apparaitre des particules seulement lors d évènements spécifiques."
style-invalid: "&cLe style &b{0} &cn existe pas ! Utilisez &b/pp styles &cpour afficher les styles disponibles."
style-no-permission: "&cVous n'avez pas la permission pour utiliser le style &b{0} &c!"
style-event-spawning-info: "&eNote: Le style &b{0} &efait apparaitre des particules seulement lors d'évènements spécifiques."
style-invalid: "&cLe style &b{0} &cn'existe pas ! Utilisez &b/pp styles &cpour afficher les styles disponibles."
style-list: "&eVous pouvez utiliser les styles suivants : &b{0}"
# Data
data-usage-none: "&eL effet &b{0} &en est pas paramétrable."
data-usage-block: "&eL effet &b{0} &erequière l ID du bloc ! &bFormat: <blockName>"
data-usage-item: "&eL effet &b{0} &erequière l ID de l item ! &bFormat: <itemName>"
data-usage-color: "&eL effet &b{0} &erequière l ID de la couleur ! &bFormat: <<0-255> <0-255> <0-255>>|<rainbow>|<random>"
data-usage-note: "&eL effet&b{0} &erequière l ID de la note ! &bFormat: <0-24>|<rainbow>|<random>"
data-invalid-block: "&cL ID du bloc que vous avez rentré n est pas valide ! &bFormat: <blockName>"
data-invalid-item: "&cL ID de l item que vous avez rentré n est pas valide ! &bFormat: <itemName>"
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>"
data-invalid-note: "&cL ID du bloc que vous avez rentré n est pas valide ! &bFormat: <0-24>|<rainbow>|<random>"
data-invalid-material-not-item: "&cL ID &b{0} &cne correspond pas à un item !"
data-invalid-material-not-block: "&cL ID &b{0} &cne correspond pas à un bloc !"
data-invalid-material-item: "&cL ID &b{0} n existe pas !"
data-invalid-material-block: "&cL ID&b{0} n existe pas !"
data-usage-none: "&eL'effet &b{0} &en'est pas paramétrable."
data-usage-block: "&eL'effet &b{0} &erequière l'ID du bloc ! &bFormat: <blockName>"
data-usage-item: "&eL'effet &b{0} &erequière l'ID de l'item ! &bFormat: <itemName>"
data-usage-color: "&eL'effet &b{0} &erequière l'ID de la couleur ! &bFormat: <<0-255> <0-255> <0-255>>|<rainbow>|<random>"
data-usage-note: "&eL'effet&b{0} &erequière l'ID de la note ! &bFormat: <0-24>|<rainbow>|<random>"
data-invalid-block: "&cL'ID du bloc que vous avez rentré n'est pas valide ! &bFormat: <blockName>"
data-invalid-item: "&cL'ID de l'item que vous avez rentré n'est pas valide ! &bFormat: <itemName>"
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>"
data-invalid-note: "&cL'ID du bloc que vous avez rentré n'est pas valide ! &bFormat: <0-24>|<rainbow>|<random>"
data-invalid-material-not-item: "&cL'ID &b{0} &cne correspond pas à un item !"
data-invalid-material-not-block: "&cL'ID &b{0} &cne correspond pas à un bloc !"
data-invalid-material-item: "&cL'ID &b{0} n'existe pas !"
data-invalid-material-block: "&cL'ID&b{0} n'existe pas !"
# Worlds
disabled-worlds: "&eLes particules sont désactivées dans ces mondes : &b{0}"
@ -161,48 +161,48 @@ fixed-create-missing-args: "&cImpossible de créer un effet fixe, vous oubliez d
fixed-create-invalid-coords: "&cImpossible de créer un effet fixe, coordonnées invalides !"
fixed-create-out-of-range: "&cImpossible de créer un effet fixe, Vous devez être à &b{0} &cblocs de la position rentrée !"
fixed-create-looking-too-far: "&cImpossible de créer un effet fixe, vous êtes trop loin du bloc que vous regardez !"
fixed-create-effect-invalid: "&cImpossible de créer un effet fixe, l effet &b{0} &cn existe pas !"
fixed-create-effect-no-permission: "&cImpossible de créer un effet fixe, vous n avez pas la permission pour utiliser le style &b{0} &c!"
fixed-create-style-invalid: "&cImpossible de créer un effet fixe, le style &b{0} &cn existe pas!"
fixed-create-style-no-permission: "&cImpossible de créer un effet fixe, vous n avez pas la permission pour utiliser le style &b{0} &c!"
fixed-create-style-non-fixable: "&cImpossible de créer un effet fixe, le style &b{0} &cne peut pas être utilisé en tant qu effet fixe !"
fixed-create-data-error: "&cImpossible de créer un effet fixe, l ID rentrée n est pas valide ! Utilisez &b/pp data <effect> &cpour afficher les IDs valides."
fixed-create-success: "&aL effet fixe à été créer."
fixed-create-effect-invalid: "&cImpossible de créer un effet fixe, l effet &b{0} &cn'existe pas !"
fixed-create-effect-no-permission: "&cImpossible de créer un effet fixe, vous n'avez pas la permission pour utiliser le style &b{0} &c!"
fixed-create-style-invalid: "&cImpossible de créer un effet fixe, le style &b{0} &cn'existe pas!"
fixed-create-style-no-permission: "&cImpossible de créer un effet fixe, vous n'avez pas la permission pour utiliser le style &b{0} &c!"
fixed-create-style-non-fixable: "&cImpossible de créer un effet fixe, le style &b{0} &cne peut pas être utilisé en tant qu'effet fixe !"
fixed-create-data-error: "&cImpossible de créer un effet fixe, l'ID rentrée n'est pas valide ! Utilisez &b/pp data <effect> &cpour afficher les IDs valides."
fixed-create-success: "&aL'effet fixe à été créer."
fixed-edit-missing-args: "&cImpossible de modifier l effet fixe, vous oubliez des arguments !"
fixed-edit-invalid-id: "&cImpossible de modifier l effet fixe, ID incorrecte !"
fixed-edit-invalid-property: "&cImpossible de modifier l effet fixe, argument incorrecte ! Seuls localisation, effet, style, et paramètre sont valides."
fixed-edit-invalid-coords: "&cImpossible de modifier l effet fixe, coordonnée incorrecte !"
fixed-edit-out-of-range: "&cImpossible de modifier l effet fixe, vous devez être à &b{0} &cblocs de l emplacement désiré !"
fixed-edit-looking-too-far: "&cImpossible de modifier l effet fixe, vous êtes trop loin du bloc que vous regardez !"
fixed-edit-effect-invalid: "&cImpossible de modifier l effet fixe, l effet &b{0} &cn existe pas !"
fixed-edit-effect-no-permission: "&cImpossible de modifier l effet fixe, vous n avez pas la permission pour utiliser l effet &b{0} &c!"
fixed-edit-style-invalid: "&cImpossible de modifier l effet fixe, le style &b{0} &cn existe pas !"
fixed-edit-style-no-permission: "&cImpossible de modifier l effet fixe, vous n avez pas la permission pour utiliser le style &b{0} &c!"
fixed-edit-style-non-fixable: "&cImpossible de modifier l effet fixe, the style &b{0} &cne peut pas être utilisé dans des effets fixes !"
fixed-edit-data-error: "&cImpossible de modifier l effet fixe, paramètre incorrecte ! Utilisez &b/pp data <effect> pour afficher les paramètres valides."
fixed-edit-data-none: "&cImpossible de modifier l effet fixe, l effet ne requière pas de paramètres !"
fixed-edit-success: "&aMise à jour de &b{0} &ade l effet fixe avec l ID &b{1} &a!"
fixed-edit-missing-args: "&cImpossible de modifier l'effet fixe, vous oubliez des arguments !"
fixed-edit-invalid-id: "&cImpossible de modifier l'effet fixe, ID incorrecte !"
fixed-edit-invalid-property: "&cImpossible de modifier l'effet fixe, argument incorrect ! Seuls localisation, effet, style, et paramètre sont valides."
fixed-edit-invalid-coords: "&cImpossible de modifier l'effet fixe, coordonnée incorrecte !"
fixed-edit-out-of-range: "&cImpossible de modifier l'effet fixe, vous devez être à &b{0} &cblocs de l'emplacement désiré !"
fixed-edit-looking-too-far: "&cImpossible de modifier l'effet fixe, vous êtes trop loin du bloc que vous regardez !"
fixed-edit-effect-invalid: "&cImpossible de modifier l'effet fixe, l'effet &b{0} &cn'existe pas !"
fixed-edit-effect-no-permission: "&cImpossible de modifier l'effet fixe, vous n'avez pas la permission pour utiliser l'effet &b{0} &c!"
fixed-edit-style-invalid: "&cImpossible de modifier l'effet fixe, le style &b{0} &cn'existe pas !"
fixed-edit-style-no-permission: "&cImpossible de modifier l'effet fixe, vous n'avez pas la permission pour utiliser le style &b{0} &c!"
fixed-edit-style-non-fixable: "&cImpossible de modifier l'effet fixe, the style &b{0} &cne peut pas être utilisé dans des effets fixes !"
fixed-edit-data-error: "&cImpossible de modifier l'effet fixe, paramètre incorrect ! Utilisez &b/pp data <effect> pour afficher les paramètres valides."
fixed-edit-data-none: "&cImpossible de modifier l'effet fixe, l'effet ne requière pas de paramètres !"
fixed-edit-success: "&aMise à jour de &b{0} &ade l'effet fixe avec l'ID &b{1} &a!"
fixed-remove-invalid: "&cImpossible de supprimer l effet fixe, vous n avez pas d effets fixes avec l ID &b{0} &c!"
fixed-remove-no-args: "&cVous n avez pas rentrer d ID à supprimer !"
fixed-remove-args-invalid: "&cImpossible de supprimer, l ID doit être un nombre !"
fixed-remove-success: "&aTous vos effets fixes avec l ID &b{0} &aont été supprimés !"
fixed-remove-invalid: "&cImpossible de supprimer l'effet fixe, vous n'avez pas d effets fixes avec l'ID &b{0} &c!"
fixed-remove-no-args: "&cVous n'avez pas rentrer d'ID à supprimer !"
fixed-remove-args-invalid: "&cImpossible de supprimer, l'ID doit être un nombre !"
fixed-remove-success: "&aTous vos effets fixes avec l'ID &b{0} &aont été supprimés !"
fixed-list-none: "&eVous n avez pas d effets fixes !"
fixed-list-none: "&eVous n'avez pas d'effets fixes !"
fixed-list-success: "&eVous avez des effets fixes avec ces IDs :&b{0}"
fixed-info-invalid: "&cImpossible de obtenir l information, vous n avez pas de particules fixes avec l ID &b{0}& c!"
fixed-info-no-args: "&cVous n avez pas rentrée d ID pour obtenir d infomations !"
fixed-info-invalid-args: "&cImpossible d obtenir l information, vous n avez pas de particules fixes avec l ID, l ID spécifiée doit être un nombre !"
fixed-info-invalid: "&cImpossible d'obtenir l'information, vous n'avez pas de particules fixes avec l'ID &b{0}& c!"
fixed-info-no-args: "&cVous n'avez pas rentrée d'ID pour obtenir d'infomations !"
fixed-info-invalid-args: "&cImpossible d'obtenir l'information, vous n'avez pas de particules fixes avec l'ID, l'ID spécifiée doit être un nombre !"
fixed-info-success: "&eID: &b{0} &eWorld: &b{1} &eX: &b{2} &eY: &b{3} &eZ: &b{4} &eEffect: &b{5} &eStyle: &b{6} &eData: &b{7}"
fixed-clear-no-permission: "&cVous n avez la permission pour supprimer les effets proches !"
fixed-clear-no-args: "&cVous n avez pas rentré de rayon !"
fixed-clear-invalid-args: "&cLe rayon rentré n est pas valide, il doit être un nombre rond !"
fixed-clear-success: "&b{0} &aeffets on été supprimés dans un rayon &b{1} &cblocs !"
fixed-clear-no-permission: "&cVous n'avez la permission pour supprimer les effets proches !"
fixed-clear-no-args: "&cVous n'avez pas rentré de rayon !"
fixed-clear-invalid-args: "&cLe rayon rentré n'est pas valide, il doit être un nombre rond !"
fixed-clear-success: "&b{0} &aeffets ont été supprimés dans un rayon &b{1} &cblocs !"
fixed-no-permission: "&cVous n avez pas la permission d ajouter des effets fixes !"
fixed-no-permission: "&cVous n'avez pas la permission d'ajouter des effets fixes !"
fixed-max-reached: "&cVous avez atteint le nombre maximum de particules fixes !"
fixed-invalid-command: "&cArguments invalides pour la commande &b/pp fixed&c!"
@ -210,13 +210,15 @@ fixed-invalid-command: "&cArguments invalides pour la commande &b/pp fixed&c!"
update-available: "&eLa version (&b{0}&e) est disponible ! vous utilisez la version &bv{1}&d. https://www.spigotmc.org/resources/playerparticles.40261/"
# GUI
gui-disabled: "&cL interface du plugin à été désactivée !"
gui-disabled: "&cL'interface du plugin à été désactivée !"
gui-color-icon-name: "&a"
gui-color-info: "&e"
gui-color-subtext: "&b"
gui-color-unavailable: "&c"
gui-commands-info: "Affichez des informations avec &b/pp help"
gui-back-button: "Retour en arrière"
gui-next-page-button: "Page Suivante ({0}/{1})"
gui-previous-page-button: "Page Précédente ({0}/{1})"
gui-click-to-load: "Cliquez pour charger : {0}"
gui-shift-click-to-delete: "Touche SHIFT + clic-gauche pour effacer un effet"
gui-particle-info: " - ID: &b{0} &eEffet: &b{1} &eStyle: &b{2} &eParamètre: &b{3}"
@ -224,14 +226,14 @@ gui-playerparticles: "PlayerParticles"
gui-active-particles: "Particules actives: &b{0}"
gui-saved-groups: "Groupes sauvegardés: &b{0}"
gui-fixed-effects: "Effets fixes: &b{0}"
gui-edit-primary-effect: "Editez l effet primaire"
gui-edit-primary-effect: "Editez l'effet primaire"
gui-edit-primary-effect-description: "Editez l effet d une de vos particules primaire"
gui-edit-primary-style: "Editez le style primaire"
gui-edit-primary-style-missing-effect: "Vous devez d abord sélectionner un effet !"
gui-edit-primary-style-description: "Editez le style d une particule primaire"
gui-edit-primary-data: "Editez les paramètres d une particules primaire"
gui-edit-primary-data-missing-effect: "Vous devez d abord sélectionner un effet"
gui-edit-primary-data-unavailable: "Votre effet primaire n est pas paramétrable"
gui-edit-primary-style-missing-effect: "Vous devez d'abord sélectionner un effet !"
gui-edit-primary-style-description: "Editez le style d'une particule primaire"
gui-edit-primary-data: "Editez les paramètres d'une particules primaire"
gui-edit-primary-data-missing-effect: "Vous devez d'abord sélectionner un effet"
gui-edit-primary-data-unavailable: "Votre effet primaire n'est pas paramétrable"
gui-edit-primary-data-description: "Editer les paramères de votre effet primaire"
gui-manage-your-particles: "Gérez vos particules"
gui-manage-your-particles-description: "Créez, éditez, et supprimez vos particules"
@ -240,7 +242,7 @@ gui-manage-your-groups-description: "Créez, éditez, et supprimez vos groupes p
gui-load-a-preset-group: "Chargez un groupe de presets"
gui-load-a-preset-group-description: "Chargez un groupe de particules déjà fait"
gui-save-group: "Sauvegardez un nouveau groupe"
gui-save-group-description: "Cliquez pour sauvegardez un nouveau groupe. Vous allez être invité\na écrire un nouveau nom dans le tchat."
gui-save-group-description: "Cliquez pour sauvegardez un nouveau groupe. Vous allez être invité\nà écrire un nouveau nom dans le tchat."
gui-save-group-full: "Vous avez atteint le nombre maximal de groupe !"
gui-save-group-no-particles: "Vous avez aucunes particules appliquées"
gui-save-group-hotbar-message: "&eTapez &b1 &enom dans le tchat pour le nouveau nom du groupe. Tapez &ccancel&e pour annuler. (&b{0}&es restants)"
@ -249,8 +251,8 @@ gui-reset-particles-description: "Supprimez vos particules actives"
gui-particle-name: "Particule #{0}"
gui-click-to-edit-particle: "Cliquez pour éditer cette particule"
gui-editing-particle: "Edition particule #{0}"
gui-edit-effect: "Editez l effet"
gui-edit-effect-description: "Cliquez pour éditer l effet de cette particule"
gui-edit-effect: "Editez l'effet"
gui-edit-effect-description: "Cliquez pour éditer l'effet de cette particule"
gui-edit-style: "Editez le style"
gui-edit-style-description: "Cliquez pour éditer le style de cette particule"
gui-edit-data: "Editez les paramères"
@ -267,10 +269,6 @@ gui-select-style-description: "Mets le style de la particule à &b{0}"
gui-select-data: "Sélectionnez les paramètres"
gui-select-data-description: "Mets les paramètres de la particule à &b{0}"
gui-select-data-note: "note #{0}"
gui-select-data-randomize-items: "Mélangez les items"
gui-select-data-randomize-items-description: "Mélangez les items affichés"
gui-select-data-randomize-blocks: "Mélangez les blocs"
gui-select-data-randomize-blocks-description: "Mélangez les blocs affichés"
gui-edit-data-color-red: "&crouge"
gui-edit-data-color-orange: "&6orange"
gui-edit-data-color-yellow: "&ejaune"

View file

@ -217,6 +217,8 @@ gui-color-subtext: "&b"
gui-color-unavailable: "&c"
gui-commands-info: "Hiển thị thêm các lệnh bằng cách gõ &b/pp help"
gui-back-button: "Quay trở về"
gui-next-page-button: "Trang tiếp theo ({0}/{1})"
gui-previous-page-button: "Trang trước ({0}/{1})"
gui-click-to-load: "Nhấn để tải {0} Hạt hiệu ứng sau:"
gui-shift-click-to-delete: "Shift Click để xóa"
gui-particle-info: " - ID: &b{0} &eEffect: &b{1} &eStyle: &b{2} &eData: &b{3}"
@ -267,10 +269,6 @@ gui-select-style-description: "Thiết lập Kiểu hiệu ứng của Hạt th
gui-select-data: "Chọn Dữ liệu của Hạt"
gui-select-data-description: "Thiết lập DỮ liệu của Hạt thành &b{0}"
gui-select-data-note: "note #{0}"
gui-select-data-randomize-items: "Vật phẩm ngẫu nhiên"
gui-select-data-randomize-items-description: "Đã hiển thị vật phẩm ngẫu nhiên"
gui-select-data-randomize-blocks: "Khối ngẫu nhiên"
gui-select-data-randomize-blocks-description: "Đã hiển thị khối ngẫu nhiên"
gui-edit-data-color-red: "&cĐỏ mạnh mẽ"
gui-edit-data-color-orange: "&6Cam dịu dàng"
gui-edit-data-color-yellow: "&eVàng yêu thương"