Add KillallCommand.java
This commit is contained in:
parent
76ae3103de
commit
ed0d15b3d4
23
api/src/main/java/com/alttd/essentia/api/model/MobData.java
Normal file
23
api/src/main/java/com/alttd/essentia/api/model/MobData.java
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
package com.alttd.essentia.api.model;
|
||||
|
||||
public enum MobData {
|
||||
|
||||
ITEMS,
|
||||
ARROWS,
|
||||
BOATS,
|
||||
MINECARTS,
|
||||
XP,
|
||||
PAINTINGS,
|
||||
ITEMFRAMES,
|
||||
ENDERCRYSTALS,
|
||||
FIREWORKS,
|
||||
HOSTILE,
|
||||
MONSTERS,
|
||||
PASSIVE,
|
||||
ANIMALS,
|
||||
AMBIENT,
|
||||
MOBS,
|
||||
ENTITIES,
|
||||
TAMED
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,246 @@
|
|||
package com.alttd.essentia.commands.admin;
|
||||
|
||||
import com.alttd.essentia.api.model.MobData;
|
||||
import com.alttd.essentia.commands.EssentiaCommand;
|
||||
import com.alttd.essentia.commands.argumement.EntityTypeArgumentType;
|
||||
import com.alttd.essentia.commands.argumement.MobDataArgumentType;
|
||||
import com.mojang.brigadier.arguments.IntegerArgumentType;
|
||||
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
|
||||
import com.mojang.brigadier.tree.LiteralCommandNode;
|
||||
import io.papermc.paper.command.brigadier.CommandSourceStack;
|
||||
import io.papermc.paper.command.brigadier.Commands;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
|
||||
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.*;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class KillallCommand implements EssentiaCommand {
|
||||
|
||||
@Override
|
||||
public String commandName() {
|
||||
return "killall";
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull LiteralCommandNode<CommandSourceStack> command() {
|
||||
final LiteralArgumentBuilder<CommandSourceStack> builder =
|
||||
Commands.literal(commandName())
|
||||
.requires(
|
||||
commandSourceStack -> commandSourceStack.getSender().hasPermission(adminCommandPermission()) &&
|
||||
commandSourceStack.getSender() instanceof Player
|
||||
)
|
||||
.then(Commands.argument("mobdata", new MobDataArgumentType())
|
||||
.executes((source) -> {
|
||||
if (!(source.getSource().getSender() instanceof Player player))
|
||||
return 1;
|
||||
|
||||
MobData mobData = source.getArgument("mobdata", MobData.class);
|
||||
execute(source.getSource().getSender(), player, mobData, 50, false);
|
||||
return 1;
|
||||
})
|
||||
.then(Commands.argument("radius", IntegerArgumentType.integer(0, 250))
|
||||
.executes((source) -> {
|
||||
if (!(source.getSource().getSender() instanceof Player player))
|
||||
return 1;
|
||||
|
||||
MobData mobData = source.getArgument("mobdata", MobData.class);
|
||||
int radius = source.getArgument("radius", Integer.class);
|
||||
execute(source.getSource().getSender(), player, mobData, radius, false);
|
||||
return 1;
|
||||
})
|
||||
.then(Commands.literal("named")
|
||||
.executes((source) -> {
|
||||
if (!(source.getSource().getSender() instanceof Player player))
|
||||
return 1;
|
||||
|
||||
MobData mobData = source.getArgument("mobdata", MobData.class);
|
||||
int radius = source.getArgument("range", Integer.class);
|
||||
execute(source.getSource().getSender(), player, mobData, radius, true);
|
||||
return 1;
|
||||
})
|
||||
)
|
||||
|
||||
)
|
||||
)
|
||||
// .then(Commands.argument("entitytype", new EntityTypeArgumentType())
|
||||
// .executes((source) -> {
|
||||
// if (!(source.getSource().getSender() instanceof Player player))
|
||||
// return 1;
|
||||
//
|
||||
// EntityType entityType = source.getArgument("entitytype", EntityType.class);
|
||||
// execute(source.getSource().getSender(), player, entityType, 50, false);
|
||||
// return 1;
|
||||
// })
|
||||
// .then(Commands.argument("radius", IntegerArgumentType.integer(0, 250))
|
||||
// .executes((source) -> {
|
||||
// if (!(source.getSource().getSender() instanceof Player player))
|
||||
// return 1;
|
||||
//
|
||||
// EntityType entityType = source.getArgument("entitytype", EntityType.class);
|
||||
// int radius = source.getArgument("radius", Integer.class);
|
||||
// execute(source.getSource().getSender(), player, entityType, radius, false);
|
||||
// return 1;
|
||||
// })
|
||||
// .then(Commands.literal("named")
|
||||
// .executes((source) -> {
|
||||
// if (!(source.getSource().getSender() instanceof Player player))
|
||||
// return 1;
|
||||
//
|
||||
// EntityType entityType = source.getArgument("entitytype", EntityType.class);
|
||||
// int radius = source.getArgument("range", Integer.class);
|
||||
// execute(source.getSource().getSender(), player, entityType, radius, true);
|
||||
// return 1;
|
||||
// })
|
||||
// )
|
||||
//
|
||||
// )
|
||||
// )
|
||||
;
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
public void execute(CommandSender sender, Player target, MobData mobData, int radius, boolean named) { // TODO - Messages from config, placeholders
|
||||
TagResolver placeholders = TagResolver.resolver(
|
||||
Placeholder.component("requester", sender.name()),
|
||||
Placeholder.component("target", target.displayName())
|
||||
);
|
||||
|
||||
int removed = 0;
|
||||
|
||||
for (Entity entity : target.getNearbyEntities(radius, radius, radius)) {
|
||||
if (entity instanceof HumanEntity)
|
||||
continue;
|
||||
|
||||
// PERFORMANCE hit?
|
||||
if (entity instanceof Tameable tameable && (tameable.isTamed() && tameable.getOwner() instanceof Player || tameable.getOwner() instanceof OfflinePlayer) && mobData != MobData.TAMED)
|
||||
continue;
|
||||
|
||||
// TODO - named entities
|
||||
if (entity instanceof LivingEntity && entity.customName() != null)
|
||||
continue;
|
||||
|
||||
switch (mobData) {
|
||||
case ITEMS -> {
|
||||
if (entity instanceof Item) {
|
||||
entity.remove();
|
||||
removed++;
|
||||
}
|
||||
}
|
||||
case ARROWS -> {
|
||||
if (entity instanceof Projectile) {
|
||||
entity.remove();
|
||||
removed++;
|
||||
}
|
||||
}
|
||||
case BOATS -> {
|
||||
if (entity instanceof Boat) {
|
||||
entity.remove();
|
||||
removed++;
|
||||
}
|
||||
}
|
||||
case MINECARTS -> {
|
||||
if (entity instanceof Minecart) {
|
||||
entity.remove();
|
||||
removed++;
|
||||
}
|
||||
}
|
||||
case XP -> {
|
||||
if (entity instanceof ExperienceOrb) {
|
||||
entity.remove();
|
||||
removed++;
|
||||
}
|
||||
}
|
||||
case PAINTINGS -> {
|
||||
if (entity instanceof Painting) {
|
||||
entity.remove();
|
||||
removed++;
|
||||
}
|
||||
}
|
||||
case ITEMFRAMES -> {
|
||||
if (entity instanceof ItemFrame) {
|
||||
entity.remove();
|
||||
removed++;
|
||||
}
|
||||
}
|
||||
case ENDERCRYSTALS -> {
|
||||
if (entity instanceof EnderCrystal) {
|
||||
entity.remove();
|
||||
removed++;
|
||||
}
|
||||
}
|
||||
case FIREWORKS -> {
|
||||
if (entity instanceof Firework) {
|
||||
entity.remove();
|
||||
removed++;
|
||||
}
|
||||
}
|
||||
case HOSTILE, MONSTERS -> {
|
||||
if (entity instanceof Monster ||entity instanceof ComplexLivingEntity || entity instanceof Flying || entity instanceof Slime) {
|
||||
entity.remove();
|
||||
removed++;
|
||||
}
|
||||
}
|
||||
case PASSIVE, ANIMALS -> {
|
||||
if (entity instanceof Animals || entity instanceof Snowman || entity instanceof WaterMob || entity instanceof Ambient) {
|
||||
entity.remove();
|
||||
removed++;
|
||||
}
|
||||
}
|
||||
case AMBIENT -> {
|
||||
if (entity instanceof Ambient) {
|
||||
entity.remove();
|
||||
removed++;
|
||||
}
|
||||
}
|
||||
case MOBS -> {
|
||||
if (entity instanceof Monster ||entity instanceof ComplexLivingEntity || entity instanceof Flying || entity instanceof Slime || entity instanceof Animals || entity instanceof Snowman || entity instanceof WaterMob || entity instanceof Ambient) {
|
||||
entity.remove();
|
||||
removed++;
|
||||
}
|
||||
}
|
||||
case ENTITIES -> {
|
||||
entity.remove();
|
||||
removed++;
|
||||
}
|
||||
case TAMED -> {
|
||||
if (entity instanceof Tameable tameable && tameable.isTamed()) {
|
||||
entity.remove();
|
||||
removed++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void execute(CommandSender sender, Player target, EntityType entityType, int radius, boolean named) { // TODO - Messages from config, placeholders
|
||||
TagResolver placeholders = TagResolver.resolver(
|
||||
Placeholder.component("requester", sender.name()),
|
||||
Placeholder.component("target", target.displayName())
|
||||
);
|
||||
|
||||
int removed = 0;
|
||||
|
||||
for (Entity entity : target.getNearbyEntities(radius, radius, radius)) {
|
||||
if (entity instanceof HumanEntity)
|
||||
continue;
|
||||
|
||||
// PERFORMANCE hit?
|
||||
if (entity instanceof Tameable tameable && (tameable.isTamed() && tameable.getOwner() instanceof Player || tameable.getOwner() instanceof OfflinePlayer))
|
||||
continue;
|
||||
|
||||
// TODO - named entities
|
||||
if (entity instanceof LivingEntity && entity.customName() != null)
|
||||
continue;
|
||||
|
||||
if (entity.getType() == entityType) {
|
||||
entity.remove();
|
||||
removed++;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
package com.alttd.essentia.commands.argumement;
|
||||
|
||||
import com.alttd.essentia.commands.EssentiaArgument;
|
||||
import com.mojang.brigadier.Message;
|
||||
import com.mojang.brigadier.arguments.ArgumentType;
|
||||
import com.mojang.brigadier.arguments.StringArgumentType;
|
||||
import com.mojang.brigadier.context.CommandContext;
|
||||
import com.mojang.brigadier.exceptions.CommandSyntaxException;
|
||||
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
|
||||
import com.mojang.brigadier.suggestion.Suggestions;
|
||||
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
|
||||
import io.papermc.paper.command.brigadier.MessageComponentSerializer;
|
||||
import io.papermc.paper.command.brigadier.argument.CustomArgumentType;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
// TODO -- add a wrapper for entitytype and only list those we want to list as this large list breaks tabcomplete
|
||||
public class EntityTypeArgumentType implements CustomArgumentType.Converted<EntityType, String>, EssentiaArgument {
|
||||
|
||||
@Override
|
||||
public @NotNull EntityType convert(String nativeType) throws CommandSyntaxException {
|
||||
try {
|
||||
return EntityType.valueOf(nativeType.toUpperCase());
|
||||
} catch (Exception e) {
|
||||
Message message = MessageComponentSerializer.message().serialize(Component.text("Invalid EntityType %s!".formatted(nativeType), NamedTextColor.RED));
|
||||
|
||||
throw new CommandSyntaxException(new SimpleCommandExceptionType(message), message);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull ArgumentType<String> getNativeType() {
|
||||
return StringArgumentType.word();
|
||||
}
|
||||
|
||||
@Override
|
||||
public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder builder) {
|
||||
Collection<String> possibleValues = new ArrayList<>();
|
||||
for (EntityType entityType : EntityType.values()) {
|
||||
possibleValues.add(entityType.name().toLowerCase());
|
||||
}
|
||||
|
||||
return completedFuture(builder, possibleValues);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
package com.alttd.essentia.commands.argumement;
|
||||
|
||||
import com.alttd.essentia.api.model.MobData;
|
||||
import com.alttd.essentia.commands.EssentiaArgument;
|
||||
import com.mojang.brigadier.Message;
|
||||
import com.mojang.brigadier.arguments.ArgumentType;
|
||||
import com.mojang.brigadier.arguments.StringArgumentType;
|
||||
import com.mojang.brigadier.context.CommandContext;
|
||||
import com.mojang.brigadier.exceptions.CommandSyntaxException;
|
||||
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
|
||||
import com.mojang.brigadier.suggestion.Suggestions;
|
||||
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
|
||||
import io.papermc.paper.command.brigadier.MessageComponentSerializer;
|
||||
import io.papermc.paper.command.brigadier.argument.CustomArgumentType;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
public class MobDataArgumentType implements CustomArgumentType.Converted<MobData, String>, EssentiaArgument {
|
||||
|
||||
@Override
|
||||
public @NotNull MobData convert(String nativeType) throws CommandSyntaxException {
|
||||
try {
|
||||
return MobData.valueOf(nativeType.toUpperCase());
|
||||
} catch (Exception e) {
|
||||
Message message = MessageComponentSerializer.message().serialize(Component.text("Invalid mobdatatype %s!".formatted(nativeType), NamedTextColor.RED));
|
||||
|
||||
throw new CommandSyntaxException(new SimpleCommandExceptionType(message), message);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull ArgumentType<String> getNativeType() {
|
||||
return StringArgumentType.word();
|
||||
}
|
||||
|
||||
@Override
|
||||
public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder builder) {
|
||||
Collection<String> possibleValues = new ArrayList<>();
|
||||
for (MobData mobData : MobData.values()) {
|
||||
possibleValues.add(mobData.name().toLowerCase());
|
||||
}
|
||||
|
||||
return completedFuture(builder, possibleValues);
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user