From 900edea7e693fd04bdbd2d66c684ae5f709cc7fb Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 15 三月 2021 17:58:32 +0800
Subject: [PATCH] 8854 子 【主干】【BT2】【GM】【后端】后台实现封禁玩家设备ID号后,聊天禁言

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py |   49 +++++++++++++++++++++++++++++++++++++------------
 1 files changed, 37 insertions(+), 12 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index 48c9641..6fc4016 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -5982,17 +5982,41 @@
 
 # 禁言 通知gameServer
 def SetGMForbidenTalk(curPlayer, value):
-    curPlayer.SetGMForbidenTalk(value)
-    curPlayer.SendGameServerRefreshState(ShareDefine.CDBPlayerRefresh_ForbidenTalk, value)
-    curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_ForbidenTalk, value, False)
+    ''' 设置是否禁言
+    @param value: 0-解禁;1-禁言;2-禁设备;3-解设备
+    
+    禁设备流程
+    1.先设置2通知前端写入禁设备记录(前端处理当为2时本地设备标记为禁设备) 
+    2.再设置1,此时前后端状态均为1,即角色禁言
+    
+    解禁设备流程
+    1.先设置3通知前端删除禁设备记录
+    2.再设置0,此时前后端状态均为1,即角色解禁
+    '''
+    __SetGMForbidenTalkValue(curPlayer, value)
     
     #同步设置离线DB玩家账号状态值
     accState = curPlayer.GetAccState()
-    if value:
+    if value == 2:
+        accState = accState | pow(2, ChConfig.Def_PysForbidTalkDevice)
         accState = accState | pow(2, ChConfig.Def_PysForbidTalk)
+    elif value == 1:
+        accState = accState | pow(2, ChConfig.Def_PysForbidTalk)
+    elif value == 3:
+        if (accState & pow(2, ChConfig.Def_PysForbidTalkDevice)):
+            accState = accState ^ pow(2, ChConfig.Def_PysForbidTalkDevice)
+        if (accState & pow(2, ChConfig.Def_PysForbidTalk)):
+            accState = accState ^ pow(2, ChConfig.Def_PysForbidTalk)
     elif (accState & pow(2, ChConfig.Def_PysForbidTalk)) > 0:
         accState = accState ^ pow(2, ChConfig.Def_PysForbidTalk)
     SetPlayerAccState(curPlayer, accState)
+    return
+
+def __SetGMForbidenTalkValue(curPlayer, value):
+    curPlayer.SetGMForbidenTalk(value)
+    curPlayer.SendGameServerRefreshState(ShareDefine.CDBPlayerRefresh_ForbidenTalk, value)
+    curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_ForbidenTalk, value, False)
+    GameWorld.DebugLog("__SetGMForbidenTalkValue %s" % value, curPlayer.GetPlayerID())
     return
 
 def SetPlayerAccState(curPlayer, accState):
@@ -6000,21 +6024,22 @@
     curPlayer.SetExAttr17(accState) # 同步设置该值 0309 封包登录时需要用到
     curPlayer.SendGameServerRefreshState(ShareDefine.CDBPlayerRefresh_ExAttr17, accState)
     curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_ExAttr17, accState, False)
-    GameWorld.DebugLog("SetPlayerAccState %s" % (accState))
+    GameWorld.DebugLog("SetPlayerAccState %s" % (accState), curPlayer.GetPlayerID())
     return
 
 def DoGMForbidenTalkOnLogin(curPlayer):
     ## 离线时被禁言,此时DB的账号状态值为禁言状态,但是GMOper暂时没有禁言操作命令,故上线时检查设置下离线禁言状态
     ## 目前离线时被禁言的,暂时只处理AccState ExAttr17, GMOper命令暂不处理,所以为永久禁言
     
-    if not curPlayer.GetAccState() & pow(2, ChConfig.Def_PysForbidTalk):
+    if curPlayer.GetAccState() & pow(2, ChConfig.Def_PysForbidTalkDevice):
+        GameWorld.Log("上线时角色为被设备禁言状态!", curPlayer.GetPlayerID())
+        __SetGMForbidenTalkValue(curPlayer, 2)
+        __SetGMForbidenTalkValue(curPlayer, 1)
+    elif curPlayer.GetAccState() & pow(2, ChConfig.Def_PysForbidTalk):
+        GameWorld.Log("上线时角色为被禁言状态!", curPlayer.GetPlayerID())
+        __SetGMForbidenTalkValue(curPlayer, 1)
+    else:
         curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_ForbidenTalk, 0, False)
-        return
-    GameWorld.Log("上线时角色为被禁言状态!", curPlayer.GetPlayerID())
-    value = 1
-    curPlayer.SetGMForbidenTalk(value)
-    curPlayer.SendGameServerRefreshState(ShareDefine.CDBPlayerRefresh_ForbidenTalk, value)
-    curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_ForbidenTalk, value, False)
     return
 
 ## 协助目标玩家ID

--
Gitblit v1.8.0