internal PBESpecialMessagePacket(PBESpecialMessage message, params object[] parameters) { using (var ms = new MemoryStream()) using (var w = new EndianBinaryWriter(ms, encoding: EncodingType.UTF16)) { w.Write(Code); w.Write(Message = message); var par = new List <object>(); switch (Message) { case PBESpecialMessage.DraggedOut: case PBESpecialMessage.Endure: case PBESpecialMessage.HPDrained: case PBESpecialMessage.Recoil: case PBESpecialMessage.Struggle: { var p0 = (PBEBattlePokemon)parameters[0]; par.Add(p0.Trainer); par.Add(p0.FieldPosition); w.Write(p0.Trainer.Id); w.Write(p0.FieldPosition); break; } case PBESpecialMessage.Magnitude: case PBESpecialMessage.MultiHit: { byte p0 = (byte)parameters[0]; par.Add(p0); w.Write(p0); break; } case PBESpecialMessage.PainSplit: { var p0 = (PBEBattlePokemon)parameters[0]; var p1 = (PBEBattlePokemon)parameters[1]; par.Add(p0.Trainer); par.Add(p0.FieldPosition); par.Add(p1.Trainer); par.Add(p1.FieldPosition); w.Write(p1.Trainer.Id); w.Write(p1.FieldPosition); w.Write(p1.Trainer.Id); w.Write(p1.FieldPosition); break; } } Params = new ReadOnlyCollection <object>(par); Data = new ReadOnlyCollection <byte>(ms.GetBuffer()); } }
internal PBESpecialMessagePacket(PBESpecialMessage message, params object[] parameters) { var bytes = new List <byte>(); bytes.AddRange(BitConverter.GetBytes(Code)); bytes.Add((byte)(Message = message)); var par = new List <object>(); switch (Message) { case PBESpecialMessage.DraggedOut: case PBESpecialMessage.Endure: case PBESpecialMessage.HPDrained: case PBESpecialMessage.Recoil: case PBESpecialMessage.Struggle: { par.Add(((PBEPokemon)parameters[0]).FieldPosition); par.Add(((PBEPokemon)parameters[0]).Team); bytes.Add((byte)((PBEPokemon)parameters[0]).FieldPosition); bytes.Add(((PBEPokemon)parameters[0]).Team.Id); break; } case PBESpecialMessage.Magnitude: { par.Add(parameters[0]); bytes.Add((byte)parameters[0]); break; } case PBESpecialMessage.PainSplit: { par.Add(((PBEPokemon)parameters[0]).FieldPosition); par.Add(((PBEPokemon)parameters[0]).Team); par.Add(((PBEPokemon)parameters[1]).FieldPosition); par.Add(((PBEPokemon)parameters[1]).Team); bytes.Add((byte)((PBEPokemon)parameters[0]).FieldPosition); bytes.Add(((PBEPokemon)parameters[0]).Team.Id); bytes.Add((byte)((PBEPokemon)parameters[1]).FieldPosition); bytes.Add(((PBEPokemon)parameters[1]).Team.Id); break; } } Params = new ReadOnlyCollection <object>(par); bytes.InsertRange(0, BitConverter.GetBytes((short)bytes.Count)); Buffer = new ReadOnlyCollection <byte>(bytes); }
public static bool VerifySpecialMessageHappened(this PBEBattle battle, PBESpecialMessage message, params object[] p) { foreach (IPBEPacket packet in battle.Events) { if (packet is PBESpecialMessagePacket smp && smp.Message == message && p.Length == smp.Params.Count) { for (int i = 0; i < p.Length; i++) { if (!p[i].Equals(smp.Params[i])) { goto nope; } } return(true); } nope: ; } return(false); }