SubServers-2/SubServers.Sync/velocity/src/net/ME1312/SubServers/Velocity/Server/CachedPlayer.java

210 lines
7.7 KiB
Java

package net.ME1312.SubServers.Velocity.Server;
import net.ME1312.Galaxi.Library.Callback.Callback;
import net.ME1312.Galaxi.Library.Map.ObjectMap;
import net.ME1312.SubData.Client.DataClient;
import net.ME1312.SubData.Client.SubDataClient;
import net.ME1312.SubServers.Client.Common.Network.API.RemotePlayer;
import net.ME1312.SubServers.Velocity.ExProxy;
import net.ME1312.SubServers.Velocity.Library.Compatibility.ChatColor;
import net.ME1312.SubServers.Velocity.SubAPI;
import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.server.RegisteredServer;
import com.velocitypowered.api.proxy.server.ServerInfo;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import java.util.ArrayList;
import java.util.Optional;
import java.util.UUID;
/**
* Cached RemotePlayer Data Class
*/
public class CachedPlayer extends RemotePlayer {
/**
* Convert a Local Player to a Cached Remote Player
*
* @param player Local Player
* @return Raw representation of the Remote Player
*/
public static ObjectMap<String> translate(Player player) {
ObjectMap<String> raw = new ObjectMap<String>();
raw = new ObjectMap<String>();
raw.set("name", player.getGameProfile().getName());
raw.set("id", player.getUniqueId());
raw.set("address", player.getRemoteAddress().getAddress().getHostAddress() + ':' + player.getRemoteAddress().getPort());
if (player.getCurrentServer().isPresent()) raw.set("server", player.getCurrentServer().get().getServerInfo().getName());
if (SubAPI.getInstance().getName() != null) raw.set("proxy", SubAPI.getInstance().getName());
return raw;
}
/**
* Convert a Local Player to a Cached Remote Player
*
* @param player Local Player
*/
public CachedPlayer(Player player) {
this(translate(player));
}
/**
* Create a Cached Remote Player
*
* @param raw Raw representation of the Remote Player
*/
public CachedPlayer(ObjectMap<String> raw) {
this(null, raw);
}
/**
* Create a Cached Remote Player
*
* @param client SubData connection
* @param raw Raw representation of the Remote Player
*/
CachedPlayer(DataClient client, ObjectMap<String> raw) {
super(client, raw);
}
/**
* Get Local Player
*
* @return Local Player (or null when not local)
*/
public Player get() {
return get(getUniqueId());
}
private static Player get(UUID player) {
return ExProxy.getInstance().getPlayer(player).orElse(null);
}
/**
* Gets the server this player is connected to.
*
* @return the server this player is connected to
*/
public ServerInfo getServer() {
String name = getServerName();
if (name == null) {
return null;
} else {
Optional<RegisteredServer> server = ExProxy.getInstance().getServer(name);
return server.map(RegisteredServer::getServerInfo).orElse(null);
}
}
static {
// These overrides prevent sending unnecessary packets in ClientCommon
instance = new StaticImpl() {
@Override
protected RemotePlayer construct(DataClient client, ObjectMap<String> raw) {
return new CachedPlayer(client, raw);
}
@Override
protected void sendMessage(SubDataClient client, UUID[] players, String[] messages, Callback<Integer> response) {
if (players != null && players.length > 0) {
ArrayList<UUID> ids = new ArrayList<UUID>();
for (UUID id : players) {
Player local = get(id);
if (local != null) {
for (String s : messages) {
local.sendMessage(Component.text(s));
}
} else {
ids.add(id);
}
}
if (ids.size() == 0) {
response.run(0);
} else {
super.sendMessage(client, ids.toArray(new UUID[0]), messages, response);
}
} else {
super.sendMessage(client, players, messages, response);
}
}
@Override
protected void sendRawMessage(SubDataClient client, UUID[] players, String[] messages, Callback<Integer> response) {
if (players != null && players.length > 0) {
ArrayList<UUID> ids = new ArrayList<UUID>();
Component[] components = null;
for (UUID id : players) {
Player local = get(id);
if (local != null) {
if (components == null) {
components = new Component[messages.length];
for (int i = 0; i < components.length; ++i) components[i] = GsonComponentSerializer.gson().deserialize(messages[i]);
}
for (Component c : components) {
local.sendMessage(c);
}
} else {
ids.add(id);
}
}
if (ids.size() == 0) {
response.run(0);
} else {
super.sendRawMessage(client, ids.toArray(new UUID[0]), messages, response);
}
} else {
super.sendRawMessage(client, players, messages, response);
}
}
@Override
protected void transfer(SubDataClient client, UUID[] players, String server, Callback<Integer> response) {
ArrayList<UUID> ids = new ArrayList<UUID>();
Optional<RegisteredServer> rs = ExProxy.getInstance().getServer(server.toLowerCase());
int failures = 0;
for (UUID id : players) {
Player local = get(id);
if (local != null) {
if (rs.isPresent()) {
local.createConnectionRequest(rs.get()).fireAndForget();
} else ++failures;
} else {
ids.add(id);
}
}
if (ids.size() == 0) {
response.run(failures);
} else {
final int ff = failures;
super.transfer(client, ids.toArray(new UUID[0]), server, i -> response.run(i + ff));
}
}
@Override
protected void disconnect(SubDataClient client, UUID[] players, String reason, Callback<Integer> response) {
Component message = (reason == null)? Component.text().build() : ChatColor.convertColor(reason);
ArrayList<UUID> ids = new ArrayList<UUID>();
for (UUID id : players) {
Player local = get(id);
if (local != null) {
local.disconnect(message);
} else {
ids.add(id);
}
}
if (ids.size() == 0) {
response.run(0);
} else {
super.disconnect(client, ids.toArray(new UUID[0]), reason, response);
}
}
};
}
}