minecraft-fakeplayer/src/main/java/io/github/hello09x/fakeplayer/manager/FakePlayerManager.java
tanyaofei 35ef7644b9 fix
2023-07-17 17:03:19 +08:00

137 lines
4.1 KiB
Java

package io.github.hello09x.fakeplayer.manager;
import com.mojang.authlib.GameProfile;
import io.github.hello09x.fakeplayer.Main;
import io.github.hello09x.fakeplayer.entity.FakePlayer;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.command.CommandSender;
import org.bukkit.craftbukkit.v1_20_R1.CraftServer;
import org.bukkit.craftbukkit.v1_20_R1.CraftWorld;
import org.bukkit.entity.Player;
import org.bukkit.metadata.FixedMetadataValue;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import properties.FakeplayerProperties;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
import static net.kyori.adventure.text.Component.text;
import static net.kyori.adventure.text.format.NamedTextColor.RED;
public class FakePlayerManager {
public final static FakePlayerManager instance = new FakePlayerManager();
private final FakeplayerProperties properties = FakeplayerProperties.instance;
public synchronized void spawnFakePlayer(
@NotNull CommandSender creator,
@NotNull Location at
) {
var existed = getFakePlayers(creator).size();
if (!creator.isOp() && existed >= properties.getMaximum()) {
creator.sendMessage(text("你创建的假人数量已达到上限...", RED));
return;
}
var name = creator.getName();
var suffix = "_" + (existed + 1);
if (name.length() + suffix.length() > 16) {
name = name.substring(0, (16 - suffix.length()));
}
name = name + suffix;
var player = new FakePlayer(
((CraftServer) Bukkit.getServer()).getServer(),
((CraftWorld) at.getWorld()).getHandle(),
UUID.randomUUID(),
name,
at
);
var p = player.prepare();
p.setMetadata(FakePlayerSpawner.META_KEY_CREATOR, new FixedMetadataValue(Main.getInstance(), creator.getName()));
}
public @Nullable Player getFakePlayer(@NotNull CommandSender creator, @NotNull String name) {
var fake = getFakePlayer(name);
if (fake == null) {
return null;
}
var c = getCreator(fake);
if (c == null || !c.equals(creator.getName())) {
return null;
}
return fake;
}
public @Nullable Player getFakePlayer(@NotNull String name) {
var player = Bukkit.getServer().getPlayer(name);
if (player == null) {
return null;
}
if (!isFakePlayer(player)) {
return null;
}
return player;
}
public int removeFakePlayers(@NotNull Player creator) {
var fakes = getFakePlayers(creator);
for (var f : fakes) {
f.kick();
}
return fakes.size();
}
public @Nullable String getCreator(@NotNull Player fakePlayer) {
var meta = fakePlayer.getMetadata(FakePlayerSpawner.META_KEY_CREATOR);
if (meta.isEmpty()) {
return null;
}
return meta.get(0).asString();
}
public int removeFakePlayers() {
var fakes = getFakePlayers();
for (var f : fakes) {
f.kick();
}
return fakes.size();
}
public @NotNull List<Player> getFakePlayers() {
return Bukkit
.getServer()
.getOnlinePlayers()
.stream()
.filter(p -> !p.getMetadata(FakePlayerSpawner.META_KEY_CREATOR).isEmpty())
.collect(Collectors.toList());
}
public @NotNull List<Player> getFakePlayers(@NotNull CommandSender creator) {
var name = creator.getName();
return Bukkit
.getServer()
.getOnlinePlayers()
.stream()
.filter(p -> p.getMetadata(FakePlayerSpawner.META_KEY_CREATOR)
.stream()
.anyMatch(meta -> meta.asString().equals(name)))
.collect(Collectors.toList());
}
public boolean isFakePlayer(@NotNull Player player) {
return !player.getMetadata(FakePlayerSpawner.META_KEY_CREATOR).isEmpty();
}
}