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 | 301 ++++++++++++++++++++++++++++++--------------------
1 files changed, 180 insertions(+), 121 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 9302651..5ea05d2 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py
@@ -25,19 +25,14 @@
import ShareDefine
import GameWorld
import ChConfig
-import PlayerMagicWeapon
import PlayerSuccess
import OpenServerCampaign
import PlayerBillboard
import EventShell
import DataRecordPack
+import time
#------------------------------------------------------------------------------
-(
-StopSitType1, #离线中断
-StopSitType2, #主动中断
-StopSitType3, #被采集打断
-)=range(1,4)
def DoOfficialOpen(curPlayer):
@@ -47,12 +42,16 @@
# DoRealmLVUpLogic(curPlayer)
return True
+
def OnLogin(curPlayer):
-
SyncRealmFBState(curPlayer)
+ UpdateRealmExp(curPlayer, False)
+ NotifyRealmExpInfo(curPlayer)
return
+
def GetRealmIpyData(realmLV): return IpyGameDataPY.GetIpyGameData("Realm", realmLV)
+
#// A5 24 开启渡劫 #tagCMOpenRealmFB
#
@@ -62,68 +61,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 玩家
@@ -158,6 +106,7 @@
PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
return
+
#// A5 23 提升境界等级 # tagCMRealmLVUp
#
#struct tagCMRealmLVUp
@@ -167,32 +116,97 @@
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) == 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()
+ # 支持不消耗物品升级
+ 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
-def DoRealmLVUpLogic(curPlayer):
+# 提升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)
- realmPoint = PlayerControl.GetMoney(curPlayer, ShareDefine.TYPE_Price_RealmPoint)
- DataRecordPack.DR_RealmLVUp(curPlayer, nextRealmLv, realmPoint)
- #realmIpyData = GetRealmIpyData(curRealmLV)
- #if realmIpyData and realmIpyData.GetIsBigRealm():
- PlayerControl.WorldNotify(0, 'RealmUpSuccess', [curPlayer.GetName(), nextRealmLv])
+ if needSys:
+ 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])
+
RefreshOfficialAttr(curPlayer)
GameFuncComm.DoFuncOpenLogic(curPlayer)
SyncRealmFBState(curPlayer)
+ #更新修为速率
+ UpdateRealmExp(curPlayer, False, True)
+ NotifyRealmExpInfo(curPlayer)
#境界提升成就
PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_RealmlvUp, nextRealmLv)
#更新排行榜
@@ -200,69 +214,114 @@
# 记录开服活动
OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_RealmLV, nextRealmLv)
EventShell.EventRespons_RealmUp(curPlayer, nextRealmLv)
+ #流向
+ 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
+
--
Gitblit v1.8.0