From 751709e3494aad919e4313c26066be24e2d4bf8a Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期四, 09 五月 2019 14:10:54 +0800 Subject: [PATCH] 6711 【后端】【2.0】洗练从0级开始洗练 --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerPrestigeSys.py | 281 ++++++++++++++++++++++++++++++++------------------------ 1 files changed, 160 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 8628949..5629cf1 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,77 @@ 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 + + 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) - realmIpyData = GetRealmIpyData(curRealmLV) - needRealmPoint = realmIpyData.GetNeedPoint() if realmIpyData else 0 - DataRecordPack.DR_RealmLVUp(curPlayer, nextRealmLv, realmPoint, needRealmPoint) - 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 +194,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