public void HandleErrorCode(ref PacketBufferReader p) { byte code = p.ReadByte(); PopupMessage = ServerErrorMessages.GetError(p.ID, code); CurrentLoginStep = LoginSteps.PopUpMessage; }
public static ServerListEntry Create(ref PacketBufferReader p) { ServerListEntry entry = new ServerListEntry() { Index = p.ReadUShort(), Name = p.ReadASCII(32).MakeSafe(), PercentFull = p.ReadByte(), Timezone = p.ReadByte(), Address = p.ReadUInt() }; // some server sends invalid ip. try { entry._ipAddress = new IPAddress ( new byte[] { (byte)((entry.Address >> 24) & 0xFF), (byte)((entry.Address >> 16) & 0xFF), (byte)((entry.Address >> 8) & 0xFF), (byte)(entry.Address & 0xFF) } ); } catch (Exception e) { Log.Error(e.ToString()); } entry._pinger.PingCompleted += entry.PingerOnPingCompleted; return(entry); }
public void HandleRelayServerPacket(ref PacketBufferReader p) { byte[] ip = { p.ReadByte(), p.ReadByte(), p.ReadByte(), p.ReadByte() }; ushort port = p.ReadUShort(); uint seed = p.ReadUInt(); NetClient.LoginSocket.Disconnect(); EncryptionHelper.Initialize(false, seed, (ENCRYPTION_TYPE)Settings.GlobalSettings.Encryption); NetClient.Socket.Connect(new IPAddress(ip), port) .ContinueWith ( t => { if (!t.IsFaulted) { NetClient.Socket.EnableCompression(); // TODO: stackalloc byte[] ss = new byte[4] { (byte)(seed >> 24), (byte)(seed >> 16), (byte)(seed >> 8), (byte)seed }; NetClient.Socket.Send(ss, 4, true, true); NetClient.Socket.Send(new PSecondLogin(Account, Password, seed)); } }, TaskContinuationOptions.ExecuteSynchronously ); }
public void UpdateCharacterList(ref PacketBufferReader p) { ParseCharacterList(ref p); if (CurrentLoginStep != LoginSteps.PopUpMessage) { PopupMessage = null; } CurrentLoginStep = LoginSteps.CharacterSelection; UIManager.GetGump <CharacterSelectionGump>()?.Dispose(); _currentGump?.Dispose(); UIManager.Add(_currentGump = new CharacterSelectionGump()); if (!string.IsNullOrWhiteSpace(PopupMessage)) { Gump g = null; g = new LoadingGump(PopupMessage, LoginButtons.OK, (but) => g.Dispose()) { IsModal = true }; UIManager.Add(g); PopupMessage = null; } }
public static PopupMenuData Parse(ref PacketBufferReader p) { ushort mode = p.ReadUShort(); bool isNewCliloc = mode >= 2; uint serial = p.ReadUInt(); byte count = p.ReadByte(); PopupMenuItem[] items = new PopupMenuItem[count]; for (int i = 0; i < count; i++) { ushort hue = 0xFFFF, replaced = 0; int cliloc; ushort index, flags; if (isNewCliloc) { cliloc = (int)p.ReadUInt(); index = p.ReadUShort(); flags = p.ReadUShort(); } else { index = p.ReadUShort(); cliloc = p.ReadUShort() + 3000000; flags = p.ReadUShort(); if ((flags & 0x84) != 0) { p.Skip(2); } if ((flags & 0x40) != 0) { p.Skip(2); } if ((flags & 0x20) != 0) { replaced = (ushort)(p.ReadUShort()); } } if ((flags & 0x01) != 0) { hue = 0x0386; } items[i] = new PopupMenuItem ( cliloc, index, hue, replaced, flags ); } return(new PopupMenuData(serial, items)); }
public void ServerListReceived(ref PacketBufferReader p) { byte flags = p.ReadByte(); ushort count = p.ReadUShort(); DisposeAllServerEntries(); Servers = new ServerListEntry[count]; for (ushort i = 0; i < count; i++) { Servers[i] = ServerListEntry.Create(ref p); } CurrentLoginStep = LoginSteps.ServerSelection; if (Settings.GlobalSettings.AutoLogin || Reconnect) { if (Servers.Length != 0) { int index = GetServerIndexFromSettings(); SelectServer((byte)Servers[index].Index); } } }
public void ServerListReceived(ref PacketBufferReader p) { byte flags = p.ReadByte(); ushort count = p.ReadUShort(); DisposeAllServerEntries(); Servers = new ServerListEntry[count]; for (ushort i = 0; i < count; i++) { Servers[i] = ServerListEntry.Create(ref p); } CurrentLoginStep = LoginSteps.ServerSelection; if (Settings.GlobalSettings.AutoLogin || Reconnect) { if (Servers.Length != 0) { int index = Settings.GlobalSettings.LastServerNum; if (index <= 0 || index > Servers.Length) { Log.Warn($"Wrong server index: {index}"); index = 1; } SelectServer((byte)Servers[index - 1].Index); } } }
public void UpdateCharacterList(ref PacketBufferReader p) { ParseCharacterList(ref p); CurrentLoginStep = LoginSteps.CharacterSelection; UIManager.GetGump <CharacterSelectionGump>()?.Dispose(); _currentGump?.Dispose(); UIManager.Add(_currentGump = new CharacterSelectionGump()); }
private void ParseCharacterList(ref PacketBufferReader p) { int count = p.ReadByte(); Characters = new string[count]; for (ushort i = 0; i < count; i++) { Characters[i] = p.ReadASCII(30).TrimEnd('\0'); p.Skip(30); } }
public void ParsePacket(ref PacketBufferReader p) { byte code = p.ReadByte(); switch (code) { case 0: /* first read of guild member */ byte count = p.ReadByte(); for (int i = 0; i < count; i++) { AddMember(p.ReadUnicode(), p.ReadUInt()); // vengono inviati in modo diverso ora, nome, seriale } break; case 1: // questo messaggio viene inviato quando aggiungo un membro della gilda DeleteMember(p.ReadUInt()); // leggo il seriale break; } }
public void ReceiveCharacterList(ref PacketBufferReader p) { ParseCharacterList(ref p); ParseCities(ref p); World.ClientFeatures.SetFlags((CharacterListFlags)p.ReadUInt()); CurrentLoginStep = LoginSteps.CharacterSelection; uint charToSelect = 0; bool haveAnyCharacter = false; bool tryAutologin = Settings.GlobalSettings.AutoLogin || Reconnect; for (byte i = 0; i < Characters.Length; i++) { if (Characters[i].Length > 0) { haveAnyCharacter = true; if (Characters[i] == Settings.GlobalSettings.LastCharacterName) { charToSelect = i; break; } } } if (tryAutologin && haveAnyCharacter) { SelectCharacter(charToSelect); } else if (!haveAnyCharacter) { StartCharCreation(); } }
public void ParsePacket(ref PacketBufferReader p) { byte code = p.ReadByte(); bool partyGiga487 = false; bool add = false; byte count = 0; switch (code) { case 1: add = true; if (!partyGiga487) { goto case 2; //giga487, trovo molto confuso questa parte di codice, la riscrivo. } else { count = p.ReadByte(); if (count <= 1) { } for (int i = 0; i < count; i++) { uint serial = p.ReadUInt(); //InsertPartyElement(serial, wme.Name); //inserisce l'elemento del party libero Members[i] = new PartyMember(serial); } } break; case 2: count = p.ReadByte(); if (count <= 1) //se ho 2 elementi e ne rimuovo uno { Leader = 0; Inviter = 0; for (int i = 0; i < PARTY_SIZE; i++) { if (Members[i] == null || Members[i].Serial == 0) { break; } BaseHealthBarGump gump = UIManager.GetGump <BaseHealthBarGump>(Members[i].Serial); if (gump != null) { if (code == 2) { Members[i].Serial = 0; } gump.RequestUpdateContents(); } } Clear(); UIManager.GetGump <PartyGump>()?.RequestUpdateContents(); break; } Clear(); uint to_remove = 0xFFFF_FFFF; if (!add) { to_remove = p.ReadUInt(); UIManager.GetGump <BaseHealthBarGump>(to_remove)?.RequestUpdateContents(); } bool remove_all = !add && to_remove == World.Player; int done = 0; for (int i = 0; i < count; i++) { uint serial = p.ReadUInt(); bool remove = !add && serial == to_remove; if (remove && serial == to_remove && i == 0) { remove_all = true; } if (!remove && !remove_all) { if (!Contains(serial)) { Members[i] = new PartyMember(serial); } done++; } if (i == 0 && !remove && !remove_all) { Leader = serial; } BaseHealthBarGump gump = UIManager.GetGump <BaseHealthBarGump>(serial); if (gump != null) { gump.RequestUpdateContents(); } else { if (serial == World.Player) { } } } if (done <= 1 && !add) { for (int i = 0; i < PARTY_SIZE; i++) { if (Members[i] != null && SerialHelper.IsValid(Members[i].Serial)) { uint serial = Members[i].Serial; Members[i] = null; UIManager.GetGump <BaseHealthBarGump>(serial)?.RequestUpdateContents(); } } Clear(); } UIManager.GetGump <PartyGump>()?.RequestUpdateContents(); NetClient.Socket.Send(new PQueryPartyPosition()); break; case 3: case 4: /* questo è il messaggio di chat */ uint ser = p.ReadUInt(); string name = p.ReadUnicode(); for (int i = 0; i < PARTY_SIZE; i++) { if (Members[i] != null && Members[i].Serial == ser) { MessageManager.HandleMessage ( null, name, Members[i].Name, ProfileManager.CurrentProfile.PartyMessageHue, MessageType.Party, 3, TextType.GUILD_ALLY ); break; } } break; case 7: Inviter = p.ReadUInt(); if (ProfileManager.CurrentProfile.PartyInviteGump) { UIManager.Add(new PartyInviteGump(Inviter)); } break; } }
private void ParseCities(ref PacketBufferReader p) { byte count = p.ReadByte(); Cities = new CityInfo[count]; bool isNew = Client.Version >= ClientVersion.CV_70130; string[] descriptions = null; if (!isNew) { descriptions = ReadCityTextFile(count); } Point[] oldtowns = { new Point(105, 130), new Point(245, 90), new Point(165, 200), new Point(395, 160), new Point(200, 305), new Point(335, 250), new Point(160, 395), new Point(100, 250), new Point(270, 130), new Point(0xFFFF, 0xFFFF) }; for (int i = 0; i < count; i++) { CityInfo cityInfo; if (isNew) { byte cityIndex = p.ReadByte(); string cityName = p.ReadASCII(32); string cityBuilding = p.ReadASCII(32); ushort cityX = (ushort)p.ReadUInt(); ushort cityY = (ushort)p.ReadUInt(); sbyte cityZ = (sbyte)p.ReadUInt(); uint cityMapIndex = p.ReadUInt(); uint cityDescription = p.ReadUInt(); p.Skip(4); cityInfo = new CityInfo ( cityIndex, cityName, cityBuilding, ClilocLoader.Instance.GetString((int)cityDescription), cityX, cityY, cityZ, cityMapIndex, isNew ); } else { byte cityIndex = p.ReadByte(); string cityName = p.ReadASCII(31); string cityBuilding = p.ReadASCII(31); cityInfo = new CityInfo ( cityIndex, cityName, cityBuilding, descriptions != null ? descriptions[i] : string.Empty, (ushort)oldtowns[i % oldtowns.Length].X, (ushort)oldtowns[i % oldtowns.Length].Y, 0, 0, isNew ); } Cities[i] = cityInfo; } }
public void ParsePacket(ref PacketBufferReader p) { byte code = p.ReadByte(); bool add = false; switch (code) { case 1: add = true; goto case 2; case 2: byte count = p.ReadByte(); if (count <= 1) { Leader = 0; Inviter = 0; for (int i = 0; i < PARTY_SIZE; i++) { if (Members[i] == null || Members[i].Serial == 0) { break; } BaseHealthBarGump gump = UIManager.GetGump <BaseHealthBarGump>(Members[i].Serial); if (gump != null) { if (code == 2) { Members[i].Serial = 0; } gump.RequestUpdateContents(); } } Clear(); UIManager.GetGump <PartyGump>()?.RequestUpdateContents(); break; } Clear(); uint to_remove = 0xFFFF_FFFF; if (!add) { to_remove = p.ReadUInt(); UIManager.GetGump <BaseHealthBarGump>(to_remove)?.RequestUpdateContents(); } bool remove_all = !add && to_remove == World.Player; int done = 0; for (int i = 0; i < count; i++) { uint serial = p.ReadUInt(); bool remove = !add && serial == to_remove; if (remove && serial == to_remove && i == 0) { remove_all = true; } if (!remove && !remove_all) { if (!Contains(serial)) { Members[i] = new PartyMember(serial); } done++; } if (i == 0 && !remove && !remove_all) { Leader = serial; } BaseHealthBarGump gump = UIManager.GetGump <BaseHealthBarGump>(serial); if (gump != null) { gump.RequestUpdateContents(); } else { if (serial == World.Player) { } } } if (done <= 1 && !add) { for (int i = 0; i < PARTY_SIZE; i++) { if (Members[i] != null && SerialHelper.IsValid(Members[i].Serial)) { uint serial = Members[i].Serial; Members[i] = null; UIManager.GetGump <BaseHealthBarGump>(serial)?.RequestUpdateContents(); } } Clear(); } UIManager.GetGump <PartyGump>()?.RequestUpdateContents(); break; case 3: case 4: uint ser = p.ReadUInt(); string name = p.ReadUnicode(); for (int i = 0; i < PARTY_SIZE; i++) { if (Members[i] != null && Members[i].Serial == ser) { MessageManager.HandleMessage ( null, name, Members[i].Name, ProfileManager.CurrentProfile.PartyMessageHue, MessageType.Party, 3, TextType.GUILD_ALLY ); break; } } break; case 7: Inviter = p.ReadUInt(); if (ProfileManager.CurrentProfile.PartyInviteGump) { UIManager.Add(new PartyInviteGump(Inviter)); } break; } }