public static void WritePacketAsync(Packet packet, BinaryWriter writer) { var packetType = packet.GetType(); // TODO: Optimise. var properties = packetType.GetProperties() .Where(p => p.GetCustomAttributes(false).OfType<PacketDataAttribute>().Any()) .OrderBy(p => p.GetCustomAttributes(false).OfType<PacketDataAttribute>().First().Order); Task.Factory.StartNew(() => { lock (writer) { try { writer.Write(packet.Header); foreach (var prop in properties) { prop.GetValue(packet).Write(prop.PropertyType, writer); } writer.Flush(); } catch (Exception ex) { // TODO: Something. } } }); }
public void OnChatMessage(Packet packet) { //Console.WriteLine("{0} : {1}", packet.User, packet.Message); foreach (var c in _clients) { PacketWriter.WritePacketAsync(packet, c.Writer); } }
public void FinishMap(Packet p) { var packet = (FinishMapPacket) p; _self.X = packet.X; _self.Y = packet.Y; Camera.CenteredLocation = new PointF(_self.X, _self.Y); Loading = false; Loaded = true; }
public void Send(Packet data) { MemoryStream mem = new MemoryStream(); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(mem, data); byte[] buffer = mem.GetBuffer(); bWriter.Write(buffer.Length); bWriter.Write(buffer); bWriter.Flush(); }
public void GiveChunk(Packet p) { if (Loading) { var packet = (GiveChunkPacket) p; var chunk = _chunks.FirstOrDefault(c => c.X == packet.X && c.Y == packet.Y) ?? new Chunk(packet.X, packet.Y); chunk.Camera = Camera; chunk.LoadFromString(packet.Data); _chunks.Add(chunk); } }
public void OnCharCreateresult(Packet packet) { var p = (CharacterCreationResultPacket)packet; if (p.Success) { this.Call(Close); } else { Out.Red(p.Reason); lblReason.Call(() => lblReason.Text = p.Reason); } }
private void LoginRequest(Packet packet) { loginButton.Call(() => loginButton.Text = Resources.LoginForm_LoginRequest_Login); if (Game.ConfigManager.Query(c => !string.IsNullOrEmpty(c.Account))) { userTextBox.Call(() => userTextBox.Text = Game.ConfigManager.TryGet(c => c.Account)); } if (Game.ConfigManager.Query(c => !string.IsNullOrEmpty(c.Password))) { passwordTextBox.Call(() => passwordTextBox.Text = Game.ConfigManager.TryGet(c => c.Password)); } if (!Game.ConfigManager.Query(c => c.AutoLogin)) return; if (userTextBox.Text != "" && passwordTextBox.Text != "") { Login(); } }
private void button3_Click(object sender, EventArgs e) { Packet cp = new Packet(); string hexString = "7c423d5858"; //data byte[] more_data = Packet.StringToByteArray(hexString); //data cp.init_CLIENT_P3(packet_cnt++, more_data); this.textBox1.Text = "Packet: " + cp.toHexString() + "\r\n"; this.textBox1.Text += "------------------------------------------" + "\r\n"; this.textBox1.Text += "PCK_SIZE = " + cp.getPCK_SIZE() + " (" + cp.getPCK_SIZE_HexString() + ")" + "\r\n"; this.textBox1.Text += "PCK_CNT = " + cp.getPCK_CNT() + " (" + cp.getPCK_CNT_HexString() + ")" + "\r\n"; this.textBox1.Text += "PCK_ID = " + cp.getPCK_ID() + " (" + cp.getPCK_ID_HexString() + ")" + "\r\n"; this.textBox1.Text += "PCK_CRC = " + cp.getPCK_CRC_HexString() + "\r\n"; this.textBox1.Text += "------------------------------------------" + "\r\n"; SendThread st = new SendThread(cp.getRawPacket(), this, this.textBoxIP.Text); Thread t = new Thread(new ThreadStart(st.ThreadProc)); t.Start(); }
public void RemoveEntity(Packet p) { var packet = (RemoveEntityPacket) p; _entities.RemoveAll(e => e.Id == packet.EntityId); }
public void GivePacket(Packet packet) { }
//---------------------------------------------------------------------------------- public void Send(Packet data) { MemoryStream mem = new MemoryStream(); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(mem, data); byte[] buffer = mem.GetBuffer(); try { _writer.Write(buffer.Length); _writer.Write(buffer); _writer.Flush(); } catch (ObjectDisposedException e) { } }
public void OnDeletionResult(Packet packet) { RequestCharacters(); }
public void OnSelectableCharacter(Packet packet) { var p = (SelectableCharacterPacket)packet; Out.Green(string.Format("Name: {0}, Id: {1}", p.Name, p.Id)); Character character = new Character { Name = p.Name, Id = p.Id }; Text text = new Text(colour: Color4.White, shadow: true, location: new PointF(600, _charCount * 75)); text.Camera = Camera; _characters.Add(character); _charTexts.Add(text); _deferralQueue.Enqueue(new QueuedFunction { Parameters = new List<object> { _charCount, character }, Function = (args) => text.Value = string.Format("{0} - level x something ({1})", args[1], args[0]) }); _deferralQueue.Enqueue(new QueuedFunction { Parameters = new List<object> { _charCount, p.Name, p.Id }, Function = args => _delButtons.Add(new Button(new PointF(300, (int)(args[0]) * 75), new SizeF(250, 100), "assets/gfx/buttons/options.png", () => PacketWriter.WritePacketAsync(new DeleteCharacterPacket { Id = (Guid)args[2], Name = (string)args[1] }, _game.Connection.Writer))) }); _charCount++; }
public void OnResult(Packet packet) { _res(packet); }
public void OnSelectionResult(Packet packet) { var p = (CharacterSelectionResultPacket)packet; if (p.Success) { _game.SwitchScreen("World"); } }
public void OnCreateResult(Packet packet) { _action(packet); }
public void OnRequestCharacters(Packet packet) { if (Account == null) return; var chars = Account.GetCharactersForAccount(Account).ToList(); Out.Yellow(string.Format("{0} has requested characters - {1} found", Account, chars.Count())); foreach (var c in chars) { PacketWriter.WritePacketAsync(new SelectableCharacterPacket { Name = c.Name, Id = c.Id }, _writer); } }
public void OnRequest(Packet packet) { _req(packet); }
private Packet processAnswer(Packet client_packet) { UpdateTextBox2Callback tb2 = new UpdateTextBox2Callback(updateTextBox2); byte pck_id = client_packet.getPCK_ID(); switch (pck_id) { case 0x05: Packet sp3 = new Packet(); string hexString = "7c423d5858"; //data byte[] more_data = Packet.StringToByteArray(hexString); //data sp3.init_SERVER_P3(packet_cnt++, client_packet.getPCK_ID(), client_packet.getPCK_CNT(), more_data); return sp3; default: this.Invoke(tb2, new object[] { "UNKNOWN CLIENT PACKET ID" }); break; } return null; }
public void OnCreateCharacter(Packet packet) { if (Account == null) return; var p = (CreateCharacterPacket)packet; if (Character.GetCharacter(name: p.Name) == null) { if (Account.GetCharactersForAccount(Account).Count() < 3) { var repo = DataConnection.Resolve().Repo; var c = new Character { Id = Guid.NewGuid(), Name = p.Name, AccountId = Account.Id }; repo.Insert(c); c.Location = new CharacterLocation { CharacterId = c.Id, X = 0, Y = 0, MapId = _game.PrimaryMap.Id }; repo.Insert(c.Location); PacketWriter.WritePacketAsync(new CharacterCreationResultPacket { Success = true }, _writer); } else { PacketWriter.WritePacketAsync( new CharacterCreationResultPacket { Success = false, Reason = "There are already three characters on this account." }, _writer); } } else { PacketWriter.WritePacketAsync( new CharacterCreationResultPacket { Success = false, Reason = "Character name already exists." }, _writer); } }
public void OnServerOffline(Packet packet) { MessageBox.Show(Resources.Connection_GivePacket_Server_has_shut_down_); Environment.Exit(0); }
public void OnChatMessage(Packet packet) { var p = (ChatMessagePacket)packet; Console.WriteLine(p.Message); }
public void SetMap(Packet p) { var packet = (SetMapPacket) p; Name = packet.Name; Loading = true; Loaded = false; }
public void OnSelectCharacter(Packet packet) { if (Account == null) return; var p = (SelectCharacterPacket)packet; var character = Character.GetCharacter(Account, p.Id); if (character != null) { Character = character; PacketWriter.WritePacketAsync(new CharacterSelectionResultPacket { Success = true }, _writer); Out.Yellow(string.Format("{0} selected character {1}", this, character)); _game.AddClient(this); } else { Out.Red(string.Format("{0} tried to selected invalid character: {1}", this, p.Id)); PacketWriter.WritePacketAsync(new CharacterSelectionResultPacket { Success = false }, _writer); } }
public void OnDeleteCharacter(Packet packet) { if (Account == null) return; var p = (DeleteCharacterPacket)packet; var c = Character.GetCharacter(Account, p.Id, p.Name); if (c != null) { var repo = DataConnection.Resolve().Repo; c.Deleted = true; repo.Update(c); PacketWriter.WritePacketAsync(new CharacterDeletionResultPacket { Success = true, Reason = "" }, _writer); } else { PacketWriter.WritePacketAsync(new CharacterDeletionResultPacket { Success = false, Reason = "Invalid character." }, _writer); } }
private void LoginResult(Packet packet) { var p = (LoginResultPacket)packet; if (p.Success) { DialogResult = DialogResult.OK; this.Call(Close); } else { infoLabel.Call(() => infoLabel.Text = string.Format("Login failed for user {0}.", userTextBox.Text)); _loggingIn = false; ControlState(true); loginButton.Call(() => loginButton.Text = Resources.LoginForm_LoginRequest_Login); } }
public void MoveEntity(Packet p) { var packet = (EntityLocationPacket) p; var ent = _entities.FirstOrDefault(e => e.Id == packet.EntityId); if (ent == null) { ent = new Entity(packet.EntityId, packet.EntityType, new PointF(packet.X, packet.Y)) { Colour = Color4.Red, Camera = Camera }; _entities.Add(ent); } else { ent.Location = new PointF(packet.X, packet.Y); } }
public void OnLogin(Packet packet) { if (Account != null) return; var p = (LoginPacket)packet; Account = _auth.TryLogin(p.Username, p.Password); if (Account != null) { LoggedIn = true; Out.Yellow(string.Format("{0} logged in.", this)); PacketWriter.WritePacketAsync(new LoginResultPacket { Success = true, Name = Account.Username }, _writer); } else { Out.DarkYellow(string.Format("{0} failed to log in. User provided: {1}.", this, p.Username)); PacketWriter.WritePacketAsync(new LoginResultPacket { Success = false, Name = p.Username }, _writer); Account = null; } }
private void accept_n_process() { UpdateTextBox1Callback tb1 = new UpdateTextBox1Callback(updateTextBox1); UpdateTextBox2Callback tb2 = new UpdateTextBox2Callback(updateTextBox2); this.Invoke(tb1, new object[] { "accept_n_process started" }); this.Invoke(tb2, new object[] { "accept_n_process started" }); TcpClient client = null; try { while (srvRunning == true) { client = server.AcceptTcpClient(); Socket soc = client.Client; soc.SendTimeout = 10000; soc.ReceiveTimeout = 10000; soc.NoDelay = true; byte b = (byte)0x00; byte[] data = new byte[1]; int bytes = 0; int counter = 0; ushort sizeOfReceivingFrame = (ushort)0x0000; ushort rxCRC = (ushort)0x0000; ushort crc = (ushort)0x0000; byte crc_hb = (byte)0x00; byte crc_lb = (byte)0x00; bool pck_error = false; bool rxOK = false; bool crc_error = false; bool end_error = false; bool rx_len_error = false; byte[] rxPacket = new byte[512];//cia tik atvaizdavimui reikalinga! int idx = 0; RX_STATE rxState = RX_STATE.WAIT_FOR_SYNC; while ((pck_error == false && rxOK == false && (bytes = soc.Receive(data, 1, 0)) > 0)) { //this.Invoke(tb1, new object[] { "byte received, bytes_size=" + bytes }); b = (byte)data[0]; switch (rxState) { case RX_STATE.WAIT_FOR_SYNC: if (b != (byte)0x4D && b != (byte)0x61 && b != (byte)0x72) { counter = 0; break; } counter++; rxPacket[idx++] = b; if (counter == 3) { counter = 0; rxState = RX_STATE.RX_LENGTH; } break; case RX_STATE.RX_LENGTH: counter++; if (counter == 1) { sizeOfReceivingFrame = b; rxPacket[idx++] = b; break; } if (counter == 2) { counter = 0; sizeOfReceivingFrame = (ushort)((sizeOfReceivingFrame << 8) | b); sizeOfReceivingFrame -= 4;// atmetam CRC ir END if (sizeOfReceivingFrame <= 0) { pck_error = true; rx_len_error = true; this.Invoke(tb1, new object[] { "RX_STATE.RX_LENGTH: pck_error" }); break; } rxPacket[idx++] = b; rxState = RX_STATE.RX_DATA; break; } break; case RX_STATE.RX_DATA: rxPacket[idx++] = b; counter++; if (counter == sizeOfReceivingFrame) { counter = 0; rxState = RX_STATE.RX_CRC; break; } break; case RX_STATE.RX_CRC: counter++; if (counter == 1) { crc_hb = b; rxPacket[idx++] = b; break; } if (counter == 2) { crc_lb = b; rxPacket[idx++] = b; counter = 0; crc = (ushort)((crc_hb << 8) | crc_lb); rxCRC = calcCRC(rxPacket, idx); //Debug.WriteLine("server crc " + crc); //Debug.WriteLine("rxcrc" + rxCRC); if (crc != rxCRC) { this.Invoke(tb1, new object[] { "Server BAD CRC: calcCRC=" + word2hexstr(rxCRC) + " | crc=" + word2hexstr(crc) }); this.Invoke(tb1, new object[] { "packet: " + toHexString(rxPacket) }); pck_error = true; crc_error = true; } else { rxState = RX_STATE.RX_END; counter = 0;// } break; } break; case RX_STATE.RX_END: // counter = 0; if (b != (byte)0x56 && b != (byte)0x61) // discard { this.Invoke(tb1, new object[] { "MISSING END! ..." }); this.Invoke(tb1, new object[] { "packet discarded: " + toHexString(rxPacket) }); pck_error = true; end_error = true; } counter++; rxPacket[idx++] = b; if (counter == 2) { rxPacket[idx++] = b; rxOK = true; } // break; } } if (rxOK == true) // response { byte[] p = new byte[idx]; Array.Copy(rxPacket, p, idx); Packet client_packet = new Packet(); client_packet.setPacket(p); this.Invoke(tb1, new object[] { "OK: packet=" + client_packet.toHexString() }); Packet server_packet = processAnswer(client_packet); if (server_packet != null) { soc.Send(server_packet.getRawPacket(), server_packet.getRawPacket().Length, 0); this.Invoke(tb2, new object[] { "packet=" + server_packet.toHexString() }); } else this.Invoke(tb2, new object[] { "failed at processAnswer(): server_packet = null" }); } else { this.Invoke(tb1, new object[] { "RX failed" }); } client.Close(); this.Invoke(tb1, new object[] { "Connection closed" }); } } catch (SocketException ex) { this.Invoke(tb1, new object[] { ex.Message }); this.Invoke(tb2, new object[] { ex.Message }); client.Close(); this.Invoke(tb1, new object[] { "Connection closed after SocketException" }); } catch (Exception exx) { this.Invoke(tb1, new object[] { exx.Message }); this.Invoke(tb2, new object[] { exx.Message }); client.Close(); this.Invoke(tb1, new object[] { "Connection closed after Exception" }); } }
public void OnLogout(Packet packet) { if (Account == null) return; Out.Cyan(string.Format("Client {0} logging out.", this)); Kill(); }