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

97 lines
4.2 KiB
Java
Raw Normal View History

package com.minelittlepony.unicopia.command;
2020-01-27 11:05:22 +01:00
import java.util.function.Function;
import com.minelittlepony.unicopia.ability.magic.spell.DisguiseSpell;
import com.minelittlepony.unicopia.ability.magic.spell.SpellType;
import com.minelittlepony.unicopia.entity.player.Pony;
2020-01-27 11:05:22 +01:00
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
import net.minecraft.command.argument.EntitySummonArgumentType;
import net.minecraft.command.argument.NbtCompoundTagArgumentType;
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;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.command.CommandManager;
import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Identifier;
import net.minecraft.world.GameRules;
public class DisguiseCommand {
2020-01-27 11:05:22 +01:00
private static final SimpleCommandExceptionType FAILED_EXCEPTION = new SimpleCommandExceptionType(new TranslatableText("commands.disguise.notfound"));
public static void register(CommandDispatcher<ServerCommandSource> dispatcher) {
2020-01-27 11:05:22 +01:00
LiteralArgumentBuilder<ServerCommandSource> builder = CommandManager
.literal("disguise")
.requires(s -> s.hasPermissionLevel(2))
.executes(context -> reveal(context.getSource(), context.getSource().getPlayer()));
builder.then(CommandManager
.argument("entity", EntitySummonArgumentType.entitySummon())
.suggests(SuggestionProviders.SUMMONABLE_ENTITIES)
.executes(context -> disguise(context.getSource(),
context.getSource().getPlayer(),
EntitySummonArgumentType.getEntitySummon(context, "entity"),
new CompoundTag(), true))
.then(CommandManager.argument("nbt", NbtCompoundTagArgumentType.nbtCompound())
.executes(context -> disguise(context.getSource(),
context.getSource().getPlayer(),
EntitySummonArgumentType.getEntitySummon(context, "entity"),
NbtCompoundTagArgumentType.getCompoundTag(context, "nbt"), false))
));
dispatcher.register(builder);
}
static int disguise(ServerCommandSource source, PlayerEntity player, Identifier id, CompoundTag nbt, boolean isSelf) throws CommandSyntaxException {
2020-04-22 16:28:20 +02:00
nbt = nbt.copy();
2020-01-27 11:05:22 +01:00
nbt.putString("id", id.toString());
2020-04-15 18:12:00 +02:00
Pony iplayer = Pony.of(player);
2020-01-27 11:05:22 +01:00
Entity entity = EntityType.loadEntityWithPassengers(nbt, source.getWorld(), Function.identity());
if (entity == null) {
throw FAILED_EXCEPTION.create();
}
2020-05-28 18:27:30 +02:00
DisguiseSpell effect = iplayer.getSpell(DisguiseSpell.class, true);
2020-01-27 11:05:22 +01:00
if (effect == null) {
iplayer.setSpell(SpellType.DISGUISE.create().setDisguise(entity));
2020-01-27 11:05:22 +01:00
} else {
effect.setDisguise(entity);
}
if (!isSelf) {
source.sendFeedback(new TranslatableText("commands.disguise.success.other", player.getName(), entity.getName()), true);
} else {
if (player.getEntityWorld().getGameRules().getBoolean(GameRules.SEND_COMMAND_FEEDBACK)) {
2020-06-26 11:44:47 +02:00
player.sendMessage(new TranslatableText("commands.disguise.success.self", entity.getName()), false);
2020-01-27 11:05:22 +01:00
}
source.sendFeedback(new TranslatableText("commands.disguise.success.otherself", player.getName(), entity.getName()), true);
}
return 0;
}
static int reveal(ServerCommandSource source, PlayerEntity player) {
2020-04-15 18:12:00 +02:00
Pony iplayer = Pony.of(player);
2020-09-24 14:49:02 +02:00
iplayer.getSpellOrEmpty(DisguiseSpell.class).ifPresent(disguise -> {
disguise.onDestroyed(iplayer);
2020-01-27 11:05:22 +01:00
});
if (player.getEntityWorld().getGameRules().getBoolean(GameRules.SEND_COMMAND_FEEDBACK)) {
2020-06-26 11:44:47 +02:00
player.sendMessage(new TranslatableText("commands.disguise.removed"), false);
2020-01-27 11:05:22 +01:00
}
return 0;
}
}