private void OnReceiveData(IAsyncResult ar) { var client = ar.AsyncState as PBEServerClient; if (client.IsConnected) { try { if (client.Socket.Poll(0, SelectMode.SelectRead) && client.Socket.Available <= 0) { DisconnectClient(client); } else { byte[] data = client.Buffer; if (_encryption != null) { data = _encryption.Decrypt(data); } client.FirePacketReceived(PBEPacketProcessor.CreatePacket(Battle, data)); BeginReceive(client); } } catch (Exception ex) { NotifyError(ex); DisconnectClient(client); } } }
private PBEBattle(BinaryReader r) { ushort version = r.ReadUInt16(); Settings = new PBESettings(r); Settings.MakeReadOnly(); BattleFormat = (PBEBattleFormat)r.ReadByte(); Teams = new PBETeams(this); var packetProcessor = new PBEPacketProcessor(this); int numEvents = r.ReadInt32(); for (int i = 0; i < numEvents; i++) { INetPacket packet = packetProcessor.CreatePacket(r.ReadBytes(r.ReadInt16())); switch (packet) { case PBEWinnerPacket wp: { Winner = wp.WinningTeam; break; } } Events.Add(packet); } BattleState = PBEBattleState.Ended; OnStateChanged?.Invoke(this); }
private void OnReceiveData(IAsyncResult ar) { if (IsConnected) { try { if (_socket.Poll(0, SelectMode.SelectRead) && _socket.Available <= 0) { Disconnect(true); } else { byte[] data = _buffer; if (_encryption != null) { data = _encryption.Decrypt(data); } PacketReceived?.Invoke(this, PBEPacketProcessor.CreatePacket(Battle, data)); BeginReceive(); } } catch (Exception ex) { NotifyError(ex); Disconnect(true); } } }
public static PBEBattle LoadReplay(string path) { byte[] fileBytes = File.ReadAllBytes(path); using (var s = new MemoryStream(fileBytes)) using (var r = new EndianBinaryReader(s)) { byte[] hash; using (var md5 = MD5.Create()) { hash = md5.ComputeHash(fileBytes, 0, fileBytes.Length - 16); } for (int i = 0; i < 16; i++) { if (hash[i] != fileBytes[fileBytes.Length - 16 + i]) { throw new InvalidDataException(); } } ushort version = r.ReadUInt16(); PBEBattle b = null; int numEvents = r.ReadInt32(); for (int i = 0; i < numEvents; i++) { IPBEPacket packet = PBEPacketProcessor.CreatePacket(b, r.ReadBytes(r.ReadUInt16())); if (packet is PBEBattlePacket bp) { b = new PBEBattle(bp); } b.Events.Add(packet); } b.BattleState = PBEBattleState.Ended; b.OnStateChanged?.Invoke(b); return(b); } }
public static PBEBattle LoadReplay(string path) { byte[] fileBytes = File.ReadAllBytes(path); using (var s = new MemoryStream(fileBytes)) using (var r = new EndianBinaryReader(s, encoding: EncodingType.UTF16)) { byte[] hash; using (var md5 = MD5.Create()) { hash = md5.ComputeHash(fileBytes, 0, fileBytes.Length - 16); } for (int i = 0; i < 16; i++) { if (hash[i] != fileBytes[fileBytes.Length - 16 + i]) { throw new InvalidDataException(); } } ushort version = r.ReadUInt16(); // Unused for now int seed = r.ReadInt32(); // Unused for now PBEBattle b = null; int numEvents = r.ReadInt32(); for (int i = 0; i < numEvents; i++) { IPBEPacket packet = PBEPacketProcessor.CreatePacket(b, r.ReadBytes(r.ReadUInt16())); if (packet is PBEBattlePacket bp) { b = new PBEBattle(bp); } else if (packet is PBEWildPkmnAppearedPacket wpap) { PBETrainer wildTrainer = b.Teams[1].Trainers[0]; foreach (PBEPkmnAppearedInfo info in wpap.Pokemon) { PBEBattlePokemon pkmn = wildTrainer.TryGetPokemon(info.Pokemon); // Process disguise and position now pkmn.FieldPosition = info.FieldPosition; if (info.IsDisguised) { pkmn.Status2 |= PBEStatus2.Disguised; pkmn.KnownCaughtBall = info.CaughtBall; pkmn.KnownGender = info.Gender; pkmn.KnownNickname = info.Nickname; pkmn.KnownShiny = info.Shiny; pkmn.KnownSpecies = info.Species; pkmn.KnownForm = info.Form; IPBEPokemonData pData = PBEDataProvider.Instance.GetPokemonData(info); pkmn.KnownType1 = pData.Type1; pkmn.KnownType2 = pData.Type2; } b.ActiveBattlers.Add(pkmn); } } b.Events.Add(packet); } b.BattleState = PBEBattleState.Ended; return(b); } }
public static PBEBattle LoadReplay(string path) { PBESettings settings = PBESettings.DefaultSettings; byte[] fileBytes = File.ReadAllBytes(path); using (var s = new MemoryStream(fileBytes)) using (var r = new BinaryReader(s)) { using (var md5 = MD5.Create()) { byte[] hash = md5.ComputeHash(fileBytes, 0, fileBytes.Length - 16); for (int i = 0; i < 16; i++) { if (hash[i] != fileBytes[fileBytes.Length - 16 + i]) { throw new InvalidDataException(); } } } ushort version = r.ReadUInt16(); var battle = new PBEBattle((PBEBattleFormat)r.ReadByte(), settings); battle.Teams[0].TrainerName = PBEUtils.StringFromBytes(r); var party = new PBEPokemonShell[r.ReadSByte()]; for (int i = 0; i < party.Length; i++) { party[i] = PBEPokemonShell.FromBytes(r, settings); } battle.Teams[0].CreateParty(party, ref battle.pkmnIdCounter); battle.Teams[1].TrainerName = PBEUtils.StringFromBytes(r); party = new PBEPokemonShell[r.ReadSByte()]; for (int i = 0; i < party.Length; i++) { party[i] = PBEPokemonShell.FromBytes(r, settings); } battle.Teams[1].CreateParty(party, ref battle.pkmnIdCounter); var packetProcessor = new PBEPacketProcessor(battle); INetPacket packet; do { byte[] buffer = r.ReadBytes(r.ReadInt16()); packet = packetProcessor.CreatePacket(buffer); battle.Events.Add(packet); } while (!(packet is PBEWinnerPacket)); return(battle); } }