From b2931b7cd49b02f9070f5136c765f4b612bb885b Mon Sep 17 00:00:00 2001 From: Obique PSWG Date: Mon, 30 Jan 2017 13:16:56 -0600 Subject: [PATCH] Merged with some local changes to TCPServer --- .classpath | 2 +- .gitignore | 1 + scripts/radial/terminal/character_builder.js | 2 +- src/network/NetworkClient.java | 11 +++-- src/network/packets/Packet.java | 33 +++++++-------- src/resources/control/Assert.java | 28 ++++++++++--- src/resources/network/TCPServer.java | 17 ++++---- src/services/network/ClientManager.java | 14 +++---- .../network/InboundNetworkManager.java | 18 ++++---- .../network/NetworkClientManager.java | 41 ++++++++++--------- .../network/OutboundNetworkManager.java | 6 +-- src/services/network/PacketSender.java | 27 ++++++++++-- src/services/objects/ObjectAwareness.java | 2 +- .../player/CharacterCreationService.java | 6 +-- src/services/player/LoginService.java | 10 ++--- src/services/player/ZoneManager.java | 2 +- 16 files changed, 125 insertions(+), 95 deletions(-) diff --git a/.classpath b/.classpath index c5505fa64..8209fc27b 100644 --- a/.classpath +++ b/.classpath @@ -28,6 +28,6 @@ - + diff --git a/.gitignore b/.gitignore index 457d26b91..8a42d70e2 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ packets.txt log.txt /target/ +/lib/ diff --git a/scripts/radial/terminal/character_builder.js b/scripts/radial/terminal/character_builder.js index 89d6d139a..86f018830 100644 --- a/scripts/radial/terminal/character_builder.js +++ b/scripts/radial/terminal/character_builder.js @@ -44,7 +44,7 @@ function spawnItems(player, items) { var creature = player.getCreatureObject(); var inventory = creature.getSlottedObject("inventory"); - new CreateStaticItemIntent(creature, inventory, new StaticItemService.LootBoxHandler(creature), items).broadcast(); + new CreateStaticItemIntent(creature, inventory, new StaticItemService.LootBoxHandler(creature), Java.to(items, "java.lang.String[]")).broadcast(); } function handleArmor(player) { diff --git a/src/network/NetworkClient.java b/src/network/NetworkClient.java index d607d5e97..3c1c6e48e 100644 --- a/src/network/NetworkClient.java +++ b/src/network/NetworkClient.java @@ -32,7 +32,7 @@ import intents.network.ConnectionOpenedIntent; import intents.network.InboundPacketIntent; import java.io.EOFException; -import java.net.InetSocketAddress; +import java.net.SocketAddress; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @@ -53,7 +53,7 @@ public class NetworkClient { private static final int DEFAULT_BUFFER = 128; private final IntentChain intentChain = new IntentChain(); - private final InetSocketAddress address; + private final SocketAddress address; private final long networkId; private final NetBufferStream buffer; private final HolocoreSessionManager sessionManager; @@ -64,7 +64,7 @@ public class NetworkClient { private State state; private PacketSender sender; - public NetworkClient(InetSocketAddress address, long networkId) { + public NetworkClient(SocketAddress address, long networkId) { this.address = address; this.networkId = networkId; this.buffer = new NetBufferStream(DEFAULT_BUFFER); @@ -82,7 +82,7 @@ public class NetworkClient { intentChain.reset(); } - public InetSocketAddress getAddress() { + public SocketAddress getAddress() { return address; } @@ -163,8 +163,7 @@ public class NetworkClient { } if (p == null) return true; - p.setAddress(address.getAddress()); - p.setPort(address.getPort()); + p.setSocketAddress(address); if (!processInbound(p)) { flushOutbound(); return false; diff --git a/src/network/packets/Packet.java b/src/network/packets/Packet.java index 92b0131e8..d15028470 100644 --- a/src/network/packets/Packet.java +++ b/src/network/packets/Packet.java @@ -32,7 +32,7 @@ import resources.encodables.Encodable; import resources.server_info.Log; import utilities.Encoder; -import java.net.InetAddress; +import java.net.SocketAddress; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.charset.Charset; @@ -42,41 +42,36 @@ import java.util.List; public class Packet { + public static final Charset ascii = Charset.forName("UTF-8"); public static final Charset unicode = Charset.forName("UTF-16LE"); - private InetAddress address; - private ByteBuffer data; - private int port = 0; - private int opcode; + + private SocketAddress socketAddress; + private ByteBuffer data; + private int opcode; public Packet() { + socketAddress = null; data = ByteBuffer.allocate(2); + opcode = 0; } public Packet(ByteBuffer data) { decode(data); } - public void setAddress(InetAddress address) { - this.address = address; - } - - public InetAddress getAddress() { - return address; - } - - public void setPort(int port) { - this.port = port; - } - - public int getPort() { - return port; + public void setSocketAddress(SocketAddress socketAddress) { + this.socketAddress = socketAddress; } public void setOpcode(int opcode) { this.opcode = opcode; } + public SocketAddress getSocketAddress() { + return socketAddress; + } + public int getOpcode() { return opcode; } diff --git a/src/resources/control/Assert.java b/src/resources/control/Assert.java index a559d5654..b532a7dff 100644 --- a/src/resources/control/Assert.java +++ b/src/resources/control/Assert.java @@ -42,23 +42,39 @@ public class Assert { } public static void notNull(Object o) { + notNull(o, ""); + } + + public static void notNull(Object o, String message) { if (debug() && o == null) - handle(new NullPointerException()); + handle(new NullPointerException(message)); } public static void isNull(Object o) { + isNull(o, ""); + } + + public static void isNull(Object o, String message) { if (debug() && o != null) - handle(new AssertionException()); + handle(new AssertionException(message)); } public static void test(boolean expr) { + test(expr, ""); + } + + public static void test(boolean expr, String message) { if (debug() && !expr) - handle(new AssertionException()); + handle(new AssertionException(message)); } public static void fail() { + fail(""); + } + + public static void fail(String message) { if (debug()) - handle(new AssertionException()); + handle(new AssertionException(message)); } private static void handle(RuntimeException e) { @@ -86,8 +102,8 @@ public class Assert { private static final long serialVersionUID = 1L; - public AssertionException() { - super(""); + public AssertionException(String message) { + super(message); } } diff --git a/src/resources/network/TCPServer.java b/src/resources/network/TCPServer.java index 996c4f360..4aa2431ca 100644 --- a/src/resources/network/TCPServer.java +++ b/src/resources/network/TCPServer.java @@ -58,9 +58,9 @@ public class TCPServer { private final InetAddress addr; private final int port; private final int bufferSize; + private final TCPListener listener; private ServerSocketChannel channel; - private TCPCallback callback; - private TCPListener listener; + private NetworkCallback callback; public TCPServer(int port, int bufferSize) { this(null, port, bufferSize); @@ -72,8 +72,8 @@ public class TCPServer { this.addr = addr; this.port = port; this.bufferSize = bufferSize; + this.listener = new TCPListener(); this.channel = null; - listener = new TCPListener(); } public void bind() throws IOException { @@ -156,16 +156,10 @@ public class TCPServer { return false; } - public void setCallback(TCPCallback callback) { + public void setCallback(NetworkCallback callback) { this.callback = callback; } - public interface TCPCallback { - void onIncomingConnection(Socket s); - void onConnectionDisconnect(Socket s, SocketAddress addr); - void onIncomingData(Socket s, byte [] data); - } - private class TCPListener implements Runnable { private final ByteBuffer buffer; @@ -240,6 +234,9 @@ public class TCPServer { SocketChannel sc = channel.accept(); if (sc == null) break; + sc.socket().setKeepAlive(true); + sc.socket().setPerformancePreferences(0, 1, 2); + sc.socket().setTrafficClass(0x10); // Low Delay bit SocketChannel old = sockets.get(sc.getRemoteAddress()); if (old != null) disconnect(old); diff --git a/src/services/network/ClientManager.java b/src/services/network/ClientManager.java index 5c99d3d09..7fc0bd55e 100644 --- a/src/services/network/ClientManager.java +++ b/src/services/network/ClientManager.java @@ -27,7 +27,7 @@ ***********************************************************************************/ package services.network; -import java.net.InetSocketAddress; +import java.net.SocketAddress; import java.util.HashMap; import java.util.Hashtable; import java.util.Map; @@ -37,17 +37,17 @@ import network.NetworkClient; class ClientManager { - private final Map sockets; + private final Map sockets; private final Map clients; private final AtomicLong networkIdCounter; public ClientManager() { - sockets = new HashMap(); - clients = new Hashtable(); + sockets = new HashMap<>(); + clients = new Hashtable<>(); networkIdCounter = new AtomicLong(1); } - public NetworkClient createSession(InetSocketAddress addr) { + public NetworkClient createSession(SocketAddress addr) { NetworkClient client = new NetworkClient(addr, networkIdCounter.incrementAndGet()); synchronized (clients) { sockets.put(client.getAddress(), client.getNetworkId()); @@ -69,11 +69,11 @@ class ClientManager { } } - public NetworkClient getClient(InetSocketAddress addr) { + public NetworkClient getClient(SocketAddress addr) { return getClient(getNetworkId(addr)); } - public long getNetworkId(InetSocketAddress addr) { + public long getNetworkId(SocketAddress addr) { synchronized (clients) { Long id = sockets.get(addr); if (id == null) diff --git a/src/services/network/InboundNetworkManager.java b/src/services/network/InboundNetworkManager.java index 777b1f2ec..87018d9b5 100644 --- a/src/services/network/InboundNetworkManager.java +++ b/src/services/network/InboundNetworkManager.java @@ -29,10 +29,12 @@ package services.network; import intents.network.InboundPacketPendingIntent; -import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.util.Arrays; + import network.NetworkClient; -import resources.control.Intent; import resources.control.Service; +import resources.server_info.Log; public class InboundNetworkManager extends Service { @@ -44,14 +46,12 @@ public class InboundNetworkManager extends Service { registerForIntent(InboundPacketPendingIntent.class, ippi -> handleInboundPacketPendingIntent(ippi)); } - private void handleInboundPacketPendingIntent(InboundPacketPendingIntent ippi){ - handlePacketPending(ippi.getClient()); - } - - public void onInboundData(InetSocketAddress addr, byte [] data) { + public void onInboundData(SocketAddress addr, byte [] data) { NetworkClient client = clientManager.getClient(addr); if (client.addToBuffer(data)) new InboundPacketPendingIntent(client).broadcast(); + else + Log.d(this, "Not enough to process. Waiting. Data: %s", Arrays.toString(data)); } public void onSessionCreated(NetworkClient client) { @@ -62,8 +62,8 @@ public class InboundNetworkManager extends Service { } - private void handlePacketPending(NetworkClient client) { - client.processInbound(); + private void handleInboundPacketPendingIntent(InboundPacketPendingIntent ippi){ + ippi.getClient().processInbound(); } } diff --git a/src/services/network/NetworkClientManager.java b/src/services/network/NetworkClientManager.java index 3befbaaa9..03778f7a2 100644 --- a/src/services/network/NetworkClientManager.java +++ b/src/services/network/NetworkClientManager.java @@ -29,7 +29,6 @@ package services.network; import java.io.IOException; import java.net.BindException; -import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; @@ -39,22 +38,25 @@ import network.packets.swg.holo.HoloConnectionStopped.ConnectionStoppedReason; import resources.config.ConfigFile; import resources.control.Manager; import resources.network.DisconnectReason; +import resources.network.NetworkCallback; import resources.network.TCPServer; -import resources.network.TCPServer.TCPCallback; +import resources.network.UnixServer; import resources.server_info.Log; -public class NetworkClientManager extends Manager implements TCPCallback { +public class NetworkClientManager extends Manager implements NetworkCallback { private final InboundNetworkManager inboundManager; private final OutboundNetworkManager outboundManager; private final ClientManager clientManager; private final TCPServer tcpServer; + private final UnixServer unixServer; public NetworkClientManager() { clientManager = new ClientManager(); tcpServer = new TCPServer(getBindPort(), getBufferSize()); + unixServer = new UnixServer(getBindPath(), getBufferSize()); inboundManager = new InboundNetworkManager(clientManager); - outboundManager = new OutboundNetworkManager(tcpServer, clientManager); + outboundManager = new OutboundNetworkManager(tcpServer, unixServer, clientManager); addChildService(inboundManager); addChildService(outboundManager); @@ -66,7 +68,9 @@ public class NetworkClientManager extends Manager implements TCPCallback { public boolean start() { try { tcpServer.bind(); + unixServer.bind(); tcpServer.setCallback(this); + unixServer.setCallback(this); } catch (IOException e) { Log.e(this, e); if (e instanceof BindException) @@ -79,6 +83,7 @@ public class NetworkClientManager extends Manager implements TCPCallback { @Override public boolean stop() { tcpServer.close(); + unixServer.close(); return super.stop(); } @@ -107,49 +112,47 @@ public class NetworkClientManager extends Manager implements TCPCallback { @Override public void onIncomingConnection(Socket s) { SocketAddress addr = s.getRemoteSocketAddress(); - if (addr instanceof InetSocketAddress) - onSessionConnect((InetSocketAddress) addr); - else if (addr != null) - Log.e(this, "Incoming connection has socket address of instance: %s", addr.getClass().getSimpleName()); + onSessionConnect(addr); } @Override public void onConnectionDisconnect(Socket s, SocketAddress addr) { - if (addr instanceof InetSocketAddress) - onSessionDisconnect((InetSocketAddress) addr, ConnectionStoppedReason.APPLICATION); - else if (addr != null) - Log.e(this, "Connection Disconnected. Has socket address of instance: %s", addr.getClass().getSimpleName()); + onSessionDisconnect(addr, ConnectionStoppedReason.APPLICATION); } @Override public void onIncomingData(Socket s, byte [] data) { SocketAddress addr = s.getRemoteSocketAddress(); - if (addr instanceof InetSocketAddress) - onInboundData((InetSocketAddress) addr, data); - else if (addr != null) - Log.e(this, "Incoming data has socket address of instance: %s", addr.getClass().getSimpleName()); + onInboundData(addr, data); } private int getBindPort() { return getConfig(ConfigFile.NETWORK).getInt("BIND-PORT", 44463); } + private String getBindPath() { + return getConfig(ConfigFile.NETWORK).getString("BIND-PATH", "/tmp/holocore44463.sock"); + } + private int getBufferSize() { return getConfig(ConfigFile.NETWORK).getInt("BUFFER-SIZE", 4096); } - private void onSessionConnect(InetSocketAddress addr) { + private void onSessionConnect(SocketAddress addr) { + Log.i(this, "NCM %s connected", addr); NetworkClient client = clientManager.createSession(addr); client.onConnected(); inboundManager.onSessionCreated(client); outboundManager.onSessionCreated(client); } - private void onInboundData(InetSocketAddress addr, byte [] data) { + private void onInboundData(SocketAddress addr, byte [] data) { + Log.i(this, "NCM %s data: %d", addr, data.length); inboundManager.onInboundData(addr, data); } - private void onSessionDisconnect(InetSocketAddress addr, ConnectionStoppedReason reason) { + private void onSessionDisconnect(SocketAddress addr, ConnectionStoppedReason reason) { + Log.i(this, "NCM %s disconnected", addr); NetworkClient client = clientManager.getClient(addr); if (client != null) { client.onDisconnected(reason); diff --git a/src/services/network/OutboundNetworkManager.java b/src/services/network/OutboundNetworkManager.java index d2248f543..4174fd6bd 100644 --- a/src/services/network/OutboundNetworkManager.java +++ b/src/services/network/OutboundNetworkManager.java @@ -28,20 +28,20 @@ package services.network; import intents.network.OutboundPacketIntent; - import network.NetworkClient; import resources.control.Assert; import resources.control.Intent; import resources.control.Service; import resources.network.TCPServer; +import resources.network.UnixServer; public class OutboundNetworkManager extends Service { private final ClientManager clientManager; private final PacketSender sender; - public OutboundNetworkManager(TCPServer server, ClientManager clientManager) { - this.sender = new PacketSender(server); + public OutboundNetworkManager(TCPServer tcpServer, UnixServer unixServer, ClientManager clientManager) { + this.sender = new PacketSender(tcpServer, unixServer); this.clientManager = clientManager; registerForIntent(OutboundPacketIntent.class, opi -> handleOutboundPacketIntent(opi)); diff --git a/src/services/network/PacketSender.java b/src/services/network/PacketSender.java index 87dfcf8ef..c3b405306 100644 --- a/src/services/network/PacketSender.java +++ b/src/services/network/PacketSender.java @@ -27,21 +27,40 @@ ***********************************************************************************/ package services.network; +import java.net.SocketAddress; import java.net.InetSocketAddress; import java.nio.ByteBuffer; +import jnr.unixsocket.UnixSocketAddress; import resources.network.TCPServer; +import resources.network.UnixServer; +import resources.server_info.Log; public class PacketSender { - private final TCPServer server; + private final TCPServer tcpServer; + private final UnixServer unixServer; - public PacketSender(TCPServer server) { - this.server = server; + public PacketSender(TCPServer server, UnixServer unixServer) { + this.tcpServer = server; + this.unixServer = unixServer; + } + + public void sendPacket(SocketAddress addr, ByteBuffer data) { + if (addr instanceof UnixSocketAddress) + sendPacket((UnixSocketAddress) addr, data); + else if (addr instanceof InetSocketAddress) + sendPacket((InetSocketAddress) addr, data); + else + Log.e(this, "Unknown socket address: %s", addr); + } + + public void sendPacket(UnixSocketAddress addr, ByteBuffer data) { + unixServer.send(addr, data); } public void sendPacket(InetSocketAddress addr, ByteBuffer data) { - server.send(addr, data); + tcpServer.send(addr, data); } } diff --git a/src/services/objects/ObjectAwareness.java b/src/services/objects/ObjectAwareness.java index 424093d65..d0eb9cf4c 100644 --- a/src/services/objects/ObjectAwareness.java +++ b/src/services/objects/ObjectAwareness.java @@ -254,7 +254,7 @@ public class ObjectAwareness extends Service implements TerrainMapCallback { private void handleCmdSceneReady(Player player, CmdSceneReady p) { Assert.test(player.getPlayerState() == PlayerState.ZONING_IN); player.setPlayerState(PlayerState.ZONED_IN); - Log.i("ZoneService", "%s with character %s zoned in from %s:%d", player.getUsername(), player.getCharacterName(), p.getAddress(), p.getPort()); + Log.i("ZoneService", "%s with character %s zoned in from %s", player.getUsername(), player.getCharacterName(), p.getSocketAddress()); new PlayerEventIntent(player, PlayerEvent.PE_ZONE_IN_SERVER).broadcast(); player.sendPacket(new CmdSceneReady()); } diff --git a/src/services/player/CharacterCreationService.java b/src/services/player/CharacterCreationService.java index c6c78ce95..1f4785bcf 100644 --- a/src/services/player/CharacterCreationService.java +++ b/src/services/player/CharacterCreationService.java @@ -189,7 +189,7 @@ public class CharacterCreationService extends Service { Assert.notNull(creature.getPlayerObject()); Assert.test(creature.isPlayer()); Assert.test(creature.getObjectId() > 0); - Log.i(this, "%s created character %s from %s:%d", player.getUsername(), create.getName(), create.getAddress(), create.getPort()); + Log.i(this, "%s created character %s from %s", player.getUsername(), create.getName(), create.getSocketAddress()); player.sendPacket(new CreateCharacterSuccess(creature.getObjectId())); new PlayerEventIntent(player, PlayerEvent.PE_CREATE_CHARACTER).broadcast(); } @@ -227,7 +227,7 @@ public class CharacterCreationService extends Service { } // Test for successful database insertion if (!createCharacterInDb(creature, create.getName(), player)) { - Log.e(this, "Failed to create character %s for user %s with server error from %s:%d", create.getName(), player.getUsername(), create.getAddress(), create.getPort()); + Log.e(this, "Failed to create character %s for user %s with server error from %s", create.getName(), player.getUsername(), create.getSocketAddress()); new DestroyObjectIntent(creature).broadcast(); sendCharCreationFailure(player, create, ErrorMessage.NAME_DECLINED_INTERNAL_ERROR); return null; @@ -254,7 +254,7 @@ public class CharacterCreationService extends Service { default: break; } - Log.e("ZoneService", "Failed to create character %s for user %s with error %s and reason %s from %s:%d", create.getName(), player.getUsername(), err, reason, create.getAddress(), create.getPort()); + Log.e("ZoneService", "Failed to create character %s for user %s with error %s and reason %s from %s", create.getName(), player.getUsername(), err, reason, create.getSocketAddress()); player.sendPacket(new CreateCharacterFailure(reason)); } diff --git a/src/services/player/LoginService.java b/src/services/player/LoginService.java index 987a46628..b19fc3871 100644 --- a/src/services/player/LoginService.java +++ b/src/services/player/LoginService.java @@ -188,7 +188,7 @@ public class LoginService extends Service { } private void onLoginClientVersionError(Player player, LoginClientId id) { - Log.i(this, "%s cannot login due to invalid version code: %s, expected %s from %s:%d", player.getUsername(), id.getVersion(), REQUIRED_VERSION, id.getAddress(), id.getPort()); + Log.i(this, "%s cannot login due to invalid version code: %s, expected %s from %s", player.getUsername(), id.getVersion(), REQUIRED_VERSION, id.getSocketAddress()); String type = "Login Failed!"; String message = "Invalid Client Version Code: " + id.getVersion(); player.sendPacket(new ErrorMessage(type, message, false)); @@ -209,7 +209,7 @@ public class LoginService extends Service { } player.setPlayerState(PlayerState.LOGGED_IN); sendLoginSuccessPacket(player); - Log.i(this, "%s connected to the login server from %s:%d", player.getUsername(), id.getAddress(), id.getPort()); + Log.i(this, "%s connected to the login server from %s", player.getUsername(), id.getSocketAddress()); new LoginEventIntent(player.getNetworkId(), LoginEvent.LOGIN_SUCCESS).broadcast(); } @@ -217,7 +217,7 @@ public class LoginService extends Service { String type = "Login Failed!"; String message = "Sorry, you're banned!"; player.sendPacket(new ErrorMessage(type, message, false)); - Log.i(this, "%s cannot login due to a ban, from %s:%d", player.getUsername(), id.getAddress(), id.getPort()); + Log.i(this, "%s cannot login due to a ban, from %s", player.getUsername(), id.getSocketAddress()); player.setPlayerState(PlayerState.DISCONNECTED); new LoginEventIntent(player.getNetworkId(), LoginEvent.LOGIN_FAIL_BANNED).broadcast(); } @@ -227,7 +227,7 @@ public class LoginService extends Service { String message = getUserPassError(set, id.getUsername(), id.getPassword()); player.sendPacket(new ErrorMessage(type, message, false)); player.sendPacket(new LoginIncorrectClientId(getServerString(), REQUIRED_VERSION)); - Log.i(this, "%s cannot login due to invalid user/pass from %s:%d", id.getUsername(), id.getAddress(), id.getPort()); + Log.i(this, "%s cannot login due to invalid user/pass from %s", id.getUsername(), id.getSocketAddress()); player.setPlayerState(PlayerState.DISCONNECTED); new LoginEventIntent(player.getNetworkId(), LoginEvent.LOGIN_FAIL_INVALID_USER_PASS).broadcast(); } @@ -237,7 +237,7 @@ public class LoginService extends Service { String message = "Server Error."; player.sendPacket(new ErrorMessage(type, message, false)); player.setPlayerState(PlayerState.DISCONNECTED); - Log.e(this, "%s cannot login due to server error, from %s:%d", id.getUsername(), id.getAddress(), id.getPort()); + Log.e(this, "%s cannot login due to server error, from %s", id.getUsername(), id.getSocketAddress()); new LoginEventIntent(player.getNetworkId(), LoginEvent.LOGIN_FAIL_SERVER_ERROR).broadcast(); } diff --git a/src/services/player/ZoneManager.java b/src/services/player/ZoneManager.java index e9c820983..d966e4c7b 100644 --- a/src/services/player/ZoneManager.java +++ b/src/services/player/ZoneManager.java @@ -191,7 +191,7 @@ public class ZoneManager extends Manager { } private void handleClientIdMsg(Player player, ClientIdMsg clientId) { - Log.i("ZoneService", "%s connected to the zone server from %s:%d", player.getUsername(), clientId.getAddress(), clientId.getPort()); + Log.i("ZoneService", "%s connected to the zone server from %s", player.getUsername(), clientId.getSocketAddress()); player.setPlayerServer(PlayerServer.ZONE); player.sendPacket(new HeartBeat()); player.sendPacket(new AccountFeatureBits());