示例#1
0
        public void SetFieldValue(FieldKey key, FieldOperation operation)
        {
            if (!_changedFields.Contains(key))
                _changedFields.Add(key);

            _FieldValues[key] = operation;
        }
示例#2
0
 public Field FindField(FieldKey key)
 {
   Type type = FindType(key);
   Field member = type.FindField(key);
   if (member == null)
   {
     member = type.AddField(key);
   }
   return member;
 }
 public FieldValue(FieldKey fieldKey, object value, string formatString)
     : this(fieldKey, value)
 {
     this.formatString = formatString;
 }
 public FieldValue(FieldKey fieldKey, object value)
     : base()
 {
     this.fieldKey = fieldKey;
     this.value = value;
 }
示例#5
0
        public Field QueryField(FieldKey queryKey)
        {
            Field.Builder field = Field.CreateBuilder().SetKey(queryKey);

            switch ((FieldKeyHelper.Program)queryKey.Program)
            {
                case FieldKeyHelper.Program.D3:
                    if (queryKey.Group == 2 && queryKey.Field == 1) // Banner configuration
                    {
                        field.SetValue(
                            Variant.CreateBuilder().SetMessageValue(BannerConfigurationField.Value.ToByteString()).Build
                                ());
                    }
                    else if (queryKey.Group == 2 && queryKey.Field == 2) //Hero's EntityId
                    {
                        field.SetValue(Variant.CreateBuilder().SetMessageValue(LastPlayedHeroId.ToByteString()).Build());
                    }
                    else if (queryKey.Group == 2 && queryKey.Field == 4) //Unknown Bool
                    {
                        field.SetValue(Variant.CreateBuilder().SetBoolValue(false).Build());
                    }
                    else if (queryKey.Group == 3 && queryKey.Field == 1) // Hero's class (GbidClass)
                    {
                        field.SetValue(Variant.CreateBuilder().SetIntValue(CurrentToon.ClassID).Build());
                    }
                    else if (queryKey.Group == 3 && queryKey.Field == 2) // Hero's current level
                    {
                        field.SetValue(Variant.CreateBuilder().SetIntValue(CurrentToon.Level).Build());
                    }
                    else if (queryKey.Group == 3 && queryKey.Field == 3) // Hero's visible equipment
                    {
                        field.SetValue(
                            Variant.CreateBuilder().SetMessageValue(
                                CurrentToon.HeroVisualEquipmentField.Value.ToByteString()).Build());
                    }
                    else if (queryKey.Group == 3 && queryKey.Field == 4) // Hero's flags (gender and such)
                    {
                        field.SetValue(
                            Variant.CreateBuilder().SetIntValue((uint)(CurrentToon.Flags | ToonFlags.AllUnknowns)).
                                Build());
                    }
                    else if (queryKey.Group == 3 && queryKey.Field == 5) // Toon name
                    {
                        field.SetValue(Variant.CreateBuilder().SetStringValue(CurrentToon.Name).Build());
                    }
                    else if (queryKey.Group == 3 && queryKey.Field == 6)
                    {
                        field.SetValue(Variant.CreateBuilder().SetIntValue(0).Build());
                    }
                    else if (queryKey.Group == 3 && queryKey.Field == 7)
                    {
                        field.SetValue(Variant.CreateBuilder().SetIntValue(0).Build());
                    }
                    else if (queryKey.Group == 4 && queryKey.Field == 1) // Channel ID if the client is online
                    {
                        if (LoggedInClient != null && LoggedInClient.CurrentChannel != null)
                            field.SetValue(
                                Variant.CreateBuilder().SetMessageValue(
                                    LoggedInClient.CurrentChannel.D3EntityId.ToByteString()).Build());
                        else field.SetValue(Variant.CreateBuilder().Build());
                    }
                    else if (queryKey.Group == 4 && queryKey.Field == 2)
                    // Current screen (all known values are just "in-menu"; also see ScreenStatuses sent in ChannelService.UpdateChannelState)
                    {
                        field.SetValue(Variant.CreateBuilder().SetIntValue(ScreenStatus.Screen).Build());
                    }
                    else if (queryKey.Group == 4 && queryKey.Field == 4) //Unknown Bool
                    {
                        field.SetValue(Variant.CreateBuilder().SetBoolValue(false).Build());
                    }
                    else
                    {
                        Logger.Warn("GameAccount Unknown query-key: {0}, {1}, {2}", queryKey.Program, queryKey.Group,
                                    queryKey.Field);
                    }
                    break;
                case FieldKeyHelper.Program.BNet:
                    if (queryKey.Group == 2 && queryKey.Field == 1) //GameAccount Logged in
                    {
                        field.SetValue(Variant.CreateBuilder().SetBoolValue(GameAccountStatusField.Value).Build());
                    }
                    else if (queryKey.Group == 2 && queryKey.Field == 2) // Away status
                    {
                        field.SetValue(Variant.CreateBuilder().SetIntValue((long)AwayStatus).Build());
                    }
                    else if (queryKey.Group == 2 && queryKey.Field == 3) // Program - always D3
                    {
                        field.SetValue(Variant.CreateBuilder().SetFourccValue("D3").Build());
                    }
                    else if (queryKey.Group == 2 && queryKey.Field == 5) // BattleTag
                    {
                        field.SetValue(Variant.CreateBuilder().SetStringValue(Owner.BattleTag).Build());
                    }
                    else if (queryKey.Group == 2 && queryKey.Field == 7) // DBAccount.EntityId
                    {
                        field.SetValue(Variant.CreateBuilder().SetEntityidValue(Owner.BnetEntityId).Build());
                    }
                    else if (queryKey.Group == 2 && queryKey.Field == 10) // AFK
                    {
                        field.SetValue(
                            Variant.CreateBuilder().SetBoolValue(AwayStatus != AwayStatusFlag.Available).Build());
                    }
                    else
                    {
                        Logger.Warn("GameAccount Unknown query-key: {0}, {1}, {2}", queryKey.Program, queryKey.Group,
                                    queryKey.Field);
                    }
                    break;
            }

            return field.HasValue ? field.Build() : null;
        }
示例#6
0
 public void StartField(FieldKey key)
 {
   if (key == null) throw new ArgumentNullException("key");
   _fields.Push(key);
   GetCurrentField();
 }
示例#7
0
        public Field QueryField(FieldKey queryKey)
        {
            Field.Builder field = Field.CreateBuilder().SetKey(queryKey);

            switch ((FieldKeyHelper.Program)queryKey.Program)
            {
            case FieldKeyHelper.Program.D3:
                if (queryKey.Group == 2 && queryKey.Field == 1)     // Banner configuration
                {
                    field.SetValue(
                        Variant.CreateBuilder().SetMessageValue(BannerConfigurationField.Value.ToByteString()).Build
                            ());
                }
                else if (queryKey.Group == 2 && queryKey.Field == 2)     //Hero's EntityId
                {
                    field.SetValue(Variant.CreateBuilder().SetMessageValue(LastPlayedHeroId.ToByteString()).Build());
                }
                else if (queryKey.Group == 2 && queryKey.Field == 4)     //Unknown Bool
                {
                    field.SetValue(Variant.CreateBuilder().SetBoolValue(false).Build());
                }
                else if (queryKey.Group == 3 && queryKey.Field == 1)     // Hero's class (GbidClass)
                {
                    field.SetValue(Variant.CreateBuilder().SetIntValue(CurrentToon.ClassID).Build());
                }
                else if (queryKey.Group == 3 && queryKey.Field == 2)     // Hero's current level
                {
                    field.SetValue(Variant.CreateBuilder().SetIntValue(CurrentToon.Level).Build());
                }
                else if (queryKey.Group == 3 && queryKey.Field == 3)     // Hero's visible equipment
                {
                    field.SetValue(
                        Variant.CreateBuilder().SetMessageValue(
                            CurrentToon.HeroVisualEquipmentField.Value.ToByteString()).Build());
                }
                else if (queryKey.Group == 3 && queryKey.Field == 4)     // Hero's flags (gender and such)
                {
                    field.SetValue(
                        Variant.CreateBuilder().SetIntValue((uint)(CurrentToon.Flags | ToonFlags.AllUnknowns)).
                        Build());
                }
                else if (queryKey.Group == 3 && queryKey.Field == 5)     // Toon name
                {
                    field.SetValue(Variant.CreateBuilder().SetStringValue(CurrentToon.Name).Build());
                }
                else if (queryKey.Group == 3 && queryKey.Field == 6)
                {
                    field.SetValue(Variant.CreateBuilder().SetIntValue(0).Build());
                }
                else if (queryKey.Group == 3 && queryKey.Field == 7)
                {
                    field.SetValue(Variant.CreateBuilder().SetIntValue(0).Build());
                }
                else if (queryKey.Group == 4 && queryKey.Field == 1)     // Channel ID if the client is online
                {
                    if (LoggedInClient != null && LoggedInClient.CurrentChannel != null)
                    {
                        field.SetValue(
                            Variant.CreateBuilder().SetMessageValue(
                                LoggedInClient.CurrentChannel.D3EntityId.ToByteString()).Build());
                    }
                    else
                    {
                        field.SetValue(Variant.CreateBuilder().Build());
                    }
                }
                else if (queryKey.Group == 4 && queryKey.Field == 2)
                // Current screen (all known values are just "in-menu"; also see ScreenStatuses sent in ChannelService.UpdateChannelState)
                {
                    field.SetValue(Variant.CreateBuilder().SetIntValue(ScreenStatus.Screen).Build());
                }
                else if (queryKey.Group == 4 && queryKey.Field == 4)     //Unknown Bool
                {
                    field.SetValue(Variant.CreateBuilder().SetBoolValue(false).Build());
                }
                else
                {
                    Logger.Warn("GameAccount Unknown query-key: {0}, {1}, {2}", queryKey.Program, queryKey.Group,
                                queryKey.Field);
                }
                break;

            case FieldKeyHelper.Program.BNet:
                if (queryKey.Group == 2 && queryKey.Field == 1)     //GameAccount Logged in
                {
                    field.SetValue(Variant.CreateBuilder().SetBoolValue(GameAccountStatusField.Value).Build());
                }
                else if (queryKey.Group == 2 && queryKey.Field == 2)     // Away status
                {
                    field.SetValue(Variant.CreateBuilder().SetIntValue((long)AwayStatus).Build());
                }
                else if (queryKey.Group == 2 && queryKey.Field == 3)     // Program - always D3
                {
                    field.SetValue(Variant.CreateBuilder().SetFourccValue("D3").Build());
                }
                else if (queryKey.Group == 2 && queryKey.Field == 5)     // BattleTag
                {
                    field.SetValue(Variant.CreateBuilder().SetStringValue(Owner.BattleTag).Build());
                }
                else if (queryKey.Group == 2 && queryKey.Field == 7)     // DBAccount.EntityId
                {
                    field.SetValue(Variant.CreateBuilder().SetEntityidValue(Owner.BnetEntityId).Build());
                }
                else if (queryKey.Group == 2 && queryKey.Field == 10)     // AFK
                {
                    field.SetValue(
                        Variant.CreateBuilder().SetBoolValue(AwayStatus != AwayStatusFlag.Available).Build());
                }
                else
                {
                    Logger.Warn("GameAccount Unknown query-key: {0}, {1}, {2}", queryKey.Program, queryKey.Group,
                                queryKey.Field);
                }
                break;
            }

            return(field.HasValue ? field.Build() : null);
        }
示例#8
0
 public static FieldKey Create(Program program, OriginatingClass originatingClass, uint field, ulong index)
 {
     return
         (FieldKey.CreateBuilder().SetProgram((uint)program).SetGroup((uint)originatingClass).SetField(
              field).SetIndex(index).Build());
 }
示例#9
0
 public bnet.protocol.attribute.Variant GetCache(bgs.types.EntityId entity, FieldKey key)
 {
     if (key == null)
     {
         return(null);
     }
     if (!base.ContainsKey(entity))
     {
         return(null);
     }
     PresenceAPI.FieldKeyToPresenceMap item = base[entity];
     if (!item.ContainsKey(key))
     {
         return(null);
     }
     return(item[key]);
 }
示例#10
0
        public void HandlePresenceUpdates(ChannelState channelState, ChannelAPI.ChannelReferenceObject channelRef)
        {
            bgs.types.EntityId high = new bgs.types.EntityId();
            high.hi = channelRef.m_channelData.m_channelId.High;
            high.lo = channelRef.m_channelData.m_channelId.Low;
            FieldKey fieldKey = new FieldKey();

            fieldKey.SetProgram(BnetProgramId.BNET.GetValue());
            fieldKey.SetGroup(1);
            fieldKey.SetField(3);
            FieldKey fieldKey1 = fieldKey;
            List <PresenceUpdate> presenceUpdates = new List <PresenceUpdate>();

            foreach (FieldOperation fieldOperationList in channelState.FieldOperationList)
            {
                if (fieldOperationList.Operation != FieldOperation.Types.OperationType.CLEAR)
                {
                    this.m_presenceCache.SetCache(high, fieldOperationList.Field.Key, fieldOperationList.Field.Value);
                }
                else
                {
                    this.m_presenceCache.SetCache(high, fieldOperationList.Field.Key, null);
                }
                PresenceUpdate boolValue = new PresenceUpdate()
                {
                    entityId   = high,
                    programId  = fieldOperationList.Field.Key.Program,
                    groupId    = fieldOperationList.Field.Key.Group,
                    fieldId    = fieldOperationList.Field.Key.Field,
                    index      = fieldOperationList.Field.Key.Index,
                    boolVal    = false,
                    intVal     = (long)0,
                    stringVal  = string.Empty,
                    valCleared = false,
                    blobVal    = new byte[0]
                };
                if (fieldOperationList.Operation == FieldOperation.Types.OperationType.CLEAR)
                {
                    boolValue.valCleared = true;
                    bool program = fieldKey1.Program == fieldOperationList.Field.Key.Program;
                    bool group   = fieldKey1.Group == fieldOperationList.Field.Key.Group;
                    bool field   = fieldKey1.Field == fieldOperationList.Field.Key.Field;
                    if (program && group && field)
                    {
                        BnetEntityId bnetEntityId = BnetEntityId.CreateFromEntityId(boolValue.entityId);
                        this.m_battleNet.Friends.RemoveFriendsActiveGameAccount(bnetEntityId, fieldOperationList.Field.Key.Index);
                    }
                }
                else if (fieldOperationList.Field.Value.HasBoolValue)
                {
                    boolValue.boolVal = fieldOperationList.Field.Value.BoolValue;
                }
                else if (fieldOperationList.Field.Value.HasIntValue)
                {
                    boolValue.intVal = fieldOperationList.Field.Value.IntValue;
                }
                else if (fieldOperationList.Field.Value.HasStringValue)
                {
                    boolValue.stringVal = fieldOperationList.Field.Value.StringValue;
                }
                else if (fieldOperationList.Field.Value.HasFourccValue)
                {
                    boolValue.stringVal = (new BnetProgramId(fieldOperationList.Field.Value.FourccValue)).ToString();
                }
                else if (fieldOperationList.Field.Value.HasEntityidValue)
                {
                    boolValue.entityIdVal.hi = fieldOperationList.Field.Value.EntityidValue.High;
                    boolValue.entityIdVal.lo = fieldOperationList.Field.Value.EntityidValue.Low;
                    bool flag   = fieldKey1.Program == fieldOperationList.Field.Key.Program;
                    bool group1 = fieldKey1.Group == fieldOperationList.Field.Key.Group;
                    bool field1 = fieldKey1.Field == fieldOperationList.Field.Key.Field;
                    if (flag && group1 && field1)
                    {
                        BnetEntityId bnetEntityId1 = BnetEntityId.CreateFromEntityId(boolValue.entityId);
                        this.m_battleNet.Friends.AddFriendsActiveGameAccount(bnetEntityId1, fieldOperationList.Field.Value.EntityidValue, fieldOperationList.Field.Key.Index);
                    }
                }
                else if (fieldOperationList.Field.Value.HasBlobValue)
                {
                    boolValue.blobVal = fieldOperationList.Field.Value.BlobValue;
                }
                else if (!fieldOperationList.Field.Value.HasMessageValue)
                {
                    continue;
                }
                else if (fieldOperationList.Field.Key.Field != 8)
                {
                    continue;
                }
                else
                {
                    this.FetchRichPresenceResource(fieldOperationList.Field.Value);
                    this.HandleRichPresenceUpdate(boolValue, fieldOperationList.Field.Key);
                    continue;
                }
                presenceUpdates.Add(boolValue);
            }
            presenceUpdates.Reverse();
            this.m_presenceUpdates.AddRange(presenceUpdates);
        }
示例#11
0
        public void HandlePresenceUpdates(ChannelState channelState, ChannelAPI.ChannelReferenceObject channelRef)
        {
            bgs.types.EntityId entityId;
            entityId.hi = channelRef.m_channelData.m_channelId.High;
            entityId.lo = channelRef.m_channelData.m_channelId.Low;
            FieldKey fieldKey = new FieldKey();

            fieldKey.SetProgram(BnetProgramId.BNET.GetValue());
            fieldKey.SetGroup(1u);
            fieldKey.SetField(3u);
            FieldKey fieldKey2         = fieldKey;
            List <PresenceUpdate> list = new List <PresenceUpdate>();

            using (List <FieldOperation> .Enumerator enumerator = channelState.FieldOperationList.GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    FieldOperation current = enumerator.get_Current();
                    if (current.Operation == FieldOperation.Types.OperationType.CLEAR)
                    {
                        this.m_presenceCache.SetCache(entityId, current.Field.Key, null);
                    }
                    else
                    {
                        this.m_presenceCache.SetCache(entityId, current.Field.Key, current.Field.Value);
                    }
                    PresenceUpdate presenceUpdate = default(PresenceUpdate);
                    presenceUpdate.entityId   = entityId;
                    presenceUpdate.programId  = current.Field.Key.Program;
                    presenceUpdate.groupId    = current.Field.Key.Group;
                    presenceUpdate.fieldId    = current.Field.Key.Field;
                    presenceUpdate.index      = current.Field.Key.Index;
                    presenceUpdate.boolVal    = false;
                    presenceUpdate.intVal     = 0L;
                    presenceUpdate.stringVal  = string.Empty;
                    presenceUpdate.valCleared = false;
                    presenceUpdate.blobVal    = new byte[0];
                    if (current.Operation == FieldOperation.Types.OperationType.CLEAR)
                    {
                        presenceUpdate.valCleared = true;
                        bool flag  = fieldKey2.Program == current.Field.Key.Program;
                        bool flag2 = fieldKey2.Group == current.Field.Key.Group;
                        bool flag3 = fieldKey2.Field == current.Field.Key.Field;
                        if (flag && flag2 && flag3)
                        {
                            BnetEntityId entityId2 = BnetEntityId.CreateFromEntityId(presenceUpdate.entityId);
                            this.m_battleNet.Friends.RemoveFriendsActiveGameAccount(entityId2, current.Field.Key.Index);
                        }
                    }
                    else if (current.Field.Value.HasBoolValue)
                    {
                        presenceUpdate.boolVal = current.Field.Value.BoolValue;
                    }
                    else if (current.Field.Value.HasIntValue)
                    {
                        presenceUpdate.intVal = current.Field.Value.IntValue;
                    }
                    else if (current.Field.Value.HasStringValue)
                    {
                        presenceUpdate.stringVal = current.Field.Value.StringValue;
                    }
                    else if (current.Field.Value.HasFourccValue)
                    {
                        presenceUpdate.stringVal = new BnetProgramId(current.Field.Value.FourccValue).ToString();
                    }
                    else if (current.Field.Value.HasEntityidValue)
                    {
                        presenceUpdate.entityIdVal.hi = current.Field.Value.EntityidValue.High;
                        presenceUpdate.entityIdVal.lo = current.Field.Value.EntityidValue.Low;
                        bool flag4 = fieldKey2.Program == current.Field.Key.Program;
                        bool flag5 = fieldKey2.Group == current.Field.Key.Group;
                        bool flag6 = fieldKey2.Field == current.Field.Key.Field;
                        if (flag4 && flag5 && flag6)
                        {
                            BnetEntityId entityId3 = BnetEntityId.CreateFromEntityId(presenceUpdate.entityId);
                            this.m_battleNet.Friends.AddFriendsActiveGameAccount(entityId3, current.Field.Value.EntityidValue, current.Field.Key.Index);
                        }
                    }
                    else if (current.Field.Value.HasBlobValue)
                    {
                        presenceUpdate.blobVal = current.Field.Value.BlobValue;
                    }
                    else
                    {
                        if (!current.Field.Value.HasMessageValue)
                        {
                            continue;
                        }
                        if (current.Field.Key.Field == 8u)
                        {
                            this.FetchRichPresenceResource(current.Field.Value);
                            this.HandleRichPresenceUpdate(presenceUpdate, current.Field.Key);
                            continue;
                        }
                        continue;
                    }
                    list.Add(presenceUpdate);
                }
            }
            list.Reverse();
            this.m_presenceUpdates.AddRange(list);
        }