diff --git a/YuMi/Modules/YMRoom/View/MoreView/Manager/TurboModeStateManager.h b/YuMi/Modules/YMRoom/View/MoreView/Manager/TurboModeStateManager.h index 46327a18..d022dbf7 100644 --- a/YuMi/Modules/YMRoom/View/MoreView/Manager/TurboModeStateManager.h +++ b/YuMi/Modules/YMRoom/View/MoreView/Manager/TurboModeStateManager.h @@ -32,6 +32,12 @@ NS_ASSUME_NONNULL_BEGIN // 🔧 新增:更新礼物特效开关状态(通过 RoomInfo.hasAnimationEffect 更新) - (void)updateGiftEffectsForRoom:(NSString *)roomId enabled:(BOOL)enabled; +// 支持来源标记:fromUser=YES 表示用户手动开关,打上覆盖标记 +- (void)updateGiftEffectsForRoom:(NSString *)roomId enabled:(BOOL)enabled fromUser:(BOOL)fromUser; + +// 用户覆盖标记:用于阻止服务端推送覆盖用户选择 +- (void)setGiftEffectsOverrideForRoom:(NSString *)roomId enabled:(BOOL)enabled; +- (BOOL)isGiftEffectsUserOverriddenForRoom:(NSString *)roomId; // 🔧 新增:获取各开关状态 - (BOOL)isGiftEffectsEnabledForRoom:(NSString *)roomId; diff --git a/YuMi/Modules/YMRoom/View/MoreView/Manager/TurboModeStateManager.m b/YuMi/Modules/YMRoom/View/MoreView/Manager/TurboModeStateManager.m index 93755bdf..aec3a16c 100644 --- a/YuMi/Modules/YMRoom/View/MoreView/Manager/TurboModeStateManager.m +++ b/YuMi/Modules/YMRoom/View/MoreView/Manager/TurboModeStateManager.m @@ -87,11 +87,43 @@ // 🔧 修复:发送通知以便UI能够更新 [[NSNotificationCenter defaultCenter] postNotificationName:kTurboGiftEffectsEnabledChanged object:nil - userInfo:@{@"roomId": roomId, @"on": @(enabled)}]; + userInfo:@{ @"roomId": roomId, @"on": @(enabled) }]; NSLog(@"🎮 TurboModeStateManager: 房间 %@ 礼物特效开关更新为 %@", roomId, enabled ? @"开启" : @"关闭"); } +// 向后兼容:默认视为非用户来源 +- (void)updateGiftEffectsForRoom:(NSString *)roomId enabled:(BOOL)enabled fromUser:(BOOL)fromUser { + if (!roomId) return; + [self ensureRoomSwitchStatesExist:roomId]; + NSMutableDictionary *roomStates = [self.roomSwitchStates[roomId] mutableCopy]; + roomStates[@"giftEffects"] = @(enabled); + if (fromUser) { + roomStates[@"giftEffectsOverride"] = @(YES); + } + self.roomSwitchStates[roomId] = roomStates; + + [[NSNotificationCenter defaultCenter] postNotificationName:kTurboGiftEffectsEnabledChanged + object:nil + userInfo:@{ @"roomId": roomId, @"on": @(enabled) }]; + NSLog(@"🎮 TurboModeStateManager: 房间 %@ 礼物特效开关更新为 %@ (fromUser=%@)", roomId, enabled ? @"开启" : @"关闭", fromUser ? @"YES" : @"NO"); +} + +// 用户覆盖标记控制 +- (void)setGiftEffectsOverrideForRoom:(NSString *)roomId enabled:(BOOL)enabled { + if (!roomId) return; + [self ensureRoomSwitchStatesExist:roomId]; + NSMutableDictionary *roomStates = [self.roomSwitchStates[roomId] mutableCopy]; + roomStates[@"giftEffectsOverride"] = @(enabled); + self.roomSwitchStates[roomId] = roomStates; +} + +- (BOOL)isGiftEffectsUserOverriddenForRoom:(NSString *)roomId { + if (!roomId) return NO; + [self ensureRoomSwitchStatesExist:roomId]; + return [self.roomSwitchStates[roomId][@"giftEffectsOverride"] boolValue]; +} + // 🔧 修复:获取礼物特效开关状态,考虑全局turbo mode影响 - (BOOL)isGiftEffectsEnabledForRoom:(NSString *)roomId { if (!roomId) return NO; @@ -259,6 +291,7 @@ // 礼物特效:按需求不持久化,这里默认开启(面板或 RoomAnimationView 会基于 roomInfo 决定) BOOL giftEffects = YES; + BOOL giftEffectsOverride = NO; id giftScreenObj = [defaults objectForKey:kTurboGlobalGiftScreenEnabledKey(roomId)]; BOOL globalGiftScreen = (giftScreenObj != nil) ? [defaults boolForKey:kTurboGlobalGiftScreenEnabledKey(roomId)] : NO; @@ -438,6 +471,7 @@ // 礼物特效:从房间信息获取,这里先设为默认值 BOOL giftEffects = YES; + BOOL giftEffectsOverride = NO; // 其他三个开关:从 NSUserDefaults 读取 id giftScreenObj = [defaults objectForKey:kTurboGlobalGiftScreenEnabledKey(roomId)]; @@ -451,6 +485,7 @@ self.roomSwitchStates[roomId] = @{ @"giftEffects": @(giftEffects), + @"giftEffectsOverride": @(giftEffectsOverride), @"globalGiftScreen": @(globalGiftScreen), @"globalGameScreen": @(globalGameScreen), @"cpMic": @(cpMic) diff --git a/YuMi/Modules/YMRoom/View/MoreView/View/XPEffectPanelViewController.m b/YuMi/Modules/YMRoom/View/MoreView/View/XPEffectPanelViewController.m index a5b0c70d..b2c60753 100644 --- a/YuMi/Modules/YMRoom/View/MoreView/View/XPEffectPanelViewController.m +++ b/YuMi/Modules/YMRoom/View/MoreView/View/XPEffectPanelViewController.m @@ -211,8 +211,8 @@ TurboModeStateManager *manager = [TurboModeStateManager sharedManager]; if (sender.tag == 0) { // 礼物特效开关 - // 礼物特效开关不持久化,只更新临时状态 - [manager updateGiftEffectsForRoom:self.roomId enabled:isOn]; + // 礼物特效开关不持久化,只更新临时状态,并记录用户覆盖 + [manager updateGiftEffectsForRoom:self.roomId enabled:isOn fromUser:YES]; } else if (sender.tag == 1) { // 全局礼物屏幕 [manager setGlobalGiftScreenEnabledForRoom:self.roomId enabled:isOn]; diff --git a/YuMi/Modules/YMRoom/View/XPRoomViewController.m b/YuMi/Modules/YMRoom/View/XPRoomViewController.m index eed342aa..a00e316a 100644 --- a/YuMi/Modules/YMRoom/View/XPRoomViewController.m +++ b/YuMi/Modules/YMRoom/View/XPRoomViewController.m @@ -1727,7 +1727,10 @@ XPCandyTreeInsufficientBalanceViewDelegate> // 修复:首次获取roominfo成功后,同步礼物特效状态到开关 NSString *roomId = @(roomInfo.roomId).stringValue; [[TurboModeStateManager sharedManager] updateGiftEffectsForRoom:roomId - enabled:roomInfo.hasAnimationEffect]; + enabled:roomInfo.hasAnimationEffect + fromUser:NO]; + // 进入房间后重置用户覆盖标记 + [[TurboModeStateManager sharedManager] setGiftEffectsOverrideForRoom:roomId enabled:NO]; [self requestBoomData]; @@ -2498,6 +2501,16 @@ XPCandyTreeInsufficientBalanceViewDelegate> RoomInfoModel * roomInfo = [RoomInfoModel modelWithDictionary:dic]; self.roomInfo.hasAnimationEffect = roomInfo.hasAnimationEffect; [self.roomHeaderView onRoomUpdate]; + // 同步到 TurboModeStateManager,除非用户已手动覆盖 + { + NSString *roomId = @(self.roomInfo.roomId).stringValue; + BOOL userOverridden = [[TurboModeStateManager sharedManager] isGiftEffectsUserOverriddenForRoom:roomId]; + if (!userOverridden) { + [[TurboModeStateManager sharedManager] updateGiftEffectsForRoom:roomId + enabled:self.roomInfo.hasAnimationEffect + fromUser:NO]; + } + } } break; }