示例#1
0
        private void DoSet(Field field)
        {
            FieldOperation.Builder operation = FieldOperation.CreateBuilder();

            Field.Builder returnField = Field.CreateBuilder().SetKey(field.Key);

            switch ((FieldKeyHelper.Program)field.Key.Program)
            {
            case FieldKeyHelper.Program.D3:
                if (field.Key.Group == 2 && field.Key.Field == 3)     //CurrentActivity
                {
                    returnField.SetValue(field.Value);
                    Logger.Trace("{0} set CurrentActivity to {1}", this, field.Value.IntValue);
                }
                else if (field.Key.Group == 2 && field.Key.Field == 4)     //Unknown bool
                {
                    returnField.SetValue(field.Value);
                    Logger.Trace("{0} set CurrentActivity to {1}", this, field.Value.BoolValue);
                }
                else if (field.Key.Group == 4 && field.Key.Field == 1) //PartyId
                {
                    if (field.Value.HasMessageValue)                   //7727 Sends empty SET instead of a CLEAR -Egris
                    {
                        EntityId entityId = EntityId.ParseFrom(field.Value.MessageValue);
                        Channel  channel  = ChannelManager.GetChannelByEntityId(entityId);
                        if (LoggedInClient.CurrentChannel != channel)
                        {
                            LoggedInClient.CurrentChannel = channel;
                            returnField.SetValue(
                                Variant.CreateBuilder().SetMessageValue(channel.BnetEntityId.ToByteString()).Build());
                            Logger.Trace("{0} set channel to {1}", this, channel);
                        }
                    }
                    else
                    {
                        if (LoggedInClient.CurrentChannel != null)
                        {
                            returnField.SetValue(Variant.CreateBuilder().SetMessageValue(ByteString.Empty).Build());
                            Logger.Warn("Emtpy-field: {0}, {1}, {2}", field.Key.Program, field.Key.Group,
                                        field.Key.Field);
                        }
                    }
                }
                else if (field.Key.Group == 4 && field.Key.Field == 2)     //JoinPermission
                {
                    //catch to stop Logger.Warn spam on client start and exit
                    // should D3.4.2 int64 Current screen (0=in-menus, 1=in-menus, 3=in-menus); see ScreenStatus sent to ChannelService.UpdateChannelState call /raist
                    if (ScreenStatus.Screen != field.Value.IntValue)
                    {
                        ScreenStatus =
                            ScreenStatus.CreateBuilder().SetScreen((int)field.Value.IntValue).SetStatus(0).Build();
                        returnField.SetValue(Variant.CreateBuilder().SetIntValue(field.Value.IntValue).Build());
                        Logger.Trace("{0} set current screen to {1}.", this, field.Value.IntValue);
                    }
                }
                else if (field.Key.Group == 4 && field.Key.Field == 3)     //CallToArmsMessage
                {
                    returnField.SetValue(field.Value);
                }
                else if (field.Key.Group == 4 && field.Key.Field == 4)     //Party IsFull
                {
                    returnField.SetValue(field.Value);
                }
                else if (field.Key.Group == 5 && field.Key.Field == 5)     //Game IsPrivate
                {
                    returnField.SetValue(field.Value);
                }
                else
                {
                    Logger.Warn("GameAccount: Unknown set-field: {0}, {1}, {2} := {3}", field.Key.Program,
                                field.Key.Group, field.Key.Field, field.Value);
                }
                break;

            case FieldKeyHelper.Program.BNet:
                if (field.Key.Group == 2 && field.Key.Field == 2)     // SocialStatus
                {
                    AwayStatus = (AwayStatusFlag)field.Value.IntValue;
                    returnField.SetValue(Variant.CreateBuilder().SetIntValue((long)AwayStatus).Build());
                    Logger.Trace("{0} set AwayStatus to {1}.", this, AwayStatus);
                }
                else if (field.Key.Group == 2 && field.Key.Field == 8)
                {
                    returnField.SetValue((field.Value));
                }
                else if (field.Key.Group == 2 && field.Key.Field == 10)     // AFK
                {
                    returnField.SetValue(field.Value);
                    Logger.Trace("{0} set AFK to {1}.", this, field.Value.BoolValue);
                }
                else
                {
                    Logger.Warn("GameAccount: Unknown set-field: {0}, {1}, {2} := {3}", field.Key.Program,
                                field.Key.Group, field.Key.Field, field.Value);
                }
                break;
            }

            //We only update subscribers on fields that actually change values.
            if (returnField.HasValue)
            {
                operation.SetField(returnField);
                UpdateSubscribers(Subscribers, new List <FieldOperation> {
                    operation.Build()
                });
            }
        }