|  |  |  | 
|---|
|  |  |  | import PlayerState | 
|---|
|  |  |  | import QuestCommon | 
|---|
|  |  |  | import PlayerDogz | 
|---|
|  |  |  | import ChPlayer | 
|---|
|  |  |  | import GMShell | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import random | 
|---|
|  |  |  | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #--------------------------------------------------------------------- | 
|---|
|  |  |  | def SendMailBatch(mailTypeKey, batchPlayerIDList, batchAddItemList=[], batchParamList=[], batchGold=[], batchGoldPaper=[], batchSilver=[]): | 
|---|
|  |  |  | def SendMailBatch(mailTypeKey, batchPlayerIDList, batchAddItemList=[], batchParamList=[], batchGold=[], batchGoldPaper=[], batchSilver=[], batchDetail=[]): | 
|---|
|  |  |  | '''批量发送邮件, 用于瞬间需要发送多封(大量)邮件的,比如一些公共副本活动等结算时 | 
|---|
|  |  |  | @param mailTypeKey: 邮件模板key | 
|---|
|  |  |  | @param batchPlayerIDList: [playerIDList, playerIDList, ...] | 
|---|
|  |  |  | @param batchAddItemList: [addItemList, addItemList, ...] | 
|---|
|  |  |  | @param batchParamList: [paramList, paramList, ...] | 
|---|
|  |  |  | @param batchGold: [batchGold, batchGold, ...] | 
|---|
|  |  |  | @param batchGold: [batchGoldPaper, batchGoldPaper, ...] | 
|---|
|  |  |  | @param batchGold: [batchSilver, batchSilver, ...] | 
|---|
|  |  |  | @param batchGoldPaper: [batchGoldPaper, batchGoldPaper, ...] | 
|---|
|  |  |  | @param batchSilver: [batchSilver, batchSilver, ...] | 
|---|
|  |  |  | @param batchDetail: [记录邮件流向用, ...] | 
|---|
|  |  |  | ''' | 
|---|
|  |  |  | msgInfo = str([mailTypeKey, batchPlayerIDList, batchAddItemList, batchParamList, batchGold, batchGoldPaper, batchSilver]) | 
|---|
|  |  |  | msgInfo = str([mailTypeKey, batchPlayerIDList, batchAddItemList, batchParamList, batchGold, batchGoldPaper, batchSilver, batchDetail]) | 
|---|
|  |  |  | GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "SendMailBatch", msgInfo, len(msgInfo)) | 
|---|
|  |  |  | GameWorld.Log("SendMailBatch %s, batchPlayerIDList=%s, batchAddItemList=%s, batchParamList=%s, batchGold=%s, batchGoldPaper=%s, batchSilver=%s" | 
|---|
|  |  |  | % (mailTypeKey, batchPlayerIDList, batchAddItemList, batchParamList, batchGold, batchGoldPaper, batchSilver)) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def SendMailByKey(mailTypeKey, playerIDList, addItemList, paramList=[], gold=0, goldPaper=0, silver=0): | 
|---|
|  |  |  | def SendMailByKey(mailTypeKey, playerIDList, addItemList, paramList=[], gold=0, goldPaper=0, silver=0, detail=""): | 
|---|
|  |  |  | ''' | 
|---|
|  |  |  | @param detail: 记录邮件流向用 | 
|---|
|  |  |  | ''' | 
|---|
|  |  |  | if not mailTypeKey: | 
|---|
|  |  |  | mailTypeKey = ShareDefine.DefaultLackSpaceMailType | 
|---|
|  |  |  |  | 
|---|
|  |  |  | content = "<MailTemplate>%s</MailTemplate>%s" % (mailTypeKey, json.dumps(paramList, ensure_ascii=False)) | 
|---|
|  |  |  | SendMail("", content, 30, playerIDList, addItemList, gold, goldPaper, silver) | 
|---|
|  |  |  | SendMail("", content, 30, playerIDList, addItemList, gold, goldPaper, silver, detail) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ## 功能发放物品补偿/奖励邮件 | 
|---|
|  |  |  | #  @param addItemList [(itemID, itemCnt, isBind), {或物品信息字典}, ...] | 
|---|
|  |  |  | #  @return | 
|---|
|  |  |  | def SendMail(title, content, getDays, playerIDList, addItemList, gold=0, goldPaper=0, silver=0): | 
|---|
|  |  |  | def SendMail(title, content, getDays, playerIDList, addItemList, gold=0, goldPaper=0, silver=0, detail=""): | 
|---|
|  |  |  | if not playerIDList: | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | for key, itemCnt in itemCountDict.items(): | 
|---|
|  |  |  | itemID, isBind = key | 
|---|
|  |  |  | combineItemList.append((itemID, itemCnt, isBind)) | 
|---|
|  |  |  | cmdList = [title, content, getDays, playerIDList, combineItemList, gold, goldPaper, silver] | 
|---|
|  |  |  | cmdList = [title, content, getDays, playerIDList, combineItemList, gold, goldPaper, silver, detail] | 
|---|
|  |  |  | GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "SendMail", '%s' % (cmdList), len(str(cmdList))) | 
|---|
|  |  |  | return True | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | #---同地图ID, 同分线, 仅切换坐标--- | 
|---|
|  |  |  | #lingID = -1, 代表默认当前线, 如主城2传送剑宗, 到达剑宗2 | 
|---|
|  |  |  | if gameWorld.GetMapID() == mapID and (shuntLineID == -1 or gameWorld.GetLineID() == shuntLineID): | 
|---|
|  |  |  | #重置坐标 | 
|---|
|  |  |  | GameWorld.ResetPlayerPos(curPlayer, posX, posY) | 
|---|
|  |  |  | if exData1: | 
|---|
|  |  |  | #boss的用move,通知前端,由前端发起move | 
|---|
|  |  |  | ChPlayer.NotifyPlayerMove(curPlayer, posX, posY, exData1) | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | #重置坐标 | 
|---|
|  |  |  | GameWorld.ResetPlayerPos(curPlayer, posX, posY) | 
|---|
|  |  |  | #@bug: 在摆摊区快速传送至非摆摊区, 可以摆摊, 这里刷新一下场景Buff | 
|---|
|  |  |  | SkillShell.ProcessMapBuff(curPlayer, GameWorld.GetGameWorld().GetTick()) | 
|---|
|  |  |  | return | 
|---|
|  |  |  | 
|---|
|  |  |  | # 非常规地图之间的切换不处理 | 
|---|
|  |  |  | if curMapID not in PyGameData.g_commMapLinePlayerCountDict or tagMapID not in PyGameData.g_commMapLinePlayerCountDict: | 
|---|
|  |  |  | return tagLineID | 
|---|
|  |  |  | tagLinePlayerCountDict = PyGameData.g_commMapLinePlayerCountDict[tagMapID] | 
|---|
|  |  |  | tagLinePlayerCountDict = PyGameData.g_commMapLinePlayerCountDict[tagMapID] # 此分线包含所有分线,含未开放的及活动分线 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | playerID = curPlayer.GetPlayerID() | 
|---|
|  |  |  | playChangeLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PlayChangeLineID) | 
|---|
|  |  |  | 
|---|
|  |  |  | GameWorld.DebugLog("功能指定切换目标线路,记录当前线路后续切线备用! curLineID=%s,tagLineID=%s" % (curLineID, tagLineID), playerID) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if bossID and NPCCommon.IsMapNeedBossShunt(tagMapID): | 
|---|
|  |  |  | bossShuntLineID = __GetBossShuntLineID(curPlayer, tagMapID, bossID, tagLinePlayerCountDict.keys()) | 
|---|
|  |  |  | bossShuntLineID = __GetBossShuntLineID(curPlayer, curMapID, curLineID, tagMapID, bossID, tagLinePlayerCountDict.keys()) | 
|---|
|  |  |  | if bossShuntLineID != -1: | 
|---|
|  |  |  | tick = GameWorld.GetGameWorld().GetTick() | 
|---|
|  |  |  | GameWorld.DebugLog("分流boss, bossID=%s,bossShuntLineID=%s" % (bossID, bossShuntLineID), playerID) | 
|---|
|  |  |  | 
|---|
|  |  |  | GameWorld.DebugLog("分流到人数较少的线路,tagMapID=%s,linePlayerList[count,lineID]=%s" % (tagMapID, linePlayerList), playerID) | 
|---|
|  |  |  | return shuntLineID | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def __GetBossShuntLineID(curPlayer, mapID, npcID, lineIDList): | 
|---|
|  |  |  | def __GetBossShuntLineID(curPlayer, curMapID, curLineID, tagMapID, npcID, lineIDList): | 
|---|
|  |  |  | '''获取目标地图boss分流线路 | 
|---|
|  |  |  | 根据人数分流玩家,boss死亡状态,只能分流到已死亡线路 | 
|---|
|  |  |  | 队伍无视任何规则,默认分配到队伍队员多的那条线 | 
|---|
|  |  |  | 根据人数分流玩家,优先分配到活着的线路 | 
|---|
|  |  |  | 队伍无视任何规则,默认分配到队伍队员多的那条线 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 前端: | 
|---|
|  |  |  | 1.在中立地图的时候,显示当前线路BOSS的状态 | 
|---|
|  |  |  | 2.在常规地图的时候,显示玩家击杀BOSS的CD时间 | 
|---|
|  |  |  | 3.本地图不换线,60秒规则保持不变 | 
|---|
|  |  |  | 4.进入BOSS区域里,刷新BOSS状态 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 玩家在非中立地图: | 
|---|
|  |  |  | 本地图不换线,60秒规则保持不变() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 玩家在中立地图 | 
|---|
|  |  |  | 没有60秒规则 | 
|---|
|  |  |  | 直接发传送包,由后端决定(有队员在不同线路打同一只boss,则传送,否则move) | 
|---|
|  |  |  | ''' | 
|---|
|  |  |  | playerID = curPlayer.GetPlayerID() | 
|---|
|  |  |  | playerTeamID = curPlayer.GetTeamID() | 
|---|
|  |  |  | 
|---|
|  |  |  | hurtTeamLineID = -1 | 
|---|
|  |  |  | hurtTeamMemCount = -1 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | emptyLineID = -1 | 
|---|
|  |  |  | bossLinePlayerCntList = [] | 
|---|
|  |  |  | bossLinePlayerDict = {1:[-1, []], 0:[-1, []]} # {是否被击杀:[该状态人数空的线路, [[玩家数, 线路], ...]], ...} | 
|---|
|  |  |  |  | 
|---|
|  |  |  | deadLineList = PyGameData.g_bossShuntDeadLine.get(npcID, []) | 
|---|
|  |  |  | bossState = not deadLineList # boss公共状态, 只要有一条线路是死亡的就是死亡 | 
|---|
|  |  |  | bossLineStateDict = PyGameData.g_bossShuntLineState.get(npcID, {}) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | GameWorld.DebugLog("玩家boss分流: playerTeamID=%s,mapID=%s,npcID=%s,lineIDList=%s,bossState=%s,deadLineList=%s,g_bossShuntPlayerInfo=%s" | 
|---|
|  |  |  | % (playerTeamID, mapID, npcID, lineIDList, bossState, deadLineList, PyGameData.g_bossShuntPlayerInfo), playerID) | 
|---|
|  |  |  | haveAliveLine = False # 是否有活着的线路 | 
|---|
|  |  |  | activityMapLineDict = IpyGameDataPY.GetFuncEvalCfg("MapLine", 2, {}) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | GameWorld.DebugLog("玩家boss分流: playerTeamID=%s,tagMapID=%s,npcID=%s,lineIDList=%s,bossLineStateDict=%s,g_bossShuntPlayerInfo=%s" | 
|---|
|  |  |  | % (playerTeamID, tagMapID, npcID, lineIDList, bossLineStateDict, PyGameData.g_bossShuntPlayerInfo), playerID) | 
|---|
|  |  |  | if tagMapID in activityMapLineDict: | 
|---|
|  |  |  | activityLineID = max(0, activityMapLineDict[tagMapID] - 1) | 
|---|
|  |  |  | # 非1线的活动线路不参与分流 | 
|---|
|  |  |  | if activityLineID != 0 and activityLineID in lineIDList: | 
|---|
|  |  |  | lineIDList.remove(activityLineID) | 
|---|
|  |  |  | GameWorld.DebugLog("    非1线的活动线路不参与分流: activityLineID=%s,lineIDList=%s" % (activityLineID, lineIDList), playerID) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for lineID in lineIDList: | 
|---|
|  |  |  | key = (mapID, lineID) | 
|---|
|  |  |  | key = (tagMapID, lineID) | 
|---|
|  |  |  | # boss分流玩家信息{(mapID, lineID):{playerID:[bossID, teamID, relatedTick], ...}, ...} | 
|---|
|  |  |  | shuntPlayerDict = PyGameData.g_bossShuntPlayerInfo.get(key, {}) | 
|---|
|  |  |  | playerCount = 0 | 
|---|
|  |  |  | teamPlayerCount = 0 | 
|---|
|  |  |  | for shuntInfo in shuntPlayerDict.values(): | 
|---|
|  |  |  | for shuntPlayerID, shuntInfo in shuntPlayerDict.items(): | 
|---|
|  |  |  | bossID = shuntInfo[0] | 
|---|
|  |  |  | if npcID != bossID: | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | playerCount += 1 | 
|---|
|  |  |  | shuntTeamID = shuntInfo[1] | 
|---|
|  |  |  | if playerTeamID and playerTeamID == shuntTeamID: | 
|---|
|  |  |  | if playerTeamID and playerTeamID == shuntTeamID and shuntPlayerID != playerID: | 
|---|
|  |  |  | teamPlayerCount += 1 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if teamPlayerCount and teamPlayerCount > hurtTeamMemCount: | 
|---|
|  |  |  | hurtTeamMemCount = teamPlayerCount | 
|---|
|  |  |  | hurtTeamLineID = lineID | 
|---|
|  |  |  |  | 
|---|
|  |  |  | lineBossState = lineID not in deadLineList # 当前线路boss状态 | 
|---|
|  |  |  | if bossState != lineBossState: | 
|---|
|  |  |  | GameWorld.DebugLog("    lineID=%s,lineBossState=%s != bossState=%s,teamPlayerCount=%s,hurtTeamMemCount=%s,hurtTeamLineID=%s" | 
|---|
|  |  |  | % (lineID, lineBossState, bossState, teamPlayerCount, hurtTeamMemCount, hurtTeamLineID), playerID) | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | lineIsAlive = bossLineStateDict.get(lineID, 0) | 
|---|
|  |  |  | lineBossIsDead = 1 if not lineIsAlive else 0 # 当前线路boss是否死亡 | 
|---|
|  |  |  | emptyLineID, linePlayerCountList = bossLinePlayerDict[lineBossIsDead] | 
|---|
|  |  |  | if not playerCount and emptyLineID == -1: | 
|---|
|  |  |  | emptyLineID = lineID | 
|---|
|  |  |  | linePlayerCountList.append([playerCount, lineID]) | 
|---|
|  |  |  | bossLinePlayerDict[lineBossIsDead] = [emptyLineID, linePlayerCountList] | 
|---|
|  |  |  |  | 
|---|
|  |  |  | GameWorld.DebugLog("    lineID=%s,lineBossState=%s,playerCount=%s,teamPlayerCount=%s,hurtTeamMemCount=%s,hurtTeamLineID=%s" | 
|---|
|  |  |  | % (lineID, lineBossState, playerCount, teamPlayerCount, hurtTeamMemCount, hurtTeamLineID), playerID) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if not playerCount: | 
|---|
|  |  |  | if emptyLineID < 0: | 
|---|
|  |  |  | emptyLineID = lineID | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | bossLinePlayerCntList.append([playerCount, lineID]) | 
|---|
|  |  |  | if not lineBossIsDead: | 
|---|
|  |  |  | haveAliveLine = True | 
|---|
|  |  |  |  | 
|---|
|  |  |  | GameWorld.DebugLog("    lineID=%s,lineBossIsDead=%s,playerCount=%s,teamPlayerCount=%s,hurtTeamMemCount=%s,hurtTeamLineID=%s" | 
|---|
|  |  |  | % (lineID, lineBossIsDead, playerCount, teamPlayerCount, hurtTeamMemCount, hurtTeamLineID), playerID) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if hurtTeamLineID >= 0: | 
|---|
|  |  |  | GameWorld.DebugLog("    分流到队友人数多的线路 hurtTeamLineID=%s" % hurtTeamLineID, playerID) | 
|---|
|  |  |  | return hurtTeamLineID | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if not bossLinePlayerCntList: | 
|---|
|  |  |  | GameWorld.DebugLog("    没有人在该boss状态下的线路,默认空新线路!bossState=%s,emptyLineID=%s" % (bossState, emptyLineID), playerID) | 
|---|
|  |  |  | return emptyLineID | 
|---|
|  |  |  | if curMapID == tagMapID and curMapID in IpyGameDataPY.GetFuncEvalCfg("MapLine", 4): | 
|---|
|  |  |  | GameWorld.DebugLog("    中立地图在本地图中默认当前线路 curLineID=%s" % curLineID, playerID) | 
|---|
|  |  |  | return curLineID | 
|---|
|  |  |  |  | 
|---|
|  |  |  | bossLinePlayerCntList.sort() # 升序 | 
|---|
|  |  |  | playerCount, minPlayerCntLineID = bossLinePlayerCntList[0] | 
|---|
|  |  |  | shuntBossIsDead = 0 if haveAliveLine else 1 # 优先分流到活着的线路 | 
|---|
|  |  |  | GameWorld.DebugLog("    boss状态对应线路人数: haveAliveLine=%s, 状态key0为活着: %s" % (haveAliveLine, bossLinePlayerDict)) | 
|---|
|  |  |  | emptyLineID, linePlayerCountList = bossLinePlayerDict[shuntBossIsDead] | 
|---|
|  |  |  | linePlayerCountList.sort() # 升序 | 
|---|
|  |  |  | playerCount, minPlayerCntLineID = linePlayerCountList[0] | 
|---|
|  |  |  | bossShuntPlayerCountMax = IpyGameDataPY.GetFuncCfg("BossShunt", 2) | 
|---|
|  |  |  | if playerCount >= bossShuntPlayerCountMax and emptyLineID >= 0: | 
|---|
|  |  |  | GameWorld.DebugLog("    分流到空新线路 bossState=%s,emptyLineID=%s" % (bossState, emptyLineID), playerID) | 
|---|
|  |  |  | GameWorld.DebugLog("    分流到空新线路 shuntBossIsDead=%s,emptyLineID=%s" % (shuntBossIsDead, emptyLineID), playerID) | 
|---|
|  |  |  | return emptyLineID | 
|---|
|  |  |  |  | 
|---|
|  |  |  | GameWorld.DebugLog("    分流到人数最少的线路 bossState=%s,minPlayerCntLineID=%s,bossLinePlayerCntList=%s" | 
|---|
|  |  |  | % (bossState, minPlayerCntLineID, bossLinePlayerCntList), playerID) | 
|---|
|  |  |  | GameWorld.DebugLog("    分流到人数最少的线路 shuntBossIsDead=%s,minPlayerCntLineID=%s,linePlayerCountList=%s" | 
|---|
|  |  |  | % (shuntBossIsDead, minPlayerCntLineID, linePlayerCountList), playerID) | 
|---|
|  |  |  | return minPlayerCntLineID | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #--------------------------------------------------------------------- | 
|---|
|  |  |  | 
|---|
|  |  |  | #未达到升级经验 | 
|---|
|  |  |  | if curTotalExp < lvUpNeedExp: | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | needSyncTalentPoint = False | 
|---|
|  |  |  | playerNeedDoLVUp = False | 
|---|
|  |  |  | curLV = curPlayer.GetLV() | 
|---|
|  |  |  | maxLV = IpyGameDataPY.GetFuncCfg("PlayerMaxLV", 1) | 
|---|
|  |  |  | 
|---|
|  |  |  | lvIpyData = GetPlayerLVIpyData(curPlayer.GetLV()) | 
|---|
|  |  |  | # 大师天赋点 | 
|---|
|  |  |  | if lvIpyData: | 
|---|
|  |  |  | PlayerGreatMaster.AddGreatMasterSkillPointByLV(curPlayer, lvIpyData.GetTalentPoint()) | 
|---|
|  |  |  | addTalentPoint = lvIpyData.GetTalentPoint() | 
|---|
|  |  |  | if addTalentPoint: | 
|---|
|  |  |  | needSyncTalentPoint = True | 
|---|
|  |  |  | PlayerGreatMaster.AddGreatMasterSkillPointByLV(curPlayer, addTalentPoint) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | EventShell.EventResponse_LVUp(curPlayer)  # 升级触发事件 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | #    NotifyCode(curPlayer, "GeRen_liubo_127574") | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #=================================================================== | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 天赋点通知 | 
|---|
|  |  |  | if needSyncTalentPoint: | 
|---|
|  |  |  | PlayerGreatMaster.Sync_GreatMasterFreeSkillPoint(curPlayer) | 
|---|
|  |  |  | # 升级需要执行的游戏功能处理 | 
|---|
|  |  |  | GameFuncComm.DoFuncOpenLogic(curPlayer) | 
|---|
|  |  |  | ChEquip.CalcEquips_OutOfPrint(curPlayer)    # 缓存绝版属性 | 
|---|
|  |  |  | 
|---|
|  |  |  | speed = int(speed * (ShareDefine.Def_MaxRateValue + buffSpeedPer) / float(ShareDefine.Def_MaxRateValue) + buffSpeed) | 
|---|
|  |  |  | GameWorld.DebugLog("    buff影响后速度值: speed=%s,buffSpeedPer=%s,buffSpeed=%s" % (speed, buffSpeedPer, buffSpeed)) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | speed = max(speed, 0)   #防小于0错误 | 
|---|
|  |  |  | if GetSpeedValue(curPlayer) != speed: | 
|---|
|  |  |  | SetSpeedValue(curPlayer, speed) | 
|---|
|  |  |  | moveSpeed = eval(FormulaControl.GetCompileFormula("MoveSpeed", moveSpeedFormat)) | 
|---|
|  |  |  | 
|---|
|  |  |  | def SetGMForbidenTalk(curPlayer, value): | 
|---|
|  |  |  | curPlayer.SetGMForbidenTalk(value) | 
|---|
|  |  |  | curPlayer.SendGameServerRefreshState(ShareDefine.CDBPlayerRefresh_ForbidenTalk, value) | 
|---|
|  |  |  | curPlayer.SendPropertyRefresh(ShareDefine.CDBPlayerRefresh_ForbidenTalk, value, False) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|