/// <summary> /// Handle chat messages /// </summary> /// <remarks> /// TODO: /// Clean command handle code /// </remarks> public void Handle() { // Create our command list Commands.Add(EngineEnum.CommandsEnum.CommandName.command_a); // Initialize our responses EnginePacket.GlobalBuffers.SuccessResponse mSuccessResponse = new EnginePacket.GlobalBuffers.SuccessResponse((Int16)EngineEnum.HeadersEnum.Send.BM_SC.BM_SC_CHAT_MESSAGE, mmo_socket: mmoclient); EnginePacket.GlobalBuffers.SuccessResponse bSuccessResponse = new EnginePacket.GlobalBuffers.SuccessResponse((Int16)EngineEnum.HeadersEnum.Send.BM_SC.BM_SC_CHAT_MESSAGE, lobby_socket: lobbyclient); string message = Encoding.ASCII.GetString(_data); if (message.Length > 1 && Regex.IsMatch(message, "[a-z0-9]+")) { // Message check 1/1 if (Commands.Any(x => message.Contains(x))) { // Command check 1/2 if (message.Replace("\0", "").Contains(EngineEnum.CommandsEnum.CommandName.command_a)) { // Command check 2/2 if(mmoclient.info.rank == EngineEnum.PlayerEnum.RankInfo.rank_a || mmoclient.info.rank == EngineEnum.PlayerEnum.RankInfo.rank_b) { // Privileges check 1/1 var Reader = new BinaryReader(new MemoryStream(_data)); Reader.BaseStream.Seek(51, SeekOrigin.Begin); int parsed_level_numb = int.Parse(System.Text.Encoding.UTF8.GetString(Reader.ReadBytes(2)).Replace("\0", "")); EnginePacket.GlobalBuffers.LevelInfo mLevelInfo = new EnginePacket.GlobalBuffers.LevelInfo(mmo_client: mmoclient, level: parsed_level_numb, license: 4, exp: 102400); EnginePacket.GlobalBuffers.LevelInfo lLevelInfo = new EnginePacket.GlobalBuffers.LevelInfo(lobby_client: lobbyclient, level: parsed_level_numb, license: 4, exp: 102400); if (mmoclient != null) new Thread(() => mLevelInfo.Send()).Start(); else if (lobbyclient != null) new Thread(() => lLevelInfo.Send()).Start(); } // Send command } } else { // Send response packet if (mmoclient != null) new Thread(() => mSuccessResponse.Send()).Start(); else if (lobbyclient != null) new Thread(() => bSuccessResponse.Send()).Start(); } } }
/// <summary> /// Handle socket's data from lobby room recv. /// </summary> /// <remarks> /// TODO: /// Clean this mess /// </remarks> /// <param name="data"></param> /// <param name="Socket"></param> public static void HandleData(byte[] data, Engine.Network.lobbyClient Socket) { // Initialize our handles EnginePacket.GlobalHandlers.ChatMessage HandleChatMessage = new EnginePacket.GlobalHandlers.ChatMessage(data, lobby_client: Socket); // Initialize our packets EnginePacket.GlobalBuffers.PlayerCharacterList PlayerCharacterList = new EnginePacket.GlobalBuffers.PlayerCharacterList(lobby_client: Socket, char_name: Socket.info.username, char_type: (EngineEnum.PlayerEnum.CharactersType)Socket.info.type, last_login: Convert.ToBoolean(Socket.info.last_login)); EnginePacket.GlobalBuffers.TrickList TrickList = new EnginePacket.GlobalBuffers.TrickList(lobby_client: Socket, grind_level: Socket.info.grind_level, backflip_level: Socket.info.backflip_level, frontflip_level: Socket.info.frontflip_level, airtwist_level: Socket.info.airtwist_level, powerswing_level: Socket.info.powerswing_level, gripturn_level: Socket.info.gripturn_level, dash_level: Socket.info.dash_level, backskating_level: Socket.info.backskating_level, jumpingsteer_level: Socket.info.jumpingsteer_level, butting_level: Socket.info.butting_level, powerslide_level: Socket.info.powerslide_level, powerjump_level: Socket.info.powerjump_level, wallride_level: Socket.info.wallride_level); EnginePacket.GlobalBuffers.BalanceInfo BalanceInfo = new EnginePacket.GlobalBuffers.BalanceInfo(lobby_client: Socket, coins: Socket.info.coins, rupees: Socket.info.rupees, gpotatos: Socket.info.gpotatos, trickpoints: Socket.info.questpoints); EnginePacket.GlobalBuffers.ChannelList ChannelList = new EnginePacket.GlobalBuffers.ChannelList(lobby_client: Socket, channel_name: (String)EngineEnum.WorldEnum.Channel.channel_a); EnginePacket.GlobalBuffers.EnterChannel EnterChannel = new EnginePacket.GlobalBuffers.EnterChannel(lobby_client: Socket); EnginePacket.GlobalBuffers.CashBalance CashBalance = new EnginePacket.GlobalBuffers.CashBalance(lobby_client: Socket, gpotatos: Socket.info.gpotatos); EnginePacket.GlobalBuffers.LevelInfo LevelInfo = new EnginePacket.GlobalBuffers.LevelInfo(lobby_client: Socket, exp: Socket.info.exp, level: Socket.info.level, license: Socket.info.licence); EnginePacket.GlobalBuffers.PlayerInfo PlayerInfo = new EnginePacket.GlobalBuffers.PlayerInfo(lobby_client: Socket, level: (SByte)Socket.info.level); EnginePacket.GlobalBuffers.InventoryItems InventoryItems = new EnginePacket.GlobalBuffers.InventoryItems(lobby_client: Socket, char_type: (EngineEnum.PlayerEnum.CharactersType)Socket.info.type); EnginePacket.GlobalBuffers.MateInfo MateInfo = new EnginePacket.GlobalBuffers.MateInfo(lobby_client: Socket); // Initialize our responses packets EnginePacket.GlobalBuffers.SuccessResponse[] SuccessResponse = { new EnginePacket.GlobalBuffers.SuccessResponse((Int16)EngineEnum.HeadersEnum.Send.BM_SC.BM_SC_LOGIN, lobby_socket: Socket), new EnginePacket.GlobalBuffers.SuccessResponse((Int16)EngineEnum.HeadersEnum.Send.BM_SC.BM_SC_SELECT_CHARACTER, lobby_socket: Socket), new EnginePacket.GlobalBuffers.SuccessResponse((Int16)EngineEnum.HeadersEnum.Send.BM_SC.BM_SC_SELECT_TRICK, lobby_socket: Socket), new EnginePacket.GlobalBuffers.SuccessResponse((Int16)EngineEnum.HeadersEnum.Send.BM_SC.BM_SC_ENTER_INVENTORY, lobby_socket: Socket), new EnginePacket.GlobalBuffers.SuccessResponse((Int16)EngineEnum.HeadersEnum.Send.BM_SC.BM_SC_LEAVE_INVENTORY, lobby_socket: Socket), new EnginePacket.GlobalBuffers.SuccessResponse((Int16)EngineEnum.HeadersEnum.Send.BM_SC.BM_SC_LEAVE_CHANNEL, lobby_socket: Socket), new EnginePacket.GlobalBuffers.SuccessResponse((Int16)EngineEnum.HeadersEnum.Send.ID_BZ_SC.ID_BZ_SC_ENTER_LOBBY, lobby_socket: Socket), new EnginePacket.GlobalBuffers.SuccessResponse((Int16)EngineEnum.HeadersEnum.Send.BM_SC.BM_SC_CREATE_ROOM, lobby_socket: Socket), new EnginePacket.GlobalBuffers.SuccessResponse((Int16)EngineEnum.HeadersEnum.Send.ID_BZ_SC.ID_BZ_SC_ENTER_LOBBY_ROOM, lobby_socket: Socket), new EnginePacket.GlobalBuffers.SuccessResponse((Int16)EngineEnum.HeadersEnum.Send.ID_BZ_SC.ID_BZ_SC_UNKNOW_LOBBY, lobby_socket: Socket), }; // That's a quick code I wrote to detect a header, it's a bit laggy but you can find a better way. Int16 header = 0; byte[] buff = new byte[0x255]; var Reader = new BinaryReader(new MemoryStream(data)); for (int Index = 0; Index < data.Length; Index++) { Reader.BaseStream.Seek((int)Index, SeekOrigin.Begin); byte[] headerBuff = Reader.ReadBytes(2); headerBuff.CopyTo(buff, 0); header = BitConverter.ToInt16(buff, 0); switch (header) { case ((Int16)EngineEnum.HeadersEnum.Recv.BM_SC.BM_SC_LOGIN): new Thread(() => SuccessResponse[0].Send()).Start(); break; // Login response because the player left the channel case ((Int16)EngineEnum.HeadersEnum.Recv.BM_SC.BM_SC_SELECT_CHARACTER): new Thread(() => SuccessResponse[1].Send()).Start(); break; // Select character response case ((Int16)EngineEnum.HeadersEnum.Recv.BM_SC.BM_SC_CHAT_MESSAGE): new Thread(() => HandleChatMessage.Handle()).Start(); break; // Send a command or a message case ((Int16)EngineEnum.HeadersEnum.Recv.BM_SC.BM_SC_PLAYER_INFO): new Thread(()=> PlayerInfo.Send()).Start(); break; // The server need this we don't actually know what this packet can do case ((Int16)EngineEnum.HeadersEnum.Recv.BM_SC.BM_SC_TRICK_LIST): new Thread(()=> TrickList.Send()).Start(); break; // Send each tricks level to the player case ((Int16)EngineEnum.HeadersEnum.Recv.BM_SC.BM_SC_BALANCE_INFO): new Thread(()=> BalanceInfo.Send()).Start(); break; // Send player's database balance stuff to the world server case ((Int16)EngineEnum.HeadersEnum.Recv.BM_SC.BM_SC_GET_CHANNEL_LIST): new Thread(()=> ChannelList.Send()).Start(); break; // Create our channel list, still only one channel coded case ((Int16)EngineEnum.HeadersEnum.Recv.BM_SC.BM_SC_ENTER_CHANNEL): new Thread(()=> EnterChannel.Send()).Start(); new Thread(()=> CashBalance.Send()).Start(); new Thread(()=> LevelInfo.Send()).Start(); break; // Enter in Parktown and some server-need stuff (cash, level stuff..) case ((Int16)EngineEnum.HeadersEnum.Recv.BM_SC.BM_SC_INVENTORY): new Thread(()=> InventoryItems.Send()).Start(); break; // Send every items to the player's character type inventory case ((Int16)EngineEnum.HeadersEnum.Recv.BM_SC.BM_SC_SELECT_TRICK): new Thread(() => SuccessResponse[2].Send()).Start(); break; // Select the desired trick (still in progress, you can't unselect..) case ((Int16)EngineEnum.HeadersEnum.Recv.BM_SC.BM_SC_ENTER_INVENTORY): new Thread(() => SuccessResponse[3].Send()).Start(); break; // Enter in the inventory room case ((Int16)EngineEnum.HeadersEnum.Recv.BM_SC.BM_SC_MATE_INFO): new Thread(()=> MateInfo.Handle(data)).Start(); new Thread(()=> MateInfo.Send()).Start(); break; // Show up infos of the selected player -- TODO: update infos code case ((Int16)EngineEnum.HeadersEnum.Recv.BM_SC.BM_SC_LEAVE_CHANNEL): new Thread(() => SuccessResponse[5].Send()).Start(); break; // Leave the current channel case ((Int16)EngineEnum.HeadersEnum.Recv.ID_BZ_SC.ID_BZ_SC_ENTER_LOBBY): new Thread(() => SuccessResponse[6].Send()).Start(); break; // Enter lobby room response case ((Int16)EngineEnum.HeadersEnum.Recv.BM_SC.BM_SC_LEAVE_INVENTORY): new Thread(() => SuccessResponse[4].Send()).Start(); break; // Leave inventory and enter the tuning shop case ((Int16)EngineEnum.HeadersEnum.Recv.BM_SC.BM_SC_CREATE_ROOM): new Thread(() => SuccessResponse[7].Send()).Start(); break; // Create a room with the selected options and desired name case ((Int16)EngineEnum.HeadersEnum.Recv.ID_BZ_SC.ID_BZ_SC_ENTER_LOBBY_ROOM): new Thread(() => SuccessResponse[8].Send()).Start(); break; // Enter the lobby waiting room case ((Int16)EngineEnum.HeadersEnum.Recv.ID_BZ_SC.ID_BZ_SC_UNKNOW_LOBBY): new Thread(() => SuccessResponse[9].Send()).Start(); break; // Enter the lobby waiting room } } }