2023-08-24 09:43:16 +00:00
package dev.plex.extras.command ;
2022-07-09 14:26:57 +00:00
import com.google.common.collect.Lists ;
2023-08-24 09:43:16 +00:00
import dev.plex.command.PlexCommand ;
2022-07-09 14:26:57 +00:00
import dev.plex.command.annotation.CommandParameters ;
import dev.plex.command.annotation.CommandPermissions ;
import dev.plex.command.source.RequiredCommandSource ;
2023-08-29 00:12:48 +00:00
import java.util.Arrays ;
import java.util.List ;
2022-07-09 14:26:57 +00:00
import net.kyori.adventure.text.Component ;
import net.kyori.adventure.text.minimessage.MiniMessage ;
import org.apache.commons.lang3.StringUtils ;
import org.bukkit.Material ;
import org.bukkit.Sound ;
import org.bukkit.command.CommandSender ;
import org.bukkit.enchantments.Enchantment ;
import org.bukkit.entity.Player ;
import org.bukkit.inventory.ItemStack ;
import org.jetbrains.annotations.NotNull ;
import org.jetbrains.annotations.Nullable ;
@CommandParameters ( name = " enchant " , description = " Enchants an item " , usage = " /<command> <add | reset | list | addall | remove> " , aliases = " enchantment " )
2023-08-29 00:12:48 +00:00
@CommandPermissions ( permission = " plex.tfmextras.enchant " , source = RequiredCommandSource . IN_GAME )
2023-03-08 19:30:51 +00:00
public class EnchantCommand extends PlexCommand
{
2022-07-09 14:26:57 +00:00
@Override
2023-03-08 19:30:51 +00:00
protected Component execute ( @NotNull CommandSender sender , @Nullable Player player , @NotNull String [ ] args )
{
2022-07-09 14:26:57 +00:00
if ( args . length = = 0 )
{
return usage ( ) ;
}
ItemStack item = player . getInventory ( ) . getItemInMainHand ( ) ;
if ( item . getType ( ) = = Material . AIR )
{
return MiniMessage . miniMessage ( ) . deserialize ( " <red>You must be holding an enchantable item. " ) ;
}
if ( args . length = = 1 )
{
if ( args [ 0 ] . equalsIgnoreCase ( " list " ) )
{
return MiniMessage . miniMessage ( ) . deserialize ( " <dark_gray>All possible enchantments are for this item are: <gray> " + StringUtils . join ( getEnchantmentNames ( item ) , " , " ) ) ;
}
if ( args [ 0 ] . equalsIgnoreCase ( " addall " ) )
{
getEnchantments ( item ) . forEach ( enchantment - > item . addEnchantment ( enchantment , enchantment . getMaxLevel ( ) ) ) ;
player . playSound ( player , Sound . BLOCK_ANVIL_USE , 1 , 1 ) ;
return MiniMessage . miniMessage ( ) . deserialize ( " <gray>Added all possible enchantments for this item. " ) ;
}
if ( args [ 0 ] . equalsIgnoreCase ( " reset " ) )
{
item . getEnchantments ( ) . keySet ( ) . forEach ( item : : removeEnchantment ) ;
player . playSound ( player , Sound . BLOCK_ANVIL_USE , 1 , 1 ) ;
return MiniMessage . miniMessage ( ) . deserialize ( " <gray>Removed every enchantment from this item. " ) ;
}
}
return null ;
}
2023-03-08 19:30:51 +00:00
private List < Enchantment > getEnchantments ( ItemStack item )
{
2022-07-09 14:26:57 +00:00
List < Enchantment > enchants = Lists . newArrayList ( ) ;
Arrays . stream ( Enchantment . values ( ) ) . filter ( enchantment - > enchantment . canEnchantItem ( item ) ) . forEach ( enchants : : add ) ;
return enchants ;
}
2023-03-08 19:30:51 +00:00
private String [ ] getEnchantmentNames ( ItemStack item )
{
2022-07-09 14:26:57 +00:00
return getEnchantments ( item ) . stream ( ) . map ( enchantment - > enchantment . key ( ) . value ( ) ) . toArray ( String [ ] : : new ) ;
}
}