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() }); } }