public override void Run() { while (!terminationRequested || !incomingPacketQueue.IsEmpty) { IncomingDatagramPacket packet; if (incomingPacketQueue.TryDequeue(out packet)) { ReadOnlyBitStream packetStream = new ReadOnlyBitStream(packet.Data); byte rakNetPacketId = packetStream.ReadByte(); switch (rakNetPacketId) { case 17: // ID_NEW_INCOMING_CONNECTION { Server.Instance.Scheduler.RunTask(() => Server.Instance.EventManager.Publish(new ClientConnectEvent(packet.SourceAddress, packet.SourcePort, packet.DestinationAddress, packet.DestinationPort))); break; } case 19: // ID_DISCONNECTION_NOTIFICATION case 20: // ID_CONNECTION_LOST { Server.Instance.Scheduler.RunTask(() => Server.Instance.EventManager.Publish(new ClientDisconnectEvent(packet.SourceAddress, packet.SourcePort, packet.DestinationAddress, packet.DestinationPort))); break; } case 83: // ID_USER_PACKET_ENUM { try { RemoteConnectionType remoteConnectionType = (RemoteConnectionType)packetStream.ReadUInt16(); uint luPacketId = packetStream.ReadUInt32(); packetStream.SkipBytes(1); IUnserializable gamePacket = null; switch (remoteConnectionType) { case RemoteConnectionType.General: { GeneralPacketId generalPacketId = (GeneralPacketId)luPacketId; switch (generalPacketId) { case GeneralPacketId.MSG_SERVER_VERSION_CONFIRM: { gamePacket = new GeneralVersionConfirmPacket(); break; } default: { Server.Instance.Logger.Log("Received an unknown LU packet. generalPacketId=" + generalPacketId); break; } } break; } case RemoteConnectionType.Auth: { AuthPacketId authPacketId = (AuthPacketId)luPacketId; switch (authPacketId) { case AuthPacketId.MSG_AUTH_LOGIN_REQUEST: { gamePacket = new AuthLoginRequestPacket(); break; } default: { Server.Instance.Logger.Log("Received an unknown LU packet. authPacketId=" + authPacketId); break; } } break; } case RemoteConnectionType.World: { WorldPacketId worldPacketId = (WorldPacketId)luPacketId; switch (worldPacketId) { case WorldPacketId.MSG_WORLD_CLIENT_VALIDATION: { gamePacket = new WorldValidationPacket(); break; } case WorldPacketId.MSG_WORLD_CLIENT_CHARACTER_LIST_REQUEST: { gamePacket = new WorldCharacterListRequestPacket(); break; } case WorldPacketId.MSG_WORLD_CLIENT_CHARACTER_CREATE_REQUEST: { gamePacket = new WorldCharacterCreateRequestPacket(); break; } case WorldPacketId.MSG_WORLD_CLIENT_CHARACTER_DELETE_REQUEST: { gamePacket = new WorldCharacterDeleteRequestPacket(); break; } case WorldPacketId.MSG_WORLD_CLIENT_CHARACTER_RENAME_REQUEST: { gamePacket = new WorldCharacterRenameRequestPacket(); break; } case WorldPacketId.MSG_WORLD_CLIENT_LOGIN_REQUEST: { gamePacket = new WorldLoginRequestPacket(); break; } case WorldPacketId.MSG_WORLD_CLIENT_LEVEL_LOAD_COMPLETE: { gamePacket = new WorldLevelLoadCompletePacket(); break; } case WorldPacketId.MSG_WORLD_CLIENT_POSITION_UPDATE: { gamePacket = new WorldPositionUpdatePacket(); break; } case WorldPacketId.MSG_WORLD_CLIENT_GAME_MSG: { long objectId = packetStream.ReadInt64(); ushort gameMessageId = packetStream.ReadUInt16(); switch (gameMessageId) { case (ushort)GameMessageId.PlayerLoaded: { gamePacket = new PlayerLoadedGameMessage(objectId); break; } default: { Server.Instance.Logger.Log("Received an unknown LU packet. gameMessageId=" + gameMessageId); break; } } break; } default: { Server.Instance.Logger.Log("Received an unknown LU packet. worldPacketId=" + worldPacketId); break; } } break; } default: { Server.Instance.Logger.Log("Received an unknown LU packet. remoteConnectionType=" + remoteConnectionType); break; } } if (gamePacket != null) { gamePacket.FromBitStream(packetStream); Server.Instance.Scheduler.RunTask(() => Server.Instance.EventManager.Publish(new GamePacketReceiveEvent(packet.SourceAddress, packet.SourcePort, packet.DestinationAddress, packet.DestinationPort, gamePacket))); } } catch (Exception exc) { StackTrace stackTrace = new StackTrace(exc, true); StackFrame stackFrame = stackTrace.GetFrame(0); string fileName = stackFrame.GetFileName(); int fileLine = stackFrame.GetFileLineNumber(); int fileColumn = stackFrame.GetFileColumnNumber(); Server.Instance.Logger.Log("Received an invalid game packet. address=" + packet.SourceAddress + " port=" + packet.SourcePort + " exception=" + exc.Message + " stackTrace=" + fileName + ":" + fileLine + ":" + fileColumn); } break; } default: { Server.Instance.Logger.Log("Received an unknown RakNet packet. rakNetPacketId=" + rakNetPacketId); break; } } } else { Thread.Sleep(1); } } }
public void OnWorldCharacterCreateRequestPacketReceive(GamePacketReceiveEvent e) { if (e.Packet is WorldCharacterCreateRequestPacket) { WorldCharacterCreateRequestPacket request = (WorldCharacterCreateRequestPacket)e.Packet; Session session = Server.Instance.SessionManager.GetSession(e.SourceAddress, e.SourcePort); if (session != null) { long characterId = Server.Instance.ObjectIdGenerator.GenerateGlobalId(); CharacterInfo characterInfo = new CharacterInfo(characterId, session.ActiveAccountInfo.AccountId); string name; if (Server.Instance.PredefinedNameCache != null) { name = Server.Instance.PredefinedNameCache.GetFirstName(request.PredefinedNameFirst); name += Server.Instance.PredefinedNameCache.GetMiddleName(request.PredefinedNameMiddle); name += Server.Instance.PredefinedNameCache.GetLastName(request.PredefinedNameLast); } else { name = characterId.ToString(); } characterInfo.Name = name; characterInfo.HeadColor = request.HeadColor; characterInfo.Head = request.Head; characterInfo.ChestColor = request.ChestColor; characterInfo.Chest = request.Chest; characterInfo.Legs = request.Legs; characterInfo.HairStyle = request.HairStyle; characterInfo.HairColor = request.HairColor; characterInfo.LeftHand = request.LeftHand; characterInfo.RightHand = request.RightHand; characterInfo.EyebrowStyle = request.EyebrowStyle; characterInfo.EyesStyle = request.EyesStyle; characterInfo.MouthStyle = request.MouthStyle; characterInfo.ZoneId = 0; characterInfo.CloneId = 0; characterInfo.LastLogout = (ulong)DateTime.Now.Subtract(Time.UnixEpoch).TotalSeconds; if (Server.Instance.GetZone(1000) != null) { characterInfo.Position = Server.Instance.GetZone(1000).SpawnPosition; characterInfo.Rotation = Server.Instance.GetZone(1000).SpawnRotation; } else { characterInfo.Position = JVector.Zero; characterInfo.Rotation = new JQuaternion(0.0f, 0.0f, 0.0f, 0.0f); } Server.Instance.Scheduler.RunTaskAsync( () => { ClientCharacterCreateResponsePacket response = new ClientCharacterCreateResponsePacket(); response.CharacterCreationResult = CharacterCreateResult.DenyInvalidCustomName; MySqlHandle mySqlHandle = Server.Instance.DatabaseManager.GetMySqlHandle(); try { mySqlHandle.Open(); bool success = mySqlHandle.CharactersCreateCharacter(characterInfo); if (success) { if (!String.IsNullOrEmpty(request.CustomName)) { success = mySqlHandle.CharactersSetPendingName(characterId, request.CustomName); } if (success) { response.CharacterCreationResult = CharacterCreateResult.Allow; } else { response.CharacterCreationResult = CharacterCreateResult.DenyCustomNameTaken; mySqlHandle.CharactersDeleteCharacter(characterId); } } else { response.CharacterCreationResult = CharacterCreateResult.DenyPredefinedNameTaken; } mySqlHandle.Close(); } catch (Exception exc) { Server.Instance.LogDatabaseError(exc); } mySqlHandle.Free(); Server.Instance.SendGamePacket(response, ClientPacketId.MSG_CLIENT_CHARACTER_CREATE_RESPONSE, e.SourceAddress, e.SourcePort); Server.Instance.Logger.Log("A client requested to create a character. address=" + e.SourceAddress + " port=" + e.SourcePort + " predefinedName=" + name + " customName=" + request.CustomName + " result=" + response.CharacterCreationResult); if (response.CharacterCreationResult == CharacterCreateResult.Allow) { Server.Instance.Scheduler.RunTask(() => Server.Instance.EventManager.Publish(new CharacterListRequestEvent(session))); } else { Server.Instance.ObjectIdGenerator.FreeObjectId(characterId); } } ); } } }