From 8068ba5ca1ea2aef5908e2e42604be27d6ffcf3c Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期四, 06 六月 2019 15:53:19 +0800
Subject: [PATCH] 7152 【后端】每次炼制灵根丹数量随机1-2

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py |  185 ++++++++++++++++++++++++++++++++++++----------
 1 files changed, 144 insertions(+), 41 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py
index fb88005..5ea05d2 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py
@@ -31,6 +31,7 @@
 import EventShell
 import DataRecordPack
 
+import time
 #------------------------------------------------------------------------------
 
 
@@ -41,11 +42,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
 #
@@ -65,6 +71,7 @@
     sendPack.IsPass = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmFBIsOpen)
     NetPackCommon.SendFakePack(curPlayer, sendPack)
     return
+
 
 ## 计算爵位属性
 #  @param curPlayer 玩家
@@ -99,6 +106,7 @@
     PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
     return
 
+
 #// A5 23 提升境界等级 # tagCMRealmLVUp
 #
 #struct    tagCMRealmLVUp
@@ -118,6 +126,26 @@
         if not canLvUp:
             GameWorld.DebugLog('    副本未过关,不能升级境界')
             return
+    #等级判断
+    if curPlayer.GetLV() < realmIpyData.GetNeedLV():
+        return
+    #装备判断
+    needEquip = realmIpyData.GetNeedEquip()
+    if needEquip and len(needEquip) == 3:
+        classLV, color, isSuite = 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
+            if curEquip.GetItemColor() < color:
+                return
+            if isSuite and not curEquip.GetSuiteID():
+                return
     
     needItemID = realmIpyData.GetNeedItemID()
     needItemCount = realmIpyData.GetNeedItemCnt()
@@ -132,32 +160,53 @@
         #扣除物品
         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:
         addBuffID = nextRealmIpyData.GetBuffID()
         if addBuffID:
-            PlayerControl.WorldNotify(0, 'BigRealmUpSuccess', [curPlayer.GetName(), nextRealmLv, IpyGameDataPY.GetFuncCfg('RadioExpRealm')])
+            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(), nextRealmLv])
+            PlayerControl.WorldNotify(0, 'RealmUpSuccess', [curPlayer.GetName(), curPlayer.GetID(), nextRealmLv])
             
     RefreshOfficialAttr(curPlayer)
     GameFuncComm.DoFuncOpenLogic(curPlayer)
     SyncRealmFBState(curPlayer)
+    #更新修为速率
+    UpdateRealmExp(curPlayer, False, True)
+    NotifyRealmExpInfo(curPlayer)
     #境界提升成就
     PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_RealmlvUp, nextRealmLv)
     #更新排行榜
@@ -169,6 +218,7 @@
     DataRecordPack.DR_RealmLVUp(curPlayer, nextRealmLv)
     return True
 
+
 def DologicDujieFBPass(curPlayer, realmLV, star):
     #渡劫通过后处理
     realmIpyData = GetRealmIpyData(realmLV)
@@ -177,48 +227,101 @@
     #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
+

--
Gitblit v1.8.0