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());