hxp
2020-01-13 12e548e57be573f0b963eefb1865169e9d7e67cc
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py
@@ -25,19 +25,15 @@
import ShareDefine
import GameWorld
import ChConfig
import PlayerMagicWeapon
import PlayerSuccess
import OpenServerCampaign
import ChEquip
import PlayerBillboard
import EventShell
import DataRecordPack
import SkillCommon
import time
#------------------------------------------------------------------------------
(
StopSitType1, #离线中断
StopSitType2, #主动中断
StopSitType3, #被采集打断
)=range(1,4)
def DoOfficialOpen(curPlayer):
@@ -47,11 +43,16 @@
#        DoRealmLVUpLogic(curPlayer)
    return True
def OnLogin(curPlayer):
def OnLogin(curPlayer):
    SyncRealmFBState(curPlayer)
    UpdateRealmExp(curPlayer, False)
    NotifyRealmExpInfo(curPlayer)
    return
def GetRealmIpyData(realmLV): return IpyGameDataPY.GetIpyGameData("Realm", realmLV)
#// A5 24 开启渡劫 #tagCMOpenRealmFB
#
@@ -61,68 +62,17 @@
#};
def OpenRealmFB(index, clientData, tick):
    return
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Official):
        GameWorld.DebugLog("爵位境界功能未开启, 无法开启渡劫!curLV=%s" % curPlayer.GetLV())
        return
    
    if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmFBIsOpen):
        GameWorld.DebugLog("渡劫已开启,无法再次开启!")
        return
    curRealmLV = curPlayer.GetOfficialRank()
    realmIpyData = GetRealmIpyData(curRealmLV)
    if not realmIpyData:
        GameWorld.ErrLog("没有该境界等级数据! Lv=%s" % curRealmLV)
        return
    needRealmPoint = realmIpyData.GetNeedPoint()
    if not needRealmPoint:
        GameWorld.DebugLog("境界已是最大等级,不能升级! Lv=%s" % curRealmLV, curPlayer.GetPlayerID())
        return
    if not PlayerControl.HaveMoney(curPlayer, ShareDefine.TYPE_Price_RealmPoint, needRealmPoint, False):
        GameWorld.DebugLog("境界修炼点不足,无法开启渡劫!needRealmPoint=%s" % (needRealmPoint), curPlayer.GetPlayerID())
        return
    needActiveTreasureDict = realmIpyData.GetNeedActiveTreasure()
    for mwType, needActiveCnt in needActiveTreasureDict.items():
        activeCnt = PlayerMagicWeapon.GetMWActiveCntByType(curPlayer, mwType)
        if activeCnt < needActiveCnt:
            GameWorld.DebugLog("开启渡劫 需要法宝的激活条件不满足! needActiveTreasureDict=%s,法宝类型=%s, 已激活数量=%s" % (needActiveTreasureDict, mwType, activeCnt))
            return
    needItemID = realmIpyData.GetNeedItemID()
    needItemCount = realmIpyData.GetNeedItemCnt()
    # 支持不消耗物品升级
    if needItemID > 0 and needItemCount > 0:
        curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
        hasEnough, itemIndexList = ItemCommon.GetItem_FromPack_ByID(needItemID, curPack, needItemCount)
        if not hasEnough:
            GameWorld.DebugLog("渡劫开启, 材料不足! Lv=%s, needItemID=%s,needItemCount=%s"
                               % (curRealmLV, needItemID, needItemCount))
            return
        #扣除物品
        ItemCommon.ReduceItem(curPlayer, curPack, itemIndexList, needItemCount, True, "Realm")
    PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_RealmPoint, needRealmPoint)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmFBIsOpen, 1)
    SyncRealmFBState(curPlayer)
    GameWorld.Log("开启渡劫副本成功: curRealmLV=%s" % curRealmLV, curPlayer.GetPlayerID())
    return
def SyncRealmFBState(curPlayer):
    #通知客户端渡劫副本是否开启
    return
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Official):
        return
    sendPack = ChPyNetSendPack.tagMCSyncRealmFBIsOpen()
    sendPack.IsOpen = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmFBIsOpen)
    sendPack.SitAllTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmSitAllTime)
    sendPack.SitRemainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmSitRemainTime)
    sendPack.SitStartTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmSitStartTime)
    #sendPack.LastEnterTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmFBLastEnterTime)
    sendPack = ChPyNetSendPack.tagMCSyncRealmInfo()
    sendPack.IsPass = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmFBIsOpen)
    NetPackCommon.SendFakePack(curPlayer, sendPack)
    return
## 计算爵位属性
#  @param curPlayer 玩家
@@ -157,6 +107,7 @@
    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
    return
#// A5 23 提升境界等级 # tagCMRealmLVUp
#
#struct    tagCMRealmLVUp
@@ -166,104 +117,223 @@
def DoRealmLVUp(index, clientData, tick):
    #升级境界
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    canLvUp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmFBIsOpen) == 2
    if not canLvUp:
        GameWorld.DebugLog('    不能升级境界')
    curRealmLV = curPlayer.GetOfficialRank()
    realmIpyData = GetRealmIpyData(curRealmLV)
    if not realmIpyData:
        GameWorld.ErrLog("没有该境界等级数据! Lv=%s" % curRealmLV)
        return
    if realmIpyData.GetBossID():
        canLvUp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmFBIsOpen) == 1
        if not canLvUp:
            GameWorld.DebugLog('    副本未过关,不能升级境界')
            return
    #等级判断
    if curPlayer.GetLV() < realmIpyData.GetNeedLV():
        return
    #装备判断
    needEquip = realmIpyData.GetNeedEquip()
    if needEquip and len(needEquip) == 4:
        classLV, star, isSuite, color = needEquip
        equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
        for place in ChConfig.EquipPlace_Base:
            ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, place)
            if not ipyData:
                return
            gridIndex = ipyData.GetGridIndex()
            curEquip = equipPack.GetAt(gridIndex)
            if not ItemCommon.CheckItemCanUse(curEquip):
                return
            curPartStar = ChEquip.GetEquipPartStar(curPlayer, gridIndex)
            if curPartStar < star:
                return
            if isSuite and not curEquip.GetSuiteID():
                return
            if curEquip.GetItemColor() < color:
                return
    needItemID = realmIpyData.GetNeedItemID()
    needItemCount = realmIpyData.GetNeedItemCnt()
    # 支持不消耗物品升级
    if needItemID > 0 and needItemCount > 0:
        curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
        hasEnough, itemIndexList = ItemCommon.GetItem_FromPack_ByID(needItemID, curPack, needItemCount)
        if not hasEnough:
            GameWorld.DebugLog("渡劫开启, 材料不足! Lv=%s, needItemID=%s,needItemCount=%s"
                               % (curRealmLV, needItemID, needItemCount))
            return
        #扣除物品
        ItemCommon.ReduceItem(curPlayer, curPack, itemIndexList, needItemCount, True, "Realm")
    
    DoRealmLVUpLogic(curPlayer)
    return
# 提升1级境界加点
def __DoRealmLVUpAddPoint(curPlayer):
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_AddPoint):
        # 未开启前不可加点,因为DoAddPointOpen会一次性补齐,避免意外情况多加了点数
        return
    curFreePoint = curPlayer.GetFreePoint()
    addPoint = IpyGameDataPY.GetFuncCfg("LVUPAddPoint", 3)
    if addPoint != 0:
        setFreePoint = curFreePoint + addPoint
        DataRecordPack.DR_Freepoint(curPlayer, "RealmLVUp", addPoint)
        curPlayer.SetFreePoint(setFreePoint)
    return
def DoRealmLVUpLogic(curPlayer, needSys=True):
    curRealmLV = curPlayer.GetOfficialRank()
    nextRealmLv = curRealmLV + 1
    GameWorld.DebugLog('    升级境界nextRealmLv=%s'%nextRealmLv)
    GameWorld.DebugLog('    升级境界nextRealmLv=%s' % nextRealmLv)
    nextRealmIpyData = GetRealmIpyData(nextRealmLv)
    if not nextRealmIpyData:
        return
    
    curPlayer.SetOfficialRank(nextRealmLv)
    # 提升1级境界加点
    __DoRealmLVUpAddPoint(curPlayer)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmFBIsOpen, 0)
    if needSys:
        PlayerControl.WorldNotify(0, 'RealmUpSuccess', [curPlayer.GetName(), nextRealmLv])
        addBuffID = nextRealmIpyData.GetBuffID()
        if addBuffID:
            PlayerControl.WorldNotify(0, 'BigRealmUpSuccess', [curPlayer.GetName(), curPlayer.GetID(), nextRealmLv, IpyGameDataPY.GetFuncCfg('RadioExpRealm')])
            msgStr = str(addBuffID)
            GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'RealmUpAddBuff', msgStr, len(msgStr))
        else:
            PlayerControl.WorldNotify(0, 'RealmUpSuccess', [curPlayer.GetName(), curPlayer.GetID(), nextRealmLv])
    SkillCommon.GivePlayerSkillByJobSkillList(curPlayer, nextRealmIpyData.GetLearnSkillIDInfo())
    addFreePoint = nextRealmIpyData.GetAddFreePoint()
    if addFreePoint:
        updFreePoint = curPlayer.GetFreePoint() + addFreePoint
        curPlayer.SetFreePoint(updFreePoint)
        GameWorld.DebugLog("    addFreePoint=%s,updFreePoint=%s" % (addFreePoint, updFreePoint))
    RefreshOfficialAttr(curPlayer)
    GameFuncComm.DoFuncOpenLogic(curPlayer)
    SyncRealmFBState(curPlayer)
    #更新修为速率
    UpdateRealmExp(curPlayer, False, True)
    NotifyRealmExpInfo(curPlayer)
    #境界提升成就
    PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_RealmlvUp, nextRealmLv)
    #更新排行榜
    PlayerBillboard.UpdateRealmBillboard(curPlayer)
    # 记录开服活动
    OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_RealmLV, nextRealmLv)
    #OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_RealmLV, nextRealmLv)
    EventShell.EventRespons_RealmUp(curPlayer, nextRealmLv)
    #流向
    realmPoint = PlayerControl.GetMoney(curPlayer, ShareDefine.TYPE_Price_RealmPoint)
    realmIpyData = GetRealmIpyData(curRealmLV)
    needRealmPoint = realmIpyData.GetNeedPoint() if realmIpyData else 0
    DataRecordPack.DR_RealmLVUp(curPlayer, nextRealmLv, realmPoint, needRealmPoint)
    DataRecordPack.DR_RealmLVUp(curPlayer, nextRealmLv)
    return True
def DologicDujieFBPass(curPlayer, realmLV, star):
    #渡劫通过后处理
    realmIpyData = GetRealmIpyData(realmLV)
    if not realmIpyData:
        return
    needRealmPoint = realmIpyData.GetNeedPoint()
    PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_RealmPoint, needRealmPoint)
    DoRealmLVUpLogic(curPlayer)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmFBIsOpen, 0)
#    sitTimeDict = realmIpyData.GetSitTime()
#    sitSecond = sitTimeDict.get(str(star), 0)
#    if sitSecond == 0:
#        #没有打坐时间,直接升境界
#        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmFBIsOpen, 2)
#    else:
#        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmSitAllTime, sitSecond)
#        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmSitRemainTime, sitSecond)
#    SyncRealmFBState(curPlayer)
    #DoRealmLVUpLogic(curPlayer)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmFBIsOpen, 1)
    SyncRealmFBState(curPlayer)
    
    return
#// A5 0C 使用道具减少渡劫打坐时间 #tagCMReduceSitTime
#// A5 21 境界修为池提取 #tagCMTakeOutRealmExp
#
#struct tagCMReduceSitTime
#struct    tagCMTakeOutRealmExp
#{
#    tagHead        Head;
#    WORD        ItemCnt;       // 道具数量
#};
def OnReduceSitTime(index, clientData, tick):
#    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
#    itemCnt = clientData.ItemCnt
#    reduceSitTimeItemID = IpyGameDataPY.GetFuncCfg('ReduceSitTimeItemID')
#
#    remainTime = __GetRemainSitTime(curPlayer)
#    if remainTime <= 0:
#        GameWorld.DebugLog('使用道具减少渡劫打坐时间 remainTime=%s' % remainTime)
#        return
#    curItem = GameWorld.GetGameData().GetItemByTypeID(reduceSitTimeItemID)
#    curEff = curItem.GetEffectByIndex(0)
#    singleReduceTime = curEff.GetEffectValue(0)
#    useCnt = min(itemCnt, remainTime/singleReduceTime)
#    if not useCnt:
#        GameWorld.DebugLog('使用道具减少渡劫打坐时间 useCnt=%s' % useCnt)
#        return
#
#    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
#    hasEnough, itemList = ItemCommon.GetItem_FromPack_ByID(reduceSitTimeItemID, itemPack, useCnt)
#    if not hasEnough:
#        GameWorld.DebugLog('使用道具减少渡劫打坐时间 道具不足%s' % useCnt)
#        return
#
#    ItemCommon.ReduceItem(curPlayer, itemPack, itemList, useCnt, False)
#
#    reduceTime = useCnt * singleReduceTime
#    sitRemainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmSitRemainTime)
#    newRemainTime = max(0, sitRemainTime-reduceTime)
#    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmSitRemainTime, newRemainTime)
#    GameWorld.DebugLog('使用道具减少渡劫打坐时间 使用道具%s,减少打坐时间%s秒' % (useCnt, reduceTime))
#    SyncRealmFBState(curPlayer)
def OnTakeOutRealmExp(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    playerID = curPlayer.GetID()
    curTotalRealmExp = UpdateRealmExp(curPlayer, False)
    if curTotalRealmExp <= 0:
        GameWorld.DebugLog('境界修为池提取 没有经验可提取', playerID)
        return
    playerControl = PlayerControl.PlayerControl(curPlayer)
    playerControl.AddExp(curTotalRealmExp)
    PlayerControl.NotifyCode(curPlayer, 'TakeOutRealmExp', [curTotalRealmExp])
    #
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmExpBeginTime, int(time.time()))
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmExp, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmExpPoint, 0)
    NotifyRealmExpInfo(curPlayer)
    return
def UpdateRealmExp(curPlayer, isNotify=True, isRealmLVUP=False):
    ##更新境界修为池
    curRealmLV = curPlayer.GetOfficialRank()
    ipyData = GetRealmIpyData(curRealmLV)
    if not ipyData:
        return 0
    if not ipyData.GetExpRate():
        return 0
    curTime = int(time.time())
    beginTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmExpBeginTime)
    if not beginTime:
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmExpBeginTime, curTime)
        return 0
    if isRealmLVUP:
        ipyData = GetRealmIpyData(curRealmLV-1)
    curRealmExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmExp)
    curRealmExpPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmExpPoint)
    curTotalExp = curRealmExpPoint * ChConfig.Def_PerPointValue + curRealmExp
    if curTotalExp >= ipyData.GetExpLimit():
        return curTotalExp
    passSeconds = curTime - beginTime
    if passSeconds <= 0:
        return curTotalExp
    perRealmExpTime = IpyGameDataPY.GetFuncCfg('RealmExpTime')
    curExpRate = ipyData.GetExpRate()
    #buff增加的额外经验
    buffRemainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmExpBuffRemainTime)
    buffAddRate = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmExpBuffAddRate)
    buffTime = min(buffRemainTime, passSeconds)
    addExp = buffTime /perRealmExpTime*(curExpRate*(ShareDefine.Def_MaxRateValue + buffAddRate)/ShareDefine.Def_MaxRateValue) + (passSeconds-buffTime)/perRealmExpTime*curExpRate
    #addExp = passSeconds / perRealmExpTime * curExpRate
    if addExp <= 0:
        return curTotalExp
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmExpBeginTime, curTime)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmExpBuffRemainTime, buffRemainTime - buffTime)
    updTotalExp = min(curTotalExp + addExp, ipyData.GetExpLimit())
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmExp, updTotalExp % ChConfig.Def_PerPointValue)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmExpPoint, updTotalExp / ChConfig.Def_PerPointValue)
    #֪ͨ
    if isNotify:
        NotifyRealmExpInfo(curPlayer)
    return updTotalExp
def AddRealmExpBuffTime(curPlayer, addTime, addRate):
    ##增加会灵丹BUFF时间
    UpdateRealmExp(curPlayer, False)
    remainTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmExpBuffRemainTime)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmExpBuffRemainTime, remainTime + addTime)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmExpBuffAddRate, addRate)
    NotifyRealmExpInfo(curPlayer)
    return
def NotifyRealmExpInfo(curPlayer):
    ##通知修为池信息
    sendPack = ChPyNetSendPack.tagMCRealmExpInfo()
    sendPack.BeginTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmExpBeginTime)
    sendPack.BuffTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmExpBuffRemainTime)
    sendPack.BuffAddRate = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmExpBuffAddRate)
    sendPack.CurExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmExp)
    sendPack.CurExpPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmExpPoint)
    NetPackCommon.SendFakePack(curPlayer, sendPack)
    return