Beispiel #1
0
        private static void LoadBroadcastTextLocale()
        {
            //                                                  0   1       2              3                4
            var query = new StringBuilder(string.Format("SELECT Id, locale, MaleText_lang, FemaleText_lang, VerifiedBuild FROM {0}.broadcast_text_locale;", Settings.HotfixesDatabase));

            using (var reader = SQLConnector.ExecuteQuery(query.ToString()))
            {
                if (reader == null)
                {
                    return;
                }

                while (reader.Read())
                {
                    var broadcastTextLocale = new BroadcastTextLocale();

                    var id     = (uint)reader.GetValue(0);
                    var locale = (string)reader.GetValue(1);

                    broadcastTextLocale.MaleText_lang   = (string)reader.GetValue(2);
                    broadcastTextLocale.FemaleText_lang = (string)reader.GetValue(3);
                    broadcastTextLocale.VerifiedBuild   = Convert.ToInt16(reader.GetValue(4));

                    BroadcastTextLocaleStores.Add(Tuple.Create(id, locale), broadcastTextLocale);
                }
            }
        }
Beispiel #2
0
        public static void HandleDBReply(Packet packet)
        {
            var type      = packet.ReadUInt32E <DB2Hash>("TableHash");
            var entry     = packet.ReadInt32("RecordID");
            var timeStamp = packet.ReadUInt32();

            packet.AddValue("Timestamp", Utilities.GetDateTimeFromUnixTime(timeStamp));
            var allow = packet.ReadBit("Allow");

            var size    = packet.ReadInt32("Size");
            var data    = packet.ReadBytes(size);
            var db2File = new Packet(data, packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName);

            if (entry < 0 || !allow)
            {
                packet.WriteLine("Row {0} has been removed.", -entry);
                HotfixStoreMgr.RemoveRecord(type, entry);
            }
            else
            {
                switch (type)
                {
                case DB2Hash.BroadcastText:
                {
                    var bct = new BroadcastText()
                    {
                        Text  = db2File.ReadCString("Text"),
                        Text1 = db2File.ReadCString("Text1"),
                    };

                    bct.ID                   = db2File.ReadUInt32("ID");
                    bct.LanguageID           = db2File.ReadByte("LanguageID");
                    bct.ConditionID          = db2File.ReadUInt32("ConditionID");
                    bct.EmotesID             = db2File.ReadUInt16("EmotesID");
                    bct.Flags                = db2File.ReadByte("Flags");
                    bct.ChatBubbleDurationMs = db2File.ReadUInt32("ChatBubbleDurationMs");

                    bct.SoundEntriesID = new uint?[2];
                    for (int i = 0; i < 2; ++i)
                    {
                        bct.SoundEntriesID[i] = db2File.ReadUInt32("SoundEntriesID", i);
                    }

                    bct.EmoteID    = new ushort?[3];
                    bct.EmoteDelay = new ushort?[3];
                    for (int i = 0; i < 3; ++i)
                    {
                        bct.EmoteID[i] = db2File.ReadUInt16("EmoteID", i);
                    }
                    for (int i = 0; i < 3; ++i)
                    {
                        bct.EmoteDelay[i] = db2File.ReadUInt16("EmoteDelay", i);
                    }

                    Storage.BroadcastTexts.Add(bct, packet.TimeSpan);

                    if (ClientLocale.PacketLocale != LocaleConstant.enUS)
                    {
                        BroadcastTextLocale lbct = new BroadcastTextLocale
                        {
                            ID        = bct.ID,
                            TextLang  = bct.Text,
                            Text1Lang = bct.Text1
                        };
                        Storage.BroadcastTextLocales.Add(lbct, packet.TimeSpan);
                    }
                    break;
                }

                default:
                    HotfixStoreMgr.AddRecord(type, entry, db2File);
                    break;
                }

                db2File.ClosePacket(false);
            }
        }
        public static void HandleDBReply(Packet packet)
        {
            var dbReply = packet.Holder.DbReply = new();
            var type    = packet.ReadUInt32E <DB2Hash>("TableHash");

            dbReply.TableHash = (uint)type;
            var entry     = dbReply.RecordId = packet.ReadInt32("RecordID");
            var timeStamp = packet.ReadUInt32();
            var time      = packet.AddValue("Timestamp", Utilities.GetDateTimeFromUnixTime(timeStamp));

            dbReply.Time = Timestamp.FromDateTime(DateTime.SpecifyKind(time, DateTimeKind.Utc));
            int statusBits = ClientVersion.AddedInVersion(ClientVersionBuild.V9_1_0_39185) ? 3 : 2;
            var status     = packet.ReadBitsE <HotfixStatus>("Status", statusBits);

            switch (status)
            {
            case HotfixStatus.Valid:
                dbReply.Status = PacketDbReplyRecordStatus.RecordStatusValid;
                break;

            case HotfixStatus.RecordRemoved:
                dbReply.Status = PacketDbReplyRecordStatus.RecordStatusRecordRemoved;
                break;

            case HotfixStatus.Invalid:
                dbReply.Status = PacketDbReplyRecordStatus.RecordStatusInvalid;
                break;

            case HotfixStatus.NotPublic:
                dbReply.Status = PacketDbReplyRecordStatus.RecordStatusNotPublic;
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            var size    = packet.ReadInt32("Size");
            var data    = packet.ReadBytes(size);
            var db2File = new Packet(data, packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName);

            switch (status)
            {
            case HotfixStatus.Valid:
            {
                switch (type)
                {
                case DB2Hash.BroadcastText:
                {
                    var bct = new BroadcastText()
                    {
                        Text  = db2File.ReadCString("Text"),
                        Text1 = db2File.ReadCString("Text1"),
                    };

                    bct.ID                   = db2File.ReadUInt32("ID");
                    bct.LanguageID           = db2File.ReadInt32("LanguageID");
                    bct.ConditionID          = db2File.ReadUInt32("ConditionID");
                    bct.EmotesID             = db2File.ReadUInt16("EmotesID");
                    bct.Flags                = db2File.ReadByte("Flags");
                    bct.ChatBubbleDurationMs = db2File.ReadUInt32("ChatBubbleDurationMs");

                    bct.SoundEntriesID = new uint?[2];
                    for (int i = 0; i < 2; ++i)
                    {
                        bct.SoundEntriesID[i] = db2File.ReadUInt32("SoundEntriesID", i);
                    }

                    bct.EmoteID    = new ushort?[3];
                    bct.EmoteDelay = new ushort?[3];
                    for (int i = 0; i < 3; ++i)
                    {
                        bct.EmoteID[i] = db2File.ReadUInt16("EmoteID", i);
                    }
                    for (int i = 0; i < 3; ++i)
                    {
                        bct.EmoteDelay[i] = db2File.ReadUInt16("EmoteDelay", i);
                    }

                    Storage.BroadcastTexts.Add(bct, packet.TimeSpan);

                    if (ClientLocale.PacketLocale != LocaleConstant.enUS)
                    {
                        BroadcastTextLocale lbct = new BroadcastTextLocale
                        {
                            ID        = bct.ID,
                            TextLang  = bct.Text,
                            Text1Lang = bct.Text1
                        };
                        Storage.BroadcastTextLocales.Add(lbct, packet.TimeSpan);
                    }

                    dbReply.BroadcastText = new PacketDbReplyBroadcastText()
                    {
                        Id                 = bct.ID.Value,
                        Text0              = bct.Text,
                        Text1              = bct.Text1,
                        Language           = bct.LanguageID.Value,
                        ConditionId        = bct.ConditionID.Value,
                        EmotesId           = bct.EmotesID.Value,
                        Flags              = bct.Flags.Value,
                        ChatBubbleDuration = bct.ChatBubbleDurationMs.Value,
                    };
                    for (int i = 0; i < 2; ++i)
                    {
                        dbReply.BroadcastText.Sounds.Add(bct.SoundEntriesID[i] ?? 0);
                    }
                    for (int i = 0; i < 3; ++i)
                    {
                        dbReply.BroadcastText.Emotes.Add(new BroadcastTextEmote()
                                {
                                    EmoteId = bct.EmoteID[i] ?? 0, Delay = bct.EmoteDelay[i] ?? 0
                                });
                    }
                    break;
                }

                default:
                    HotfixStoreMgr.AddRecord(type, entry, db2File);
                    break;
                }

                if (db2File.Position != db2File.Length)
                {
                    HandleHotfixOptionalData(packet, type, entry, db2File);
                }

                db2File.ClosePacket(false);
                break;
            }

            case HotfixStatus.RecordRemoved:
            {
                packet.WriteLine($"Row {entry} has been removed.");
                HotfixStoreMgr.RemoveRecord(type, entry);
                break;
            }

            case HotfixStatus.Invalid:
            {
                // sniffs from others may have the data
                packet.WriteLine($"Row {entry} is invalid.");
                break;
            }

            case HotfixStatus.NotPublic:
            {
                packet.WriteLine($"Row {entry} is not public.");
                break;
            }

            default:
            {
                packet.WriteLine($"Unhandled status: {status}");
                break;
            }
            }
        }
        public static void HandleDBReply(Packet packet)
        {
            var dbReply = packet.Holder.DbReply = new();
            var type    = packet.ReadUInt32E <DB2Hash>("TableHash");

            dbReply.TableHash = (uint)type;
            var entry     = dbReply.RecordId = packet.ReadInt32("RecordID");
            var timeStamp = packet.ReadUInt32();
            var time      = packet.AddValue("Timestamp", Utilities.GetDateTimeFromUnixTime(timeStamp));

            dbReply.Time = Timestamp.FromDateTime(DateTime.SpecifyKind(time, DateTimeKind.Utc));
            var allow = packet.ReadBit("Allow");

            var size    = packet.ReadInt32("Size");
            var data    = packet.ReadBytes(size);
            var db2File = new Packet(data, packet.Opcode, packet.Time, packet.Direction, packet.Number, packet.Writer, packet.FileName);

            if (entry < 0 || !allow)
            {
                dbReply.Status = PacketDbReplyRecordStatus.RecordStatusRecordRemoved;
                packet.WriteLine("Row {0} has been removed.", -entry);
                HotfixStoreMgr.RemoveRecord(type, entry);
            }
            else
            {
                dbReply.Status = PacketDbReplyRecordStatus.RecordStatusValid;
                switch (type)
                {
                case DB2Hash.BroadcastText:
                {
                    var bct = new BroadcastText()
                    {
                        ID    = (uint)entry,
                        Text  = db2File.ReadCString("Text"),
                        Text1 = db2File.ReadCString("Text1"),
                    };

                    bct.EmoteID    = new ushort?[3];
                    bct.EmoteDelay = new ushort?[3];

                    for (int i = 0; i < 3; ++i)
                    {
                        bct.EmoteID[i] = db2File.ReadUInt16("EmoteID", i);
                    }
                    for (int i = 0; i < 3; ++i)
                    {
                        bct.EmoteDelay[i] = db2File.ReadUInt16("EmoteDelay", i);
                    }

                    bct.EmotesID   = db2File.ReadUInt16("EmotesID");
                    bct.LanguageID = db2File.ReadByte("LanguageID");
                    bct.Flags      = db2File.ReadByte("Flags");

                    if (ClientVersion.AddedInVersion(ClientVersionBuild.V7_3_5_25848))
                    {
                        bct.ConditionID = db2File.ReadUInt32("ConditionID");
                    }

                    bct.SoundEntriesID = new uint?[2];
                    for (int i = 0; i < 2; ++i)
                    {
                        bct.SoundEntriesID[i] = db2File.ReadUInt32("SoundEntriesID", i);
                    }

                    if (ClientVersion.AddedInVersion(ClientVersionBuild.V7_0_3_22248) && ClientVersion.RemovedInVersion(ClientVersionBuild.V7_3_5_25848))
                    {
                        bct.ConditionID = db2File.ReadUInt32("ConditionID");
                    }

                    Storage.BroadcastTexts.Add(bct, packet.TimeSpan);

                    if (ClientLocale.PacketLocale != LocaleConstant.enUS)
                    {
                        BroadcastTextLocale lbct = new BroadcastTextLocale
                        {
                            ID        = bct.ID,
                            TextLang  = bct.Text,
                            Text1Lang = bct.Text1
                        };
                        Storage.BroadcastTextLocales.Add(lbct, packet.TimeSpan);
                    }

                    dbReply.BroadcastText = new PacketDbReplyBroadcastText()
                    {
                        Id                 = bct.ID.Value,
                        Text0              = bct.Text,
                        Text1              = bct.Text1,
                        Language           = bct.LanguageID.Value,
                        ConditionId        = bct.ConditionID ?? 0,
                        EmotesId           = bct.EmotesID.Value,
                        Flags              = bct.Flags.Value,
                        ChatBubbleDuration = 0,
                    };
                    dbReply.BroadcastText.Sounds.Add(bct.SoundEntriesID1 ?? 0);
                    dbReply.BroadcastText.Sounds.Add(bct.SoundEntriesID2 ?? 0);
                    for (int i = 0; i < 3; ++i)
                    {
                        dbReply.BroadcastText.Emotes.Add(new BroadcastTextEmote()
                            {
                                EmoteId = bct.EmoteID[i] ?? 0, Delay = bct.EmoteDelay[i] ?? 0
                            });
                    }
                    break;
                }

                default:
                    HotfixStoreMgr.AddRecord(type, entry, db2File);
                    break;
                }

                db2File.ClosePacket(false);
            }
        }