package com.thebrokenrail.sorcerycraft.command; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; import com.thebrokenrail.sorcerycraft.SorceryCraft; import com.thebrokenrail.sorcerycraft.spell.api.Spell; import com.thebrokenrail.sorcerycraft.spell.api.registry.SpellRegistry; import com.thebrokenrail.sorcerycraft.spell.util.SpellHelper; import com.thebrokenrail.sorcerycraft.spell.util.SpellPlayerEntity; import net.minecraft.command.arguments.EntityArgumentType; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.Texts; import net.minecraft.text.TranslatableText; import net.minecraft.util.Identifier; import java.util.Collection; import java.util.HashMap; import java.util.Map; public class SpellCommand { private static final DynamicCommandExceptionType NOT_HOLDING_SPELL_EXCEPTION = new DynamicCommandExceptionType(object -> new TranslatableText("command."+ SorceryCraft.NAMESPACE + ".spell.not_holding_spell", object)); public static void register(CommandDispatcher dispatcher) { dispatcher.register(CommandManager.literal("spell") .requires(source -> source.hasPermissionLevel(4)) .then(CommandManager.literal("list") .then(CommandManager.argument("player", EntityArgumentType.players()) .executes(ctx -> { Collection players = EntityArgumentType.getPlayers(ctx, "player"); for (PlayerEntity player : players) { SpellPlayerEntity spellPlayer = (SpellPlayerEntity) player; Map spellMap = spellPlayer.getDiscoveredSpells(); ctx.getSource().sendFeedback(new TranslatableText("command." + SorceryCraft.NAMESPACE + ".spell.listing_spells", player.getDisplayName(), Texts.join(spellMap.entrySet(), spell -> SpellHelper.getTranslatedSpell(spell.getKey(), spell.getValue()))), false); } return 0; }) ) ) .then(CommandManager.literal("forget") .then(CommandManager.argument("player", EntityArgumentType.players()) .executes(ctx -> { Collection players = EntityArgumentType.getPlayers(ctx, "player"); for (PlayerEntity player : players) { SpellPlayerEntity spellPlayer = (SpellPlayerEntity) player; Map spells = spellPlayer.getDiscoveredSpells(); for (Map.Entry entry : spells.entrySet()) { ctx.getSource().sendFeedback(new TranslatableText("command." + SorceryCraft.NAMESPACE + ".spell.forgotten_spell", player.getDisplayName(), SpellHelper.getTranslatedSpellChat(entry.getKey(), entry.getValue())), true); } spellPlayer.setDiscoveredSpells(new HashMap<>()); } return 1; }) .then(CommandManager.argument("spell", SpellArgumentType.spell()) .executes(ctx -> { Collection players = EntityArgumentType.getPlayers(ctx, "player"); for (PlayerEntity player : players) { Identifier spell = SpellArgumentType.getSpell(ctx, "spell"); SpellPlayerEntity spellPlayer = (SpellPlayerEntity) player; Map spells = spellPlayer.getDiscoveredSpells(); if (spells.containsKey(spell)) { ctx.getSource().sendFeedback(new TranslatableText("command." + SorceryCraft.NAMESPACE + ".spell.forgotten_spell", player.getDisplayName(), SpellHelper.getTranslatedSpellChat(spell, spells.get(spell))), true); spells.remove(spell); } spellPlayer.setDiscoveredSpells(spells); } return 1; }) ) ) ) .then(CommandManager.literal("discover") .then(CommandManager.argument("player", EntityArgumentType.players()) .executes(ctx -> { Collection players = EntityArgumentType.getPlayers(ctx, "player"); for (PlayerEntity player : players) { Map spellMap = new HashMap<>(); Spell[] maxSpells = SpellRegistry.getMaxSpells(); for (Spell spell : maxSpells) { spellMap.put(spell.getID(), spell.getLevel()); } SpellHelper.learnSpells(player, spellMap); } return 1; }) .then(CommandManager.argument("spell", SpellArgumentType.spell()) .then(CommandManager.argument("level", IntegerArgumentType.integer()) .executes(ctx -> { Collection players = EntityArgumentType.getPlayers(ctx, "player"); for (PlayerEntity player : players) { Identifier spell = SpellArgumentType.getSpell(ctx, "spell"); int level = IntegerArgumentType.getInteger(ctx, "level") - 1; Map spellMap = new HashMap<>(); spellMap.put(spell, level); SpellHelper.learnSpells(player, spellMap); } return 1; }) ) ) ) ) .then(CommandManager.literal("apply") .then(CommandManager.argument("player", EntityArgumentType.players()) .then(CommandManager.argument("spell", SpellArgumentType.spell()) .then(CommandManager.argument("level", IntegerArgumentType.integer()) .executes(ctx -> { Collection players = EntityArgumentType.getPlayers(ctx, "player"); for (PlayerEntity player : players) { Identifier spell = SpellArgumentType.getSpell(ctx, "spell"); int level = IntegerArgumentType.getInteger(ctx, "level") - 1; ItemStack stack = player.getMainHandStack(); if (stack.getItem() != SorceryCraft.SPELL_ITEM) { throw NOT_HOLDING_SPELL_EXCEPTION.create(player); } Map spellMap = SpellHelper.getSpells(stack); spellMap.put(spell, level); SpellHelper.setSpells(stack, spellMap); ctx.getSource().sendFeedback(new TranslatableText("command." + SorceryCraft.NAMESPACE + ".spell.applied_spell", SpellHelper.getTranslatedSpell(spell, level)), true); } return 1; }) ) ) ) ) .then(CommandManager.literal("remove") .then(CommandManager.argument("player", EntityArgumentType.players()) .then(CommandManager.argument("spell", SpellArgumentType.spell()) .executes(ctx -> { Collection players = EntityArgumentType.getPlayers(ctx, "player"); for (PlayerEntity player : players) { Identifier spell = SpellArgumentType.getSpell(ctx, "spell"); ItemStack stack = player.getMainHandStack(); if (stack.getItem() != SorceryCraft.SPELL_ITEM) { throw NOT_HOLDING_SPELL_EXCEPTION.create(player); } Map spellMap = SpellHelper.getSpells(stack); if (spellMap.containsKey(spell)) { ctx.getSource().sendFeedback(new TranslatableText("command." + SorceryCraft.NAMESPACE + ".spell.removed_spell", SpellHelper.getTranslatedSpell(spell, spellMap.get(spell))), true); spellMap.remove(spell); } SpellHelper.setSpells(stack, spellMap); } return 1; }) ) ) ) ); } }