ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Success.py
@@ -15,135 +15,96 @@
#"""Version = 2020-03-31 18:00"""
#-------------------------------------------------------------------------------
import ChConfig
import ShareDefine
import PlayerSuccess
import IpyGameDataPY
import GameWorld
import PlayerControl
#逻辑实现
## GM命令执行入口
#  @param curPlayer 当前玩家
#  @param msgList 参数列表 [npcID]
#  @return None
#  @remarks 函数详细说明.
def OnExec(curPlayer, msgList):
    if not msgList:
        GameWorld.DebugAnswer(curPlayer, "重置所有成就: Success 0")
        GameWorld.DebugAnswer(curPlayer, "重置指定成就: Success 0 类型")
        GameWorld.DebugAnswer(curPlayer, "重置成就领奖: Success w 类型")
        GameWorld.DebugAnswer(curPlayer, "输出成就数据: Success p 类型")
        #GameWorld.DebugAnswer(curPlayer, "增加成就进度: Success a 类型 进度 条件(选填)")
        #GameWorld.DebugAnswer(curPlayer, "更新成就进度: Success u 类型 进度 条件(选填)")
        GameWorld.DebugAnswer(curPlayer, "重置成就: Success 0 [类型 ...]")
        GameWorld.DebugAnswer(curPlayer, "输出成就: Success p 类型")
        GameWorld.DebugAnswer(curPlayer, "增加进度: Success a 类型 进度 [条件 ...]")
        GameWorld.DebugAnswer(curPlayer, "更新进度: Success u 类型 进度 [条件 ...]")
        return
    
    cmdType = msgList[0]
    # 重置数据
    if cmdType == 0:
        __DoResetSuccess(curPlayer, msgList)
    # 重置领奖
    elif cmdType == "w":
        __DoResetSuccessAward(curPlayer, msgList)
    # 输出数据
    elif cmdType == "p":
        __DoPrintSuccess(curPlayer, msgList)
    # 增加进度
    elif cmdType == "a":
        pass
        succType = msgList[1] if len(msgList) > 1 else 0
        addValue = msgList[2] if len(msgList) > 2 else 1
        conds = msgList[3:]
        GameWorld.DebugAnswer(curPlayer, "增加成就进度: T:%s,V:%s,C:%s" % (succType, addValue, conds))
        PlayerSuccess.DoAddSuccessProgress(curPlayer, succType, addValue, conds)
    # 更新进度
    elif cmdType == "u":
        pass
        succType = msgList[1] if len(msgList) > 1 else 0
        newCnt = msgList[2] if len(msgList) > 2 else 1
        conds = msgList[3:]
        GameWorld.DebugAnswer(curPlayer, "更新成就进度: T:%s,V:%s,C:%s" % (succType, addValue, conds))
        PlayerSuccess.UptateSuccessProgress(curPlayer, succType, newCnt, conds)
    return
def __DoResetSuccess(curPlayer, msgList):
def __DoResetSuccess(curPlayer, msgList, resetValue=True):
    ## 重置成就数据
    if len(msgList) > 1:
        typeList = [msgList[1]]
    else:
        typeList = ShareDefine.SuccessTypeList
    resetTypeList = []
    for succType in typeList:
        succDataList = PlayerSuccess.GetSuccDataMng().GetSuccDataByType(succType)
        if not succDataList:
            continue
        for succDataObj in succDataList:
            succID = succDataObj.succID
            if succType not in resetTypeList:
                resetTypeList.append(succType)
            PlayerSuccess.SetSuccHasGot(curPlayer, succID, False)
            PlayerSuccess.SetSuccPassportAwardHasGot(curPlayer, succID, False)
            PlayerSuccess.SetSuccFinish(curPlayer, succID, False)
            PlayerSuccess.SetPDictValue(curPlayer, ChConfig.Def_PDict_Success_LastDay % (succID), 0)
            PlayerSuccess.SetSuccFinishValue(curPlayer, succType, succDataObj.condition, 0)
    # 老玩家上线检查情况
    PlayerSuccess.SetPDictValue(curPlayer, ChConfig.Def_PDict_Success_CheckVersion, 0)
    # 同步成就信息
    PlayerSuccess.Sync_SuccessInfo(curPlayer, [], True)
    # 同步成就领奖记录
    PlayerSuccess.Sync_SuccTypeIndexAwardRecord(curPlayer, [], True)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Success_ScoreAward, 0)
    PlayerSuccess.Sync_SuccessScoreAward(curPlayer)
    GameWorld.DebugAnswer(curPlayer, "重置成就类型:%s" % resetTypeList)
    return
def __DoResetSuccessAward(curPlayer, msgList):
    ## 重置成就领奖
    if len(msgList) > 1:
        typeList = [msgList[1]]
        typeList = msgList[1:]
    else:
        typeList = ShareDefine.SuccessTypeList
        
    resetIDList = []
    succIDList = []
    syncTypeCondList = []
    for succType in typeList:
        succDataList = PlayerSuccess.GetSuccDataMng().GetSuccDataByType(succType)
        if not succDataList:
        ipyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("Success", succType)
        if not ipyDataList:
            continue
        for succDataObj in succDataList:
            succID = succDataObj.succID
            if not PlayerSuccess.GetSuccHasGot(curPlayer, succID) and not PlayerSuccess.GetSuccPassportAwardHasGot(curPlayer, succID):
                continue
            PlayerSuccess.SetSuccHasGot(curPlayer, succID, False)
            PlayerSuccess.SetSuccPassportAwardHasGot(curPlayer, succID, False)
            PlayerSuccess.SetSuccFinish(curPlayer, succID) # 有重置领奖的ID需要重新设置为已完成
            resetIDList.append(succID)
        for ipyData in ipyDataList:
            succID = ipyData.GetSuccID()
            conds = ipyData.GetCondition()
            
    # 同步成就领奖记录
    PlayerSuccess.Sync_SuccTypeIndexAwardRecord(curPlayer, resetIDList, True)
    GameWorld.DebugAnswer(curPlayer, "重置成就ID领奖:%s" % resetIDList)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_Success_ScoreAward, 0)
    PlayerSuccess.Sync_SuccessScoreAward(curPlayer)
            if PlayerSuccess.GetSuccHasGot(curPlayer, succID):
                succIDList.append(succID)
                PlayerSuccess.SetSuccHasGot(curPlayer, succID, False)
            if [succType, conds] not in syncTypeCondList:
                syncTypeCondList.append([succType, conds])
                PlayerSuccess.SetSuccValue(curPlayer, succType, conds, 0)
    PlayerSuccess.SyncSuccessInfo(curPlayer, syncTypeCondList, True)
    PlayerSuccess.SyncSuccessAwardRecord(curPlayer, succIDList, True)
    GameWorld.DebugAnswer(curPlayer, "重置成就类型:%s" % typeList)
    return
def __DoPrintSuccess(curPlayer, msgList):
    ## 输出成就数据
    if len(msgList) > 1:
        typeList = [msgList[1]]
        typeList = msgList[1:]
    else:
        typeList = ShareDefine.SuccessTypeList
    GameWorld.DebugAnswer(curPlayer, "--- 输出有进度的成就数据 ---")
    for succType in typeList:
        succDataList = PlayerSuccess.GetSuccDataMng().GetSuccDataByType(succType)
        if not succDataList:
        ipyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("Success", succType)
        if not ipyDataList:
            continue
        printType = False
        for succDataObj in succDataList:
            succID = succDataObj.succID
            value = PlayerSuccess.GetSuccFinishValue(curPlayer, succType, succDataObj.condition)
        for ipyData in ipyDataList:
            succID = ipyData.GetSuccID()
            conds = ipyData.GetCondition()
            needCnt = ipyData.GetNeedCnt()
            value = PlayerSuccess.GetSuccValue(curPlayer, succType, conds)
            if not value:
                continue
            if not printType:
                printType = True
                GameWorld.DebugAnswer(curPlayer, "成就类型: %s" % succType)
            isFinish = PlayerSuccess.GetSuccIsFinish(curPlayer, succID)
                GameWorld.DebugAnswer(curPlayer, "----- 成就类型: %s" % succType)
            hasGot = PlayerSuccess.GetSuccHasGot(curPlayer, succID)
            passportHasGot = PlayerSuccess.GetSuccPassportAwardHasGot(curPlayer, succID)
            GameWorld.DebugAnswer(curPlayer, "    id=%s 条件:%s 进度:%s/%s 完成:%s 领奖:%s %s"
                                  % (succID, succDataObj.condition, value, succDataObj.needCnt, isFinish, hasGot, passportHasGot))
            GameWorld.DebugAnswer(curPlayer, "ID:%s,C:%s,V:%s/%s,奖:%s" % (succID, conds, value, needCnt, hasGot))
            
    return