2016-06-18 17:16:32 +02:00
package me.libraryaddict.disguise.commands ;
import me.libraryaddict.disguise.DisguiseConfig ;
import me.libraryaddict.disguise.LibsDisguises ;
import me.libraryaddict.disguise.disguisetypes.Disguise ;
import me.libraryaddict.disguise.disguisetypes.DisguiseType ;
2016-11-30 18:38:43 +01:00
import me.libraryaddict.disguise.utilities.DisguiseParser ;
import me.libraryaddict.disguise.utilities.DisguiseParser.DisguiseParseException ;
import me.libraryaddict.disguise.utilities.DisguiseParser.DisguisePerm ;
2016-11-28 15:01:06 +01:00
import me.libraryaddict.disguise.utilities.ReflectionFlagWatchers ;
import me.libraryaddict.disguise.utilities.ReflectionFlagWatchers.ParamInfo ;
2017-06-19 11:23:02 +02:00
import me.libraryaddict.disguise.utilities.TranslateType ;
import org.apache.commons.lang.StringUtils ;
import org.bukkit.Bukkit ;
import org.bukkit.ChatColor ;
import org.bukkit.command.Command ;
import org.bukkit.command.CommandSender ;
import org.bukkit.command.TabCompleter ;
import org.bukkit.entity.Player ;
import java.lang.reflect.InvocationTargetException ;
import java.lang.reflect.Method ;
import java.util.ArrayList ;
import java.util.HashMap ;
import java.util.List ;
2016-06-18 17:16:32 +02:00
2016-11-28 22:47:48 +01:00
public class DisguiseEntityCommand extends DisguiseBaseCommand implements TabCompleter {
2016-06-18 17:16:32 +02:00
@Override
2016-11-28 15:01:06 +01:00
public boolean onCommand ( CommandSender sender , Command cmd , String label , String [ ] args ) {
2017-02-19 15:53:03 +01:00
if ( ! ( sender instanceof Player ) ) {
2017-06-19 11:23:02 +02:00
sender . sendMessage (
TranslateType . MESSAGE . get ( ChatColor . RED + " You may not use this command from the " + " console! " ) ) ;
2016-06-18 17:16:32 +02:00
return true ;
}
2016-11-28 15:01:06 +01:00
2017-02-19 15:53:03 +01:00
if ( getPermissions ( sender ) . isEmpty ( ) ) {
2017-06-19 11:23:02 +02:00
sender . sendMessage ( TranslateType . MESSAGE . get ( ChatColor . RED + " You are forbidden to use this command. " ) ) ;
2017-02-19 15:53:03 +01:00
return true ;
}
2016-11-30 18:38:43 +01:00
if ( args . length = = 0 ) {
sendCommandUsage ( sender , getPermissions ( sender ) ) ;
return true ;
}
2016-06-18 17:16:32 +02:00
Disguise disguise ;
2016-11-28 15:01:06 +01:00
try {
2016-11-30 18:38:43 +01:00
disguise = DisguiseParser . parseDisguise ( sender , getPermNode ( ) , args , getPermissions ( sender ) ) ;
2016-06-18 17:16:32 +02:00
}
2016-11-28 15:01:06 +01:00
catch ( DisguiseParseException ex ) {
if ( ex . getMessage ( ) ! = null ) {
2016-06-18 17:16:32 +02:00
sender . sendMessage ( ex . getMessage ( ) ) ;
}
2016-11-28 15:01:06 +01:00
2016-06-18 17:16:32 +02:00
return true ;
}
2016-11-28 15:01:06 +01:00
catch ( IllegalAccessException | InvocationTargetException ex ) {
2016-06-18 17:16:32 +02:00
ex . printStackTrace ( ) ;
return true ;
}
2016-11-28 15:01:06 +01:00
2016-06-18 17:16:32 +02:00
LibsDisguises . getInstance ( ) . getListener ( ) . setDisguiseEntity ( sender . getName ( ) , disguise ) ;
2016-11-28 15:01:06 +01:00
2017-06-19 11:23:02 +02:00
sender . sendMessage ( TranslateType . MESSAGE . get (
ChatColor . RED + " Right click an entity in the next " + DisguiseConfig . getDisguiseEntityExpire ( ) + " " + " seconds to disguise it as a " + disguise . getType ( ) . toReadable ( ) + " ! " ) ) ;
2016-06-18 17:16:32 +02:00
return true ;
}
2016-11-28 15:01:06 +01:00
@Override
public List < String > onTabComplete ( CommandSender sender , Command cmd , String label , String [ ] origArgs ) {
2017-06-19 11:23:02 +02:00
ArrayList < String > tabs = new ArrayList < > ( ) ;
2017-02-19 15:53:03 +01:00
if ( ! ( sender instanceof Player ) ) {
return tabs ;
}
2016-11-28 15:01:06 +01:00
String [ ] args = getArgs ( origArgs ) ;
2016-11-30 18:38:43 +01:00
HashMap < DisguisePerm , HashMap < ArrayList < String > , Boolean > > perms = getPermissions ( sender ) ;
2016-11-28 15:01:06 +01:00
if ( args . length = = 0 ) {
2016-11-30 18:38:43 +01:00
for ( String type : getAllowedDisguises ( perms ) ) {
tabs . add ( type ) ;
2016-11-28 15:01:06 +01:00
}
2017-06-19 11:23:02 +02:00
} else {
2016-11-30 18:38:43 +01:00
DisguisePerm disguiseType = DisguiseParser . getDisguisePerm ( args [ 0 ] ) ;
2016-11-28 15:01:06 +01:00
2016-11-30 18:38:43 +01:00
if ( disguiseType = = null )
2016-11-28 15:01:06 +01:00
return filterTabs ( tabs , origArgs ) ;
2016-11-30 18:38:43 +01:00
if ( args . length = = 1 & & disguiseType . getType ( ) = = DisguiseType . PLAYER ) {
2016-11-28 15:01:06 +01:00
for ( Player player : Bukkit . getOnlinePlayers ( ) ) {
tabs . add ( player . getName ( ) ) ;
}
2017-06-19 11:23:02 +02:00
} else {
ArrayList < String > usedOptions = new ArrayList < > ( ) ;
2016-11-28 15:01:06 +01:00
for ( Method method : ReflectionFlagWatchers . getDisguiseWatcherMethods ( disguiseType . getWatcherClass ( ) ) ) {
2016-11-30 18:38:43 +01:00
for ( int i = disguiseType . getType ( ) = = DisguiseType . PLAYER ? 2 : 1 ; i < args . length ; i + + ) {
2016-11-28 15:01:06 +01:00
String arg = args [ i ] ;
if ( ! method . getName ( ) . equalsIgnoreCase ( arg ) )
continue ;
usedOptions . add ( arg ) ;
}
}
2016-11-30 18:56:11 +01:00
if ( passesCheck ( sender , perms . get ( disguiseType ) , usedOptions ) ) {
2016-11-28 15:01:06 +01:00
boolean addMethods = true ;
if ( args . length > 1 ) {
String prevArg = args [ args . length - 1 ] ;
ParamInfo info = ReflectionFlagWatchers . getParamInfo ( disguiseType , prevArg ) ;
if ( info ! = null ) {
if ( info . getParamClass ( ) ! = boolean . class )
addMethods = false ;
if ( info . isEnums ( ) ) {
2016-11-28 19:30:25 +01:00
for ( String e : info . getEnums ( origArgs [ origArgs . length - 1 ] ) ) {
2016-11-28 15:01:06 +01:00
tabs . add ( e ) ;
}
2017-06-19 11:23:02 +02:00
} else {
2016-11-28 15:01:06 +01:00
if ( info . getParamClass ( ) = = String . class ) {
for ( Player player : Bukkit . getOnlinePlayers ( ) ) {
tabs . add ( player . getName ( ) ) ;
}
}
}
}
}
if ( addMethods ) {
// If this is a method, add. Else if it can be a param of the previous argument, add.
2017-06-19 11:23:02 +02:00
for ( Method method : ReflectionFlagWatchers . getDisguiseWatcherMethods (
disguiseType . getWatcherClass ( ) ) ) {
2016-11-28 15:01:06 +01:00
tabs . add ( method . getName ( ) ) ;
}
}
}
}
}
return filterTabs ( tabs , origArgs ) ;
}
2016-06-18 17:16:32 +02:00
/ * *
* Send the player the information
*
* @param sender
* @param map
* /
@Override
2017-06-19 11:23:02 +02:00
protected void sendCommandUsage ( CommandSender sender ,
HashMap < DisguisePerm , HashMap < ArrayList < String > , Boolean > > map ) {
2016-06-18 17:16:32 +02:00
ArrayList < String > allowedDisguises = getAllowedDisguises ( map ) ;
2016-11-30 18:38:43 +01:00
2017-06-19 11:23:02 +02:00
sender . sendMessage ( TranslateType . MESSAGE . get (
ChatColor . DARK_GREEN + " Choose a disguise then right click an entity to disguise it! " ) ) ;
sender . sendMessage (
String . format ( TranslateType . MESSAGE . get ( ChatColor . DARK_GREEN + " You can use the " + " disguises: %s " ) ,
ChatColor . GREEN + StringUtils . join ( allowedDisguises , ChatColor . RED + " , " + ChatColor . GREEN ) ) ) ;
2016-11-28 15:01:06 +01:00
if ( allowedDisguises . contains ( " player " ) ) {
2017-06-19 11:23:02 +02:00
sender . sendMessage ( TranslateType . MESSAGE . get ( ChatColor . DARK_GREEN + " /disguiseentity player <Name> " ) ) ;
2016-06-18 17:16:32 +02:00
}
2016-11-28 15:01:06 +01:00
2017-06-19 11:23:02 +02:00
sender . sendMessage ( TranslateType . MESSAGE . get ( ChatColor . DARK_GREEN + " /disguiseentity <DisguiseType> <Baby> " ) ) ;
2016-11-28 15:01:06 +01:00
if ( allowedDisguises . contains ( " dropped_item " ) | | allowedDisguises . contains ( " falling_block " ) ) {
2017-06-19 11:23:02 +02:00
sender . sendMessage ( TranslateType . MESSAGE . get (
ChatColor . DARK_GREEN + " /disguiseentity <Dropped_Item/Falling_Block> <Id> " + " <Durability> " ) ) ;
2016-06-18 17:16:32 +02:00
}
}
}