mirror of
https://github.com/libraryaddict/LibsDisguises.git
synced 2024-06-22 09:54:43 +02:00
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:
parent
ee5e0d22cc
commit
d35c68a0ab
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -18,6 +18,7 @@ public class MobDisguise extends TargetedDisguise {
|
|||
this(disguiseType, true);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public MobDisguise(DisguiseType disguiseType, boolean isAdult) {
|
||||
super(disguiseType);
|
||||
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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()));
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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";
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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";
|
||||
}
|
||||
}
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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";
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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"),
|
||||
|
|
Loading…
Reference in New Issue
Block a user