using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Net; using System.Net.Sockets; using Blizzard.HabboHotel.Users; namespace Blizzard.Connections { public class Game { private Socket ClientSock; private int GameID; private Habbo NewHabbo = null; private AsyncCallback CallBack; private byte[] dataBuffer = new byte[1024]; private Thread sTheard; private RequestMessages Requests; internal Game(Socket NewSocket, int ClientID) { try { this.ClientSock = NewSocket; this.GameID = ClientID; this.NewHabbo = new Habbo(this, ClientID); this.CallBack = new AsyncCallback(GetResponse); this.Requests = new RequestMessages(this); Requests.GetClasses(NewHabbo); if (StaticGame.TheardSystem.ContainsKey(ClientID)) { Thread t = StaticGame.TheardSystem[NewHabbo.GameId]; t.Abort(); t = new Thread(new ThreadStart(WaitForaResponse)); t.Start(); } else { Thread t = new Thread(new ThreadStart(WaitForaResponse)); StaticGame.TheardSystem.Add(NewHabbo.GameId, t); t.Start(); } } catch (Exception e) { BlizzardSystem.WriteLine(e.ToString()); } } private void WaitForDataTask() { this.WaitForaResponse(); } private void WaitForaResponse() { try { if (NewHabbo == null) return; this.CallBack = new AsyncCallback(GetResponse); ClientSock.BeginReceive(dataBuffer, 0, dataBuffer.Length, SocketFlags.None, CallBack, null); // Linea 44 } catch (Exception e) { if (NewHabbo == null) return; NewHabbo.DisconnectMe(); // BlizzardSystem.WriteLine("Error on packet system: " + e.Message); } } internal void Disconnect() { try { Thread t = StaticGame.TheardSystem[NewHabbo.GameId]; NewHabbo = null; try { ClientSock.Dispose(); ClientSock.Close(); } catch { } try { t.Abort(); } catch { } } catch { } } private void GetResponse(IAsyncResult Async) { try { if (NewHabbo == null) return; Thread t = StaticGame.TheardSystem[NewHabbo.GameId]; int bytesBuffer = ClientSock.EndReceive(Async); StringBuilder Data = new StringBuilder(); Data.Append(Encoding.Default.GetString(dataBuffer, 0, bytesBuffer)); if (Data.Length <= 0) { // Console.WriteLine("Invalid Packet!"); return; } // Initial Packet if (Data.ToString() == "" + Convert.ToChar(0)) { SendData("" + "\r\n" + "" + "\r\n" + "" + "\r\n" + " " + "\r\n" + ""); NewHabbo = null; StaticGame.TheardSystem.Remove(GameID); t.Abort(); return; } // Process All packets while (Data.Length > 1) { int v = HabboEncode.decodeB64(Data.ToString().Substring(1, 2)); Requests.ProcessPackets(Data.ToString().Substring(3, v)); Data.Remove(0, 3 + v); } } catch (Exception e) { if (NewHabbo == null) return; //BlizzardSystem.WriteLine("Packetlog fail: " + e.ToString()); NewHabbo.DisconnectMe(); } finally { try { if (NewHabbo != null) { if (StaticGame.TheardSystem.ContainsKey(NewHabbo.GameId)) { Thread t = StaticGame.TheardSystem[NewHabbo.GameId]; Thread tu = new Thread(new ThreadStart(WaitForaResponse)); StaticGame.TheardSystem.Remove(NewHabbo.GameId); tu.Start(); StaticGame.TheardSystem.Add(NewHabbo.GameId, tu); t.Abort(); } else { // Nothing? } } } catch (Exception e) { BlizzardSystem.WriteLine("multi-threading system fail!!: " + e.ToString()); NewHabbo.DisconnectMe(); } } } internal void SendData(string Data) { try { Data = Data + Convert.ToChar(0); byte[] dataBytes = Encoding.Default.GetBytes(Data); ClientSock.BeginSend(dataBytes, 0, dataBytes.Length, 0, new AsyncCallback(sentData), null); } catch (Exception e) { BlizzardSystem.WriteLine(e.ToString()); } } internal void SendPacket(string Data) { try { if (Data.Length > 0) { Data = Data + Convert.ToChar(1); byte[] dataBytes = Encoding.Default.GetBytes(Data); ClientSock.BeginSend(dataBytes, 0, dataBytes.Length, 0, new AsyncCallback(sentData), null); } } catch (Exception e) { BlizzardSystem.WriteLine(e.ToString()); } } internal void SendPackets(string Data) { try { byte[] dataBytes = Encoding.Default.GetBytes(Data); ClientSock.BeginSend(dataBytes, 0, dataBytes.Length, 0, new AsyncCallback(sentData), null); } catch (Exception e) { BlizzardSystem.WriteLine(e.ToString()); } } internal void SendMessage(ServerMessage Message) { SendPacket(Message.ToString()); } private void sentData(IAsyncResult iAr) { try { ClientSock.EndSend(iAr); } catch { Disconnect(); } } internal bool SocketsActive { get { try { return ClientSock.Connected; } catch { return false; } } } } }