PlayerParticles/src/com/esophose/playerparticles/command/FixedCommandModule.java

801 lines
36 KiB
Java
Raw Normal View History

package com.esophose.playerparticles.command;
import java.text.DecimalFormat;
import java.util.ArrayList;
2018-10-07 21:18:19 -06:00
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;
2018-10-07 21:18:19 -06:00
import java.util.stream.Collectors;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
2018-10-07 21:18:19 -06:00
import org.bukkit.util.StringUtil;
import com.esophose.playerparticles.manager.DataManager;
import com.esophose.playerparticles.manager.LangManager;
2018-10-16 19:09:20 -06:00
import com.esophose.playerparticles.manager.LangManager.Lang;
import com.esophose.playerparticles.manager.ParticleManager;
import com.esophose.playerparticles.manager.PermissionManager;
import com.esophose.playerparticles.particles.FixedParticleEffect;
import com.esophose.playerparticles.particles.PPlayer;
import com.esophose.playerparticles.particles.ParticleEffect;
import com.esophose.playerparticles.particles.ParticleEffect.NoteColor;
import com.esophose.playerparticles.particles.ParticleEffect.OrdinaryColor;
import com.esophose.playerparticles.particles.ParticleEffect.ParticleProperty;
import com.esophose.playerparticles.particles.ParticlePair;
import com.esophose.playerparticles.styles.api.ParticleStyle;
import com.esophose.playerparticles.util.ParticleUtils;
public class FixedCommandModule implements CommandModule {
public void onCommandExecute(PPlayer pplayer, String[] args) {
Player p = pplayer.getPlayer();
if (!PermissionManager.canUseFixedEffects(p)) {
LangManager.sendMessage(pplayer, Lang.FIXED_NO_PERMISSION);
return;
}
if (args.length == 0) { // General information on command
LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_CREATE);
LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_EDIT);
LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_REMOVE);
LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_LIST);
LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_INFO);
LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_CLEAR);
return;
}
String cmd = args[0];
String[] cmdArgs = new String[args.length - 1];
2019-04-28 00:17:08 -06:00
System.arraycopy(args, 1, cmdArgs, 0, args.length - 1);
2018-10-07 21:18:19 -06:00
switch (cmd.toLowerCase()) {
case "create":
2019-04-28 00:17:08 -06:00
this.handleCreate(pplayer, p, cmdArgs);
2018-10-07 21:18:19 -06:00
return;
case "edit":
2019-04-28 00:17:08 -06:00
this.handleEdit(pplayer, p, cmdArgs);
return;
2018-10-07 21:18:19 -06:00
case "remove":
2019-04-28 00:17:08 -06:00
this.handleRemove(pplayer, p, cmdArgs);
2018-10-07 21:18:19 -06:00
return;
case "list":
2019-04-28 00:17:08 -06:00
this.handleList(pplayer, p, cmdArgs);
2018-10-07 21:18:19 -06:00
return;
case "info":
2019-04-28 00:17:08 -06:00
this.handleInfo(pplayer, p, cmdArgs);
2018-10-07 21:18:19 -06:00
return;
case "clear":
2019-04-28 00:17:08 -06:00
this.handleClear(pplayer, p, cmdArgs);
2018-10-07 21:18:19 -06:00
return;
default:
LangManager.sendMessage(pplayer, Lang.FIXED_INVALID_COMMAND);
LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_CREATE);
LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_EDIT);
LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_REMOVE);
LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_LIST);
LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_INFO);
LangManager.sendMessage(pplayer, Lang.COMMAND_DESCRIPTION_FIXED_CLEAR);
2018-10-07 21:18:19 -06:00
}
}
2019-04-28 00:17:08 -06:00
2018-10-07 21:18:19 -06:00
/**
* Handles the command /pp fixed create
2019-04-28 00:17:08 -06:00
*
2018-10-07 21:18:19 -06:00
* @param pplayer The PPlayer
* @param p The Player
* @param args The command arguments
*/
private void handleCreate(PPlayer pplayer, Player p, String[] args) {
boolean reachedMax = PermissionManager.hasPlayerReachedMaxFixedEffects(pplayer);
2018-10-07 21:18:19 -06:00
if (reachedMax) {
LangManager.sendMessage(pplayer, Lang.FIXED_MAX_REACHED);
2018-10-07 21:18:19 -06:00
return;
}
if (args.length < 5 && !(args.length > 0 && args[0].equalsIgnoreCase("looking") && args.length >= 3)) {
LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_MISSING_ARGS, 5 - args.length);
2018-10-07 21:18:19 -06:00
return;
}
2019-04-28 00:17:08 -06:00
double xPos, yPos, zPos;
if (args[0].equalsIgnoreCase("looking")) {
Block targetBlock = p.getTargetBlock((Set<Material>) null, 8);
int maxDistanceSqrd = 6 * 6;
if (targetBlock.getLocation().distanceSquared(p.getLocation()) > maxDistanceSqrd) {
LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_LOOKING_TOO_FAR);
return;
}
2019-04-28 00:17:08 -06:00
Location blockLocation = targetBlock.getLocation().clone().add(0.5, 0.5, 0.5); // Center of block
2019-04-28 00:17:08 -06:00
xPos = blockLocation.getX();
yPos = blockLocation.getY();
zPos = blockLocation.getZ();
2019-04-28 00:17:08 -06:00
// Pad the args with the coordinates so we don't have to adjust all the indices
String[] paddedArgs = new String[args.length + 2];
paddedArgs[0] = String.valueOf(xPos);
paddedArgs[1] = String.valueOf(yPos);
paddedArgs[2] = String.valueOf(zPos);
2019-04-28 00:17:08 -06:00
System.arraycopy(args, 1, paddedArgs, 3, args.length - 1);
args = paddedArgs;
} else {
try {
if (args[0].startsWith("~")) {
if (args[0].equals("~")) xPos = p.getLocation().getX();
else xPos = p.getLocation().getX() + Double.parseDouble(args[0].substring(1));
} else {
xPos = Double.parseDouble(args[0]);
}
if (args[1].startsWith("~")) {
if (args[1].equals("~")) yPos = p.getLocation().getY() + 1;
else yPos = p.getLocation().getY() + 1 + Double.parseDouble(args[1].substring(1));
} else {
yPos = Double.parseDouble(args[1]);
}
if (args[2].startsWith("~")) {
if (args[2].equals("~")) zPos = p.getLocation().getZ();
else zPos = p.getLocation().getZ() + Double.parseDouble(args[2].substring(1));
} else {
zPos = Double.parseDouble(args[2]);
}
} catch (Exception e) {
LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_INVALID_COORDS);
return;
}
2018-10-07 21:18:19 -06:00
}
2018-10-07 21:18:19 -06:00
double distanceFromEffect = p.getLocation().distance(new Location(p.getWorld(), xPos, yPos, zPos));
int maxCreationDistance = PermissionManager.getMaxFixedEffectCreationDistance();
2018-10-07 21:18:19 -06:00
if (maxCreationDistance != 0 && distanceFromEffect > maxCreationDistance) {
LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_OUT_OF_RANGE, maxCreationDistance);
2018-10-07 21:18:19 -06:00
return;
}
2018-10-13 16:38:01 -06:00
ParticleEffect effect = ParticleEffect.fromName(args[3]);
2018-10-07 21:18:19 -06:00
if (effect == null) {
LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_EFFECT_INVALID, args[3]);
2018-10-07 21:18:19 -06:00
return;
} else if (!PermissionManager.hasEffectPermission(p, effect)) {
LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_EFFECT_NO_PERMISSION, effect.getName());
2018-10-07 21:18:19 -06:00
return;
}
ParticleStyle style = ParticleStyle.fromName(args[4]);
2018-10-07 21:18:19 -06:00
if (style == null) {
LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_STYLE_INVALID, args[4]);
2018-10-07 21:18:19 -06:00
return;
} else if (!PermissionManager.hasStylePermission(p, style)) {
LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_STYLE_NO_PERMISSION, args[4]);
2018-10-07 21:18:19 -06:00
return;
}
2018-10-07 21:18:19 -06:00
if (!style.canBeFixed()) {
LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_STYLE_NON_FIXABLE, style.getName());
2018-10-07 21:18:19 -06:00
return;
}
2018-10-07 21:18:19 -06:00
Material itemData = null;
Material blockData = null;
OrdinaryColor colorData = null;
NoteColor noteColorData = null;
2018-10-07 21:18:19 -06:00
if (args.length > 5) {
if (effect.hasProperty(ParticleProperty.COLORABLE)) {
if (effect == ParticleEffect.NOTE) {
if (args[5].equalsIgnoreCase("rainbow")) {
noteColorData = new NoteColor(99);
} else if (args[5].equalsIgnoreCase("random")) {
noteColorData = new NoteColor(98);
} else {
2019-04-28 00:17:08 -06:00
int note;
2018-10-07 21:18:19 -06:00
try {
note = Integer.parseInt(args[5]);
} catch (Exception e) {
LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_DATA_ERROR);
2018-10-07 21:18:19 -06:00
return;
}
if (note < 0 || note > 24) {
LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_DATA_ERROR);
2018-10-07 21:18:19 -06:00
return;
}
2018-10-07 21:18:19 -06:00
noteColorData = new NoteColor(note);
}
2018-10-07 21:18:19 -06:00
} else {
if (args[5].equalsIgnoreCase("rainbow")) {
colorData = new OrdinaryColor(999, 999, 999);
} else if (args[5].equalsIgnoreCase("random")) {
colorData = new OrdinaryColor(998, 998, 998);
2018-10-07 21:18:19 -06:00
} else {
2019-04-28 00:17:08 -06:00
int r, g, b;
2018-10-07 21:18:19 -06:00
try {
2018-10-07 21:18:19 -06:00
r = Integer.parseInt(args[5]);
g = Integer.parseInt(args[6]);
b = Integer.parseInt(args[7]);
} catch (Exception e) {
LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_DATA_ERROR);
return;
}
2018-10-07 21:18:19 -06:00
if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) {
LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_DATA_ERROR);
return;
}
2018-10-07 21:18:19 -06:00
colorData = new OrdinaryColor(r, g, b);
}
}
2018-10-07 21:18:19 -06:00
} else if (effect.hasProperty(ParticleProperty.REQUIRES_MATERIAL_DATA)) {
if (effect == ParticleEffect.BLOCK || effect == ParticleEffect.FALLING_DUST) {
2019-04-28 00:17:08 -06:00
Material material;
2018-10-07 21:18:19 -06:00
try {
material = ParticleUtils.closestMatch(args[5]);
if (material == null) material = Material.matchMaterial(args[5]);
if (material == null || !material.isBlock()) throw new Exception();
2018-10-07 21:18:19 -06:00
} catch (Exception e) {
LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_DATA_ERROR);
2018-10-07 21:18:19 -06:00
return;
}
2018-10-07 21:18:19 -06:00
blockData = material;
} else if (effect == ParticleEffect.ITEM) {
2019-04-28 00:17:08 -06:00
Material material;
2018-10-07 21:18:19 -06:00
try {
material = ParticleUtils.closestMatch(args[5]);
if (material == null) material = Material.matchMaterial(args[5]);
if (material == null || material.isBlock()) throw new Exception();
2018-10-07 21:18:19 -06:00
} catch (Exception e) {
LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_DATA_ERROR);
2018-10-07 21:18:19 -06:00
return;
}
2018-10-07 21:18:19 -06:00
itemData = material;
}
}
2018-10-07 21:18:19 -06:00
}
2018-10-07 21:18:19 -06:00
int nextFixedEffectId = pplayer.getNextFixedEffectId();
ParticlePair particle = new ParticlePair(pplayer.getUniqueId(), nextFixedEffectId, effect, style, itemData, blockData, colorData, noteColorData);
FixedParticleEffect fixedEffect = new FixedParticleEffect(p.getUniqueId(), nextFixedEffectId, p.getLocation().getWorld().getName(), xPos, yPos, zPos, particle);
LangManager.sendMessage(pplayer, Lang.FIXED_CREATE_SUCCESS);
2018-10-07 21:18:19 -06:00
DataManager.saveFixedEffect(fixedEffect);
}
2019-04-28 00:17:08 -06:00
/**
* Handles the command /pp fixed edit
2019-04-28 00:17:08 -06:00
*
* @param pplayer The PPlayer
* @param p The Player
* @param args The command arguments
*/
private void handleEdit(PPlayer pplayer, Player p, String[] args) {
if (args.length < 3) {
LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_MISSING_ARGS);
return;
}
2019-04-28 00:17:08 -06:00
int id;
try {
id = Integer.parseInt(args[0]);
} catch (Exception ex) {
LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_INVALID_ID);
return;
}
2019-04-28 00:17:08 -06:00
FixedParticleEffect fixedEffect = pplayer.getFixedEffectById(id);
if (fixedEffect == null) {
LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_INVALID_ID);
return;
}
2019-04-28 00:17:08 -06:00
String editType = args[1].toLowerCase();
2019-04-28 00:17:08 -06:00
switch (editType) {
case "location":
double xPos, yPos, zPos;
if (args[2].equalsIgnoreCase("looking")) {
Block targetBlock = p.getTargetBlock((Set<Material>) null, 8);
2019-04-28 00:17:08 -06:00
int maxDistanceSqrd = 6 * 6;
if (targetBlock.getLocation().distanceSquared(p.getLocation()) > maxDistanceSqrd) {
LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_LOOKING_TOO_FAR);
return;
}
2019-04-28 00:17:08 -06:00
Location blockLocation = targetBlock.getLocation().clone().add(0.5, 0.5, 0.5); // Center of block
2019-04-28 00:17:08 -06:00
xPos = blockLocation.getX();
yPos = blockLocation.getY();
zPos = blockLocation.getZ();
} else {
try {
if (args[2].startsWith("~")) {
if (args[2].equals("~")) xPos = p.getLocation().getX();
else xPos = p.getLocation().getX() + Double.parseDouble(args[2].substring(1));
} else {
xPos = Double.parseDouble(args[2]);
}
if (args[3].startsWith("~")) {
if (args[3].equals("~")) yPos = p.getLocation().getY() + 1;
else yPos = p.getLocation().getY() + 1 + Double.parseDouble(args[3].substring(1));
} else {
yPos = Double.parseDouble(args[3]);
}
if (args[4].startsWith("~")) {
if (args[4].equals("~")) zPos = p.getLocation().getZ();
else zPos = p.getLocation().getZ() + Double.parseDouble(args[4].substring(1));
} else {
zPos = Double.parseDouble(args[4]);
}
} catch (Exception e) {
LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_INVALID_COORDS);
return;
}
2019-04-28 00:17:08 -06:00
}
double distanceFromEffect = p.getLocation().distance(new Location(p.getWorld(), xPos, yPos, zPos));
int maxCreationDistance = PermissionManager.getMaxFixedEffectCreationDistance();
if (maxCreationDistance != 0 && distanceFromEffect > maxCreationDistance) {
LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_OUT_OF_RANGE, maxCreationDistance);
return;
}
2019-04-28 00:17:08 -06:00
fixedEffect.setCoordinates(xPos, yPos, zPos);
break;
case "effect": {
ParticleEffect effect = ParticleEffect.fromName(args[2]);
if (effect == null) {
LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_EFFECT_INVALID, args[2]);
return;
} else if (!PermissionManager.hasEffectPermission(pplayer.getPlayer(), effect)) {
LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_EFFECT_NO_PERMISSION, effect.getName());
return;
}
fixedEffect.getParticlePair().setEffect(effect);
break;
}
2019-04-28 00:17:08 -06:00
case "style":
ParticleStyle style = ParticleStyle.fromName(args[2]);
if (style == null) {
LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_STYLE_INVALID, args[2]);
return;
} else if (!PermissionManager.hasStylePermission(pplayer.getPlayer(), style)) {
LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_STYLE_NO_PERMISSION, style.getName());
return;
} else if (!style.canBeFixed()) {
LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_STYLE_NON_FIXABLE, style.getName());
return;
}
2019-04-28 00:17:08 -06:00
fixedEffect.getParticlePair().setStyle(style);
break;
case "data": {
Material itemData = null;
Material blockData = null;
OrdinaryColor colorData = null;
NoteColor noteColorData = null;
ParticleEffect effect = fixedEffect.getParticlePair().getEffect();
if (effect.hasProperty(ParticleProperty.COLORABLE)) {
if (effect == ParticleEffect.NOTE) {
if (args[2].equalsIgnoreCase("rainbow")) {
noteColorData = new NoteColor(99);
} else if (args[2].equalsIgnoreCase("random")) {
noteColorData = new NoteColor(98);
} else {
int note;
try {
note = Integer.parseInt(args[2]);
} catch (Exception e) {
LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_DATA_ERROR);
return;
}
2019-04-28 00:17:08 -06:00
if (note < 0 || note > 24) {
LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_DATA_ERROR);
return;
}
noteColorData = new NoteColor(note);
}
} else {
2019-04-28 00:17:08 -06:00
if (args[2].equalsIgnoreCase("rainbow")) {
colorData = new OrdinaryColor(999, 999, 999);
} else if (args[2].equalsIgnoreCase("random")) {
colorData = new OrdinaryColor(998, 998, 998);
} else {
int r, g, b;
try {
r = Integer.parseInt(args[2]);
g = Integer.parseInt(args[3]);
b = Integer.parseInt(args[4]);
} catch (Exception e) {
LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_DATA_ERROR);
return;
}
if (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) {
LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_DATA_ERROR);
return;
}
2019-04-28 00:17:08 -06:00
colorData = new OrdinaryColor(r, g, b);
}
}
} else if (effect.hasProperty(ParticleProperty.REQUIRES_MATERIAL_DATA)) {
if (effect == ParticleEffect.BLOCK || effect == ParticleEffect.FALLING_DUST) {
Material material;
try {
2019-04-28 00:17:08 -06:00
material = ParticleUtils.closestMatch(args[2]);
if (material == null) material = Material.matchMaterial(args[2]);
if (material == null || !material.isBlock()) throw new Exception();
} catch (Exception e) {
LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_DATA_ERROR);
return;
}
2019-04-28 00:17:08 -06:00
blockData = material;
} else if (effect == ParticleEffect.ITEM) {
Material material;
try {
material = ParticleUtils.closestMatch(args[2]);
if (material == null) material = Material.matchMaterial(args[2]);
if (material == null || material.isBlock()) throw new Exception();
} catch (Exception e) {
LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_DATA_ERROR);
return;
}
2019-04-28 00:17:08 -06:00
itemData = material;
}
2019-04-28 00:17:08 -06:00
} else {
LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_DATA_NONE);
return;
}
2019-04-28 00:17:08 -06:00
fixedEffect.getParticlePair().setColor(colorData);
fixedEffect.getParticlePair().setNoteColor(noteColorData);
fixedEffect.getParticlePair().setItemMaterial(itemData);
fixedEffect.getParticlePair().setBlockMaterial(blockData);
break;
}
2019-04-28 00:17:08 -06:00
default:
LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_INVALID_PROPERTY);
return;
}
2019-04-28 00:17:08 -06:00
DataManager.updateFixedEffect(fixedEffect);
LangManager.sendMessage(pplayer, Lang.FIXED_EDIT_SUCCESS, editType, id);
}
2019-04-28 00:17:08 -06:00
2018-10-07 21:18:19 -06:00
/**
* Handles the command /pp fixed remove
2019-04-28 00:17:08 -06:00
*
2018-10-07 21:18:19 -06:00
* @param pplayer The PPlayer
* @param p The Player
* @param args The command arguments
*/
private void handleRemove(PPlayer pplayer, Player p, String[] args) {
if (args.length < 1) {
LangManager.sendMessage(pplayer, Lang.FIXED_REMOVE_NO_ARGS);
2018-10-07 21:18:19 -06:00
return;
}
2019-04-28 00:17:08 -06:00
int id;
2018-10-07 21:18:19 -06:00
try {
id = Integer.parseInt(args[0]);
} catch (Exception e) {
LangManager.sendMessage(pplayer, Lang.FIXED_REMOVE_ARGS_INVALID);
2018-10-07 21:18:19 -06:00
return;
}
2018-10-07 21:18:19 -06:00
if (pplayer.getFixedEffectById(id) != null) {
DataManager.removeFixedEffect(pplayer.getUniqueId(), id);
LangManager.sendMessage(pplayer, Lang.FIXED_REMOVE_SUCCESS, id);
2018-10-07 21:18:19 -06:00
} else {
LangManager.sendMessage(pplayer, Lang.FIXED_REMOVE_INVALID, id);
2018-10-07 21:18:19 -06:00
}
}
2019-04-28 00:17:08 -06:00
2018-10-07 21:18:19 -06:00
/**
* Handles the command /pp fixed list
2019-04-28 00:17:08 -06:00
*
2018-10-07 21:18:19 -06:00
* @param pplayer The PPlayer
* @param p The Player
* @param args The command arguments
*/
private void handleList(PPlayer pplayer, Player p, String[] args) {
List<Integer> ids = pplayer.getFixedEffectIds();
Collections.sort(ids);
if (ids.isEmpty()) {
LangManager.sendMessage(pplayer, Lang.FIXED_LIST_NONE);
2018-10-07 21:18:19 -06:00
return;
}
2019-04-28 00:17:08 -06:00
StringBuilder msg = new StringBuilder();
2018-10-07 21:18:19 -06:00
boolean first = true;
for (int id : ids) {
2019-04-28 00:17:08 -06:00
if (!first) msg.append(", ");
2018-10-07 21:18:19 -06:00
else first = false;
2019-04-28 00:17:08 -06:00
msg.append(id);
2018-10-07 21:18:19 -06:00
}
2019-04-28 00:17:08 -06:00
LangManager.sendMessage(pplayer, Lang.FIXED_LIST_SUCCESS, msg.toString());
2018-10-07 21:18:19 -06:00
}
2019-04-28 00:17:08 -06:00
2018-10-07 21:18:19 -06:00
/**
* Handles the command /pp fixed info
2019-04-28 00:17:08 -06:00
*
2018-10-07 21:18:19 -06:00
* @param pplayer The PPlayer
* @param p The Player
* @param args The command arguments
*/
private void handleInfo(PPlayer pplayer, Player p, String[] args) {
if (args.length < 1) {
LangManager.sendMessage(pplayer, Lang.FIXED_INFO_NO_ARGS);
2018-10-07 21:18:19 -06:00
return;
}
2019-04-28 00:17:08 -06:00
int id;
2018-10-07 21:18:19 -06:00
try {
id = Integer.parseInt(args[0]);
} catch (Exception e) {
LangManager.sendMessage(pplayer, Lang.FIXED_INFO_INVALID_ARGS);
2018-10-07 21:18:19 -06:00
return;
}
2018-10-07 21:18:19 -06:00
FixedParticleEffect fixedEffect = pplayer.getFixedEffectById(id);
if (fixedEffect == null) {
LangManager.sendMessage(pplayer, Lang.FIXED_INFO_INVALID, id);
2018-10-07 21:18:19 -06:00
return;
}
2018-10-07 21:18:19 -06:00
ParticlePair particle = fixedEffect.getParticlePair();
DecimalFormat df = new DecimalFormat("0.##"); // Decimal formatter so the coords aren't super long
2019-04-28 00:17:08 -06:00
LangManager.sendMessage(pplayer,
2018-10-07 21:18:19 -06:00
Lang.FIXED_INFO_SUCCESS,
fixedEffect.getId(),
2018-10-07 21:18:19 -06:00
fixedEffect.getLocation().getWorld().getName(),
df.format(fixedEffect.getLocation().getX()),
df.format(fixedEffect.getLocation().getY()),
df.format(fixedEffect.getLocation().getZ()),
2018-10-07 21:18:19 -06:00
particle.getEffect().getName(),
particle.getStyle().getName(),
particle.getDataString()
2019-04-28 00:17:08 -06:00
);
2018-10-07 21:18:19 -06:00
}
2019-04-28 00:17:08 -06:00
2018-10-07 21:18:19 -06:00
/**
* Handles the command /pp fixed clear
2019-04-28 00:17:08 -06:00
*
2018-10-07 21:18:19 -06:00
* @param pplayer The PPlayer
* @param p The Player
* @param args The command arguments
*/
private void handleClear(PPlayer pplayer, Player p, String[] args) {
if (!PermissionManager.canClearFixedEffects(p)) {
LangManager.sendMessage(pplayer, Lang.FIXED_CLEAR_NO_PERMISSION);
2018-10-07 21:18:19 -06:00
return;
}
2018-10-07 21:18:19 -06:00
if (args.length < 1) {
LangManager.sendMessage(pplayer, Lang.FIXED_CLEAR_NO_ARGS);
2018-10-07 21:18:19 -06:00
return;
}
2019-04-28 00:17:08 -06:00
int radius;
2018-10-07 21:18:19 -06:00
try {
radius = Math.abs(Integer.parseInt(args[0]));
} catch (Exception e) {
LangManager.sendMessage(pplayer, Lang.FIXED_CLEAR_INVALID_ARGS);
2018-10-07 21:18:19 -06:00
return;
}
2019-04-28 00:17:08 -06:00
ArrayList<FixedParticleEffect> fixedEffectsToRemove = new ArrayList<>();
2018-10-07 21:18:19 -06:00
for (PPlayer ppl : ParticleManager.getPPlayers())
for (FixedParticleEffect fixedEffect : ppl.getFixedParticles())
2019-04-28 00:17:08 -06:00
if (fixedEffect.getLocation().getWorld().equals(p.getLocation().getWorld()) && fixedEffect.getLocation().distance(p.getLocation()) <= radius)
2018-10-07 21:18:19 -06:00
fixedEffectsToRemove.add(fixedEffect);
2018-10-07 21:18:19 -06:00
for (FixedParticleEffect fixedEffect : fixedEffectsToRemove)
DataManager.removeFixedEffect(fixedEffect.getOwnerUniqueId(), fixedEffect.getId());
LangManager.sendMessage(pplayer, Lang.FIXED_CLEAR_SUCCESS, fixedEffectsToRemove.size(), radius);
}
public List<String> onTabComplete(PPlayer pplayer, String[] args) {
2018-10-07 21:18:19 -06:00
Player p = pplayer.getPlayer();
2019-04-28 00:17:08 -06:00
List<String> matches = new ArrayList<>();
2018-10-07 21:18:19 -06:00
if (args.length <= 1) {
2019-04-28 00:17:08 -06:00
List<String> possibleCmds = new ArrayList<>(Arrays.asList("create", "edit", "remove", "list", "info", "clear"));
2018-10-07 21:18:19 -06:00
if (args.length == 0) matches = possibleCmds;
else StringUtil.copyPartialMatches(args[0], possibleCmds, matches);
} else {
switch (args[0].toLowerCase()) {
2019-04-28 00:17:08 -06:00
case "create":
if (args.length <= 4) {
List<String> possibleValues = new ArrayList<>();
if (args.length == 4) {
possibleValues.add("~");
}
2019-04-28 00:17:08 -06:00
if (args.length == 3) {
possibleValues.add("~ ~");
}
2019-04-28 00:17:08 -06:00
if (args.length == 2) {
possibleValues.add("~ ~ ~");
possibleValues.add("looking");
}
StringUtil.copyPartialMatches(args[args.length - 1], possibleValues, matches);
2019-04-28 00:17:08 -06:00
}
// Pad arguments if the first coordinate is "looking"
if (args[1].equalsIgnoreCase("looking")) {
String[] paddedArgs = new String[args.length + 2];
paddedArgs[0] = paddedArgs[1] = paddedArgs[2] = paddedArgs[3] = "";
System.arraycopy(args, 2, paddedArgs, 4, args.length - 2);
args = paddedArgs;
}
if (args.length == 5) {
StringUtil.copyPartialMatches(args[4], PermissionManager.getEffectNamesUserHasPermissionFor(p), matches);
} else if (args.length == 6) {
StringUtil.copyPartialMatches(args[5], PermissionManager.getFixableStyleNamesUserHasPermissionFor(p), matches);
} else if (args.length >= 7) {
ParticleEffect effect = ParticleEffect.fromName(args[4]);
if (effect != null) {
if (effect.hasProperty(ParticleProperty.COLORABLE)) {
2019-04-28 00:17:08 -06:00
List<String> possibleValues = new ArrayList<>();
if (effect == ParticleEffect.NOTE) { // Note data
2019-04-28 00:17:08 -06:00
if (args.length == 7) {
possibleValues.add("<0-24>");
possibleValues.add("rainbow");
possibleValues.add("random");
}
} else { // Color data
2019-04-28 00:17:08 -06:00
if (args.length <= 9 && !args[2].equalsIgnoreCase("rainbow") && !args[2].equalsIgnoreCase("random")) {
possibleValues.add("<0-255>");
}
2019-04-28 00:17:08 -06:00
if (args.length <= 8 && !args[2].equalsIgnoreCase("rainbow") && !args[2].equalsIgnoreCase("random")) {
possibleValues.add("<0-255> <0-255>");
}
2019-04-28 00:17:08 -06:00
if (args.length <= 7) {
possibleValues.add("<0-255> <0-255> <0-255>");
possibleValues.add("rainbow");
possibleValues.add("random");
}
}
StringUtil.copyPartialMatches(args[args.length - 1], possibleValues, matches);
2019-04-28 00:17:08 -06:00
} else if (args.length == 7 && effect.hasProperty(ParticleProperty.REQUIRES_MATERIAL_DATA)) {
if (effect == ParticleEffect.BLOCK || effect == ParticleEffect.FALLING_DUST) { // Block material
2019-04-28 00:17:08 -06:00
StringUtil.copyPartialMatches(args[6], ParticleUtils.getAllBlockMaterials(), matches);
} else if (effect == ParticleEffect.ITEM) { // Item material
2019-04-28 00:17:08 -06:00
StringUtil.copyPartialMatches(args[6], ParticleUtils.getAllItemMaterials(), matches);
}
}
2018-10-07 21:18:19 -06:00
}
}
2019-04-28 00:17:08 -06:00
break;
case "edit":
if (args.length == 2) {
StringUtil.copyPartialMatches(args[1], pplayer.getFixedEffectIds().stream().map(String::valueOf).collect(Collectors.toList()), matches);
} else if (args.length == 3) {
String[] validProperties = new String[] { "location", "effect", "style", "data" };
StringUtil.copyPartialMatches(args[2], Arrays.asList(validProperties), matches);
} else {
String property = args[2].toLowerCase();
if (property.equals("location")) {
List<String> possibleValues = new ArrayList<String>();
if (args.length == 6 && !args[3].equalsIgnoreCase("looking")) {
possibleValues.add("~");
}
if (args.length == 5 && !args[3].equalsIgnoreCase("looking")) {
possibleValues.add("~ ~");
}
if (args.length == 4) {
possibleValues.add("~ ~ ~");
possibleValues.add("looking");
}
StringUtil.copyPartialMatches(args[args.length - 1], possibleValues, matches);
} else if (property.equals("effect") && args.length == 4) {
StringUtil.copyPartialMatches(args[3], PermissionManager.getEffectNamesUserHasPermissionFor(p), matches);
} else if (property.equals("style") && args.length == 4) {
StringUtil.copyPartialMatches(args[3], PermissionManager.getFixableStyleNamesUserHasPermissionFor(p), matches);
} else if (property.equals("data")) {
int id = -1;
try {
id = Integer.parseInt(args[1]);
} catch (Exception e) { }
FixedParticleEffect fixedEffect = pplayer.getFixedEffectById(id);
if (fixedEffect != null) {
ParticleEffect effect = fixedEffect.getParticlePair().getEffect();
if (effect.hasProperty(ParticleProperty.COLORABLE)) {
List<String> possibleValues = new ArrayList<>();
if (effect == ParticleEffect.NOTE) { // Note data
if (args.length == 4) {
possibleValues.add("<0-24>");
possibleValues.add("rainbow");
possibleValues.add("random");
}
} else { // Color data
if (args.length == 6 && !args[3].equalsIgnoreCase("rainbow") && !args[3].equalsIgnoreCase("random")) {
possibleValues.add("<0-255>");
}
if (args.length == 5 && !args[3].equalsIgnoreCase("rainbow") && !args[3].equalsIgnoreCase("random")) {
possibleValues.add("<0-255> <0-255>");
}
if (args.length == 4) {
possibleValues.add("<0-255> <0-255> <0-255>");
possibleValues.add("rainbow");
possibleValues.add("random");
}
}
StringUtil.copyPartialMatches(args[args.length - 1], possibleValues, matches);
} else if (args.length == 4 && effect.hasProperty(ParticleProperty.REQUIRES_MATERIAL_DATA)) {
if (effect == ParticleEffect.BLOCK || effect == ParticleEffect.FALLING_DUST) { // Block material
StringUtil.copyPartialMatches(args[3], ParticleUtils.getAllBlockMaterials(), matches);
} else if (effect == ParticleEffect.ITEM) { // Item material
StringUtil.copyPartialMatches(args[3], ParticleUtils.getAllItemMaterials(), matches);
}
}
}
}
}
break;
case "remove":
case "info":
StringUtil.copyPartialMatches(args[1], pplayer.getFixedEffectIds().stream().map(String::valueOf).collect(Collectors.toList()), matches);
break;
case "clear":
matches.add("<radius>");
break;
case "list":
break;
2018-10-07 21:18:19 -06:00
}
}
2019-04-28 00:17:08 -06:00
2018-10-07 21:18:19 -06:00
return matches;
}
public String getName() {
return "fixed";
}
2018-09-29 17:27:37 -06:00
public Lang getDescription() {
2018-10-01 22:23:05 -06:00
return Lang.COMMAND_DESCRIPTION_FIXED;
}
public String getArguments() {
2018-10-16 19:09:20 -06:00
return "<sub-command>";
}
public boolean requiresEffects() {
return true;
}
public boolean canConsoleExecute() {
return false;
}
}