package net.CyanWool.network;
import net.CyanWool.CyanServer;
import net.CyanWool.api.entity.player.Player;
import net.CyanWool.api.network.NetworkServer;
import net.CyanWool.api.world.Location;
import net.CyanWool.entity.player.CyanPlayer;
import net.CyanWool.network.handlers.ServerInfo;
import net.CyanWool.network.handlers.ServerLogin;
import org.spacehq.mc.protocol.MinecraftProtocol;
import org.spacehq.mc.protocol.ProtocolConstants;
import org.spacehq.packetlib.Server;
import org.spacehq.packetlib.packet.Packet;
import org.spacehq.packetlib.tcp.TcpSessionFactory;
public class CyanNetworkServer implements NetworkServer {
private static CyanServer server;
// MCProtocolLib
private Server protocol_server;
public CyanNetworkServer(CyanServer server) {
CyanNetworkServer.server = server;
}
public void init() {
if (protocol_server == null) {
try {
this.protocol_server = new Server(server.getConfiguration().getIPAdress(), server.getConfiguration().getPort(), MinecraftProtocol.class, new TcpSessionFactory());
protocol_server.setGlobalFlag(ProtocolConstants.VERIFY_USERS_KEY, server.getConfiguration().isOnlineMode());
protocol_server.setGlobalFlag(ProtocolConstants.SERVER_INFO_BUILDER_KEY, new ServerInfo(server));
protocol_server.setGlobalFlag(ProtocolConstants.SERVER_LOGIN_HANDLER_KEY, new ServerLogin(server));
protocol_server.addListener(new CyanServerListener(server));
protocol_server.setGlobalFlag(ProtocolConstants.SERVER_COMPRESSION_THRESHOLD, 256);
protocol_server.bind();
server.getLogger().info("Protocol server is started!");
} catch (Exception ex) {
server.getLogger().info("Server crashed: ");
ex.printStackTrace();
}
}
}
@Override
public net.CyanWool.api.Server getServer() {
return server;
}
@Override
public Server getProtocolServer() {
return protocol_server;
}
@Override
public int getPort() {
return protocol_server.getPort();
}
@Override
public String getHostAddress() {
return protocol_server.getHost();
}
@Override
public void sendPacketForAll(Packet packet) {
for (Player player : server.getPlayers()) {
player.getPlayerNetwork().sendPacket(packet);
}
}
@Override
public void sendPacketDistance(Location location, Packet packet, int radius) {
for (Player player : server.getPlayers()) {
if (player.getWorld().getName().equals(location.getWorld().getName())) {
if (player.getLocation().distance(location) < radius) {
player.getPlayerNetwork().sendPacket(packet);
}
}
}
}
@Override
public void sendPacketForAllExpect(Packet packet, Player expect) {
for (Player player : server.getPlayers()) {
if (!player.equals(expect)) {
player.getPlayerNetwork().sendPacket(packet);
}
}
}
@Override
public void sendPacketDistanceExpect(Location location, Packet packet, int radius, Player expect) {
for (Player player : server.getPlayers()) {
if (!player.equals(expect)) {
if (player.getWorld().getName().equals(location.getWorld().getName())) {
if (player.getLocation().distance(location) < radius) {
((CyanPlayer) player).getPlayerNetwork().sendPacket(packet);
}
}
}
}
}
}