2021-06-29 22:52:11 +00:00
package me.totalfreedom.totalfreedommod.command ;
import java.util.ArrayList ;
import java.util.Arrays ;
import java.util.Collections ;
import java.util.List ;
import me.totalfreedom.totalfreedommod.player.FPlayer ;
2022-03-25 20:42:21 +00:00
import me.totalfreedom.totalfreedommod.punishments.Punishment ;
import me.totalfreedom.totalfreedommod.punishments.PunishmentType ;
2021-06-29 22:52:11 +00:00
import me.totalfreedom.totalfreedommod.rank.Rank ;
import me.totalfreedom.totalfreedommod.util.FUtil ;
import org.bukkit.ChatColor ;
import org.bukkit.GameMode ;
import org.bukkit.Location ;
import org.bukkit.Material ;
import org.bukkit.command.Command ;
import org.bukkit.command.CommandSender ;
import org.bukkit.entity.Player ;
@CommandPermissions ( level = Rank . ADMIN , source = SourceType . BOTH )
@CommandParameters ( description = " Place a cage around someone with certain blocks, or someone's player head. " , usage = " /<command> <purge | <partialname> [head | block] [playername | blockname] " )
public class Command_cage extends FreedomCommand
{
2022-03-25 20:42:21 +00:00
2021-06-29 22:52:11 +00:00
public boolean run ( final CommandSender sender , final Player playerSender , final Command cmd , final String commandLabel , final String [ ] args , final boolean senderIsConsole )
{
if ( args . length = = 0 )
{
return false ;
}
String skullName = null ;
if ( args [ 0 ] . equalsIgnoreCase ( " purge " ) )
{
FUtil . adminAction ( sender . getName ( ) , " Uncaging all players " , true ) ;
for ( Player player : server . getOnlinePlayers ( ) )
{
final FPlayer fPlayer = plugin . pl . getPlayer ( player ) ;
fPlayer . getCageData ( ) . setCaged ( false ) ;
}
return true ;
}
Player player = getPlayer ( args [ 0 ] ) ;
if ( player = = null )
{
msg ( PLAYER_NOT_FOUND ) ;
return true ;
}
final FPlayer fPlayer = plugin . pl . getPlayer ( player ) ;
if ( fPlayer . getCageData ( ) . isCaged ( ) )
{
msg ( " That player is already caged. " , ChatColor . RED ) ;
return true ;
}
Material outerMaterial = Material . GLASS ;
Material innerMaterial = Material . AIR ;
if ( args . length > = 2 & & args [ 1 ] ! = null )
{
final String s = args [ 1 ] ;
switch ( s )
{
2022-03-25 20:42:21 +00:00
case " head " :
{
2021-06-29 22:52:11 +00:00
outerMaterial = Material . PLAYER_HEAD ;
if ( args . length > = 3 )
{
skullName = args [ 2 ] ;
}
else
{
outerMaterial = Material . SKELETON_SKULL ;
}
2022-03-25 20:42:21 +00:00
break ;
2021-06-29 22:52:11 +00:00
}
2022-03-25 20:42:21 +00:00
case " block " :
{
if ( args . length > = 3 )
2021-06-30 05:01:06 +00:00
{
2022-03-25 20:42:21 +00:00
// Checks the validity of the Material and checks if it's a block.
// This is incredibly inefficient, as Spigot's isBlock() method in Material is an actual
// nightmare of switch-cases.
if ( Material . matchMaterial ( args [ 2 ] ) ! = null & & Material . matchMaterial ( args [ 2 ] ) . isBlock ( ) )
2021-06-30 05:01:06 +00:00
{
2022-03-25 20:42:21 +00:00
outerMaterial = Material . matchMaterial ( args [ 2 ] ) ;
2021-06-30 05:01:06 +00:00
break ;
}
2022-03-25 20:42:21 +00:00
else
{
msg ( " Invalid block! " , ChatColor . RED ) ;
return true ;
}
2021-06-30 05:01:06 +00:00
}
else
2021-06-29 22:52:11 +00:00
{
2022-03-25 20:42:21 +00:00
return false ;
2021-06-29 22:52:11 +00:00
}
2022-03-25 20:42:21 +00:00
}
default :
{
return false ;
2021-06-29 22:52:11 +00:00
}
}
}
2022-03-25 20:42:21 +00:00
if ( outerMaterial = = Material . PLAYER_HEAD )
2021-06-29 22:52:11 +00:00
{
2022-03-25 20:42:21 +00:00
FUtil . adminAction ( sender . getName ( ) , " Caging " + player . getName ( ) + " in " + skullName , true ) ;
2021-06-29 22:52:11 +00:00
}
else
{
2022-03-25 20:42:21 +00:00
FUtil . adminAction ( sender . getName ( ) , " Caging " + player . getName ( ) , true ) ;
2021-06-29 22:52:11 +00:00
}
2022-03-25 20:42:21 +00:00
Location location = player . getLocation ( ) . clone ( ) . add ( 0 . 0 , 1 . 0 , 0 . 0 ) ;
2021-06-29 22:52:11 +00:00
2022-03-25 20:42:21 +00:00
if ( skullName ! = null )
2021-06-29 22:52:11 +00:00
{
2022-03-25 20:42:21 +00:00
fPlayer . getCageData ( ) . cage ( location , outerMaterial , innerMaterial , skullName ) ;
2021-06-29 22:52:11 +00:00
}
else
{
2022-03-25 20:42:21 +00:00
fPlayer . getCageData ( ) . cage ( location , outerMaterial , innerMaterial ) ;
2021-06-29 22:52:11 +00:00
}
2022-03-25 20:42:21 +00:00
player . setGameMode ( GameMode . SURVIVAL ) ;
plugin . pul . logPunishment ( new Punishment ( player . getName ( ) , FUtil . getIp ( player ) , sender . getName ( ) , PunishmentType . CAGE , null ) ) ;
2021-06-29 22:52:11 +00:00
return true ;
}
@Override
public List < String > getTabCompleteOptions ( CommandSender sender , Command command , String alias , String [ ] args )
{
if ( ! plugin . al . isAdmin ( sender ) )
{
return null ;
}
if ( args . length = = 1 )
{
List < String > arguments = new ArrayList < > ( ) ;
arguments . add ( " purge " ) ;
arguments . addAll ( FUtil . getPlayerList ( ) ) ;
return arguments ;
}
else if ( args . length = = 2 )
{
if ( ! args [ 0 ] . equals ( " purge " ) )
{
return Arrays . asList ( " head " , " block " ) ;
}
}
else if ( args . length = = 3 )
{
if ( args [ 1 ] . equals ( " block " ) )
{
return FUtil . getAllMaterialNames ( ) ;
}
else if ( args [ 1 ] . equals ( " head " ) )
{
return FUtil . getPlayerList ( ) ;
}
}
return Collections . emptyList ( ) ;
}
}