mirror of
https://github.com/plexusorg/Plex.git
synced 2025-07-13 10:38:35 +00:00
Fixed /mp and it now has the ability to purge one or all mobs + tab completion. (#79)
* Added a tab completion to /mp because our genius Plex devs forgot to. Its shitty but works lmao * Rewrote /mp to actually work with or without args so now specific or all mobs can be purged, instead of just all mobs being purged. Why the REAL plex developers didn't include this (yet they did for /rd) defies any sort of logic. * Tweaked the command a bit. It works as it should now. * Tweaked the command a bit. It works as it should now.
This commit is contained in:
@ -4,50 +4,103 @@ import dev.plex.command.PlexCommand;
|
||||
import dev.plex.command.annotation.CommandParameters;
|
||||
import dev.plex.command.annotation.CommandPermissions;
|
||||
import dev.plex.command.source.RequiredCommandSource;
|
||||
|
||||
import dev.plex.util.PlexLog;
|
||||
import dev.plex.util.PlexUtils;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.apache.commons.lang3.text.WordUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Mob;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
@CommandPermissions(permission = "plex.mobpurge", source = RequiredCommandSource.ANY)
|
||||
@CommandParameters(name = "mobpurge", description = "Purge all mobs.", usage = "/<command>", aliases = "mp")
|
||||
public class MobPurgeCMD extends PlexCommand
|
||||
{
|
||||
@CommandParameters(name = "mobpurge", description = "Purge all mobs.", usage = "/<command> <mob>", aliases = "mp")
|
||||
public class MobPurgeCMD extends PlexCommand {
|
||||
|
||||
public static final List<EntityType> MOB_TYPES = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
protected Component execute(@NotNull CommandSender sender, @Nullable Player playerSender, @NotNull String[] args)
|
||||
{
|
||||
HashMap<String, Integer> entityCounts = new HashMap<>();
|
||||
protected Component execute(@NotNull CommandSender sender, @Nullable Player playerSender, @NotNull String[] args) {
|
||||
EntityType type = null;
|
||||
String mobName = null;
|
||||
if (args.length > 0) {
|
||||
try {
|
||||
type = EntityType.valueOf(args[0].toUpperCase());
|
||||
} catch (Exception e) {
|
||||
PlexLog.debug("A genius tried and failed removing the following invalid mob: " + args[0].toUpperCase());
|
||||
send(sender, messageComponent("notAValidMob"));
|
||||
return null;
|
||||
}
|
||||
if (!MOB_TYPES.contains(type)) {
|
||||
PlexLog.debug(Arrays.deepToString(MOB_TYPES.toArray()));
|
||||
PlexLog.debug("A genius tried to remove a mob that doesn't exist: " + args[0].toUpperCase());
|
||||
sender.sendMessage(messageComponent("notAValidMobButValidEntity"));
|
||||
return null;
|
||||
}
|
||||
}
|
||||
if (type != null) {
|
||||
mobName = WordUtils.capitalizeFully(type.name().replace("_", " "));
|
||||
PlexLog.debug("The args aren't null so the mob is: " + mobName);
|
||||
}
|
||||
int count = purgeMobs(type);
|
||||
if (type != null) {
|
||||
PlexUtils.broadcast(messageComponent("removedEntitiesOfTypes", sender.getName(), count, mobName));
|
||||
PlexLog.debug("All " + count + " of " + mobName + " were removed");
|
||||
} else {
|
||||
PlexUtils.broadcast(messageComponent("removedMobs", sender.getName(), count));
|
||||
PlexLog.debug("All " + count + " valid mobs were removed");
|
||||
}
|
||||
sender.sendMessage(messageComponent("amountOfMobsRemoved", count, (type != null ? mobName : "mob") + multipleS(count)));
|
||||
return null;
|
||||
}
|
||||
|
||||
for (World world : Bukkit.getWorlds())
|
||||
{
|
||||
for (Entity entity : world.getEntities())
|
||||
{
|
||||
if (entity instanceof Mob)
|
||||
{
|
||||
String type = entity.getType().name();
|
||||
public static String multipleS(int count) {
|
||||
return (count == 1 ? "" : "s");
|
||||
}
|
||||
|
||||
// Removes the mobs.
|
||||
|
||||
public int purgeMobs(EntityType type) {
|
||||
int removed = 0;
|
||||
for (World world : Bukkit.getWorlds()) {
|
||||
for (Entity entity : world.getLivingEntities()) {
|
||||
if (entity instanceof LivingEntity && !(entity instanceof Player)) {
|
||||
if (type != null && !entity.getType().equals(type)) {
|
||||
continue;
|
||||
}
|
||||
entity.remove();
|
||||
|
||||
entityCounts.put(type, entityCounts.getOrDefault(type, 0) + 1);
|
||||
removed++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return removed;
|
||||
}
|
||||
|
||||
int entityCount = entityCounts.values().stream().mapToInt(a -> a).sum();
|
||||
// Adds a tab completion for /mp so players stop complaining we (mostly me) nuked all their mobs because a filter for some reason was never added by the REAL plex devs. Go figure. -Alco_Rs11
|
||||
|
||||
PlexUtils.broadcast(messageComponent("removedMobs", sender.getName(), entityCount));
|
||||
public static List<String> getAllMobs() {
|
||||
List<String> mobs = new ArrayList<>();
|
||||
Arrays.stream(EntityType.values()).filter(EntityType::isAlive).filter(EntityType::isSpawnable).forEach(MOB_TYPES::add);
|
||||
for (EntityType entityType : MOB_TYPES) {
|
||||
mobs.add(entityType.name());
|
||||
}
|
||||
return mobs;
|
||||
}
|
||||
|
||||
/*entityCounts.forEach((entityName, numRemoved) -> {
|
||||
sender.sendMessage(messageComponent("removedEntitiesOfType", sender.getName(), numRemoved, entityName));
|
||||
});*/
|
||||
return null;
|
||||
public @NotNull List<String> tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException {
|
||||
if (args.length == 1) {
|
||||
return getAllMobs();
|
||||
}
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user