Unicopia/src/main/java/com/minelittlepony/unicopia/command/DisguiseCommand.java

131 lines
6.4 KiB
Java
Raw Normal View History

package com.minelittlepony.unicopia.command;
2020-01-27 11:05:22 +01:00
import java.util.function.Function;
2022-10-01 18:20:53 +02:00
import com.minelittlepony.unicopia.EquinePredicates;
import com.minelittlepony.unicopia.InteractionManager;
import com.minelittlepony.unicopia.ability.magic.SpellPredicate;
import com.minelittlepony.unicopia.ability.magic.spell.CastingMethod;
import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType;
import com.minelittlepony.unicopia.entity.player.Pony;
import com.mojang.authlib.GameProfile;
import com.mojang.brigadier.arguments.StringArgumentType;
import com.mojang.brigadier.builder.ArgumentBuilder;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.context.CommandContext;
2020-01-27 11:05:22 +01:00
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
2022-12-18 22:07:24 +01:00
import net.minecraft.command.CommandRegistryAccess;
import net.minecraft.command.argument.*;
2020-01-27 11:05:22 +01:00
import net.minecraft.command.suggestion.SuggestionProviders;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.player.PlayerEntity;
2021-08-04 15:38:03 +02:00
import net.minecraft.nbt.NbtCompound;
2022-12-18 22:07:24 +01:00
import net.minecraft.registry.RegistryKeys;
import net.minecraft.registry.entry.RegistryEntry;
2020-01-27 11:05:22 +01:00
import net.minecraft.server.command.CommandManager;
import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.server.network.ServerPlayerEntity;
2022-06-25 00:19:55 +02:00
import net.minecraft.text.Text;
2020-01-27 11:05:22 +01:00
import net.minecraft.world.GameRules;
public class DisguiseCommand {
2022-06-25 00:19:55 +02:00
private static final SimpleCommandExceptionType FAILED_EXCEPTION = new SimpleCommandExceptionType(Text.translatable("commands.disguise.notfound"));
2020-01-27 11:05:22 +01:00
public static LiteralArgumentBuilder<ServerCommandSource> create(CommandRegistryAccess registries) {
return CommandManager.literal("disguise").requires(s -> s.hasPermissionLevel(2))
.executes(context -> reveal(context.getSource(), context.getSource().getPlayer()))
.then(
CommandManager.argument("target", EntityArgumentType.players())
2022-12-18 22:07:24 +01:00
.then(buildEntityDisguise(context -> EntityArgumentType.getPlayer(context, "target"), registries))
.then(buildPlayerDisguise(context -> EntityArgumentType.getPlayer(context, "target")))
)
2022-12-18 22:07:24 +01:00
.then(buildEntityDisguise(context -> context.getSource().getPlayer(), registries))
.then(buildPlayerDisguise(context -> context.getSource().getPlayer()));
2020-01-27 11:05:22 +01:00
}
2022-12-18 22:07:24 +01:00
private static ArgumentBuilder<ServerCommandSource, ?> buildEntityDisguise(Arg<ServerPlayerEntity> targetOp, CommandRegistryAccess registries) {
return CommandManager.argument("entity", RegistryEntryArgumentType.registryEntry(registries, RegistryKeys.ENTITY_TYPE))
.suggests(SuggestionProviders.SUMMONABLE_ENTITIES)
.executes(context -> disguise(
context.getSource(),
targetOp.apply(context),
loadEntity(context.getSource(),
2022-12-18 22:07:24 +01:00
RegistryEntryArgumentType.getSummonableEntityType(context, "entity"),
new NbtCompound())))
.then(
CommandManager.argument("nbt", NbtCompoundArgumentType.nbtCompound())
.executes(context -> disguise(
context.getSource(),
targetOp.apply(context),
loadEntity(context.getSource(),
2022-12-18 22:07:24 +01:00
RegistryEntryArgumentType.getSummonableEntityType(context, "entity"),
NbtCompoundArgumentType.getNbtCompound(context, "nbt"))))
);
}
2020-01-27 11:05:22 +01:00
private static ArgumentBuilder<ServerCommandSource, ?> buildPlayerDisguise(Arg<ServerPlayerEntity> targetOp) {
return CommandManager.argument("playername", StringArgumentType.string())
.executes(context -> disguise(
context.getSource(),
targetOp.apply(context),
loadPlayer(context.getSource(), StringArgumentType.getString(context, "playername"))));
}
2020-01-27 11:05:22 +01:00
static int disguise(ServerCommandSource source, PlayerEntity player, Entity entity) throws CommandSyntaxException {
2022-10-01 18:20:53 +02:00
if (entity == null || !EquinePredicates.VALID_FOR_DISGUISE.test(entity)) {
2020-01-27 11:05:22 +01:00
throw FAILED_EXCEPTION.create();
}
Pony iplayer = Pony.of(player);
iplayer.getSpellSlot().get(SpellType.CHANGELING_DISGUISE, true)
.orElseGet(() -> SpellType.CHANGELING_DISGUISE.withTraits().apply(iplayer, CastingMethod.INNATE))
2021-03-03 10:33:23 +01:00
.setDisguise(entity);
2020-01-27 11:05:22 +01:00
2021-08-07 22:32:05 +02:00
if (source.getEntity() == player) {
2023-06-03 13:40:54 +02:00
source.sendFeedback(() -> Text.translatable("commands.disguise.success.self", entity.getName()), true);
2020-01-27 11:05:22 +01:00
} else {
if (player.getEntityWorld().getGameRules().getBoolean(GameRules.SEND_COMMAND_FEEDBACK)) {
2022-06-25 00:19:55 +02:00
player.sendMessage(Text.translatable("commands.disguise.success", entity.getName()));
2020-01-27 11:05:22 +01:00
}
2021-08-07 22:32:05 +02:00
2023-06-03 13:40:54 +02:00
source.sendFeedback(() -> Text.translatable("commands.disguise.success.other", player.getName(), entity.getName()), true);
2020-01-27 11:05:22 +01:00
}
return 0;
}
2022-12-18 22:07:24 +01:00
static Entity loadEntity(ServerCommandSource source, RegistryEntry.Reference<EntityType<?>> entityType, NbtCompound nbt) {
nbt = nbt.copy();
2022-12-18 22:07:24 +01:00
nbt.putString("id", entityType.registryKey().getValue().toString());
return EntityType.loadEntityWithPassengers(nbt, source.getWorld(), Function.identity());
}
static Entity loadPlayer(ServerCommandSource source, String username) {
return InteractionManager.instance().createPlayer(source.getWorld(), new GameProfile(null, username));
}
2020-01-27 11:05:22 +01:00
static int reveal(ServerCommandSource source, PlayerEntity player) {
2020-04-15 18:12:00 +02:00
Pony iplayer = Pony.of(player);
iplayer.getSpellSlot().removeIf(SpellPredicate.IS_DISGUISE, true);
2020-01-27 11:05:22 +01:00
2021-08-07 22:32:05 +02:00
if (source.getEntity() == player) {
2023-06-03 13:40:54 +02:00
source.sendFeedback(() -> Text.translatable("commands.disguise.removed.self"), true);
2021-08-07 22:32:05 +02:00
} else {
if (player.getEntityWorld().getGameRules().getBoolean(GameRules.SEND_COMMAND_FEEDBACK)) {
2022-06-25 00:19:55 +02:00
player.sendMessage(Text.translatable("commands.disguise.removed"));
2021-08-07 22:32:05 +02:00
}
2023-06-03 13:40:54 +02:00
source.sendFeedback(() -> Text.translatable("commands.disguise.removed.other", player.getName()), true);
2020-01-27 11:05:22 +01:00
}
return 0;
}
interface Arg<T> {
T apply(CommandContext<ServerCommandSource> context) throws CommandSyntaxException;
}
2020-01-27 11:05:22 +01:00
}