From dc0b92c1e2fe9f3d24c183b325dad54d088735c1 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 10 七月 2025 17:01:24 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_ServerCode
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py | 530 ++++++++++++----------------------------------------------
1 files changed, 115 insertions(+), 415 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index e1bc3fc..020ef1f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -99,8 +99,9 @@
import PlayerCharm
import PlayerTask
import PlayerFace
+import PlayerMail
+import PlayerHero
import ChPlayer
-import GMShell
import GameObj
import random
@@ -338,189 +339,16 @@
#---------------------------------------------------------------------
def SendMailBatch(mailTypeKey, batchPlayerIDList, batchAddItemList=[], batchParamList=[], batchGold=[], batchGoldPaper=[], batchSilver=[], batchDetail=[], moneySource=ChConfig.Def_GiveMoney_Mail, crossMail=False):
- '''批量发送邮件, 用于瞬间需要发送多封(大量)邮件的,比如一些公共副本活动等结算时
- @param mailTypeKey: 邮件模板key
- @param batchPlayerIDList: [playerIDList, playerIDList, ...]
- @param batchAddItemList: [addItemList, addItemList, ...]
- @param batchParamList: [paramList, paramList, ...]
- @param batchGold: [batchGold, batchGold, ...]
- @param batchGoldPaper: [batchGoldPaper, batchGoldPaper, ...]
- @param batchSilver: [batchSilver, batchSilver, ...]
- @param batchDetail: [记录邮件流向用, ...]
- @param moneySource: 货币来源
- '''
-
- copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager()
- for i, playerIDList in enumerate(batchPlayerIDList):
- for playerID in playerIDList[::-1]:
- curPlayer = copyMapPlayerManager.FindPlayerByID(playerID)
- if curPlayer and not curPlayer.GetGameServerInitOK():
- bAddItemList = [batchAddItemList[i]] if len(batchAddItemList) > i else []
- bParamList = [batchParamList[i]] if len(batchParamList) > i else []
- bGold = [batchGold[i]] if len(batchGold) > i else []
- bGoldPaper = [batchGoldPaper[i]] if len(batchGoldPaper) > i else []
- bSilver = [batchSilver[i]] if len(batchSilver) > i else []
- bDetail = [batchDetail[i]] if len(batchDetail) > i else []
- AddUnLoginOKPlayerMailCache(playerID, "ByMailTemplate", [mailTypeKey, bAddItemList, bParamList, bGold, bGoldPaper, bSilver, bDetail, moneySource, crossMail])
- playerIDList.pop(playerIDList.index(playerID))
- continue
-
- msgInfo = str([mailTypeKey, batchPlayerIDList, batchAddItemList, batchParamList, batchGold, batchGoldPaper, batchSilver, batchDetail, moneySource, crossMail])
- GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "SendMailBatch", msgInfo, len(msgInfo))
- GameWorld.Log("SendMailBatch %s, batchPlayerIDList=%s, batchAddItemList=%s, batchParamList=%s, batchGold=%s, batchGoldPaper=%s, batchSilver=%s"
- % (mailTypeKey, batchPlayerIDList, batchAddItemList, batchParamList, batchGold, batchGoldPaper, batchSilver))
+ ## 删除旧版发送邮件,如果功能还有需要,可使用新版本发送邮件 PlayerMail
+ ## 批量发送邮件的一般是活动类型功能,一般都需要用到GameServer
+ ## 所以暂时不兼容使用新版本发送邮件,等相应功能有需要时再同步修改
return
def SendMailByKey(mailTypeKey, playerIDList, addItemList, paramList=[], gold=0, goldPaper=0, silver=0, detail="", moneySource=ChConfig.Def_GiveMoney_Mail, crossMail=False):
- '''
- @param detail: 记录邮件流向用
- '''
- if not mailTypeKey:
- mailTypeKey = ShareDefine.DefaultLackSpaceMailType
-
- content = "<MailTemplate>%s</MailTemplate>%s" % (mailTypeKey, json.dumps(paramList, ensure_ascii=False))
- SendMail("", content, 30, playerIDList, addItemList, gold, goldPaper, silver, detail, moneySource, crossMail)
- return
-
-def SendCrossMail(serverGroupID, mailTypeKey, playerIDList, addItemList, paramList=[]):
- ## 发送跨服邮件
- if not serverGroupID:
- return
- dataMsg = {"MailTypeKey":mailTypeKey, "Player":playerIDList}
- if addItemList:
- dataMsg["Item"] = CombineMailItem(addItemList)
- if paramList:
- dataMsg["Param"] = paramList
- GameWorld.SendMsgToClientServer(ShareDefine.CrossServerMsg_SendMail, dataMsg, [serverGroupID])
- return
-
-def SendEntireMail(mailTypeKey, getDays, limitLV, limitLVType, addItemList=[], paramList=[], \
- gold=0, goldPaper=0, silver=0, detail="", moneySource=ChConfig.Def_GiveMoney_Mail):
- ''' 发送全服邮件
- @param mailTypeKey: 邮件模板key
- @param getDays: 有效天数
- @param limitLV: 领取最低等级限制
- @param limitLVType: 等级不足的升级后是否可领 0-不可,1-可以
- '''
-
- # 有效天数限制
- if not mailTypeKey or getDays <= 0:
- return
-
- # 跨服服务器不允许发送邮件
- if GameWorld.IsCrossServer():
- return
-
- combineItemList = CombineMailItem(addItemList)
- cmdList = [mailTypeKey, getDays, limitLV, limitLVType, combineItemList, paramList, gold, goldPaper, silver, detail, moneySource]
- GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "SendEntireMail", '%s' % (cmdList), len(str(cmdList)))
- GameWorld.Log("发送全服邮件: %s,getDays=%s,limitLV=%s,limitLVType=%s,combineItemList=%s,paramList=%s,gold=%s,goldPaper=%s,silver=%s,detail=%s,moneySource=%s" %
- (mailTypeKey, getDays, limitLV, limitLVType, combineItemList, paramList, gold, goldPaper, silver, detail, moneySource))
- return
-
-## 功能发放物品补偿/奖励邮件
-# @param addItemList [(itemID, itemCnt, 是否拍品), {或物品信息字典}, ...]
-# @return
-def SendMail(title, content, getDays, playerIDList, addItemList, gold=0, goldPaper=0, silver=0, detail="", moneySource=ChConfig.Def_GiveMoney_Mail, crossMail=False):
- if not playerIDList:
- return
-
-# if not addItemList:
-# return
-
- # 有效天数限制
- if getDays <= 0:
- return
-
- # 跨服服务器不允许发送邮件
- if GameWorld.IsCrossServer() and not crossMail:
- return
-
- sendPlayerIDList = []
- copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager()
+ ## 函数先保留,之后功能直接使用 PlayerMail.SendMailByKey
for playerID in playerIDList:
- curPlayer = copyMapPlayerManager.FindPlayerByID(playerID)
- if curPlayer and not curPlayer.GetGameServerInitOK():
- AddUnLoginOKPlayerMailCache(playerID, "ByMailContent", [title, content, getDays, addItemList, gold, goldPaper, silver, detail, moneySource])
- continue
- sendPlayerIDList.append(playerID)
-
- combineItemList = CombineMailItem(addItemList)
- cmdList = [title, content, getDays, sendPlayerIDList, combineItemList, gold, goldPaper, silver, detail, moneySource, crossMail]
- GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "SendMail", '%s' % (cmdList), len(str(cmdList)))
- return True
-
-def AddUnLoginOKPlayerMailCache(playerID, cacheType, mailInfo):
- ''' 添加未登录成功的玩家个人邮件发送缓存
- '''
- if playerID not in PyGameData.g_unLoginOKPlayerMailInfo:
- PyGameData.g_unLoginOKPlayerMailInfo[playerID] = []
- mailList = PyGameData.g_unLoginOKPlayerMailInfo[playerID]
- if [cacheType, mailInfo] in mailList:
- GameWorld.Log("###重复添加GetGameServerInitOK未登录成功的玩家个人邮件发送缓存! 不添加! mailCount=%s, mailInfo=%s"
- % (len(mailList), str(mailInfo)), playerID)
- return
- if len(mailList) >= 30: # 做个限制,防止出问题刷邮件
- GameWorld.Log("###限制添加GetGameServerInitOK未登录成功的玩家个人邮件发送缓存! 超出最大可添加数,不添加! mailCount=%s, mailInfo=%s"
- % (len(mailList), str(mailInfo)), playerID)
- return
- mailList.append([cacheType, mailInfo])
- # curPlayer.GetGameServerInitOK()
- GameWorld.Log("添加GetGameServerInitOK未登录成功的玩家个人邮件发送缓存! 等待发送! mailCount=%s, mailInfo=%s"
- % (len(mailList), str(mailInfo)), playerID)
+ PlayerMail.SendMailByKey(mailTypeKey, playerID, addItemList, paramList)
return
-
-def SendUnLoginOKPlayerMailCache(curPlayer):
- ## 未登录成功的玩家个人邮件发送缓存 - 登录成功后处理
- if not curPlayer.GetGameServerInitOK():
- return
- playerID = curPlayer.GetPlayerID()
- if playerID not in PyGameData.g_unLoginOKPlayerMailInfo:
- return
- mailList = PyGameData.g_unLoginOKPlayerMailInfo.pop(playerID)
- for cacheType, mailInfo in mailList:
- playerIDList = [playerID]
- GameWorld.Log("发送未登录成功时缓存的待发送邮件! cacheType=%s, mailInfo=%s" % (cacheType, str(mailInfo)), playerID)
- if cacheType == "ByMailContent":
- title, content, getDays, addItemList, gold, goldPaper, silver, detail, moneySource = mailInfo
- SendMail(title, content, getDays, playerIDList, addItemList, gold, goldPaper, silver, detail, moneySource)
- elif cacheType == "ByMailTemplate":
- mailTypeKey, bAddItemList, bParamList, bGold, bGoldPaper, bSilver, bDetail, moneySource, crossMail = mailInfo
- SendMailBatch(mailTypeKey, [playerIDList], bAddItemList, bParamList, bGold, bGoldPaper, bSilver, bDetail, moneySource, crossMail)
- return
-
-def CombineMailItem(addItemList):
- ## 合并邮件物品
- itemCountDict = {}
- combineItemList = [] # 合并后的物品列表
- for mailItem in addItemList:
- if isinstance(mailItem, dict):
- combineItemList.append(mailItem)
- continue
-
- if len(mailItem) != 3:
- continue
-
- itemID, itemCnt, isAuctionItem = mailItem
-
- if ItemControler.GetAppointItemRealID(itemID):
- # 定制物品转化为物品信息字典
- appointItemObj = ItemControler.GetItemByData(ItemControler.GetAppointItemDictData(itemID, isAuctionItem))
- if not appointItemObj:
- GameWorld.ErrLog("邮件定制物品转化失败!itemID, itemCnt, isAuctionItem" % (itemID, itemCnt, isAuctionItem))
- continue
- combineItemList.append(ItemCommon.GetMailItemDict(appointItemObj))
- appointItemObj.Clear()
- elif isAuctionItem:
- combineItemList.append((itemID, itemCnt, isAuctionItem))
- else:
- key = (itemID, isAuctionItem)
- itemCountDict[key] = itemCountDict.get(key, 0) + itemCnt
-
- for key, itemCnt in itemCountDict.items():
- itemID, isAuctionItem = key
- combineItemList.append((itemID, itemCnt, isAuctionItem))
- return combineItemList
## 构建系统提示参数列表
# @param msgParamList 信息参数列表
@@ -3056,6 +2884,10 @@
#轮回殿
PlayerActLunhuidian.AddLunhuidianValue(curPlayer, PlayerActLunhuidian.AwardType_PayMoney, type_Price, price)
if type_Price == ShareDefine.TYPE_Price_Xiantao:
+ unXiantaoCntExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntExp)
+ NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntExp, unXiantaoCntExp + price)
+ unXiantaoCntEquip = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCntEquip)
+ NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_UnXiantaoCntEquip, unXiantaoCntEquip + price)
PlayerPrestigeSys.AddRealmTaskValue(curPlayer, PlayerPrestigeSys.RealmTaskType_UseXiantao, price)
unitPrice = price if quantity == 1 else int(math.ceil(price * 1.0 / quantity)) # 单价
#reason_name = "Unknown" if not costType else costType
@@ -3901,31 +3733,25 @@
NetPackCommon.SendFakePack(curPlayer, sendPack)
#副本获得经验, 无论获得多少经验均需通知, 有些副本逻辑需要通过获得经验时机处理
- if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull:
- FBLogic.OnGetExp(curPlayer, finalAddExp, expViewType)
-
+ #if GameWorld.GetMap().GetMapFBType() != IPY_GameWorld.fbtNull:
+ # FBLogic.OnGetExp(curPlayer, finalAddExp, expViewType)
+
return finalAddExp
# 参数 addSkillID 表示因什么技能杀死NPC获得经验
def __AddExp(self, curPlayer, addExp, expViewType, isSysHint, addSkillID=0, expRateEx=0):
- if addExp == 0:
+ if addExp <= 0:
# 不进入计算
return addExp, expViewType
#取得人物当前经验
- #curTotalExp = GetPlayerTotalExp(curPlayer)
- curTotalExp = curPlayer.GetExpPoint() * ChConfig.Def_PerPointValue + curPlayer.GetTotalExp()
-
- maxLV = GetPlayerMaxLV(curPlayer)
- maxLVExpStore = IpyGameDataPY.GetFuncCfg("MaxLVExpStore", 1)
+ curTotalExp = GetPlayerTotalExp(curPlayer)
- curLV = curPlayer.GetLV()
-# # 检查转生等级
-# if curLV >= nextReinLV and curTotalExp >= maxLVExpStore:
-# self.__NotifyExpFull(curPlayer, "GeRen_liubo_260986")
-# GameWorld.DebugLog("经验已满!需先转生!curLV=%s,reinLV=%s" % (curLV, nextReinLV), curPlayer.GetPlayerID())
-# return 0
-
+ maxLV = GetPlayerMaxLV(curPlayer)
+ maxLVExpStore = IpyGameDataPY.GetFuncCfg("PlayerMaxLV", 2)
+
+ curLV = curPlayer.GetLV()
+
# 检查最大等级,maxLVExpStore -1时不限累计经验上限
if curLV >= maxLV and curTotalExp >= maxLVExpStore and maxLVExpStore != -1:
self.__NotifyExpFull(curPlayer, "GeRen_admin_825676")
@@ -3935,90 +3761,26 @@
# 杀怪
if expViewType == ShareDefine.Def_ViewExpType_KillNPC:
exp_rate = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_TotalExpRate)
- superRate = PassiveBuffEffMng.GetPassiveSkillValueByTriggerType(curPlayer, None, None, ChConfig.TriggerType_AddExpRate)
- if superRate:
- # 龙凤镯 经验
- expViewType = ShareDefine.Def_ViewExpType_KillNPCSuper
- if addSkillID == ChConfig.Def_SkillID_LXHY_AddExpRate:
- addSkill = GameWorld.GetGameData().GetSkillBySkillID(addSkillID)
- hasEffect = SkillCommon.GetSkillEffectByEffectID(addSkill, ChConfig.Def_Skill_Effect_AddExpRate)
- if hasEffect:
- #烈焰战神 经验
- superRate += hasEffect.GetEffectValue(0)
- expViewType = ShareDefine.Def_ViewExpType_LYZS
- exp_rate += superRate
-
elif expViewType in [ShareDefine.Def_ViewExpType_GameEvent, ShareDefine.Def_ViewExpType_Sit]:
exp_rate = curPlayer.GetGameEventExpRate()
exp_rate += GetFamilySitExpPer(curPlayer)
else:
exp_rate = max(GameWorld.GetGameWorld().GetExpRate(), ChConfig.Def_MaxRateValue)
-
+
exp_rate += expRateEx
#输入的经验有可能为long型
addExp = int(addExp * exp_rate / float(ChConfig.Def_MaxRateValue))
- #防沉迷计算
- addExp = PlayerGameWallow.ChangeExpByWallow(curPlayer, addExp)
-
- #===========================================================================================
- # #特殊地图杀怪经验外层加成
- # if expViewType == ShareDefine.Def_ViewExpType_KillNPC:
- # #mapID = GameWorld.GetMap().GetMapID()
- # #if mapID in ChConfig.Def_FBMapID_BZZDAll:
- # # nobleVIPOuterRate = ...
- # # #nobleVIPAddExp += 0 if not nobleVIPOuterRate else int(addExp * nobleVIPOuterRate / float(ChConfig.Def_MaxRateValue))
- # # nobleVIPAddExp += nobleVIPOuterRate
- #
- # outerExpRate = FBLogic.OnGetOuterExpRate(curPlayer)
- # if outerExpRate > 0:
- # addExp = int(addExp * outerExpRate / float(ChConfig.Def_MaxRateValue))
- #===========================================================================================
-
# 不可再升级时,增加后的经验不可超过最大可存储经验
- #if curLV >= nextReinLV or curLV >= maxLV:
if curLV >= maxLV and maxLVExpStore > 0:
addExp = min(addExp, max(0, maxLVExpStore - curTotalExp))
-
+
if addExp <= 0:
#无法获得经验
GameWorld.DebugLog("无法获得经验")
return 0, expViewType
- #addExp = min(addExp, ChConfig.Def_UpperLimit_DWord) # 单次加经验不超过20亿
-
- #缓存获取的经验值, 用于兑换家族荣誉
- #if curPlayer.GetFamilyID() != 0:
- # curPlayer.SetPerExp(min(curPlayer.GetPerExp() + addExp, ChConfig.Def_UpperLimit_DWord))
-
- #人物头顶提示
- #=======================================================================
- # viewExpCnt = min(2, addExp / ChConfig.Def_UpperLimit_DWord) # 最多飘两次20亿的
- # viewExp = addExp % ChConfig.Def_UpperLimit_DWord
- # for _ in range(viewExpCnt):
- # curPlayer.Notify_GetExpView(ChConfig.Def_UpperLimit_DWord, expViewType)
- # if viewExp:
- # curPlayer.Notify_GetExpView(viewExp, expViewType)
- #
- # if isSysHint:
- # # 杀怪附加加成显示
- # if expViewType == ShareDefine.Def_ViewExpType_KillNPC:
- # nobleVIPAddExp = int(nobleVIPAddExp / 100.0)
- # #NotifyCode(curPlayer, "GeRen_liubo_74717", [addExp, nobleVIPAddExp])
- # elif expViewType in [ShareDefine.Def_ViewExpType_GameEvent,
- # ShareDefine.Def_ViewExpType_Sit]:
- # #小游戏事件特殊提示,打坐获取经验
- # NotifyCode(curPlayer, "ObtainExperience", [addExp])
- # elif expViewType == ShareDefine.Def_ViewExpType_MousePos:
- # #鼠标位置提示获得经验
- # NotifyCode(curPlayer, "GeRen_admin_887936", [addExp])
- # else:
- # #正常信息提示
- # NotifyCode(curPlayer, "GeRen_lhs_0", [addExp])
- #=======================================================================
-
#给人物经验 先设经验后升级
- #SetPlayerTotalExp(curPlayer, curTotalExp + addExp)
totalExp = curTotalExp + addExp
curExp = totalExp % ChConfig.Def_PerPointValue
expPoint = totalExp / ChConfig.Def_PerPointValue
@@ -4027,13 +3789,10 @@
curPlayer.SetExpPoint(expPoint)
if curPlayer.GetTotalExp() != curExp:
curPlayer.SetTotalExp(curExp)
-
- #GameWorld.Log("玩家 = %s 得到经验 = %s ,当前经验倍率 = %s"%(curPlayer.GetName(), addExp,expRate ))
- #小于转生等级才可升级
- #if curLV < nextReinLV and curLV < maxLV:
+
if curLV < maxLV:
self.PlayerLvUp()
-
+
#添加经验成功
return addExp, expViewType
@@ -4057,25 +3816,18 @@
#玩家死亡不可升级
return
- #lvIpyData = GetPlayerLVIpyData(curPlayer.GetLV())
- lvIpyData = IpyGameDataPY.GetIpyGameData("PlayerLV", curPlayer.GetLV())
+ lvIpyData = GetPlayerLVIpyData(curPlayer.GetLV())
if not lvIpyData:
- GameWorld.ErrLog("经验表异常 lv= %s" % curPlayer.GetLV())
return
-
- #lvUpNeedExp = GetLVUPTotalExpNeed(lvIpyData)
- lvUpNeedExp = lvIpyData.GetExpPoint() * ChConfig.Def_PerPointValue + lvIpyData.GetExp()
-
+ lvUpNeedExp = GetLVUPTotalExpNeed(lvIpyData)
if lvUpNeedExp <= 0:
return
#增加经验
- #curTotalExp = GetPlayerTotalExp(curPlayer)
- curTotalExp = curPlayer.GetExpPoint() * ChConfig.Def_PerPointValue + curPlayer.GetTotalExp()
+ curTotalExp = GetPlayerTotalExp(curPlayer)
#未达到升级经验
if curTotalExp < lvUpNeedExp:
return
- needSyncTalentPoint = False
playerNeedDoLVUp = False
curLV = curPlayer.GetLV()
maxLV = GetPlayerMaxLV(curPlayer)
@@ -4083,14 +3835,7 @@
curPlayer.BeginRefreshState()
#befXP = curPlayer.GetXP()
befLV = curPlayer.GetLV()
- befFreePoint = curPlayer.GetFreePoint()
- befBaseSTR = curPlayer.GetBaseSTR()
- befBasePNE = curPlayer.GetBasePNE()
- befBasePHY = curPlayer.GetBasePHY()
- befBaseCON = curPlayer.GetBaseCON()
-
- #升级前的世界等级经验
- #beforeExpRate = PlayerWorldAverageLv.GetWorldAverageLvExpRate(curPlayer)
+ #befFreePoint = curPlayer.GetFreePoint()
while curTotalExp >= lvUpNeedExp and curLV < maxLV:
@@ -4105,24 +3850,17 @@
isNotifyServer = False
curPlayer.SetLV(curLV, isNotifyServer)
- EventReport.WriteEvent_level_up(curPlayer)
+ #EventReport.WriteEvent_level_up(curPlayer)
# 记录玩家升级
DataRecordPack.DR_PlayerUpgrade(curPlayer, curPlayer.GetLV(), GetPlayerTotalExp(curPlayer), lvUpNeedExp)
DataRecordPack.Cache_FightPowerChangeInfo(curPlayer, ChConfig.PowerDownType_LVUP, {'lv':curLV})
self.__GiveLVMailAward(curLV)
- self.__DoLVUPAddPoint() # 升级加点
+ #self.__DoLVUPAddPoint() # 升级加点
#self.__DoLvUpAddSkill() # 升级加技能
lvIpyData = GetPlayerLVIpyData(curPlayer.GetLV())
- # 大师天赋点
- if lvIpyData:
- addTalentPoint = lvIpyData.GetTalentPoint()
- if addTalentPoint:
- needSyncTalentPoint = True
- PlayerGreatMaster.AddGreatMasterSkillPointByLV(curPlayer, addTalentPoint)
- PlayerTongTianLing.AddTongTianTaskValue(curPlayer, ChConfig.TTLTaskType_LVUp, 1)
#---是否继续循环---
curTotalExp = curTotalExp - lvUpNeedExp
@@ -4137,50 +3875,24 @@
#有升级, 转生时刚好是转生等级会默认+1级
if playerNeedDoLVUp:
aftLV = curPlayer.GetLV()
- aftFreePoint = curPlayer.GetFreePoint()
- aftBaseSTR = curPlayer.GetBaseSTR()
- aftBasePNE = curPlayer.GetBasePNE()
- aftBasePHY = curPlayer.GetBasePHY()
- aftBaseCON = curPlayer.GetBaseCON()
+ #aftFreePoint = curPlayer.GetFreePoint()
if aftLV > befLV:
curPlayer.SetLV(aftLV, False) # 这里不再通知GameServer
- PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_LV, aftLV)
+ PlayerTongTianLing.AddTongTianTaskValue(curPlayer, ChConfig.TTLTaskType_LVUp, aftLV - befLV)
+ PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_LV)
PlayerSuccess.UptateSuccessProgress(curPlayer, ShareDefine.SuccType_HeroLV, aftLV)
PlayerActivity.DoAddActivityByLV(curPlayer, befLV, aftLV)
- if aftFreePoint > befFreePoint:
- curPlayer.SetFreePoint(aftFreePoint)
- #NotifyCode(curPlayer, "ObtainAttributeDot", [aftFreePoint - befFreePoint])
- if aftBaseSTR > befBaseSTR:
- curPlayer.SetBaseSTR(aftBaseSTR)
- if aftBasePNE > befBasePNE:
- curPlayer.SetBasePNE(aftBasePNE)
- if aftBasePHY > befBasePHY:
- curPlayer.SetBasePHY(aftBasePHY)
- if aftBaseCON > befBaseCON:
- curPlayer.SetBaseCON(aftBaseCON)
+ #if aftFreePoint > befFreePoint:
+ # curPlayer.SetFreePoint(aftFreePoint)
PlayerGubao.DoGubaoAddFreePoint(curPlayer)
- #===================================================================
- # if curPlayer.GetXP() != befXP:
- # curPlayer.SetXP(curPlayer.GetXP())
- #===================================================================
-
- #享受世界等级
- #===================================================================
- #curExpRate = PlayerWorldAverageLv.GetWorldAverageLvExpRate(curPlayer)
- #if beforeExpRate <= 0 and curExpRate > 0:
- # NotifyCode(curPlayer, "GeRen_liubo_127574")
- #===================================================================
- # 天赋点通知
- if needSyncTalentPoint:
- PlayerGreatMaster.Sync_GreatMasterFreeSkillPoint(curPlayer)
# 升级需要执行的游戏功能处理
GameFuncComm.DoFuncOpenLogic(curPlayer)
ChEquip.RefreshPlayerLingQiEquipAttr(curPlayer) # 灵器属性会随等级成长
- if aftLV%10 == 0:
- # 控制下刷新次数
- PlayerPet.CalcPetItemAddPlayerAttr(curPlayer) # 宠物有随等级变化的技能
+ #if aftLV%10 == 0:
+ # # 控制下刷新次数
+ # PlayerPet.CalcPetItemAddPlayerAttr(curPlayer) # 宠物有随等级变化的技能
self.RefreshPlayerAttrState(billboardFunc=PlayerBillboard.UpdatePlayerLVBillboard)
#放在功能开启后面
@@ -4411,6 +4123,7 @@
PlayerFamilyZhenfa.CalcZhenfaAttr(curPlayer)
PlayerFace.CalcFaceAttr(curPlayer)
PlayerFace.CalcFacePicAttr(curPlayer)
+ PlayerHero.CalcHeroItemAddAttr(curPlayer)
self.RefreshAllState(isForce=True)
GameWorld.DebugLog("End ReCalcAllState!!!", playerID)
return
@@ -4879,10 +4592,11 @@
def __DoRefreshGMAttr(self):
## 刷新GM测试属性
curPlayer = self.__Player
- platform = GameWorld.GetPlatform()
- if platform not in GMShell.TestPlatformList:
- return
if curPlayer.GetGMLevel() != ChConfig.Def_GM_LV_God:
+ return
+
+ platform = GameWorld.GetPlatform()
+ if not GameWorld.IsTestPlatform(platform):
return
ipyDataMgr = IpyGameDataPY.IPY_Data()
@@ -5209,7 +4923,7 @@
def __SetAtkInterval(self):
curPlayer = self.__Player
- atkSpeed = GetAtkSpeed(curPlayer)
+ atkSpeed = GameObj.GetAtkSpeed(curPlayer)
formula = IpyGameDataPY.GetFuncCfg("AtkInterval")
atkInterval = 0 if not formula else eval(FormulaControl.GetCompileFormula("AtkInterval", formula))
@@ -5848,8 +5562,20 @@
#通知客户端
curPack.Sync_PackCanUseCount()
return
-
+def Init_HeroPack(curPlayer):
+ packType = ShareDefine.rptHero
+ #获取玩家背包
+ curPack = curPlayer.GetItemManager().GetPack(packType)
+ initCount = ItemCommon.GetPackInitCount(packType)
+ if packType in ChConfig.Def_Type_CanBuyPack_PlayerDict.keys():
+ keyName = ChConfig.Def_Type_CanBuyPack_PlayerDict.get(packType)[ChConfig.Def_PlayerPackDict_Index_Key]
+ initCount += curPlayer.NomalDictGetProperty(keyName)
+ curPack.SetCount(initCount)
+ #通知客户端背包格子数目
+# curPlayer.Sync_ItemCount(curPack.GetCount())
+ curPack.Sync_PackCanUseCount()
+ return
##初始化寻宝背包
@@ -6090,18 +5816,58 @@
SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_ForbidenTalk, 0)
return
+def IsMainLevelPass(curPlayer, lvID):
+ ## 判断玩家是否过关某个主线关卡ID
+ # @param lvID: 关卡唯一ID,与策划约定好 = 章节*100+关卡编号
+ passChapterID, passLevelNum, _ = GetMainLevelPassInfo(curPlayer)
+ passValue = passChapterID * 100 + passLevelNum # 因为pass的记录是带波数的,即当前关卡boss还没过关,所以只有大于该记录值的才算过关
+ return passValue > lvID
+
+## 主线关卡过关进度值 = 章节*10000+关卡编号*100+第x波
+def GetMainLevelPassValue(curPlayer): return curPlayer.GetExAttr1()
+def SetMainLevelPassValue(curPlayer, value): curPlayer.SetExAttr1(value, False, False) # 不通知GameServer
+def SetMainLevelPassInfo(curPlayer, chapterID, levelNum, wave=0):
+ ## 设置主线关卡过关进度
+ # @param chapterID: 章节ID
+ # @param levelNum: 关卡编号
+ # @param wave: 第x波
+ value = ComMainLevelValue(chapterID, levelNum, wave)
+ SetMainLevelPassValue(curPlayer, value)
+ return value
+def GetMainLevelPassInfo(curPlayer):
+ ## 获取主线关卡过关进度信息
+ # @return: chapterID, levelNum, wave
+ return GetMainLevelValue(GetMainLevelPassValue(curPlayer))
+
+## 主线关卡当前进度值 = 章节*10000+关卡编号*100+第x波
+def GetMainLevelNowValue(curPlayer): return curPlayer.GetExAttr2()
+def SetMainLevelNowValue(curPlayer, value): curPlayer.SetExAttr2(value, False, False) # 不通知GameServer
+def SetMainLevelNowInfo(curPlayer, chapterID=1, levelNum=1, wave=1):
+ ## 设置主线关卡当前进度
+ # @param chapterID: 章节ID
+ # @param levelNum: 关卡编号
+ # @param wave: 第x波
+ value = ComMainLevelValue(chapterID, levelNum, wave)
+ SetMainLevelNowValue(curPlayer, value)
+ return value
+def GetMainLevelNowInfo(curPlayer):
+ ## 获取主线关卡当前进度信息
+ # @return: chapterID, levelNum, wave
+ return GetMainLevelValue(GetMainLevelNowValue(curPlayer))
+
+def ComMainLevelValue(chapterID, levelNum, wave=0): return chapterID * 10000 + levelNum * 100 + wave
+def GetMainLevelValue(value):
+ chapterID = value / 10000
+ levelNum = value % 10000 / 100
+ wave = value % 100
+ return chapterID, levelNum, wave
+
## 协助目标玩家ID
-def SetAssistTagPlayerID(curPlayer, value):
- curPlayer.SetExAttr1(value, True, False) # 不通知GameServer
- NPCHurtManager.OnSetAssistTagPlayerID(curPlayer, value)
- return
-def GetAssistTagPlayerID(curPlayer): return curPlayer.GetExAttr1()
+def GetAssistTagPlayerID(curPlayer): return 0
## 队伍相关审核开关状态, joinReqCheck-入队申请是否需要审核; inviteCheck-组队邀请是否需要审核;
def SetTeamCheckStateEx(curPlayer, joinReqCheck, inviteCheck): return SetTeamCheckState(curPlayer, joinReqCheck * 10 + inviteCheck)
-def SetTeamCheckState(curPlayer, checkState): return curPlayer.SetExAttr2(checkState, False, True)
-def GetTeamCheckState(curPlayer): return curPlayer.GetExAttr2()
-
+def SetTeamCheckState(curPlayer, checkState): return
## 副本功能线路ID, 这里做db存储,防止在合并地图副本中掉线重上时前端无法加载正确的场景资源,登录加载场景时机为0102包
def SetFBFuncLineID(curPlayer, mapID, funcLineID):
value = mapID * 1000 + funcLineID
@@ -6504,29 +6270,11 @@
count += 1
return count
-
-
-## 获取节假日经验加成
-# @param curPlayer: 玩家实例
-# @return: 节假日经验加成
-def GetHolidayExpRate(curPlayer):
- return 0
-
-
-## 获取世界boss经验加成
-# @param curPlayer: 玩家实例
-# @return: 世界boss经验加成
-def GetWorldBossExpRate(curPlayer):
- return 0
-
## 获取玩家当前等级升级所需总经验
# @param playerLv 玩家等级
# @return 返回值, 升级需要的总经验
def GetLVUPTotalNeedExp(curPlayer):
curLV = curPlayer.GetLV()
- #if curLV >= IpyGameDataPY.GetFuncCfg("PlayerMaxLV") and PlayerGreatMaster.IsGreatMasterOpen(curPlayer):
- # return PlayerGreatMaster.GetTotalExpByGreatMasterLV(curPlayer.GetLV2())
-
return GetTotalExpByPlayerLv(curLV)
## 根据等级获得升级需要的总经验
@@ -6548,7 +6296,7 @@
def GetLVUPTotalExpNeed(lvIpyData):
if not lvIpyData:
return 0
- return lvIpyData.GetExpPoint() * ChConfig.Def_PerPointValue + lvIpyData.GetExp()
+ return lvIpyData.GetExp()
def GetPlayerMaxLV(curPlayer):
## 获取玩家实际可升的最大等级
@@ -6768,18 +6516,6 @@
def SetSpeedValue(curPlayer, value):
curPlayer.SetDict(ChConfig.Def_PlayerKey_SpeedValue, value)
SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_SpeedValue, value, True) # 移动速度值暂定广播周围玩家
-
-##获取玩家攻击速度,用于计算攻击间隔
-# @param curPlayer 玩家实例
-# @return 玩家攻击速度
-def GetAtkSpeed(curPlayer):
- return curPlayer.GetBattleValEx1()
-
-##设置玩家攻击速度,用于计算攻击间隔
-# @param curPlayer 玩家实例
-# @return None
-def SetAtkSpeed(curPlayer, value):
- curPlayer.SetBattleValEx1(value, True)
#---攻击回复血量比率----
## 获取玩家攻击回复血量比率
@@ -6851,11 +6587,7 @@
## 卓越一击伤害减免
def GetGreatHitReducePer(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_GreatHitReducePer)
def SetGreatHitReducePer(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_GreatHitReducePer, value)
-## 暴击伤害减免
-def GetSuperHitReduce(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_SuperHitReduce)
-def SetSuperHitReduce(curPlayer, value):
- curPlayer.SetDict(ChConfig.Def_PlayerKey_SuperHitReduce, value)
- SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_SuperHitReduce, value)
+
## 无视防御伤害减免
def GetIgnoreDefReducePer(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_IgnoreDefReducePer)
def SetIgnoreDefReducePer(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_IgnoreDefReducePer, value)
@@ -6869,11 +6601,7 @@
## 抗卓越一击概率
def GetGreatHitRateReduce(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_GreatHitRateReduce)
def SetGreatHitRateReduce(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_GreatHitRateReduce, value)
-## 抗暴击概率
-def GetSuperHitRateReduce(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_SuperHitRateReduce)
-def SetSuperHitRateReduce(curPlayer, value):
- curPlayer.SetDict(ChConfig.Def_PlayerKey_SuperHitRateReduce, value)
- SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_SuperHitRateReduce, value)
+
## 抗无视防御概率
def GetIgnoreDefRateReduce(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_IgnoreDefRateReduce)
def SetIgnoreDefRateReduce(curPlayer, value):
@@ -6896,18 +6624,6 @@
def SetBossFinalHurtPer(curPlayer, value):
curPlayer.SetDict(ChConfig.Def_PlayerKey_BossFinalHurtPer, value)
SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_BossFinalHurtPer, value)
-
-## 最终伤害百分比
-def GetFinalHurtPer(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_FinalHurtPer)
-def SetFinalHurtPer(curPlayer, value):
- curPlayer.SetDict(ChConfig.Def_PlayerKey_FinalHurtPer, value)
- SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_FinalHurtPer, value)
-
-## 最终伤害减免百分比
-def GetFinalHurtReducePer(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_FinalHurtReducePer)
-def SetFinalHurtReducePer(curPlayer, value):
- curPlayer.SetDict(ChConfig.Def_PlayerKey_FinalHurtReducePer, value)
- SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_FinalHurtReducePer, value)
## 最终固定伤害增加
def GetFinalHurt(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_FinalHurt)
@@ -7155,17 +6871,6 @@
# @return None
def SetReduceBackHPPer(curPlayer, value):
curPlayer.SetDict(ChConfig.Def_PlayerKey_ReduceBackHPPer, value)
-
-#---触发击晕----
-def GetFaintRate(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrFaintRate)
-def SetFaintRate(curPlayer, value):
- curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrFaintRate, value)
- SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_FaintRate, value)
-#---击晕抵抗----
-def GetFaintDefRate(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrFaintDefRate)
-def SetFaintDefRate(curPlayer, value):
- curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrFaintDefRate, value)
- SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_FaintDefRate, value)
#---触发定身----
def GetAtkerFreezed(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrAtkerFreezed)
@@ -7175,17 +6880,6 @@
def GetAddAngry(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrAddAngry)
def SetAddAngry(curPlayer, value): curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrAddAngry, value)
-#---连击几率----
-def GetComboRate(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrComboRate)
-def SetComboRate(curPlayer, value):
- curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrComboRate, value)
- SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_ComboRate, value)
-#---连击伤害----
-def GetComboDamPer(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrComboDamPer)
-def SetComboDamPer(curPlayer, value):
- curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrComboDamPer, value)
- SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_ComboDamPer, value)
-
#---技能攻击比例减少----
def GetSkillAtkRateReduce(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_SkillAtkRateReduce)
def SetSkillAtkRateReduce(curPlayer, value):
@@ -7499,6 +7193,12 @@
dict1[key] = aValue + value
return
+def GetLordAttr(curPlayer):
+ ## 获取主公属性汇总
+ lordAttrDict = {"Atk":curPlayer.GetMaxAtk(), "Def":curPlayer.GetDef(), "MaxHP":GameObj.GetMaxHP(curPlayer),
+ "Hit":curPlayer.GetHit(), "Miss":curPlayer.GetMiss()}
+ return lordAttrDict
+
#-------------------------------------------------------------------------------
## 设置玩家字典值, 存库
def NomalDictSetProperty(curPlayer, key, value, dType=0):
--
Gitblit v1.8.0