Added the ability for the console to manage its own fixed effects

This commit is contained in:
Esophose 2020-01-26 00:02:27 -07:00
parent 4886f10656
commit dcb18d94bb
16 changed files with 371 additions and 166 deletions

View file

@ -6,6 +6,7 @@
+ Added sub-command '/pp fixed teleport <id>' that requires the permission playerparticles.fixed.teleport + Added sub-command '/pp fixed teleport <id>' that requires the permission playerparticles.fixed.teleport
+ Added named colors to the color data autocomplete + Added named colors to the color data autocomplete
+ Added an API, accessible through the dev.esophose.playerparticles.api.PlayerParticlesAPI class + Added an API, accessible through the dev.esophose.playerparticles.api.PlayerParticlesAPI class
+ Added the ability for the console to manage its own fixed effects
+ Added PlaceholderAPI support + Added PlaceholderAPI support
+ Added permission playerparticles.override for /ppo + Added permission playerparticles.override for /ppo
+ Added permission playerparticles.gui to open the GUI. Disabled in the config by default + Added permission playerparticles.gui to open the GUI. Disabled in the config by default

View file

@ -5,6 +5,7 @@ import dev.esophose.playerparticles.manager.DataManager;
import dev.esophose.playerparticles.manager.GuiManager; import dev.esophose.playerparticles.manager.GuiManager;
import dev.esophose.playerparticles.manager.ParticleManager; import dev.esophose.playerparticles.manager.ParticleManager;
import dev.esophose.playerparticles.manager.ParticleStyleManager; import dev.esophose.playerparticles.manager.ParticleStyleManager;
import dev.esophose.playerparticles.particles.ConsolePPlayer;
import dev.esophose.playerparticles.particles.FixedParticleEffect; import dev.esophose.playerparticles.particles.FixedParticleEffect;
import dev.esophose.playerparticles.particles.PPlayer; import dev.esophose.playerparticles.particles.PPlayer;
import dev.esophose.playerparticles.particles.ParticleEffect; import dev.esophose.playerparticles.particles.ParticleEffect;
@ -23,6 +24,8 @@ import java.util.Set;
import java.util.UUID; import java.util.UUID;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -81,6 +84,35 @@ public final class PlayerParticlesAPI {
return this.getPPlayer(player.getUniqueId()); return this.getPPlayer(player.getUniqueId());
} }
/**
* Gets a PPlayer from a CommandSender
*
* @param sender The CommandSender, either a Player or ConsoleCommandSender
* @return The PPlayer, or null if not found
*/
@Nullable
public PPlayer getPPlayer(@NotNull CommandSender sender) {
Objects.requireNonNull(sender);
if (sender instanceof Player) {
return this.getPPlayer((Player) sender);
} else if (sender instanceof ConsoleCommandSender) {
return this.getConsolePPlayer();
}
return null;
}
/**
* Gets the PPlayer representing the console
*
* @return The PPlayer, or null if not found
*/
@Nullable
public PPlayer getConsolePPlayer() {
return this.getPPlayer(ConsolePPlayer.getUUID());
}
//endregion //endregion
//region Manage Active Player Particles //region Manage Active Player Particles
@ -489,21 +521,21 @@ public final class PlayerParticlesAPI {
/** /**
* Creates a fixed particle effect for a player * Creates a fixed particle effect for a player
* *
* @param player The player to create for * @param sender The sender to create for, either a Player or ConsoleCommandSender
* @param location The location to create at * @param location The location to create at
* @param particle The particle to display * @param particle The particle to display
*/ */
public void createFixedParticleEffect(@NotNull Player player, @NotNull Location location, @NotNull ParticlePair particle) { public void createFixedParticleEffect(@NotNull CommandSender sender, @NotNull Location location, @NotNull ParticlePair particle) {
Objects.requireNonNull(location); Objects.requireNonNull(location);
Objects.requireNonNull(location.getWorld()); Objects.requireNonNull(location.getWorld());
Objects.requireNonNull(particle); Objects.requireNonNull(particle);
DataManager dataManager = this.playerParticles.getManager(DataManager.class); DataManager dataManager = this.playerParticles.getManager(DataManager.class);
PPlayer pplayer = this.getPPlayer(player); PPlayer pplayer = this.getPPlayer(sender);
if (pplayer == null) if (pplayer == null)
return; return;
FixedParticleEffect fixedEffect = new FixedParticleEffect(player.getUniqueId(), pplayer.getNextFixedEffectId(), location, particle); FixedParticleEffect fixedEffect = new FixedParticleEffect(pplayer.getUniqueId(), pplayer.getNextFixedEffectId(), location, particle);
pplayer.addFixedEffect(fixedEffect); pplayer.addFixedEffect(fixedEffect);
dataManager.saveFixedEffect(fixedEffect); dataManager.saveFixedEffect(fixedEffect);
} }
@ -511,58 +543,58 @@ public final class PlayerParticlesAPI {
/** /**
* Creates a fixed particle effect for a player * Creates a fixed particle effect for a player
* *
* @param player The player to create for * @param sender The sender to create for, either a Player or ConsoleCommandSender
* @param location The location to create at * @param location The location to create at
* @param effect The effect of the particle * @param effect The effect of the particle
* @param style The style of the particle * @param style The style of the particle
*/ */
public void createFixedParticleEffect(@NotNull Player player, @NotNull Location location, @NotNull ParticleEffect effect, @NotNull ParticleStyle style) { public void createFixedParticleEffect(@NotNull CommandSender sender, @NotNull Location location, @NotNull ParticleEffect effect, @NotNull ParticleStyle style) {
this.createFixedParticleEffect(player, location, effect, style, null, null, null); this.createFixedParticleEffect(sender, location, effect, style, null, null, null);
} }
/** /**
* Creates a fixed particle effect for a player * Creates a fixed particle effect for a player
* *
* @param player The player to create for * @param sender The sender to create for, either a Player or ConsoleCommandSender
* @param location The location to create at * @param location The location to create at
* @param effect The effect of the particle * @param effect The effect of the particle
* @param style The style of the particle * @param style The style of the particle
* @param colorData The color data of the particle * @param colorData The color data of the particle
*/ */
public void createFixedParticleEffect(@NotNull Player player, @NotNull Location location, @NotNull ParticleEffect effect, @NotNull ParticleStyle style, @NotNull OrdinaryColor colorData) { public void createFixedParticleEffect(@NotNull CommandSender sender, @NotNull Location location, @NotNull ParticleEffect effect, @NotNull ParticleStyle style, @NotNull OrdinaryColor colorData) {
this.createFixedParticleEffect(player, location, effect, style, colorData, null, null); this.createFixedParticleEffect(sender, location, effect, style, colorData, null, null);
} }
/** /**
* Creates a fixed particle effect for a player * Creates a fixed particle effect for a player
* *
* @param player The player to create for * @param sender The sender to create for, either a Player or ConsoleCommandSender
* @param location The location to create at * @param location The location to create at
* @param effect The effect of the particle * @param effect The effect of the particle
* @param style The style of the particle * @param style The style of the particle
* @param noteColorData The note color data of the particle * @param noteColorData The note color data of the particle
*/ */
public void createFixedParticleEffect(@NotNull Player player, @NotNull Location location, @NotNull ParticleEffect effect, @NotNull ParticleStyle style, @NotNull NoteColor noteColorData) { public void createFixedParticleEffect(@NotNull CommandSender sender, @NotNull Location location, @NotNull ParticleEffect effect, @NotNull ParticleStyle style, @NotNull NoteColor noteColorData) {
this.createFixedParticleEffect(player, location, effect, style, null, noteColorData, null); this.createFixedParticleEffect(sender, location, effect, style, null, noteColorData, null);
} }
/** /**
* Creates a fixed particle effect for a player * Creates a fixed particle effect for a player
* *
* @param player The player to create for * @param sender The sender to create for, either a Player or ConsoleCommandSender
* @param location The location to create at * @param location The location to create at
* @param effect The effect of the particle * @param effect The effect of the particle
* @param style The style of the particle * @param style The style of the particle
* @param materialData The material data of the particle * @param materialData The material data of the particle
*/ */
public void createFixedParticleEffect(@NotNull Player player, @NotNull Location location, @NotNull ParticleEffect effect, @NotNull ParticleStyle style, @NotNull Material materialData) { public void createFixedParticleEffect(@NotNull CommandSender sender, @NotNull Location location, @NotNull ParticleEffect effect, @NotNull ParticleStyle style, @NotNull Material materialData) {
this.createFixedParticleEffect(player, location, effect, style, null, null, materialData); this.createFixedParticleEffect(sender, location, effect, style, null, null, materialData);
} }
/** /**
* Creates a fixed particle effect for a player * Creates a fixed particle effect for a player
* *
* @param player The player to create for * @param sender The sender to create for, either a Player or ConsoleCommandSender
* @param location The location to create at * @param location The location to create at
* @param effect The effect of the particle * @param effect The effect of the particle
* @param style The style of the particle * @param style The style of the particle
@ -570,13 +602,13 @@ public final class PlayerParticlesAPI {
* @param noteColorData The note color data of the particle * @param noteColorData The note color data of the particle
* @param materialData The material data of the particle * @param materialData The material data of the particle
*/ */
private void createFixedParticleEffect(@NotNull Player player, @NotNull Location location, @NotNull ParticleEffect effect, @NotNull ParticleStyle style, @Nullable OrdinaryColor colorData, @Nullable NoteColor noteColorData, @Nullable Material materialData) { private void createFixedParticleEffect(@NotNull CommandSender sender, @NotNull Location location, @NotNull ParticleEffect effect, @NotNull ParticleStyle style, @Nullable OrdinaryColor colorData, @Nullable NoteColor noteColorData, @Nullable Material materialData) {
Objects.requireNonNull(location); Objects.requireNonNull(location);
Objects.requireNonNull(location.getWorld()); Objects.requireNonNull(location.getWorld());
Objects.requireNonNull(effect); Objects.requireNonNull(effect);
Objects.requireNonNull(style); Objects.requireNonNull(style);
PPlayer pplayer = this.getPPlayer(player); PPlayer pplayer = this.getPPlayer(sender);
if (pplayer == null) if (pplayer == null)
return; return;
@ -590,25 +622,25 @@ public final class PlayerParticlesAPI {
} }
} }
ParticlePair particle = new ParticlePair(player.getUniqueId(), 1, effect, style, itemMaterialData, blockMaterialData, colorData, noteColorData); ParticlePair particle = new ParticlePair(pplayer.getUniqueId(), 1, effect, style, itemMaterialData, blockMaterialData, colorData, noteColorData);
this.createFixedParticleEffect(player, location, particle); this.createFixedParticleEffect(sender, location, particle);
} }
/** /**
* Edits a fixed particle effect for a player * Edits a fixed particle effect for a player
* *
* @param player The player to edit from * @param sender The sender to edit from, either a Player or ConsoleCommandSender
* @param fixedEffect The modified fixed effect to edit * @param fixedEffect The modified fixed effect to edit
*/ */
public void editFixedParticleEffect(@NotNull Player player, @NotNull FixedParticleEffect fixedEffect) { public void editFixedParticleEffect(@NotNull CommandSender sender, @NotNull FixedParticleEffect fixedEffect) {
Objects.requireNonNull(fixedEffect); Objects.requireNonNull(fixedEffect);
PPlayer pplayer = this.getPPlayer(player); PPlayer pplayer = this.getPPlayer(sender);
if (pplayer == null) if (pplayer == null)
return; return;
DataManager dataManager = this.playerParticles.getManager(DataManager.class); DataManager dataManager = this.playerParticles.getManager(DataManager.class);
if (this.validateFixedParticleEffect(player, fixedEffect.getId()) != null) { if (this.validateFixedParticleEffect(sender, fixedEffect.getId()) != null) {
pplayer.removeFixedEffect(fixedEffect.getId()); pplayer.removeFixedEffect(fixedEffect.getId());
pplayer.addFixedEffect(fixedEffect); pplayer.addFixedEffect(fixedEffect);
dataManager.updateFixedEffect(fixedEffect); dataManager.updateFixedEffect(fixedEffect);
@ -618,16 +650,16 @@ public final class PlayerParticlesAPI {
/** /**
* Edits a fixed particle effect for a player * Edits a fixed particle effect for a player
* *
* @param player The player to edit from * @param sender The sender to edit from, either a Player or ConsoleCommandSender
* @param id The ID of the fixed particle effect * @param id The ID of the fixed particle effect
* @param location The new location * @param location The new location
*/ */
public void editFixedParticleEffect(@NotNull Player player, int id, @NotNull Location location) { public void editFixedParticleEffect(@NotNull CommandSender sender, int id, @NotNull Location location) {
Objects.requireNonNull(location); Objects.requireNonNull(location);
Objects.requireNonNull(location.getWorld()); Objects.requireNonNull(location.getWorld());
DataManager dataManager = this.playerParticles.getManager(DataManager.class); DataManager dataManager = this.playerParticles.getManager(DataManager.class);
FixedParticleEffect fixedEffect = this.validateFixedParticleEffect(player, id); FixedParticleEffect fixedEffect = this.validateFixedParticleEffect(sender, id);
if (fixedEffect != null) { if (fixedEffect != null) {
fixedEffect.setCoordinates(location.getX(), location.getY(), location.getZ()); fixedEffect.setCoordinates(location.getX(), location.getY(), location.getZ());
dataManager.saveFixedEffect(fixedEffect); dataManager.saveFixedEffect(fixedEffect);
@ -637,15 +669,15 @@ public final class PlayerParticlesAPI {
/** /**
* Edits a fixed particle effect for a player * Edits a fixed particle effect for a player
* *
* @param player The player to edit from * @param sender The sender to edit from, either a Player or ConsoleCommandSender
* @param id The ID of the fixed particle effect * @param id The ID of the fixed particle effect
* @param effect The new effect * @param effect The new effect
*/ */
public void editFixedParticleEffect(@NotNull Player player, int id, @NotNull ParticleEffect effect) { public void editFixedParticleEffect(@NotNull CommandSender sender, int id, @NotNull ParticleEffect effect) {
Objects.requireNonNull(effect); Objects.requireNonNull(effect);
DataManager dataManager = this.playerParticles.getManager(DataManager.class); DataManager dataManager = this.playerParticles.getManager(DataManager.class);
FixedParticleEffect fixedEffect = this.validateFixedParticleEffect(player, id); FixedParticleEffect fixedEffect = this.validateFixedParticleEffect(sender, id);
if (fixedEffect != null) { if (fixedEffect != null) {
fixedEffect.getParticlePair().setEffect(effect); fixedEffect.getParticlePair().setEffect(effect);
dataManager.saveFixedEffect(fixedEffect); dataManager.saveFixedEffect(fixedEffect);
@ -655,15 +687,15 @@ public final class PlayerParticlesAPI {
/** /**
* Edits a fixed particle effect for a player * Edits a fixed particle effect for a player
* *
* @param player The player to edit from * @param sender The sender to edit from, either a Player or ConsoleCommandSender
* @param id The ID of the fixed particle effect * @param id The ID of the fixed particle effect
* @param style The new style * @param style The new style
*/ */
public void editFixedParticleEffect(@NotNull Player player, int id, @NotNull ParticleStyle style) { public void editFixedParticleEffect(@NotNull CommandSender sender, int id, @NotNull ParticleStyle style) {
Objects.requireNonNull(style); Objects.requireNonNull(style);
DataManager dataManager = this.playerParticles.getManager(DataManager.class); DataManager dataManager = this.playerParticles.getManager(DataManager.class);
FixedParticleEffect fixedEffect = this.validateFixedParticleEffect(player, id); FixedParticleEffect fixedEffect = this.validateFixedParticleEffect(sender, id);
if (fixedEffect != null) { if (fixedEffect != null) {
fixedEffect.getParticlePair().setStyle(style); fixedEffect.getParticlePair().setStyle(style);
dataManager.saveFixedEffect(fixedEffect); dataManager.saveFixedEffect(fixedEffect);
@ -673,15 +705,15 @@ public final class PlayerParticlesAPI {
/** /**
* Edits a fixed particle effect for a player * Edits a fixed particle effect for a player
* *
* @param player The player to edit from * @param sender The sender to edit from, either a Player or ConsoleCommandSender
* @param id The ID of the fixed particle effect * @param id The ID of the fixed particle effect
* @param colorData The new color data * @param colorData The new color data
*/ */
public void editFixedParticleEffect(@NotNull Player player, int id, @NotNull OrdinaryColor colorData) { public void editFixedParticleEffect(@NotNull CommandSender sender, int id, @NotNull OrdinaryColor colorData) {
Objects.requireNonNull(colorData); Objects.requireNonNull(colorData);
DataManager dataManager = this.playerParticles.getManager(DataManager.class); DataManager dataManager = this.playerParticles.getManager(DataManager.class);
FixedParticleEffect fixedEffect = this.validateFixedParticleEffect(player, id); FixedParticleEffect fixedEffect = this.validateFixedParticleEffect(sender, id);
if (fixedEffect != null) { if (fixedEffect != null) {
fixedEffect.getParticlePair().setColor(colorData); fixedEffect.getParticlePair().setColor(colorData);
dataManager.saveFixedEffect(fixedEffect); dataManager.saveFixedEffect(fixedEffect);
@ -691,15 +723,15 @@ public final class PlayerParticlesAPI {
/** /**
* Edits a fixed particle effect for a player * Edits a fixed particle effect for a player
* *
* @param player The player to edit from * @param sender The sender to edit from, either a Player or ConsoleCommandSender
* @param id The ID of the fixed particle effect * @param id The ID of the fixed particle effect
* @param noteColorData The new note color data * @param noteColorData The new note color data
*/ */
public void editFixedParticleEffect(@NotNull Player player, int id, @NotNull NoteColor noteColorData) { public void editFixedParticleEffect(@NotNull CommandSender sender, int id, @NotNull NoteColor noteColorData) {
Objects.requireNonNull(noteColorData); Objects.requireNonNull(noteColorData);
DataManager dataManager = this.playerParticles.getManager(DataManager.class); DataManager dataManager = this.playerParticles.getManager(DataManager.class);
FixedParticleEffect fixedEffect = this.validateFixedParticleEffect(player, id); FixedParticleEffect fixedEffect = this.validateFixedParticleEffect(sender, id);
if (fixedEffect != null) { if (fixedEffect != null) {
fixedEffect.getParticlePair().setNoteColor(noteColorData); fixedEffect.getParticlePair().setNoteColor(noteColorData);
dataManager.saveFixedEffect(fixedEffect); dataManager.saveFixedEffect(fixedEffect);
@ -709,15 +741,15 @@ public final class PlayerParticlesAPI {
/** /**
* Edits a fixed particle effect for a player * Edits a fixed particle effect for a player
* *
* @param player The player to edit from * @param sender The sender to edit from, either a Player or ConsoleCommandSender
* @param id The ID of the fixed particle effect * @param id The ID of the fixed particle effect
* @param materialData The new material data * @param materialData The new material data
*/ */
public void editFixedParticleEffect(@NotNull Player player, int id, @NotNull Material materialData) { public void editFixedParticleEffect(@NotNull CommandSender sender, int id, @NotNull Material materialData) {
Objects.requireNonNull(materialData); Objects.requireNonNull(materialData);
DataManager dataManager = this.playerParticles.getManager(DataManager.class); DataManager dataManager = this.playerParticles.getManager(DataManager.class);
FixedParticleEffect fixedEffect = this.validateFixedParticleEffect(player, id); FixedParticleEffect fixedEffect = this.validateFixedParticleEffect(sender, id);
if (fixedEffect != null) { if (fixedEffect != null) {
if (materialData.isBlock()) { if (materialData.isBlock()) {
fixedEffect.getParticlePair().setBlockMaterial(materialData); fixedEffect.getParticlePair().setBlockMaterial(materialData);
@ -731,19 +763,19 @@ public final class PlayerParticlesAPI {
/** /**
* Removes a fixed particle effect from a player * Removes a fixed particle effect from a player
* *
* @param player The player to remove from * @param sender The sender to remove from, either a Player or ConsoleCommandSender
* @param id The ID of the fixed particle effect * @param id The ID of the fixed particle effect
*/ */
public void removeFixedEffect(@NotNull Player player, int id) { public void removeFixedEffect(@NotNull CommandSender sender, int id) {
DataManager dataManager = this.playerParticles.getManager(DataManager.class); DataManager dataManager = this.playerParticles.getManager(DataManager.class);
FixedParticleEffect fixedEffect = this.validateFixedParticleEffect(player, id); FixedParticleEffect fixedEffect = this.validateFixedParticleEffect(sender, id);
if (fixedEffect != null) { if (fixedEffect != null) {
PPlayer pplayer = this.getPPlayer(player); PPlayer pplayer = this.getPPlayer(sender);
if (pplayer == null) if (pplayer == null)
return; return;
pplayer.removeFixedEffect(id); pplayer.removeFixedEffect(id);
dataManager.removeFixedEffect(player.getUniqueId(), fixedEffect.getId()); dataManager.removeFixedEffect(pplayer.getUniqueId(), fixedEffect.getId());
} }
} }
@ -780,13 +812,13 @@ public final class PlayerParticlesAPI {
/** /**
* Validates that a fixed particle effect with the given ID exists for a player * Validates that a fixed particle effect with the given ID exists for a player
* *
* @param player The player to check * @param sender The sender to check, either a Player or CommandSender
* @param id The ID of the fixed particle effect * @param id The ID of the fixed particle effect
* @return The fixed particle effect * @return The fixed particle effect
*/ */
@Nullable @Nullable
private FixedParticleEffect validateFixedParticleEffect(@NotNull Player player, int id) { private FixedParticleEffect validateFixedParticleEffect(@NotNull CommandSender sender, int id) {
PPlayer pplayer = this.getPPlayer(player); PPlayer pplayer = this.getPPlayer(sender);
if (pplayer == null) if (pplayer == null)
return null; return null;
@ -800,13 +832,13 @@ public final class PlayerParticlesAPI {
/** /**
* Gets a fixed particle effect for a player * Gets a fixed particle effect for a player
* *
* @param player The player to get from * @param sender The sender to get from, either a Player or CommandSender
* @param id The ID of the fixed particle effect * @param id The ID of the fixed particle effect
* @return The fixed particle effect, or null if not found * @return The fixed particle effect, or null if not found
*/ */
@Nullable @Nullable
public FixedParticleEffect getFixedParticleEffect(@NotNull Player player, int id) { public FixedParticleEffect getFixedParticleEffect(@NotNull CommandSender sender, int id) {
PPlayer pplayer = this.getPPlayer(player); PPlayer pplayer = this.getPPlayer(sender);
if (pplayer == null) if (pplayer == null)
return null; return null;
@ -816,12 +848,12 @@ public final class PlayerParticlesAPI {
/** /**
* Gets a collection of a player's fixed particle effects * Gets a collection of a player's fixed particle effects
* *
* @param player The player to get from * @param sender The sender to get from, either a Player or CommandSender
* @return A collection of the player's fixed particle effects * @return A collection of the player's fixed particle effects
*/ */
@NotNull @NotNull
public Collection<FixedParticleEffect> getFixedParticleEffects(@NotNull Player player) { public Collection<FixedParticleEffect> getFixedParticleEffects(@NotNull CommandSender sender) {
PPlayer pplayer = this.getPPlayer(player); PPlayer pplayer = this.getPPlayer(sender);
if (pplayer == null) if (pplayer == null)
return new ArrayList<>(); return new ArrayList<>();

View file

@ -22,6 +22,8 @@ import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -32,21 +34,13 @@ public class FixedCommandModule implements CommandModule {
public void onCommandExecute(PPlayer pplayer, String[] args) { public void onCommandExecute(PPlayer pplayer, String[] args) {
LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class);
Player p = pplayer.getPlayer();
if (!PlayerParticles.getInstance().getManager(PermissionManager.class).canUseFixedEffects(pplayer)) { if (!PlayerParticles.getInstance().getManager(PermissionManager.class).canUseFixedEffects(pplayer)) {
localeManager.sendMessage(pplayer, "fixed-no-permission"); localeManager.sendMessage(pplayer, "fixed-no-permission");
return; return;
} }
if (args.length == 0) { // General information on command if (args.length == 0) { // General information on command
localeManager.sendMessage(pplayer, "command-description-fixed-create"); this.sendCommandsList(pplayer);
localeManager.sendMessage(pplayer, "command-description-fixed-edit");
localeManager.sendMessage(pplayer, "command-description-fixed-remove");
localeManager.sendMessage(pplayer, "command-description-fixed-list");
localeManager.sendMessage(pplayer, "command-description-fixed-info");
localeManager.sendMessage(pplayer, "command-description-fixed-clear");
localeManager.sendMessage(pplayer, "command-description-fixed-teleport");
return; return;
} }
@ -56,36 +50,54 @@ public class FixedCommandModule implements CommandModule {
System.arraycopy(args, 1, cmdArgs, 0, args.length - 1); System.arraycopy(args, 1, cmdArgs, 0, args.length - 1);
switch (cmd.toLowerCase()) { switch (cmd.toLowerCase()) {
case "create": case "create":
this.handleCreate(pplayer, p, cmdArgs); this.handleCreate(pplayer, cmdArgs);
return; return;
case "edit": case "edit":
this.handleEdit(pplayer, p, cmdArgs); this.handleEdit(pplayer, cmdArgs);
return; return;
case "remove": case "remove":
this.handleRemove(pplayer, p, cmdArgs); this.handleRemove(pplayer, cmdArgs);
return; return;
case "list": case "list":
this.handleList(pplayer, p, cmdArgs); this.handleList(pplayer, cmdArgs);
return; return;
case "info": case "info":
this.handleInfo(pplayer, p, cmdArgs); this.handleInfo(pplayer, cmdArgs);
return; return;
case "clear": case "clear":
this.handleClear(pplayer, p, cmdArgs); this.handleClear(pplayer, cmdArgs);
return; return;
case "teleport": case "teleport":
this.handleTeleport(pplayer, p, cmdArgs); if (pplayer.getPlayer() != null) {
return; this.handleTeleport(pplayer, cmdArgs);
default: } else {
localeManager.sendMessage(pplayer, "fixed-invalid-command"); pplayer.getUnderlyingExecutor().sendMessage(ChatColor.RED + "Error: This command can only be executed by a player.");
}
return;
default:
this.sendCommandsList(pplayer);
}
}
private void sendCommandsList(PPlayer pplayer) {
LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class);
localeManager.sendMessage(pplayer, "fixed-invalid-command");
if (pplayer.getPlayer() != null) {
localeManager.sendMessage(pplayer, "command-description-fixed-create"); localeManager.sendMessage(pplayer, "command-description-fixed-create");
localeManager.sendMessage(pplayer, "command-description-fixed-edit"); } else {
localeManager.sendMessage(pplayer, "command-description-fixed-remove"); localeManager.sendMessage(pplayer, "command-description-fixed-create-console");
localeManager.sendMessage(pplayer, "command-description-fixed-list"); }
localeManager.sendMessage(pplayer, "command-description-fixed-info"); localeManager.sendMessage(pplayer, "command-description-fixed-edit");
localeManager.sendMessage(pplayer, "command-description-fixed-remove");
localeManager.sendMessage(pplayer, "command-description-fixed-list");
localeManager.sendMessage(pplayer, "command-description-fixed-info");
if (pplayer.getPlayer() != null) {
localeManager.sendMessage(pplayer, "command-description-fixed-clear"); localeManager.sendMessage(pplayer, "command-description-fixed-clear");
localeManager.sendMessage(pplayer, "command-description-fixed-teleport"); localeManager.sendMessage(pplayer, "command-description-fixed-teleport");
} else {
localeManager.sendMessage(pplayer, "command-description-fixed-clear-console");
} }
} }
@ -93,20 +105,26 @@ public class FixedCommandModule implements CommandModule {
* Handles the command /pp fixed create * Handles the command /pp fixed create
* *
* @param pplayer The PPlayer * @param pplayer The PPlayer
* @param p The Player
* @param args The command arguments * @param args The command arguments
*/ */
private void handleCreate(PPlayer pplayer, Player p, String[] args) { private void handleCreate(PPlayer pplayer, String[] args) {
LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class);
PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class); PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class);
Player player = pplayer.getPlayer();
boolean reachedMax = permissionManager.hasPlayerReachedMaxFixedEffects(pplayer); boolean reachedMax = permissionManager.hasPlayerReachedMaxFixedEffects(pplayer);
if (reachedMax) { if (reachedMax) {
localeManager.sendMessage(pplayer, "fixed-max-reached"); localeManager.sendMessage(pplayer, "fixed-max-reached");
return; return;
} }
if (args.length < 5 && !(args.length > 0 && args[0].equalsIgnoreCase("looking") && args.length >= 3)) { int argAmount;
localeManager.sendMessage(pplayer, "fixed-create-missing-args", StringPlaceholders.single("amount", 5 - args.length)); if (player != null) {
argAmount = 5;
} else {
argAmount = 6;
}
if (args.length < argAmount && !(args.length > 0 && args[0].equalsIgnoreCase("looking") && args.length >= 3)) {
localeManager.sendMessage(pplayer, "fixed-create-missing-args", StringPlaceholders.single("amount", argAmount - args.length));
return; return;
} }
@ -121,11 +139,13 @@ public class FixedCommandModule implements CommandModule {
return; return;
} }
double distanceFromEffect = p.getLocation().distance(location); if (player != null) {
int maxCreationDistance = permissionManager.getMaxFixedEffectCreationDistance(); double distanceFromEffect = player.getLocation().distance(location);
if (maxCreationDistance != 0 && distanceFromEffect > maxCreationDistance) { int maxCreationDistance = permissionManager.getMaxFixedEffectCreationDistance();
localeManager.sendMessage(pplayer, "fixed-create-out-of-range", StringPlaceholders.single("range", maxCreationDistance)); if (maxCreationDistance != 0 && distanceFromEffect > maxCreationDistance) {
return; localeManager.sendMessage(pplayer, "fixed-create-out-of-range", StringPlaceholders.single("range", maxCreationDistance));
return;
}
} }
ParticleEffect effect = inputParser.next(ParticleEffect.class); ParticleEffect effect = inputParser.next(ParticleEffect.class);
@ -189,7 +209,7 @@ public class FixedCommandModule implements CommandModule {
} }
ParticlePair particle = new ParticlePair(pplayer.getUniqueId(), pplayer.getNextFixedEffectId(), effect, style, itemData, blockData, colorData, noteColorData); ParticlePair particle = new ParticlePair(pplayer.getUniqueId(), pplayer.getNextFixedEffectId(), effect, style, itemData, blockData, colorData, noteColorData);
PlayerParticlesAPI.getInstance().createFixedParticleEffect(pplayer.getPlayer(), location, particle); PlayerParticlesAPI.getInstance().createFixedParticleEffect(player == null ? Bukkit.getConsoleSender() : player, location, particle);
localeManager.sendMessage(pplayer, "fixed-create-success"); localeManager.sendMessage(pplayer, "fixed-create-success");
} }
@ -197,12 +217,12 @@ public class FixedCommandModule implements CommandModule {
* Handles the command /pp fixed edit * Handles the command /pp fixed edit
* *
* @param pplayer The PPlayer * @param pplayer The PPlayer
* @param p The Player
* @param args The command arguments * @param args The command arguments
*/ */
private void handleEdit(PPlayer pplayer, Player p, String[] args) { private void handleEdit(PPlayer pplayer, String[] args) {
LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class);
PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class); PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class);
Player player = pplayer.getPlayer();
if (args.length < 3) { if (args.length < 3) {
localeManager.sendMessage(pplayer, "fixed-edit-missing-args"); localeManager.sendMessage(pplayer, "fixed-edit-missing-args");
@ -236,11 +256,13 @@ public class FixedCommandModule implements CommandModule {
return; return;
} }
double distanceFromEffect = p.getLocation().distance(location); if (player != null) {
int maxCreationDistance = permissionManager.getMaxFixedEffectCreationDistance(); double distanceFromEffect = player.getLocation().distance(location);
if (maxCreationDistance != 0 && distanceFromEffect > maxCreationDistance) { int maxCreationDistance = permissionManager.getMaxFixedEffectCreationDistance();
localeManager.sendMessage(pplayer, "fixed-edit-out-of-range", StringPlaceholders.single("range", maxCreationDistance)); if (maxCreationDistance != 0 && distanceFromEffect > maxCreationDistance) {
return; localeManager.sendMessage(pplayer, "fixed-edit-out-of-range", StringPlaceholders.single("range", maxCreationDistance));
return;
}
} }
fixedEffect.setCoordinates(location.getX(), location.getY(), location.getZ()); fixedEffect.setCoordinates(location.getX(), location.getY(), location.getZ());
@ -324,7 +346,7 @@ public class FixedCommandModule implements CommandModule {
return; return;
} }
PlayerParticlesAPI.getInstance().editFixedParticleEffect(pplayer.getPlayer(), fixedEffect); PlayerParticlesAPI.getInstance().editFixedParticleEffect(player == null ? Bukkit.getConsoleSender() : player, fixedEffect);
localeManager.sendMessage(pplayer, "fixed-edit-success", StringPlaceholders.builder("prop", editType).addPlaceholder("id", id).build()); localeManager.sendMessage(pplayer, "fixed-edit-success", StringPlaceholders.builder("prop", editType).addPlaceholder("id", id).build());
} }
@ -332,11 +354,11 @@ public class FixedCommandModule implements CommandModule {
* Handles the command /pp fixed remove * Handles the command /pp fixed remove
* *
* @param pplayer The PPlayer * @param pplayer The PPlayer
* @param p The Player
* @param args The command arguments * @param args The command arguments
*/ */
private void handleRemove(PPlayer pplayer, Player p, String[] args) { private void handleRemove(PPlayer pplayer, String[] args) {
LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class);
Player player = pplayer.getPlayer();
if (args.length < 1) { if (args.length < 1) {
localeManager.sendMessage(pplayer, "fixed-remove-no-args"); localeManager.sendMessage(pplayer, "fixed-remove-no-args");
@ -352,7 +374,7 @@ public class FixedCommandModule implements CommandModule {
} }
if (pplayer.getFixedEffectById(id) != null) { if (pplayer.getFixedEffectById(id) != null) {
PlayerParticlesAPI.getInstance().removeFixedEffect(pplayer.getPlayer(), id); PlayerParticlesAPI.getInstance().removeFixedEffect(player == null ? Bukkit.getConsoleSender() : player, id);
localeManager.sendMessage(pplayer, "fixed-remove-success", StringPlaceholders.single("id", id)); localeManager.sendMessage(pplayer, "fixed-remove-success", StringPlaceholders.single("id", id));
} else { } else {
localeManager.sendMessage(pplayer, "fixed-remove-invalid", StringPlaceholders.single("id", id)); localeManager.sendMessage(pplayer, "fixed-remove-invalid", StringPlaceholders.single("id", id));
@ -363,10 +385,9 @@ public class FixedCommandModule implements CommandModule {
* Handles the command /pp fixed list * Handles the command /pp fixed list
* *
* @param pplayer The PPlayer * @param pplayer The PPlayer
* @param p The Player
* @param args The command arguments * @param args The command arguments
*/ */
private void handleList(PPlayer pplayer, Player p, String[] args) { private void handleList(PPlayer pplayer, String[] args) {
LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class);
List<Integer> ids = new ArrayList<>(pplayer.getFixedEffectIds()); List<Integer> ids = new ArrayList<>(pplayer.getFixedEffectIds());
@ -392,10 +413,9 @@ public class FixedCommandModule implements CommandModule {
* Handles the command /pp fixed info * Handles the command /pp fixed info
* *
* @param pplayer The PPlayer * @param pplayer The PPlayer
* @param p The Player
* @param args The command arguments * @param args The command arguments
*/ */
private void handleInfo(PPlayer pplayer, Player p, String[] args) { private void handleInfo(PPlayer pplayer, String[] args) {
LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class);
if (args.length < 1) { if (args.length < 1) {
@ -436,12 +456,12 @@ public class FixedCommandModule implements CommandModule {
* Handles the command /pp fixed clear * Handles the command /pp fixed clear
* *
* @param pplayer The PPlayer * @param pplayer The PPlayer
* @param p The Player
* @param args The command arguments * @param args The command arguments
*/ */
private void handleClear(PPlayer pplayer, Player p, String[] args) { private void handleClear(PPlayer pplayer, String[] args) {
LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class);
PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class); PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class);
Player player = pplayer.getPlayer();
if (!permissionManager.canClearFixedEffects(pplayer)) { if (!permissionManager.canClearFixedEffects(pplayer)) {
localeManager.sendMessage(pplayer, "fixed-clear-no-permission"); localeManager.sendMessage(pplayer, "fixed-clear-no-permission");
@ -462,7 +482,19 @@ public class FixedCommandModule implements CommandModule {
} }
radius = Math.abs(radius); radius = Math.abs(radius);
int amountRemoved = PlayerParticlesAPI.getInstance().removeFixedEffectsInRange(p.getLocation(), radius); Location location;
if (player != null) {
location = player.getLocation();
} else {
location = inputParser.next(Location.class);
}
if (location == null) {
localeManager.sendMessage(pplayer, "fixed-clear-invalid-args");
return;
}
int amountRemoved = PlayerParticlesAPI.getInstance().removeFixedEffectsInRange(location, radius);
localeManager.sendMessage(pplayer, "fixed-clear-success", StringPlaceholders.builder("amount", amountRemoved).addPlaceholder("range", radius).build()); localeManager.sendMessage(pplayer, "fixed-clear-success", StringPlaceholders.builder("amount", amountRemoved).addPlaceholder("range", radius).build());
} }
@ -470,12 +502,12 @@ public class FixedCommandModule implements CommandModule {
* Handles the command /pp fixed teleport * Handles the command /pp fixed teleport
* *
* @param pplayer The PPlayer * @param pplayer The PPlayer
* @param p The Player
* @param args The command arguments * @param args The command arguments
*/ */
private void handleTeleport(PPlayer pplayer, Player p, String[] args) { private void handleTeleport(PPlayer pplayer, String[] args) {
LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class);
PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class); PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class);
Player player = pplayer.getPlayer();
if (!permissionManager.canTeleportToFixedEffects(pplayer)) { if (!permissionManager.canTeleportToFixedEffects(pplayer)) {
localeManager.sendMessage(pplayer, "fixed-teleport-no-permission"); localeManager.sendMessage(pplayer, "fixed-teleport-no-permission");
@ -501,45 +533,73 @@ public class FixedCommandModule implements CommandModule {
return; return;
} }
p.teleport(fixedEffect.getLocation()); player.teleport(fixedEffect.getLocation());
localeManager.sendMessage(pplayer, "fixed-teleport-success", StringPlaceholders.single("id", id)); localeManager.sendMessage(pplayer, "fixed-teleport-success", StringPlaceholders.single("id", id));
} }
public List<String> onTabComplete(PPlayer pplayer, String[] args) { public List<String> onTabComplete(PPlayer pplayer, String[] args) {
PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class); PermissionManager permissionManager = PlayerParticles.getInstance().getManager(PermissionManager.class);
Player p = pplayer.getPlayer();
List<String> matches = new ArrayList<>(); List<String> matches = new ArrayList<>();
Player player = pplayer.getPlayer();
boolean isConsole = player == null;
if (args.length <= 1) { if (args.length <= 1) {
List<String> possibleCmds = new ArrayList<>(Arrays.asList("create", "edit", "remove", "list", "info", "clear", "teleport")); List<String> possibleCmds;
if (!isConsole) {
possibleCmds = new ArrayList<>(Arrays.asList("create", "edit", "remove", "list", "info", "clear", "teleport"));
} else {
possibleCmds = new ArrayList<>(Arrays.asList("create", "edit", "remove", "list", "info", "clear"));
}
if (args.length == 0) matches = possibleCmds; if (args.length == 0) matches = possibleCmds;
else StringUtil.copyPartialMatches(args[0], possibleCmds, matches); else StringUtil.copyPartialMatches(args[0], possibleCmds, matches);
} else { } else {
switch (args[0].toLowerCase()) { switch (args[0].toLowerCase()) {
case "create": case "create":
if (args.length <= 4) { if (args.length <= 4 || (isConsole && args.length <= 5)) {
List<String> possibleValues = new ArrayList<>(); List<String> possibleValues = new ArrayList<>();
if (args.length == 4) { if (args.length == 5) { // console only
possibleValues.add("~"); possibleValues.add("<world>");
} }
if (args.length == 3) { if (args.length == 4 && !args[1].equalsIgnoreCase("looking")) {
possibleValues.add("~ ~"); if (!isConsole) {
possibleValues.add("~");
} else {
possibleValues.add("<z> <world>");
}
}
if (args.length == 3 && !args[1].equalsIgnoreCase("looking")) {
if (!isConsole) {
possibleValues.add("~ ~");
} else {
possibleValues.add("<y> <z> <world>");
}
} }
if (args.length == 2) { if (args.length == 2) {
possibleValues.add("~ ~ ~"); if (!isConsole) {
possibleValues.add("looking"); possibleValues.add("~ ~ ~");
possibleValues.add("looking");
} else {
possibleValues.add("<x> <y> <z> <world>");
}
} }
StringUtil.copyPartialMatches(args[args.length - 1], possibleValues, matches); StringUtil.copyPartialMatches(args[args.length - 1], possibleValues, matches);
} }
// Pad arguments if the first coordinate is "looking" // Pad arguments if the first coordinate is "looking"
if (args[1].equalsIgnoreCase("looking")) { if (!isConsole && args[1].equalsIgnoreCase("looking")) {
String[] paddedArgs = new String[args.length + 2]; String[] paddedArgs = new String[args.length + 2];
paddedArgs[0] = paddedArgs[1] = paddedArgs[2] = paddedArgs[3] = ""; paddedArgs[0] = paddedArgs[1] = paddedArgs[2] = paddedArgs[3] = "";
System.arraycopy(args, 2, paddedArgs, 4, args.length - 2); System.arraycopy(args, 2, paddedArgs, 4, args.length - 2);
args = paddedArgs; args = paddedArgs;
} }
// Pad arguments to compensate for the extra 'world' parameter
if (isConsole) {
String[] paddedArgs = Arrays.copyOf(args, args.length + 1);
paddedArgs[args.length] = "";
args = paddedArgs;
}
if (args.length == 5) { if (args.length == 5) {
StringUtil.copyPartialMatches(args[4], permissionManager.getEffectNamesUserHasPermissionFor(pplayer), matches); StringUtil.copyPartialMatches(args[4], permissionManager.getEffectNamesUserHasPermissionFor(pplayer), matches);
} else if (args.length == 6) { } else if (args.length == 6) {
@ -587,15 +647,30 @@ public class FixedCommandModule implements CommandModule {
String property = args[2].toLowerCase(); String property = args[2].toLowerCase();
if (property.equals("location")) { if (property.equals("location")) {
List<String> possibleValues = new ArrayList<>(); List<String> possibleValues = new ArrayList<>();
if (args.length == 7 && isConsole) {
possibleValues.add("<world>");
}
if (args.length == 6 && !args[3].equalsIgnoreCase("looking")) { if (args.length == 6 && !args[3].equalsIgnoreCase("looking")) {
possibleValues.add("~"); if (!isConsole) {
possibleValues.add("~");
} else {
possibleValues.add("<z> <world>");
}
} }
if (args.length == 5 && !args[3].equalsIgnoreCase("looking")) { if (args.length == 5 && !args[3].equalsIgnoreCase("looking")) {
possibleValues.add("~ ~"); if (!isConsole) {
possibleValues.add("~ ~");
} else {
possibleValues.add("<y> <z> <world>");
}
} }
if (args.length == 4) { if (args.length == 4) {
possibleValues.add("~ ~ ~"); if (!isConsole) {
possibleValues.add("looking"); possibleValues.add("~ ~ ~");
possibleValues.add("looking");
} else {
possibleValues.add("<x> <y> <z> <world>");
}
} }
StringUtil.copyPartialMatches(args[args.length - 1], possibleValues, matches); StringUtil.copyPartialMatches(args[args.length - 1], possibleValues, matches);
} else if (property.equals("effect") && args.length == 4) { } else if (property.equals("effect") && args.length == 4) {
@ -644,11 +719,32 @@ public class FixedCommandModule implements CommandModule {
break; break;
case "remove": case "remove":
case "info": case "info":
case "teleport":
StringUtil.copyPartialMatches(args[1], pplayer.getFixedEffectIds().stream().map(String::valueOf).collect(Collectors.toList()), matches); StringUtil.copyPartialMatches(args[1], pplayer.getFixedEffectIds().stream().map(String::valueOf).collect(Collectors.toList()), matches);
break; break;
case "teleport":
if (!isConsole)
StringUtil.copyPartialMatches(args[1], pplayer.getFixedEffectIds().stream().map(String::valueOf).collect(Collectors.toList()), matches);
break;
case "clear": case "clear":
matches.add("<radius>"); if (isConsole) {
if (args.length == 6) {
matches.add("<world>");
}
if (args.length == 5) {
matches.add("<z> <world>");
}
if (args.length == 4) {
matches.add("<y> <z> <world>");
}
if (args.length == 3) {
matches.add("<x> <y> <z> <world>");
}
if (args.length == 2) {
matches.add("<radius> <x> <y> <z> <world>");
}
} else {
matches.add("<radius>");
}
break; break;
case "list": case "list":
break; break;
@ -675,7 +771,7 @@ public class FixedCommandModule implements CommandModule {
} }
public boolean canConsoleExecute() { public boolean canConsoleExecute() {
return false; return true;
} }
} }

View file

@ -11,12 +11,14 @@ public class HelpCommandModule implements CommandModule {
public void onCommandExecute(PPlayer pplayer, String[] args) { public void onCommandExecute(PPlayer pplayer, String[] args) {
LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class);
boolean isConsole = pplayer.getPlayer() == null;
localeManager.sendMessage(pplayer, "command-descriptions"); localeManager.sendMessage(pplayer, "command-descriptions");
List<CommandModule> cmds = PlayerParticles.getInstance().getManager(CommandManager.class).getCommands(); List<CommandModule> cmds = PlayerParticles.getInstance().getManager(CommandManager.class).getCommands();
for (CommandModule cmd : cmds) for (CommandModule cmd : cmds)
if (!(cmd instanceof DefaultCommandModule)) if (!(cmd instanceof DefaultCommandModule) && (!isConsole || cmd.canConsoleExecute()))
CommandModule.printUsageWithDescription(pplayer, cmd); CommandModule.printUsageWithDescription(pplayer, cmd);
localeManager.sendSimpleMessage(pplayer, "command-descriptions-help-other"); localeManager.sendSimpleMessage(pplayer, "command-descriptions-help-other");
} }

View file

@ -50,11 +50,13 @@ public class EnglishLocale implements Locale {
this.put("#2", "Fixed Particle Command Description Messages"); this.put("#2", "Fixed Particle Command Description Messages");
this.put("command-description-fixed-create", "&e/pp fixed create <<x> <y> <z>|<looking>> <effect> <style> [data] - Creates a new fixed effect"); this.put("command-description-fixed-create", "&e/pp fixed create <<x> <y> <z>|<looking>> <effect> <style> [data] - Creates a new fixed effect");
this.put("command-description-fixed-edit", "&e/pp fixed edit <id> <effect|style|data> <args> - Edit part of a fixed effect by its ID"); this.put("command-description-fixed-create-console", "&e/pp fixed create <x> <y> <z> <world> <effect> <style> [data] - Creates a new fixed effect");
this.put("command-description-fixed-edit", "&e/pp fixed edit <id> <effect|style|data|location> <args> - Edit part of a fixed effect by its ID");
this.put("command-description-fixed-remove", "&e/pp fixed remove <ID> - Removes a fixed effect by its ID"); this.put("command-description-fixed-remove", "&e/pp fixed remove <ID> - Removes a fixed effect by its ID");
this.put("command-description-fixed-list", "&e/pp fixed list - Lists all IDs of your fixed effects"); this.put("command-description-fixed-list", "&e/pp fixed list - Lists all IDs of your fixed effects");
this.put("command-description-fixed-info", "&e/pp fixed info <ID> - Gets info on one of your fixed effects"); this.put("command-description-fixed-info", "&e/pp fixed info <ID> - Gets info on one of your fixed effects");
this.put("command-description-fixed-clear", "&e/pp fixed clear <radius> - Clears all fixed effects of all players within the given radius"); this.put("command-description-fixed-clear", "&e/pp fixed clear <radius> - Clears all fixed effects of all players within the given radius");
this.put("command-description-fixed-clear-console", "&e/pp fixed clear <radius> <x> <y> <z> <world> - Clears all fixed effects of all players within the given radius");
this.put("command-description-fixed-teleport", "&e/pp fixed teleport <id> - Teleports you to one of your fixed effects"); this.put("command-description-fixed-teleport", "&e/pp fixed teleport <id> - Teleports you to one of your fixed effects");
this.put("#2.5", "Group Command Description Messages"); this.put("#2.5", "Group Command Description Messages");

View file

@ -50,11 +50,13 @@ public class FrenchLocale implements Locale {
this.put("#2", "Fixed Particle Command Description Messages"); this.put("#2", "Fixed Particle Command Description Messages");
this.put("command-description-fixed-create", "&e/pp fixed create <<x> <y> <z>|<looking>> <effect> <style> [data] - Créez une particule fixe"); this.put("command-description-fixed-create", "&e/pp fixed create <<x> <y> <z>|<looking>> <effect> <style> [data] - Créez une particule fixe");
this.put("command-description-fixed-edit", "&e/pp fixed edit <id> <effect|style|data> <args> - Modifiez une partie d'une particule fixe par son ID"); this.put("command-description-fixed-create-console", "&e/pp fixed create <x> <y> <z> <world> <effect> <style> [data] - Créez une particule fixe");
this.put("command-description-fixed-edit", "&e/pp fixed edit <id> <effect|style|data|location> <args> - Modifiez une partie d'une particule fixe par son ID");
this.put("command-description-fixed-remove", "&e/pp fixed remove <id> - Supprimez une particule fixe par son ID"); this.put("command-description-fixed-remove", "&e/pp fixed remove <id> - Supprimez une particule fixe par son ID");
this.put("command-description-fixed-list", "&e/pp fixed list - Affiche l'ID de tous vos effets fixes"); this.put("command-description-fixed-list", "&e/pp fixed list - Affiche l'ID de tous vos effets fixes");
this.put("command-description-fixed-info", "&e/pp fixed info <id> - Voir des informations sur l'une de vos particules fixe"); this.put("command-description-fixed-info", "&e/pp fixed info <id> - Voir des informations sur l'une de vos particules fixe");
this.put("command-description-fixed-clear", "&e/pp fixed clear <radius> - Supprimez tous les effets fixe de tous les joueurs d'un rayon"); this.put("command-description-fixed-clear", "&e/pp fixed clear <radius> - Supprimez tous les effets fixe de tous les joueurs d'un rayon");
this.put("command-description-fixed-clear-console", "&e/pp fixed clear <radius> <x> <y> <z> <world> - Supprimez tous les effets fixe de tous les joueurs d'un rayon");
this.put("command-description-fixed-teleport", "&e/pp fixed teleport <id> - Vous téléporte vers un de vos effets fixes"); this.put("command-description-fixed-teleport", "&e/pp fixed teleport <id> - Vous téléporte vers un de vos effets fixes");
this.put("#2.5", "Group Command Description Messages"); this.put("#2.5", "Group Command Description Messages");

View file

@ -50,11 +50,13 @@ public class GermanLocale implements Locale {
this.put("#2", "Fixed Particle Command Description Messages"); this.put("#2", "Fixed Particle Command Description Messages");
this.put("command-description-fixed-create", "&e/pp fixed create <<x> <y> <z>|<looking>> <effect> <style> [data] - Erstellt einen neun fixen Effekt"); this.put("command-description-fixed-create", "&e/pp fixed create <<x> <y> <z>|<looking>> <effect> <style> [data] - Erstellt einen neun fixen Effekt");
this.put("command-description-fixed-edit", "&e/pp fixed edit <id> <effect|style|data> <args> - Bearbeiten Sie einen Teil eines festen Effekts anhand seiner ID"); this.put("command-description-fixed-create-console", "&e/pp fixed create <x> <y> <z> <world> <effect> <style> [data] - Erstellt einen neun fixen Effekt");
this.put("command-description-fixed-edit", "&e/pp fixed edit <id> <effect|style|data|location> <args> - Bearbeiten Sie einen Teil eines festen Effekts anhand seiner ID");
this.put("command-description-fixed-remove", "&e/pp fixed remove <id> - Entfernt einen festen Effekt anhand seiner ID"); this.put("command-description-fixed-remove", "&e/pp fixed remove <id> - Entfernt einen festen Effekt anhand seiner ID");
this.put("command-description-fixed-list", "&e/pp fixed list - Listet alle IDs Ihrer festen Effekte auf"); this.put("command-description-fixed-list", "&e/pp fixed list - Listet alle IDs Ihrer festen Effekte auf");
this.put("command-description-fixed-info", "&e/pp fixed info <id> - Ruft Informationen zu einem Ihrer Fixen Effekte ab"); this.put("command-description-fixed-info", "&e/pp fixed info <id> - Ruft Informationen zu einem Ihrer Fixen Effekte ab");
this.put("command-description-fixed-clear", "&e/pp fixed clear <radius> - Löscht alle festen Effekte aller Spieler innerhalb des angegebenen Radius"); this.put("command-description-fixed-clear", "&e/pp fixed clear <radius> - Löscht alle festen Effekte aller Spieler innerhalb des angegebenen Radius");
this.put("command-description-fixed-clear-console", "&e/pp fixed clear <radius> <x> <y> <z> <world> - Löscht alle festen Effekte aller Spieler innerhalb des angegebenen Radius");
this.put("command-description-fixed-teleport", "&e/pp fixed teleport <id> - Teleportiert Sie zu einem Ihrer festen Effekte"); this.put("command-description-fixed-teleport", "&e/pp fixed teleport <id> - Teleportiert Sie zu einem Ihrer festen Effekte");
this.put("#2.5", "Group Command Description Messages"); this.put("#2.5", "Group Command Description Messages");

View file

@ -49,12 +49,14 @@ public class RussianLocale implements Locale {
this.put("command-description-worlds", "Узнать, в каком мире Ваши частицы отключены."); this.put("command-description-worlds", "Узнать, в каком мире Ваши частицы отключены.");
this.put("#2", "Fixed Particle Command Description Messages"); this.put("#2", "Fixed Particle Command Description Messages");
this.put("command-description-fixed-create", "&e/pp fixed create «x> <y> <z>|<looking» <Эффект> <Стиль> [данные] - Создаёт новый эффект."); this.put("command-description-fixed-create", "&e/pp fixed create <<x> <y> <z>|<looking>> <Эффект> <Стиль> [данные] - Создаёт новый эффект.");
this.put("command-description-fixed-edit", "&e/pp fixed edit <id> <Эффект|Стиль|Данные> <аргумент> - Изменяет чать эффекта по его ID."); this.put("command-description-fixed-create-console", "&e/pp fixed create <x> <y> <z> <Мир> <Эффект> <Стиль> [данные] - Создаёт новый эффект.");
this.put("command-description-fixed-edit", "&e/pp fixed edit <id> <effect|style|data|location> <аргумент> - Изменяет чать эффекта по его ID.");
this.put("command-description-fixed-remove", "&e/pp fixed remove <id> - Удаляет эффект по его ID."); this.put("command-description-fixed-remove", "&e/pp fixed remove <id> - Удаляет эффект по его ID.");
this.put("command-description-fixed-list", "&e/pp fixed list - Показывает список ID всех Ваших эффектов."); this.put("command-description-fixed-list", "&e/pp fixed list - Показывает список ID всех Ваших эффектов.");
this.put("command-description-fixed-info", "&e/pp fixed info <id> - Показывает информацию об одном из Ваших эффектов."); this.put("command-description-fixed-info", "&e/pp fixed info <id> - Показывает информацию об одном из Ваших эффектов.");
this.put("command-description-fixed-clear", "&e/pp fixed clear <Радиус> - Удаляет все эффекты игроков, находящихся в заданном радиусе."); this.put("command-description-fixed-clear", "&e/pp fixed clear <Радиус> - Удаляет все эффекты игроков, находящихся в заданном радиусе.");
this.put("command-description-fixed-clear-console", "&e/pp fixed clear <Радиус> <x> <y> <z> <Мир> - Удаляет все эффекты игроков, находящихся в заданном радиусе.");
this.put("command-description-fixed-teleport", "&e/pp fixed teleport <id> - Телепортирует вас к одному из ваших фиксированных эффектов"); this.put("command-description-fixed-teleport", "&e/pp fixed teleport <id> - Телепортирует вас к одному из ваших фиксированных эффектов");
this.put("#2.5", "Group Command Description Messages"); this.put("#2.5", "Group Command Description Messages");
@ -147,11 +149,11 @@ public class RussianLocale implements Locale {
this.put("data-usage-none", "&eЭффект &b%effect% &eне использует какие-либо данные!"); this.put("data-usage-none", "&eЭффект &b%effect% &eне использует какие-либо данные!");
this.put("data-usage-block", "&eЭффект &b%effect% &eзапрашивает &bблок &eданных! &bФормат: <названиеБлока>"); this.put("data-usage-block", "&eЭффект &b%effect% &eзапрашивает &bблок &eданных! &bФормат: <названиеБлока>");
this.put("data-usage-item", "&eЭффект &b%effect% &eзапрашивает &bпредмет &eданных! &bФормат: <названиеПредмета>"); this.put("data-usage-item", "&eЭффект &b%effect% &eзапрашивает &bпредмет &eданных! &bФормат: <названиеПредмета>");
this.put("data-usage-color", "&eЭффект &b%effect% &eзапрашивает &bцвет &eданных! &bФормат: «0-255> <0-255> <0-255»|<rainbow>|<random>"); this.put("data-usage-color", "&eЭффект &b%effect% &eзапрашивает &bцвет &eданных! &bФормат: <0-255> <0-255> <0-255>|<rainbow>|<random>");
this.put("data-usage-note", "&eЭффект &b%effect% &eзапрашивает &bноту &eданных! &bФормат: <0-24>|<rainbow>|<random>"); this.put("data-usage-note", "&eЭффект &b%effect% &eзапрашивает &bноту &eданных! &bФормат: <0-24>|<rainbow>|<random>");
this.put("data-invalid-block", "&bБлок &cданных, который Вы ввели, недействителен! &bФормат: <названиеБлока>"); this.put("data-invalid-block", "&bБлок &cданных, который Вы ввели, недействителен! &bФормат: <названиеБлока>");
this.put("data-invalid-item", "&bПредмет &cданных, который Вы ввели, недействителен! &bФормат: <названиеПредмета>"); this.put("data-invalid-item", "&bПредмет &cданных, который Вы ввели, недействителен! &bФормат: <названиеПредмета>");
this.put("data-invalid-color", "&bЦвет &cданных, который Вы ввели, недействителен! &bФормат: «0-255> <0-255> <0-255»|<rainbow>|<random>"); this.put("data-invalid-color", "&bЦвет &cданных, который Вы ввели, недействителен! &bФормат: <0-255> <0-255> <0-255>|<rainbow>|<random>");
this.put("data-invalid-note", "&bНота &cданных, которую Вы ввели, недействительна! &bФормат: <0-24>|<rainbow>|<random>"); this.put("data-invalid-note", "&bНота &cданных, которую Вы ввели, недействительна! &bФормат: <0-24>|<rainbow>|<random>");
this.put("data-invalid-material-not-item", "&bМатериал &cпредмета&b%material%&c, который Вы ввели, не является предметом!"); this.put("data-invalid-material-not-item", "&bМатериал &cпредмета&b%material%&c, который Вы ввели, не является предметом!");
this.put("data-invalid-material-not-block", "&bМатериал &cблока&b%material%&c, который Вы ввели, не является блоком!"); this.put("data-invalid-material-not-block", "&bМатериал &cблока&b%material%&c, который Вы ввели, не является блоком!");

View file

@ -50,11 +50,13 @@ public class SimplifiedChineseLocale implements Locale {
this.put("#2", "Fixed Particle Command Description Messages"); this.put("#2", "Fixed Particle Command Description Messages");
this.put("command-description-fixed-create", "&e/pp fixed create <<x> <y> <z>|<looking>> <特效名> <风格名> [数据名] - 创建新的定点特效"); this.put("command-description-fixed-create", "&e/pp fixed create <<x> <y> <z>|<looking>> <特效名> <风格名> [数据名] - 创建新的定点特效");
this.put("command-description-fixed-edit", "&e/pp fixed edit <id> <特效名|风格名|数据名> <参数> - 根据ID编辑定点特效"); this.put("command-description-fixed-create-console", "&e/pp fixed create <x> <y> <z> <世界> <特效名> <风格名> [数据名] - 创建新的定点特效");
this.put("command-description-fixed-edit", "&e/pp fixed edit <id> <effect|style|data|location> <参数> - 根据ID编辑定点特效");
this.put("command-description-fixed-remove", "&e/pp fixed remove <id> - 根据ID删除定点特效"); this.put("command-description-fixed-remove", "&e/pp fixed remove <id> - 根据ID删除定点特效");
this.put("command-description-fixed-list", "&e/pp fixed list - 列出所有定点特效的ID"); this.put("command-description-fixed-list", "&e/pp fixed list - 列出所有定点特效的ID");
this.put("command-description-fixed-info", "&e/pp fixed info <id> - 获取定点特效的详细信息"); this.put("command-description-fixed-info", "&e/pp fixed info <id> - 获取定点特效的详细信息");
this.put("command-description-fixed-clear", "&e/pp fixed clear <半径> - 清空指定范围内的所有定点特效"); this.put("command-description-fixed-clear", "&e/pp fixed clear <半径> - 清空指定范围内的所有定点特效");
this.put("command-description-fixed-clear-console", "&e/pp fixed clear <半径> <x> <y> <z> <世界> - 清空指定范围内的所有定点特效");
this.put("command-description-fixed-teleport", "&e/pp fixed teleport <id> - 传送你到固定效果之一"); this.put("command-description-fixed-teleport", "&e/pp fixed teleport <id> - 传送你到固定效果之一");
this.put("#2.5", "Group Command Description Messages"); this.put("#2.5", "Group Command Description Messages");

View file

@ -50,11 +50,13 @@ public class VietnameseLocale implements Locale {
this.put("#2", "Fixed Particle Command Description Messages"); this.put("#2", "Fixed Particle Command Description Messages");
this.put("command-description-fixed-create", "&e/pp fixed create <<x> <y> <z>|<looking>> <effect> <style> [data] - Tạo mới một hiệu ứng cố định"); this.put("command-description-fixed-create", "&e/pp fixed create <<x> <y> <z>|<looking>> <effect> <style> [data] - Tạo mới một hiệu ứng cố định");
this.put("command-description-fixed-edit", "&e/pp fixed edit <id> <effect|style|data> <args> - Chỉnh sửa hiệu ứng cố định bằng IDs của nó"); this.put("command-description-fixed-create-console", "&e/pp fixed create <x> <y> <z> <world> <effect> <style> [data] - Tạo mới một hiệu ứng cố định");
this.put("command-description-fixed-edit", "&e/pp fixed edit <id> <effect|style|data|location> <args> - Chỉnh sửa hiệu ứng cố định bằng IDs của nó");
this.put("command-description-fixed-remove", "&e/pp fixed remove <id> - Xóa hiệu ứng cố định"); this.put("command-description-fixed-remove", "&e/pp fixed remove <id> - Xóa hiệu ứng cố định");
this.put("command-description-fixed-list", "&e/pp fixed list - Danh sách các hiệu ứng cố định dưới dạng IDs"); this.put("command-description-fixed-list", "&e/pp fixed list - Danh sách các hiệu ứng cố định dưới dạng IDs");
this.put("command-description-fixed-info", "&e/pp fixed info <id> - Hiển thị thông tin về hiệu ứng cố định"); this.put("command-description-fixed-info", "&e/pp fixed info <id> - Hiển thị thông tin về hiệu ứng cố định");
this.put("command-description-fixed-clear", "&e/pp fixed clear <radius> - Xóa toàn bộ hiệu ứng trong khu vực bán kính"); this.put("command-description-fixed-clear", "&e/pp fixed clear <radius> - Xóa toàn bộ hiệu ứng trong khu vực bán kính");
this.put("command-description-fixed-clear-console", "&e/pp fixed clear <radius> <x> <y> <z> <world> - Xóa toàn bộ hiệu ứng trong khu vực bán kính");
this.put("command-description-fixed-teleport", "&e/pp fixed teleport <id> - Dịch chuyển bạn đến một trong những hiệu ứng cố định của bạn"); this.put("command-description-fixed-teleport", "&e/pp fixed teleport <id> - Dịch chuyển bạn đến một trong những hiệu ứng cố định của bạn");
this.put("#2.5", "Group Command Description Messages"); this.put("#2.5", "Group Command Description Messages");

View file

@ -1,6 +1,7 @@
package dev.esophose.playerparticles.manager; package dev.esophose.playerparticles.manager;
import dev.esophose.playerparticles.PlayerParticles; import dev.esophose.playerparticles.PlayerParticles;
import dev.esophose.playerparticles.api.PlayerParticlesAPI;
import dev.esophose.playerparticles.command.AddCommandModule; import dev.esophose.playerparticles.command.AddCommandModule;
import dev.esophose.playerparticles.command.CommandModule; import dev.esophose.playerparticles.command.CommandModule;
import dev.esophose.playerparticles.command.CommandModuleSecondary; import dev.esophose.playerparticles.command.CommandModuleSecondary;
@ -21,7 +22,6 @@ import dev.esophose.playerparticles.command.StylesCommandModule;
import dev.esophose.playerparticles.command.ToggleCommandModule; import dev.esophose.playerparticles.command.ToggleCommandModule;
import dev.esophose.playerparticles.command.VersionCommandModule; import dev.esophose.playerparticles.command.VersionCommandModule;
import dev.esophose.playerparticles.command.WorldsCommandModule; import dev.esophose.playerparticles.command.WorldsCommandModule;
import dev.esophose.playerparticles.particles.OtherPPlayer;
import dev.esophose.playerparticles.particles.PPlayer; import dev.esophose.playerparticles.particles.PPlayer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -31,6 +31,7 @@ import org.bukkit.Bukkit;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.command.PluginCommand; import org.bukkit.command.PluginCommand;
import org.bukkit.command.TabCompleter; import org.bukkit.command.TabCompleter;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -152,8 +153,8 @@ public class CommandManager extends Manager implements CommandExecutor, TabCompl
sender.sendMessage(ChatColor.RED + "Error: This command can only be executed by a player."); sender.sendMessage(ChatColor.RED + "Error: This command can only be executed by a player.");
return true; return true;
} }
} else { } else if (sender instanceof ConsoleCommandSender) {
commandModule.onCommandExecute(new OtherPPlayer(sender), cmdArgs); commandModule.onCommandExecute(PlayerParticlesAPI.getInstance().getConsolePPlayer(), cmdArgs);
return true; return true;
} }
@ -185,10 +186,9 @@ public class CommandManager extends Manager implements CommandExecutor, TabCompl
*/ */
public List<String> onTabComplete(CommandSender sender, Command cmd, String alias, String[] args) { public List<String> onTabComplete(CommandSender sender, Command cmd, String alias, String[] args) {
if (cmd.getName().equalsIgnoreCase("pp")) { if (cmd.getName().equalsIgnoreCase("pp")) {
if (!(sender instanceof Player)) return new ArrayList<>(); PPlayer pplayer = PlayerParticlesAPI.getInstance().getPPlayer(sender);
if (pplayer == null)
PPlayer pplayer = this.playerParticles.getManager(DataManager.class).getPPlayer(((Player) sender).getUniqueId()); return new ArrayList<>();
if (pplayer == null) return new ArrayList<>();
if (args.length <= 1) { if (args.length <= 1) {
CommandModule commandModule = this.findMatchingCommand(""); // Get the default command module CommandModule commandModule = this.findMatchingCommand(""); // Get the default command module
@ -196,6 +196,9 @@ public class CommandManager extends Manager implements CommandExecutor, TabCompl
} else { } else {
CommandModule commandModule = this.findMatchingCommand(args[0]); CommandModule commandModule = this.findMatchingCommand(args[0]);
if (commandModule != null) { if (commandModule != null) {
if (sender instanceof ConsoleCommandSender && !commandModule.canConsoleExecute())
return new ArrayList<>();
String[] cmdArgs = Arrays.copyOfRange(args, 1, args.length); String[] cmdArgs = Arrays.copyOfRange(args, 1, args.length);
return commandModule.onTabComplete(pplayer, cmdArgs); return commandModule.onTabComplete(pplayer, cmdArgs);
} }

View file

@ -5,6 +5,7 @@ import dev.esophose.playerparticles.database.DatabaseConnector;
import dev.esophose.playerparticles.database.MySQLConnector; import dev.esophose.playerparticles.database.MySQLConnector;
import dev.esophose.playerparticles.database.SQLiteConnector; import dev.esophose.playerparticles.database.SQLiteConnector;
import dev.esophose.playerparticles.manager.ConfigurationManager.Setting; import dev.esophose.playerparticles.manager.ConfigurationManager.Setting;
import dev.esophose.playerparticles.particles.ConsolePPlayer;
import dev.esophose.playerparticles.particles.FixedParticleEffect; import dev.esophose.playerparticles.particles.FixedParticleEffect;
import dev.esophose.playerparticles.particles.PPlayer; import dev.esophose.playerparticles.particles.PPlayer;
import dev.esophose.playerparticles.particles.ParticleEffect; import dev.esophose.playerparticles.particles.ParticleEffect;
@ -244,7 +245,12 @@ public class DataManager extends Manager {
groups.put(activeGroup.getName(), activeGroup); groups.put(activeGroup.getName(), activeGroup);
} }
PPlayer loadedPPlayer = new PPlayer(playerUUID, groups, fixedParticles, particlesHidden); PPlayer loadedPPlayer;
if (!playerUUID.equals(ConsolePPlayer.getUUID())) {
loadedPPlayer = new PPlayer(playerUUID, groups, fixedParticles, particlesHidden);
} else {
loadedPPlayer = new ConsolePPlayer(groups, fixedParticles);
}
this.sync(() -> { this.sync(() -> {
synchronized (loadedPPlayer) { synchronized (loadedPPlayer) {

View file

@ -2,6 +2,7 @@ package dev.esophose.playerparticles.manager;
import dev.esophose.playerparticles.PlayerParticles; import dev.esophose.playerparticles.PlayerParticles;
import dev.esophose.playerparticles.manager.ConfigurationManager.Setting; import dev.esophose.playerparticles.manager.ConfigurationManager.Setting;
import dev.esophose.playerparticles.particles.ConsolePPlayer;
import dev.esophose.playerparticles.particles.FixedParticleEffect; import dev.esophose.playerparticles.particles.FixedParticleEffect;
import dev.esophose.playerparticles.particles.PParticle; import dev.esophose.playerparticles.particles.PParticle;
import dev.esophose.playerparticles.particles.PPlayer; import dev.esophose.playerparticles.particles.PPlayer;
@ -68,6 +69,7 @@ public class ParticleManager extends Manager implements Listener, Runnable {
dataManager.loadFixedEffects(); dataManager.loadFixedEffects();
for (Player player : Bukkit.getOnlinePlayers()) for (Player player : Bukkit.getOnlinePlayers())
dataManager.getPPlayer(player.getUniqueId(), (pplayer) -> { }); // Loads the PPlayer from the database dataManager.getPPlayer(player.getUniqueId(), (pplayer) -> { }); // Loads the PPlayer from the database
dataManager.getPPlayer(ConsolePPlayer.getUUID(), (pplayer) -> { }); // Load the console PPlayer
} }
@Override @Override

View file

@ -0,0 +1,38 @@
package dev.esophose.playerparticles.particles;
import java.util.Map;
import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class ConsolePPlayer extends PPlayer {
private static final UUID uuid;
static {
uuid = UUID.fromString("ffffffff-ffff-ffff-ffff-ffffffffffff");
}
public ConsolePPlayer(Map<String, ParticleGroup> particleGroups, Map<Integer, FixedParticleEffect> fixedParticles) {
super(uuid, particleGroups, fixedParticles, false);
}
/**
* @return the underlying ConsoleCommandSender who executed the command
*/
@Override
public CommandSender getUnderlyingExecutor() {
return Bukkit.getConsoleSender();
}
@Override
public Player getPlayer() {
return null;
}
public static UUID getUUID() {
return uuid;
}
}

View file

@ -23,6 +23,7 @@ public class OtherPPlayer extends PPlayer {
/** /**
* @return the underlying CommandSender who executed the command * @return the underlying CommandSender who executed the command
*/ */
@Override
public CommandSender getUnderlyingExecutor() { public CommandSender getUnderlyingExecutor() {
return this.sender; return this.sender;
} }

View file

@ -4,8 +4,10 @@ import dev.esophose.playerparticles.particles.PPlayer;
import dev.esophose.playerparticles.util.inputparser.Parsable; import dev.esophose.playerparticles.util.inputparser.Parsable;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -20,7 +22,7 @@ public class ParsableLocation extends Parsable<Location> {
String input = inputs.remove(0); String input = inputs.remove(0);
Player player = pplayer.getPlayer(); Player player = pplayer.getPlayer();
if (input.equalsIgnoreCase("looking")) { if (player != null && input.equalsIgnoreCase("looking")) {
Block targetBlock = player.getTargetBlock((Set<Material>) null, 8); // Need the Set<Material> cast for 1.9 support Block targetBlock = player.getTargetBlock((Set<Material>) null, 8); // Need the Set<Material> cast for 1.9 support
int maxDistanceSqrd = 6 * 6; int maxDistanceSqrd = 6 * 6;
if (targetBlock.getLocation().distanceSquared(player.getLocation()) > maxDistanceSqrd) if (targetBlock.getLocation().distanceSquared(player.getLocation()) > maxDistanceSqrd)
@ -34,28 +36,38 @@ public class ParsableLocation extends Parsable<Location> {
double x, y, z; double x, y, z;
if (input.startsWith("~")) { if (player != null && input.startsWith("~")) {
if (input.equals("~")) x = player.getLocation().getX(); if (input.equals("~")) x = player.getLocation().getX();
else x = player.getLocation().getX() + Double.parseDouble(input.substring(1)); else x = player.getLocation().getX() + Double.parseDouble(input.substring(1));
} else { } else {
x = Double.parseDouble(input); x = Double.parseDouble(input);
} }
if (input2.startsWith("~")) { if (player != null && input2.startsWith("~")) {
if (input2.equals("~")) y = player.getLocation().getY(); if (input2.equals("~")) y = player.getLocation().getY();
else y = player.getLocation().getY() + Double.parseDouble(input2.substring(1)); else y = player.getLocation().getY() + Double.parseDouble(input2.substring(1));
} else { } else {
y = Double.parseDouble(input); y = Double.parseDouble(input2);
} }
if (input3.startsWith("~")) { if (player != null && input3.startsWith("~")) {
if (input3.equals("~")) z = player.getLocation().getZ(); if (input3.equals("~")) z = player.getLocation().getZ();
else z = player.getLocation().getZ() + Double.parseDouble(input3.substring(1)); else z = player.getLocation().getZ() + Double.parseDouble(input3.substring(1));
} else { } else {
z = Double.parseDouble(input); z = Double.parseDouble(input3);
} }
return new Location(player.getWorld(), x, y, z); World world;
if (player == null) {
world = Bukkit.getWorld(inputs.remove(0));
} else {
world = player.getWorld();
}
if (world == null)
return null;
return new Location(world, x, y, z);
} }
} }