Refactor how parameters work to be cleaner. This should effect command/parse from string disguises only. And shouldn't break existing uses.

- All disguises can now be constructed without an argument
- Certain disguises now accept the arguments where they didn't before, such as item frames.
- The new disguise disguises now have default values to make them more usable. Such as text_display now being "center" not "fixed"
- The defaults of the display disguises now have stone & "text display" to prevent invisibility. But this does not stop anyone from abusing the display disguises, they should be limited to trusted members.
This commit is contained in:
libraryaddict 2023-04-24 00:02:46 +12:00
parent ee5e0d22cc
commit d35c68a0ab
24 changed files with 577 additions and 137 deletions

View File

@ -255,13 +255,12 @@ public class LibsDisguises extends JavaPlugin {
new SoundManager().load();
ReflectionManager.registerValues();
DisguiseParser.createDefaultMethods();
ParamInfoManager.getParamInfoSoundGroup().recalculate();
DisguiseConfig.loadConfig();
DisguiseParser.createDefaultMethods();
PacketsManager.addPacketListeners();
listener = new DisguiseListener(this);

View File

@ -23,6 +23,7 @@ import me.libraryaddict.disguise.utilities.parser.DisguisePermissions;
import me.libraryaddict.disguise.utilities.parser.WatcherMethod;
import me.libraryaddict.disguise.utilities.translations.LibsMsg;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Art;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandExecutor;
@ -178,12 +179,18 @@ public abstract class DisguiseBaseCommand implements CommandExecutor {
String methodName = null;
if (allArgs.length == startsAt) {
if (disguisePerm.getType() == DisguiseType.FALLING_BLOCK) {
if (disguisePerm.getType() == DisguiseType.FALLING_BLOCK || disguisePerm.getType() == DisguiseType.BLOCK_DISPLAY) {
info = ParamInfoManager.getParamInfoItemBlock();
methodName = "setBlock";
} else if (disguisePerm.getType() == DisguiseType.DROPPED_ITEM) {
} else if (disguisePerm.getType() == DisguiseType.DROPPED_ITEM || disguisePerm.getType() == DisguiseType.ITEM_DISPLAY) {
info = ParamInfoManager.getParamInfo(ItemStack.class);
methodName = "setItemstack";
methodName = "setItemStack";
} else if (disguisePerm.getType() == DisguiseType.ITEM_FRAME) {
info = ParamInfoManager.getParamInfo(ItemStack.class);
methodName = "setItem";
} else if (disguisePerm.getType() == DisguiseType.PAINTING) {
info = ParamInfoManager.getParamInfo(Art.class);
methodName = "setArt";
}
} else if (allArgs.length > startsAt) {
// Check what argument was used before the current argument to see what we're displaying

View File

@ -18,6 +18,7 @@ public class MobDisguise extends TargetedDisguise {
this(disguiseType, true);
}
@Deprecated
public MobDisguise(DisguiseType disguiseType, boolean isAdult) {
super(disguiseType);

View File

@ -2,11 +2,19 @@ package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import org.joml.Vector3f;
public class BlockDisplayWatcher extends DisplayWatcher {
public BlockDisplayWatcher(Disguise disguise) {
super(disguise);
// So we're not seeing air
setBlock(Bukkit.createBlockData(Material.STONE));
// So its centered
setTranslation(new Vector3f(-0.5f, 0f, -0.5f));
}
public BlockData getBlock() {

View File

@ -3,6 +3,7 @@ package me.libraryaddict.disguise.disguisetypes.watchers;
import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.disguisetypes.FlagWatcher;
import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.parser.RandomDefaultValue;
import org.bukkit.Color;
import org.bukkit.entity.Display;
import org.bukkit.util.Transformation;
@ -23,6 +24,8 @@ public abstract class DisplayWatcher extends FlagWatcher {
return new Transformation(transformation, leftRotation, scale, rightRotation);
}
// Because BlockDisplayWatcher modifies this on startup..
@RandomDefaultValue
public void setTransformation(Transformation transformation) {
setData(MetaIndex.DISPLAY_TRANSLATION, transformation.getTranslation());
setData(MetaIndex.DISPLAY_LEFT_ROTATION, transformation.getLeftRotation());
@ -36,6 +39,8 @@ public abstract class DisplayWatcher extends FlagWatcher {
return getData(MetaIndex.DISPLAY_TRANSLATION);
}
// Because BlockDisplayWatcher modifies this on startup..
@RandomDefaultValue
public void setTranslation(Vector3f translation) {
setData(MetaIndex.DISPLAY_TRANSLATION, translation);
sendData(MetaIndex.DISPLAY_TRANSLATION);
@ -135,6 +140,8 @@ public abstract class DisplayWatcher extends FlagWatcher {
return Display.Billboard.values()[getData(MetaIndex.DISPLAY_BILLBOARD_RENDER_CONSTRAINTS)];
}
// Because TextDisplayWatcher modifies this on startup..
@RandomDefaultValue
public void setBillboard(Display.Billboard billboard) {
setData(MetaIndex.DISPLAY_BILLBOARD_RENDER_CONSTRAINTS, (byte) billboard.ordinal());
sendData(MetaIndex.DISPLAY_BILLBOARD_RENDER_CONSTRAINTS);

View File

@ -9,6 +9,9 @@ import org.bukkit.inventory.ItemStack;
public class ItemDisplayWatcher extends DisplayWatcher {
public ItemDisplayWatcher(Disguise disguise) {
super(disguise);
setItemDisplayTransform(ItemDisplay.ItemDisplayTransform.GROUND);
setItemStack(new ItemStack(Material.STONE));
}
public ItemStack getItemStack() {

View File

@ -7,11 +7,15 @@ import me.libraryaddict.disguise.disguisetypes.MetaIndex;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import net.md_5.bungee.api.chat.BaseComponent;
import org.bukkit.Color;
import org.bukkit.entity.Display;
import org.bukkit.entity.TextDisplay;
public class TextDisplayWatcher extends DisplayWatcher {
public TextDisplayWatcher(Disguise disguise) {
super(disguise);
setBillboard(Display.Billboard.CENTER);
setText("Text Display");
}
public String getText() {

View File

@ -11,7 +11,7 @@ import java.util.Locale;
/**
* Created by libraryaddict on 16/02/2020.
*/
public class ParamInfoItemBlock extends ParamInfoItemStack {
public class ParamInfoItemBlock<I extends ItemStack> extends ParamInfoItemStack {
public ParamInfoItemBlock(Class paramClass, String name, String valueType, String description, Material[] possibleValues) {
super(paramClass, name, valueType, description, Arrays.stream(possibleValues).filter(m -> {
switch (m) {

View File

@ -20,7 +20,7 @@ import java.util.Locale;
/**
* Created by libraryaddict on 7/09/2018.
*/
public class ParamInfoItemStack extends ParamInfoEnum<Object> {
public class ParamInfoItemStack<I extends ItemStack> extends ParamInfoEnum<Object> {
public ParamInfoItemStack(Class paramClass, String name, String valueType, String description, Enum[] possibleValues) {
super(paramClass, name, valueType, description, possibleValues);

View File

@ -36,7 +36,7 @@ public class ParamInfoItemStackArray extends ParamInfoItemStack {
String lastEntry = split.remove(split.size() - 1);
for (String material : super.getEnums(null)) {
for (String material : (Set<String>) super.getEnums(null)) {
if (!split.isEmpty() && !material.toLowerCase(Locale.ENGLISH).startsWith(lastEntry.toLowerCase(Locale.ENGLISH))) {
continue;
}

View File

@ -10,20 +10,28 @@ import me.libraryaddict.disguise.disguisetypes.MobDisguise;
import me.libraryaddict.disguise.disguisetypes.ModdedDisguise;
import me.libraryaddict.disguise.disguisetypes.PlayerDisguise;
import me.libraryaddict.disguise.disguisetypes.TargetedDisguise;
import me.libraryaddict.disguise.disguisetypes.watchers.FallingBlockWatcher;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.modded.ModdedEntity;
import me.libraryaddict.disguise.utilities.modded.ModdedManager;
import me.libraryaddict.disguise.utilities.params.ParamInfo;
import me.libraryaddict.disguise.utilities.params.ParamInfoManager;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import me.libraryaddict.disguise.utilities.parser.constructors.ArtPaintingDisguiseParam;
import me.libraryaddict.disguise.utilities.parser.constructors.BlockDisplayDisguiseParam;
import me.libraryaddict.disguise.utilities.parser.constructors.ExtraDisguiseParam;
import me.libraryaddict.disguise.utilities.parser.constructors.FallingBlockDisguiseParamNew;
import me.libraryaddict.disguise.utilities.parser.constructors.FallingBlockDisguiseParamOld;
import me.libraryaddict.disguise.utilities.parser.constructors.IntegerPaintingDisguiseParam;
import me.libraryaddict.disguise.utilities.parser.constructors.ItemDisguiseParam;
import me.libraryaddict.disguise.utilities.parser.constructors.ItemFrameDisguiseParam;
import me.libraryaddict.disguise.utilities.parser.constructors.PlayerDisguiseParam;
import me.libraryaddict.disguise.utilities.parser.constructors.SplashPotionDisguiseParam;
import me.libraryaddict.disguise.utilities.parser.constructors.TextDisplayParam;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
import me.libraryaddict.disguise.utilities.translations.LibsMsg;
import me.libraryaddict.disguise.utilities.translations.TranslateType;
import me.libraryaddict.disguise.utilities.watchers.DisguiseMethods;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
@ -39,7 +47,6 @@ import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
@ -55,6 +62,7 @@ public class DisguiseParser {
* <Setter, <Getter, DefaultValue>>
*/
private static final HashMap<WatcherMethod, Map.Entry<WatcherMethod, Object>> defaultWatcherValues = new HashMap<>();
private static final List<ExtraDisguiseParam> extraDisguiseParams = new ArrayList<>();
public static void createDefaultMethods() {
try {
@ -156,11 +164,20 @@ public class DisguiseParser {
addWatcherDefault(setMethod, getMethod, defaultValue);
}
}
} catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
} catch (Throwable e) {
e.printStackTrace();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
extraDisguiseParams.add(new ArtPaintingDisguiseParam());
extraDisguiseParams.add(new BlockDisplayDisguiseParam());
extraDisguiseParams.add(new FallingBlockDisguiseParamNew());
extraDisguiseParams.add(new FallingBlockDisguiseParamOld());
extraDisguiseParams.add(new IntegerPaintingDisguiseParam());
extraDisguiseParams.add(new ItemDisguiseParam());
extraDisguiseParams.add(new ItemFrameDisguiseParam());
extraDisguiseParams.add(new PlayerDisguiseParam());
extraDisguiseParams.add(new SplashPotionDisguiseParam());
extraDisguiseParams.add(new TextDisplayParam());
}
public static HashMap<WatcherMethod, Entry<WatcherMethod, Object>> getMethodDefaults() {
@ -637,7 +654,7 @@ public class DisguiseParser {
Disguise disguise = null;
DisguisePerm disguisePerm;
String name;
boolean customName = false;
boolean hasSetCustomName = false;
if (args[0].startsWith("@")) {
if (sender.hasPermission("libsdisguises.disguise.disguiseclone")) {
@ -652,7 +669,7 @@ public class DisguiseParser {
disguisePerm = new DisguisePerm(disguise.getType());
name = disguise.getDisguiseName();
customName = disguise.isCustomDisguiseName();
hasSetCustomName = disguise.isCustomDisguiseName();
if (disguisePerm.isUnknown()) {
throw new DisguiseParseException(LibsMsg.PARSE_CANT_DISG_UNKNOWN);
@ -682,7 +699,7 @@ public class DisguiseParser {
}
disguise = new ModdedDisguise(ent);
customName = true;
hasSetCustomName = true;
}
Entry<DisguisePerm, String> customDisguise = DisguiseConfig.getRawCustomDisguise(args[0]);
@ -692,7 +709,7 @@ public class DisguiseParser {
// Need to add user defined args for the custom disguise
args = DisguiseUtilities.split(customDisguise.getValue());
name = customDisguise.getKey().toReadable();
customName = true;
hasSetCustomName = true;
}
args = parsePlaceholders(args, sender == null ? target : sender, target);
@ -712,152 +729,108 @@ public class DisguiseParser {
HashMap<String, HashMap<String, Boolean>> disguiseOptions = DisguisePermissions.getDisguiseOptions(sender, permNode, disguisePerm);
if (disguise == null) {
WatcherMethod[] watcherMethods = ParamInfoManager.getDisguiseWatcherMethods(disguisePerm.getWatcherClass(), true);
String method = null;
Object param = null;
if (args.length > 1) {
String[] argArray = args;
if (Arrays.stream(watcherMethods).noneMatch(m -> m.getName().equalsIgnoreCase(argArray[1]))) {
for (ExtraDisguiseParam extra : extraDisguiseParams) {
if (!extra.isApplicable(disguisePerm.getType(), args[1])) {
continue;
}
method = extra.getParameterMethod();
try {
param = extra.createParametervalue(sender, args[1]);
} catch (DisguiseParseException ex) {
throw ex;
} catch (Throwable throwable) {
throw new DisguiseParseException(LibsMsg.PARSE_EXPECTED_RECEIVED, extra.getParamInfo().getDescriptiveName(), args[1],
TranslateType.DISGUISE_OPTIONS.reverseGet(TranslateType.DISGUISE_OPTIONS.reverseGet(method)));
}
extra.checkParameterPermission(sender, permissions, disguiseOptions, usedOptions, disguisePerm, param);
toSkip++;
break;
}
}
}
if (disguisePerm.isPlayer()) {
// If he is doing a player disguise
if (args.length == 1) {
// He needs to give the player name
throw new DisguiseParseException(LibsMsg.PARSE_SUPPLY_PLAYER);
} else {
// If they can't use this name, throw error
if (!DisguisePermissions.hasPermissionOption(disguiseOptions, "setname", args[1].toLowerCase(Locale.ENGLISH))) {
if (!args[1].equalsIgnoreCase(sender.getName()) ||
!DisguisePermissions.hasPermissionOption(disguiseOptions, "setname", "themselves")) {
throw new DisguiseParseException(LibsMsg.PARSE_NO_PERM_NAME);
}
}
args[1] = args[1].replace("\\_", " ");
if (DisguiseConfig.isArmorstandsName() && !sender.hasPermission("libsdisguises.multiname")) {
args[1] = DisguiseUtilities.quoteNewLine(args[1]);
if (method == null) {
param = "Nameless Player";
} else if (!"setName".equalsIgnoreCase(method)) {
throw new IllegalStateException(
"Expected setName to be defined, this is an internal error, not a user error. Method was " + method);
}
// Construct the player disguise
disguise = new PlayerDisguise(DisguiseUtilities.translateAlternateColorCodes(args[1]));
disguise = new PlayerDisguise((String) param);
if (!customName) {
// Prevent this being set later
method = null;
if (!hasSetCustomName) {
name = ((PlayerDisguise) disguise).getName();
}
toSkip++;
}
} else if (disguisePerm.isMob()) { // Its a mob, use the mob constructor
if (args.length > 1) {
boolean adult = true;
if (args[1].equalsIgnoreCase(TranslateType.DISGUISE_OPTIONS.get("baby")) ||
args[1].equalsIgnoreCase(TranslateType.DISGUISE_OPTIONS.get("adult"))) {
usedOptions.add("setbaby");
doCheck(sender, permissions, disguisePerm, usedOptions);
adult = args[1].equalsIgnoreCase(TranslateType.DISGUISE_OPTIONS.get("adult"));
toSkip++;
disguise = new MobDisguise(disguisePerm.getType(), adult);
} else {
disguise = new MobDisguise(disguisePerm.getType());
}
} else {
disguise = new MobDisguise(disguisePerm.getType());
}
} else if (disguisePerm.isMob()) {
// Its a mob, use the mob constructor
disguise = new MobDisguise(disguisePerm.getType());
} else if (disguisePerm.isMisc()) {
// Its a misc, we are going to use the MiscDisguise constructor.
ItemStack itemStack = new ItemStack(Material.STONE);
// The steps I go through for 1.12..
Object blockData = null;
int miscId = -1;
disguise = new MiscDisguise(disguisePerm.getType());
}
if (args.length > 1) {
switch (disguisePerm.getType()) {
case FALLING_BLOCK:
case DROPPED_ITEM:
ParamInfo info;
if (method != null && param != null) {
WatcherMethod m = null;
try {
if (disguisePerm.getType() == DisguiseType.FALLING_BLOCK) {
if (NmsVersion.v1_13.isSupported() && args[1].contains("[")) {
info = ParamInfoManager.getParamInfo(BlockData.class);
blockData = info.fromString(new ArrayList<>(Collections.singletonList(args[1])));
} else {
info = ParamInfoManager.getParamInfoItemBlock();
itemStack = (ItemStack) info.fromString(new ArrayList<>(Collections.singletonList(args[1])));
}
} else {
info = ParamInfoManager.getParamInfo(ItemStack.class);
itemStack = (ItemStack) info.fromString(new ArrayList<>(Collections.singletonList(args[1])));
}
} catch (Exception ex) {
break;
}
String optionName;
if (disguisePerm.getType() == DisguiseType.FALLING_BLOCK) {
optionName = "setblock";
} else {
optionName = "setitemstack";
}
usedOptions.add(optionName);
doCheck(sender, permissions, disguisePerm, usedOptions);
String itemName = itemStack == null ? "null" : itemStack.getType().name().toLowerCase(Locale.ENGLISH);
if (!DisguisePermissions.hasPermissionOption(disguiseOptions, optionName, itemName)) {
throw new DisguiseParseException(LibsMsg.PARSE_NO_PERM_PARAM, itemName, disguisePerm.toReadable());
}
toSkip++;
break;
case PAINTING:
case SPLASH_POTION:
if (!isInteger(args[1])) {
break;
}
miscId = Integer.parseInt(args[1]);
toSkip++;
if (disguisePerm.getType() == DisguiseType.PAINTING) {
optionName = "setpainting";
} else {
optionName = "setpotionid";
}
usedOptions.add(optionName);
doCheck(sender, permissions, disguisePerm, usedOptions);
if (!DisguisePermissions.hasPermissionOption(disguiseOptions, optionName, miscId + "")) {
throw new DisguiseParseException(LibsMsg.PARSE_NO_PERM_PARAM, miscId + "", disguisePerm.toReadable());
}
break;
default:
break;
for (WatcherMethod method1 : watcherMethods) {
if (!method1.getName().equalsIgnoreCase(method)) {
continue;
}
if (!method1.getParam().isAssignableFrom(param.getClass())) {
System.out.println("Can't cast " + method1.getParam() + " to " + param.getClass() + " for " + method);
continue;
}
m = method1;
break;
}
// Construct the disguise
if (disguisePerm.getType() == DisguiseType.DROPPED_ITEM || disguisePerm.getType() == DisguiseType.FALLING_BLOCK) {
disguise = new MiscDisguise(disguisePerm.getType(), itemStack);
if (m == null) {
throw new DisguiseParseException(LibsMsg.PARSE_CANT_LOAD_DETAILS, args[1], method);
}
if (blockData != null && disguisePerm.getType() == DisguiseType.FALLING_BLOCK) {
((FallingBlockWatcher) disguise.getWatcher()).setBlockData((BlockData) blockData);
}
MethodHandle handle = m.getMethod();
if (!customName) {
name = disguise.getDisguiseName();
}
if (FlagWatcher.class.isAssignableFrom(m.getWatcherClass())) {
handle = handle.bindTo(disguise.getWatcher());
} else {
disguise = new MiscDisguise(disguisePerm.getType(), miscId);
handle = handle.bindTo(disguise);
}
handle.invoke(param);
}
if (!hasSetCustomName && !disguisePerm.isPlayer()) {
name = disguise.getDisguiseName();
}
}
}
disguise.setDisguiseName(name);
disguise.setCustomDisguiseName(customName);
disguise.setCustomDisguiseName(hasSetCustomName);
// Copy strings to their new range
String[] newArgs = new String[args.length - toSkip];
@ -941,7 +914,7 @@ public class DisguiseParser {
break;
} catch (DisguiseParseException ex) {
parseException = ex;
} catch (Exception ignored) {
} catch (Exception ex) {
parseException =
new DisguiseParseException(LibsMsg.PARSE_EXPECTED_RECEIVED, paramInfo.getDescriptiveName(), list.isEmpty() ? null : list.get(0),
TranslateType.DISGUISE_OPTIONS.reverseGet(method.getName()));

View File

@ -0,0 +1,46 @@
package me.libraryaddict.disguise.utilities.parser.constructors;
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
import me.libraryaddict.disguise.utilities.params.ParamInfo;
import me.libraryaddict.disguise.utilities.params.ParamInfoManager;
import org.bukkit.Art;
import java.util.Locale;
public class ArtPaintingDisguiseParam extends ExtraDisguiseParam<Art> {
@Override
public boolean isApplicable(DisguiseType disguiseType) {
throw new UnsupportedOperationException("Not implemented");
}
@Override
public boolean isApplicable(DisguiseType disguiseType, String arg) {
if (disguiseType != DisguiseType.PAINTING) {
return false;
}
try {
Art.getByName(arg);
return true;
} catch (Throwable ignored) {
}
return false;
}
@Override
public ParamInfo<Art> getParamInfo() {
return ParamInfoManager.getParamInfo(Art.class);
}
@Override
public String getParameterMethod() {
return "setArt";
}
@Override
public String getParameterAsString(Art param) {
return param.name().toLowerCase(Locale.ENGLISH);
}
}

View File

@ -0,0 +1,35 @@
package me.libraryaddict.disguise.utilities.parser.constructors;
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
import me.libraryaddict.disguise.utilities.params.ParamInfo;
import me.libraryaddict.disguise.utilities.params.ParamInfoManager;
import org.bukkit.block.data.BlockData;
import java.util.Locale;
public class BlockDisplayDisguiseParam extends ExtraDisguiseParam<BlockData> {
@Override
public boolean isApplicable(DisguiseType disguiseType) {
throw new UnsupportedOperationException("Not implemented");
}
@Override
public boolean isApplicable(DisguiseType disguiseType, String arg) {
return disguiseType == DisguiseType.BLOCK_DISPLAY;
}
@Override
public ParamInfo<BlockData> getParamInfo() {
return ParamInfoManager.getParamInfo(BlockData.class);
}
@Override
public String getParameterMethod() {
return "setBlock";
}
@Override
public String getParameterAsString(BlockData blockData) {
return blockData.getAsString().toLowerCase(Locale.ENGLISH);
}
}

View File

@ -0,0 +1,52 @@
package me.libraryaddict.disguise.utilities.parser.constructors;
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
import me.libraryaddict.disguise.utilities.params.ParamInfo;
import me.libraryaddict.disguise.utilities.parser.DisguiseParseException;
import me.libraryaddict.disguise.utilities.parser.DisguisePerm;
import me.libraryaddict.disguise.utilities.parser.DisguisePermissions;
import me.libraryaddict.disguise.utilities.translations.LibsMsg;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
public abstract class ExtraDisguiseParam<T> {
public abstract boolean isApplicable(DisguiseType disguiseType);
public boolean isApplicable(DisguiseType disguiseType, String arg) {
return isApplicable(disguiseType);
}
public abstract ParamInfo<T> getParamInfo();
public abstract String getParameterMethod();
public T createParametervalue(CommandSender sender, String arg) throws DisguiseParseException {
return getParamInfo().fromString(new ArrayList<>(Collections.singletonList(arg)));
}
public abstract String getParameterAsString(T param);
public void checkParameterPermission(CommandSender sender, DisguisePermissions permissions, HashMap<String, HashMap<String, Boolean>> disguiseOptions,
ArrayList<String> usedOptions, DisguisePerm disguisePerm, T param) throws DisguiseParseException {
checkParameterPermission(permissions, disguiseOptions, usedOptions, disguisePerm, param);
}
public void checkParameterPermission(DisguisePermissions permissions, HashMap<String, HashMap<String, Boolean>> disguiseOptions,
ArrayList<String> usedOptions, DisguisePerm disguisePerm, T param) throws DisguiseParseException {
usedOptions.add(getParameterMethod().toLowerCase());
if (!permissions.isAllowedDisguise(disguisePerm, usedOptions)) {
throw new DisguiseParseException(LibsMsg.D_PARSE_NOPERM, usedOptions.stream().reduce((first, second) -> second).orElse(null));
}
String itemName = param == null ? "null" : getParameterAsString(param);
if (!DisguisePermissions.hasPermissionOption(disguiseOptions, getParameterMethod(), itemName)) {
throw new DisguiseParseException(LibsMsg.PARSE_NO_PERM_PARAM, itemName, disguisePerm.toReadable());
}
}
}

View File

@ -0,0 +1,40 @@
package me.libraryaddict.disguise.utilities.parser.constructors;
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
import me.libraryaddict.disguise.utilities.params.ParamInfo;
import me.libraryaddict.disguise.utilities.params.ParamInfoManager;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import org.bukkit.block.data.BlockData;
import java.util.Locale;
public class FallingBlockDisguiseParamNew extends ExtraDisguiseParam<BlockData> {
@Override
public boolean isApplicable(DisguiseType disguiseType) {
throw new UnsupportedOperationException("Not implemented");
}
@Override
public boolean isApplicable(DisguiseType disguiseType, String arg) {
if (!NmsVersion.v1_13.isSupported() || disguiseType != DisguiseType.FALLING_BLOCK) {
return false;
}
return arg.contains("[");
}
@Override
public ParamInfo<BlockData> getParamInfo() {
return ParamInfoManager.getParamInfo(BlockData.class);
}
@Override
public String getParameterMethod() {
return "setBlockData";
}
@Override
public String getParameterAsString(BlockData blockData) {
return blockData.getAsString().toLowerCase(Locale.ENGLISH);
}
}

View File

@ -0,0 +1,36 @@
package me.libraryaddict.disguise.utilities.parser.constructors;
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
import me.libraryaddict.disguise.utilities.params.ParamInfo;
import me.libraryaddict.disguise.utilities.params.ParamInfoManager;
import me.libraryaddict.disguise.utilities.reflection.NmsVersion;
import org.bukkit.inventory.ItemStack;
import java.util.Locale;
public class FallingBlockDisguiseParamOld extends ExtraDisguiseParam<ItemStack> {
@Override
public boolean isApplicable(DisguiseType disguiseType) {
throw new UnsupportedOperationException("Not implemented");
}
@Override
public boolean isApplicable(DisguiseType disguiseType, String arg) {
return disguiseType == DisguiseType.FALLING_BLOCK && (!arg.contains("[") || !NmsVersion.v1_13.isSupported());
}
@Override
public ParamInfo<ItemStack> getParamInfo() {
return ParamInfoManager.getParamInfoItemBlock();
}
@Override
public String getParameterMethod() {
return "setBlock";
}
@Override
public String getParameterAsString(ItemStack itemstack) {
return itemstack.getType().name().toLowerCase(Locale.ENGLISH);
}
}

View File

@ -0,0 +1,33 @@
package me.libraryaddict.disguise.utilities.parser.constructors;
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
import me.libraryaddict.disguise.utilities.params.ParamInfo;
import me.libraryaddict.disguise.utilities.params.ParamInfoManager;
public abstract class IntegerDisguiseParam extends ExtraDisguiseParam<Integer> {
@Override
public boolean isApplicable(DisguiseType disguiseType, String arg) {
if (!isApplicable(disguiseType)) {
return false;
}
try {
Integer.parseInt(arg);
return true;
} catch (Throwable ignored) {
}
return false;
}
@Override
public ParamInfo<Integer> getParamInfo() {
return ParamInfoManager.getParamInfo(Integer.class);
}
@Override
public String getParameterAsString(Integer param) {
return String.valueOf(param);
}
}

View File

@ -0,0 +1,15 @@
package me.libraryaddict.disguise.utilities.parser.constructors;
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
public class IntegerPaintingDisguiseParam extends IntegerDisguiseParam {
@Override
public boolean isApplicable(DisguiseType disguiseType) {
return disguiseType == DisguiseType.PAINTING;
}
@Override
public String getParameterMethod() {
return "setArt";
}
}

View File

@ -0,0 +1,30 @@
package me.libraryaddict.disguise.utilities.parser.constructors;
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
import me.libraryaddict.disguise.utilities.params.ParamInfo;
import me.libraryaddict.disguise.utilities.params.ParamInfoManager;
import org.bukkit.inventory.ItemStack;
import java.util.Locale;
public class ItemDisguiseParam extends ExtraDisguiseParam<ItemStack> {
@Override
public boolean isApplicable(DisguiseType disguiseType) {
return disguiseType == DisguiseType.DROPPED_ITEM || disguiseType == DisguiseType.ITEM_DISPLAY;
}
@Override
public ParamInfo<ItemStack> getParamInfo() {
return ParamInfoManager.getParamInfo(ItemStack.class);
}
@Override
public String getParameterMethod() {
return "setItemStack";
}
@Override
public String getParameterAsString(ItemStack itemstack) {
return itemstack.getType().name().toLowerCase(Locale.ENGLISH);
}
}

View File

@ -0,0 +1,15 @@
package me.libraryaddict.disguise.utilities.parser.constructors;
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
public class ItemFrameDisguiseParam extends ItemDisguiseParam {
@Override
public boolean isApplicable(DisguiseType disguiseType) {
return disguiseType == DisguiseType.ITEM_FRAME || disguiseType == DisguiseType.GLOW_ITEM_FRAME;
}
@Override
public String getParameterMethod() {
return "setItem";
}
}

View File

@ -0,0 +1,71 @@
package me.libraryaddict.disguise.utilities.parser.constructors;
import me.libraryaddict.disguise.DisguiseConfig;
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.params.ParamInfo;
import me.libraryaddict.disguise.utilities.params.ParamInfoManager;
import me.libraryaddict.disguise.utilities.parser.DisguiseParseException;
import me.libraryaddict.disguise.utilities.parser.DisguisePerm;
import me.libraryaddict.disguise.utilities.parser.DisguisePermissions;
import me.libraryaddict.disguise.utilities.translations.LibsMsg;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;
public class PlayerDisguiseParam extends ExtraDisguiseParam<String> {
@Override
public boolean isApplicable(DisguiseType disguiseType) {
return disguiseType == DisguiseType.PLAYER;
}
@Override
public ParamInfo<String> getParamInfo() {
return ParamInfoManager.getParamInfo(String.class);
}
@Override
public String getParameterMethod() {
return "setName";
}
@Override
public String createParametervalue(CommandSender sender, String arg) {
arg = arg.replace("\\_", " ");
if (DisguiseConfig.isArmorstandsName() && sender != null && !sender.hasPermission("libsdisguises.multiname")) {
arg = DisguiseUtilities.quoteNewLine(arg);
}
return DisguiseUtilities.translateAlternateColorCodes(arg);
}
@Override
public String getParameterAsString(String param) {
return param;
}
public void checkParameterPermission(CommandSender sender, DisguisePermissions permissions, HashMap<String, HashMap<String, Boolean>> disguiseOptions,
ArrayList<String> usedOptions, DisguisePerm disguisePerm, String param) throws DisguiseParseException {
// If they can't use this name, throw error
if (sender != null && !DisguisePermissions.hasPermissionOption(disguiseOptions, "setname", param.toLowerCase(Locale.ENGLISH))) {
if (!param.equalsIgnoreCase(sender.getName()) || !DisguisePermissions.hasPermissionOption(disguiseOptions, "setname", "themselves")) {
throw new DisguiseParseException(LibsMsg.PARSE_NO_PERM_NAME);
}
}
usedOptions.add(getParameterMethod().toLowerCase());
if (!permissions.isAllowedDisguise(disguisePerm, usedOptions)) {
throw new DisguiseParseException(LibsMsg.D_PARSE_NOPERM, usedOptions.stream().reduce((first, second) -> second).orElse(null));
}
String itemName = param == null ? "null" : getParameterAsString(param);
if (!DisguisePermissions.hasPermissionOption(disguiseOptions, getParameterMethod(), itemName)) {
throw new DisguiseParseException(LibsMsg.PARSE_NO_PERM_PARAM, itemName, disguisePerm.toReadable());
}
}
}

View File

@ -0,0 +1,15 @@
package me.libraryaddict.disguise.utilities.parser.constructors;
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
public class SplashPotionDisguiseParam extends IntegerDisguiseParam {
@Override
public boolean isApplicable(DisguiseType disguiseType) {
return disguiseType == DisguiseType.SPLASH_POTION;
}
@Override
public String getParameterMethod() {
return "setPotionId";
}
}

View File

@ -0,0 +1,49 @@
package me.libraryaddict.disguise.utilities.parser.constructors;
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
import me.libraryaddict.disguise.disguisetypes.watchers.TextDisplayWatcher;
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.params.ParamInfo;
import me.libraryaddict.disguise.utilities.params.ParamInfoManager;
import me.libraryaddict.disguise.utilities.parser.WatcherMethod;
import org.bukkit.command.CommandSender;
import java.util.Arrays;
public class TextDisplayParam extends ExtraDisguiseParam<String> {
private final WatcherMethod[] methods = ParamInfoManager.getDisguiseWatcherMethods(TextDisplayWatcher.class, true);
@Override
public boolean isApplicable(DisguiseType disguiseType) {
throw new UnsupportedOperationException("Not implemented");
}
@Override
public boolean isApplicable(DisguiseType disguiseType, String arg) {
if (disguiseType != DisguiseType.TEXT_DISPLAY) {
return false;
}
return Arrays.stream(methods).noneMatch(m -> m.getParam() != null && m.getName().equalsIgnoreCase(arg));
}
@Override
public ParamInfo<String> getParamInfo() {
return ParamInfoManager.getParamInfo(String.class);
}
@Override
public String getParameterMethod() {
return "setText";
}
@Override
public String createParametervalue(CommandSender sender, String arg) {
return DisguiseUtilities.translateAlternateColorCodes(arg);
}
@Override
public String getParameterAsString(String param) {
return param;
}
}

View File

@ -145,6 +145,7 @@ public enum LibsMsg {
NOT_NUMBER("<red>Error! %s is not a number"),
PARSE_CANT_DISG_UNKNOWN("<red>Error! You cannot disguise as <green>Unknown!"),
PARSE_CANT_LOAD("<red>Error! This disguise couldn't be loaded!"),
PARSE_CANT_LOAD_DETAILS("<red>Error! This disguise couldn't be loaded! Tried to parse <green>%s<red> for <green>%s"),
PARSE_DISG_NO_EXIST("<red>Error! The disguise <green>%s<red> doesn't exist!"),
PARSE_EXPECTED_RECEIVED("<red>Expected <green>%s<red>, received <green>%s<red> instead for <green>%s"),
PARSE_PARTICLE_BLOCK("<red>Expected <green>%s:Material<red>, received <green>%s<red> instead"),