From 4c55d01385dec553dceeb3f5481ea70be727cb39 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期二, 09 九月 2025 11:47:38 +0800 Subject: [PATCH] 129 【战斗】战斗系统-服务端(修复切换小队未清除buff可能引起的报错; 优化切换小队重置:暂时仅保留当前血量、怒气、死亡状态,其他重置;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerVip.py | 607 ------------------------------------------------------- 1 files changed, 1 insertions(+), 606 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerVip.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerVip.py index ace36e9..04544db 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerVip.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerVip.py @@ -15,613 +15,8 @@ #--------------------------------------------------------------------- #"""Version = 2017-10-23 16:40""" #--------------------------------------------------------------------- -import PlayerControl + import GameWorld -import ChConfig -import NetPackCommon -import ChPyNetSendPack -import ItemControler -import IPY_GameWorld -import PlayerDienstgrad -import PlayerMagicWeapon -import PlayerSuccess -import ShareDefine -import ItemCommon -import DataRecordPack -import IpyGameDataPY -import NPCCommon -import EventReport -import EventShell -import PassiveBuffEffMng -import PlayerFamilyRedPacket -import GameFuncComm -import PlayerTeam -import ChPlayer - -import time -#--------------------------------------------------------------------- - -#获取vip升级所需累计经验字典 key-等级,value-经验 -def GetVIPLvUpExp(): - return IpyGameDataPY.GetFuncEvalCfg("VIPLV", 1, {}) -#获取VIP每日经验 -def GetVIPDayExp(): - return IpyGameDataPY.GetFuncCfg("VIPLV", 2) -#获取vip价格 -def GetVIPPrice(cardType): - priceDict = IpyGameDataPY.GetFuncEvalCfg("VIPPrice", 1, {}) - return priceDict.get(cardType, 0) -#获取VIP卡对应的时间(小时) -def GetVIPTime(cardType): - timeDict = IpyGameDataPY.GetFuncEvalCfg("VIPPrice", 2, {}) - return timeDict.get(cardType, 0) -#获取VIP等级对应的称号 -def GetVIPTitle(): - titleDict = IpyGameDataPY.GetFuncEvalCfg("VIPTitle", 1, {}) - return titleDict -#获取VIP时间的上限 -def GetVIPMaxTime(): - maxDay = IpyGameDataPY.GetFuncCfg("VIPLimit", 1) - maxHour = maxDay * 24 - return GetSeconds(maxHour) -#根据小时获得秒 -def GetSeconds(hour): - return hour * 60 * 60 -#获取邮件的格式和天数 -def GetMailMessage(): - maxDay = IpyGameDataPY.GetFuncCfg("VIPLimit", 2) - return maxDay -#获取首次买卡获得的经验 -def GetFirstBuyExp(cardType): - buyDict = IpyGameDataPY.GetFuncEvalCfg("VIPLimit", 4, {}) - return buyDict.get(cardType, 0) - -## A8 01 封包 -## 购买VIP时间 -# @param None -# @return None -#struct tagCMBuyVipLV -#{ -# tagHead Head; -# BYTE VipType; // vip卡类型 -#}; -def BuyVipLV(index, clientPack, tick): - return -# curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) -# buyType = clientPack.VipType -# price = GetVIPPrice(buyType) -# if not price: -# return -# vipTime = GetVIPTime(buyType) -# if not vipTime: -# return -# -# haveVipTime = GetCurVIPTime(curPlayer) -# maxTime = GetVIPMaxTime() -# if haveVipTime >= maxTime: -# GameWorld.DebugLog("VIP时间已经到达最大上限,不可继续购买--time:%s" % haveVipTime) -# return -# #有道具扣道具,没有道具扣钱 -# vipCardItemIDDict = IpyGameDataPY.GetFuncEvalCfg('VIPCard', 1) -# needItemID = vipCardItemIDDict.get(buyType) -# if not needItemID: -# return -# itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) -# hasEnough, itemList = ItemCommon.GetItem_FromPack_ByID(needItemID, itemPack, 1) -# if hasEnough: -# ItemCommon.ReduceItem(curPlayer, itemPack, itemList, 1, False) -# PlayerControl.NotifyCode(curPlayer, 'VipCardHint3', [needItemID]) -# else: -# infoDict = {"VIPType":buyType} -# if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, price, ChConfig.Def_Cost_OpenNoble, infoDict): -# GameWorld.DebugLog("仙玉不足!costGold=%s" % price) -# return -# -# record = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_VipBuyRecord) -# hasBuy = record & pow(2, buyType) -# if not hasBuy: -# addExp = GetFirstBuyExp(buyType) -# AddVIPExp(curPlayer, addExp) -# GameWorld.DebugLog("首次买卡--type:%s" % buyType) -# record = record|(1 << buyType) -# PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_VipBuyRecord, record) -# addTime = GetSeconds(vipTime) -# AddVIPTime(curPlayer, addTime, "buyVIPCard") -# return - - - -##检查VIP称号 -# @param curPlayer -# @return None -def CheckVIPDienstgrad(curPlayer): - playerVIPLV = curPlayer.GetVIPLv() - if playerVIPLV <= 0: - return - - vipDienstgradDict = GetVIPTitle() - for vipLV, dienstgradID in vipDienstgradDict.items(): - if playerVIPLV < vipLV: - break - curDienstgrad = curPlayer.GetDienstgradManager().GetDienstgrad(dienstgradID) - # 不存在该VIP称号则添加 - if curDienstgrad == None: - PlayerDienstgrad.PlayerAddDienstgrad(curPlayer, dienstgradID) - GameWorld.DebugLog("CheckVIPDienstgrad playerVIPLV=%s,vipLV=%s,dienstgradID=%s" - % (playerVIPLV, vipLV, dienstgradID), curPlayer.GetPlayerID()) - return - -## 购买消费VIP礼包 -# @param index -# @param clientPack <VIPLV-VIP等级> -# @param tick -# @return -def BuyVIPItem(index, clientPack, tick): - curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - vipLV = clientPack.VIPLV - awardMsg = IpyGameDataPY.GetIpyGameData('VIPAward', vipLV) - if not awardMsg: - GameWorld.DebugLog("没有vip等级为%s的礼包" % vipLV) - return - curVipLV = curPlayer.GetVIPLv() - if curVipLV < vipLV: - GameWorld.DebugLog("VIP等级不足--VIPLV:%s" % curVipLV) - return - - record = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_VipAwardRecord) - hasBuy = record & pow(2, vipLV) - if hasBuy: - GameWorld.DebugLog("vip等级为%s的礼包已经购买过,不能重复购买" % vipLV) - return - tatalItemDict = awardMsg.GetItemID() - playerJob = str(curPlayer.GetJob()) - if playerJob not in tatalItemDict: - GameWorld.DebugLog("没有该职业的礼包信息-职业:%s--%s" % (playerJob, str(tatalItemDict))) - return - itemList = tatalItemDict[playerJob] - needSpace = len(itemList) - packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace) - if needSpace > packSpace: - PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [IPY_GameWorld.rptItem]) - return - itemPrice = awardMsg.GetPrice() - infoDict = {"VIPLV":vipLV} - if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, itemPrice, ChConfig.Def_Cost_BuyVIPItem, infoDict): - GameWorld.DebugLog("仙玉不足!costGold=%s" % itemPrice) - return - record = record|(1 << vipLV) - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_VipAwardRecord, record) - - EventShell.EventResponse_BuyVIPItem(curPlayer, vipLV) - GameWorld.DebugLog("vip礼包-%s" % itemList) - for itemid, cnt, isBind in itemList: - ItemControler.GivePlayerItem(curPlayer, int(itemid), int(cnt), 0, [IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere], - event=["BuyVIPGift", False, {"VIPLV":vipLV}]) -# else: -# __AwardToPlayerByMail(curPlayer, itemList) - ItemControler.NotifyGiveAwardInfo(curPlayer, itemList, "BuyVIPGift") - openuiid = IpyGameDataPY.GetFuncEvalCfg('VIPPanel', 1, {}).get(vipLV, 0) - PlayerControl.WorldNotify(0, 'BuyVIPGift', [curPlayer.GetName(), vipLV, itemList[0][0], openuiid]) - Sycn_VIPAwardRecord(curPlayer) - return - -#发邮件 -def __AwardToPlayerByMail(curPlayer, mailItemInfoList): - MailMessage = GetMailMessage() - content = ShareDefine.Def_MailFormat % (MailMessage[0], '') - getDays = MailMessage[1] - PlayerControl.SendMail('', content, getDays, [curPlayer.GetPlayerID()], mailItemInfoList) - -##VIP登录处理 -# @param curPlayer -# @return None -def DoOnLogin(curPlayer, tick): - #记录登陆时间 - Sycn_VIPMsg(curPlayer) - Sycn_VIPAwardRecord(curPlayer) - Sycn_VIPTime(curPlayer, True) - SyncVIPKillNPCLVInfo(curPlayer) - return - -#------------------------------------------------------------------------------- -#VIP每日处理 -def VipOnDay(curPlayer): - return -# vipTime = PlayerControl.GetVIPExpireTime(curPlayer) -# if not vipTime: -# return -# vipStr = GameWorld.ChangeTimeNumToStr(vipTime, timeFormat=ChConfig.TYPE_Time_Format) -# vipZeroTime = GetZeroTime(vipStr) -# curZeroTime = GetZeroTime(GameWorld.GetCurrentDataTimeStr()) -# lastTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_VIPLastTime) -# if lastTime == 0: -# PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_VIPLastTime, curZeroTime) -# -# if vipZeroTime >= curZeroTime: -# n = (curZeroTime - lastTime) / (24 * 60 * 60) -# elif vipZeroTime > lastTime: -# n = (vipZeroTime - lastTime) / (24 * 60 * 60) -# else: -# n = 0 -# AddVIPExp(curPlayer, GetVIPDayExp() * n) -# PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_VIPLastTime, curZeroTime) - -#根据时间获得当天的零点时间 -def GetZeroTime(strTick): - tickList = strTick.split(' ') - newStrTick = tickList[0] + ' ' + '00:00:00' - return GameWorld.ChangeTimeStrToNum(newStrTick) - -## 直升VIP等级 -def UpgradeVIPLV(curPlayer, tagVIPLV): - befVIPLV = curPlayer.GetVIPLv() - if befVIPLV >= tagVIPLV: - GameWorld.DebugLog("已经达到该VIP等级!不需要处理") - return True, 0 - vipExpDict = GetVIPLvUpExp() - if tagVIPLV not in vipExpDict: - GameWorld.ErrLog("没有该VIP等级,无法直升! tagVIPLV=", tagVIPLV); - return False, 0 - tagVIPExp = vipExpDict[tagVIPLV] - vipExp = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_VipExp) - addExp = tagVIPExp - vipExp - return AddVIPExp(curPlayer, addExp), addExp - -#VIP经验增加入口 -def AddVIPExp(curPlayer, exp): - if exp <= 0: - return - vipExp = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_VipExp) + exp - preVIPLV = curPlayer.GetVIPLv() - vipLV = preVIPLV + 1 - vipExpDict = GetVIPLvUpExp() - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_VipExp, vipExp) - if vipLV not in vipExpDict: - GameWorld.DebugLog("vip已经满级--vipLV:%s" % (vipLV - 1)) - Sycn_VIPMsg(curPlayer) - return - while vipLV in vipExpDict and vipExp >= vipExpDict[vipLV]: - curPlayer.SetVIPLv(vipLV) - PlayerControl.SetVIPLVUpTime(curPlayer, int(time.time())) - OnChangeVIPLv(curPlayer, vipLV) ##当VIP等级变更,触发的方法写在这里 - PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_VIPLV, 1, [vipLV]) - vipLV += 1 - GameWorld.DebugLog("VIP等级--%s,addExp--%s,经验--%s" % (curPlayer.GetVIPLv(), exp, vipExp)) - Sycn_VIPMsg(curPlayer) - if not preVIPLV: - Sycn_VIPTime(curPlayer) - DataRecordPack.DR_VIPChange(curPlayer, "addVIPExp", {"Viplv":curPlayer.GetVIPLv(), 'VipExp':vipExp}) - return True - -##当VIP等级变更,触发的方法写在这里 -# @param curPlayer 玩家 -# @return None -def OnChangeVIPLv(curPlayer, vipLV): - #vip等级改变触发任务 - EventShell.EventResponse_OnVipLvUp(curPlayer, vipLV) - - CheckVIPDienstgrad(curPlayer) - - #删除VIP体验卡物品 - #__DelVIPExperienceItem(curPlayer) - - RefreshVIPAttr(curPlayer) - - EventReport.WriteEvent_VIP(curPlayer) - - #红包奖励 - redPacketID = IpyGameDataPY.GetFuncEvalCfg('VIPRedPackAward', 1, {}).get(vipLV, 0) - if redPacketID: - PlayerFamilyRedPacket.CreatRedPacketByID(curPlayer, redPacketID) - - GameFuncComm.DoFuncOpenLogic(curPlayer) - - if not curPlayer.GetTeam(): - PlayerTeam.RefreshTeamVIPBuff_OnNoTeam(curPlayer, GameWorld.GetGameWorld().GetTick()) - return - -#通知玩家购买礼包纪录 -def Sycn_VIPAwardRecord(curPlayer): - pack = ChPyNetSendPack.tagMCVIPAwardMsg() - pack.AwardMsg = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_VipAwardRecord) - GameWorld.DebugLog("领取记录!--%s" % pack.AwardMsg) - NetPackCommon.SendFakePack(curPlayer, pack) - -#通知vip经验和等级 -#Exp --vip经验 -#BuyState --vip等级 -def Sycn_VIPMsg(curPlayer): - pack = ChPyNetSendPack.tagMCVIPInfo() - pack.Exp = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_VipExp) - pack.VIPLV = curPlayer.GetVIPLv() - NetPackCommon.SendFakePack(curPlayer, pack) - -#通知VIP剩余时间 -def Sycn_VIPTime(curPlayer, islogin=False, isForce=False): - pack = ChPyNetSendPack.tagMCNotifyVipTime() - pack.Time = GetCurVIPTime(curPlayer, islogin) - pack.ExperienceTime = GetVIPExperienceTime(curPlayer, islogin) - if pack.Time > 0 or pack.ExperienceTime > 0 or isForce: - NetPackCommon.SendFakePack(curPlayer, pack) - -#唯一获取实时的VIP时间的方法,不能直接通过 PlayerControl.GetVIPExpireTime(curPlayer) 获取 -def GetCurVIPTime(curPlayer, islogin=False): - return 1 -# vipTime = PlayerControl.GetVIPExpireTime(curPlayer) -# curTime = GameWorld.ChangeTimeStrToNum(GameWorld.GetCurrentDataTimeStr()) -# if vipTime <= curTime: -# if vipTime: -# timeoutRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_VipTimeOutRecord) -# # 常规过期处理 -# if not timeoutRecord: -# GameWorld.DebugLog("VIP过期处理: vipTime=%s,curTime=%s" % (vipTime, curTime), curPlayer.GetPlayerID()) -# # 过期变更处理 -# PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_VipTimeOutRecord, 1) -# #Operate_EquipStone.OnVIPTimeOut(curPlayer) -# RefreshVIPAttr(curPlayer) -# -# # 登录状态下额外处理 -# if islogin and timeoutRecord != 2: -# GameWorld.DebugLog("VIP过期登录处理: vipTime=%s,curTime=%s" % (vipTime, curTime), curPlayer.GetPlayerID()) -# PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_VipTimeOutRecord, 2) -# PlayerControl.NotifyCode(curPlayer, 'Vip_Timeout') -# return 0 -# else: -# PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_VipTimeOutRecord, 0) -# return vipTime - curTime -# return vipTime - -#增加VIP时间 -# addTime 单位秒 -def AddVIPTime(curPlayer, addTime, addType="buyVIPTime"): -# isReActivate = False # 是否重新激活的 -# haveVipTime = GetCurVIPTime(curPlayer) -# if not haveVipTime: -# isReActivate = True -# curZeroTime = GetZeroTime(GameWorld.GetCurrentDataTimeStr()) -# PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_VIPLastTime, curZeroTime) -# haveVipTime += addTime -# if haveVipTime > ShareDefine.Def_UpperLimit_DWord: -# haveVipTime = ShareDefine.Def_UpperLimit_DWord -# curTime = GameWorld.ChangeTimeStrToNum(GameWorld.GetCurrentDataTimeStr()) -# totalTime = curTime + haveVipTime -# PlayerControl.SetVIPExpireTime(curPlayer, totalTime) -# timeDict = {"oldTime":haveVipTime, "newTime":totalTime, "addTime":addTime, "addType":addType} -# DataRecordPack.DR_VIPTimeChange(curPlayer, "addVIPTime", timeDict) -# GameWorld.DebugLog("到期时间--%s" % GameWorld.ChangeTimeNumToStr(totalTime, timeFormat=ChConfig.TYPE_Time_Format)) -# Sycn_VIPTime(curPlayer) -# if isReActivate: -# RefreshVIPAttr(curPlayer) - return True - -#def __DelVIPExperienceItem(curPlayer): -# ## VIP变更时删除背包和仓库的vip体验卡 -# for packIndex in [IPY_GameWorld.rptItem, IPY_GameWorld.rptWarehouse]: -# curPack = curPlayer.GetItemManager().GetPack(packIndex) -# for i in range(0, curPack.GetCount()): -# curItem = curPack.GetAt(i) -# if not curItem: -# continue -# -# if curItem.GetItemTypeID() != ChConfig.Def_ItemID_VIPExperience: -# continue -# -# itemCount = curItem.GetCount() -# ItemCommon.DelItem(curPlayer, curItem, itemCount, True, "DelVIPExperienceItem") -# -# return - -def UseItemVIPExperience(curPlayer): - ## 使用vip体验卡 - if curPlayer.GetVIPLv(): - PlayerControl.NotifyCode(curPlayer, 'VipCardHint2') - return - #学习龙凤镯技能,失效后再删除 - PlayerMagicWeapon.GiveSkill(curPlayer, ChConfig.Def_SkillID_LFZ, GameWorld.GetGameWorld().GetTick(), False) - - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_VipExperienceStartTime, int(time.time())) - - Sycn_VIPTime(curPlayer) - PlayerControl.NotifyCode(curPlayer, 'VipCardHint1') - return True - -def CheckVIPExperience(curPlayer, tick): - ## 检查vip体验是否结束 - startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_VipExperienceStartTime) - - if not startTime: - return - - if not GameWorld.CheckPlayerTick(curPlayer, ChConfig.TYPE_Player_Tick_VIPExperience, tick): - return - - if not GetVIPExperienceTime(curPlayer): - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_VipExperienceStartTime, 0) - if curPlayer.GetVIPLv() == 0: - PlayerControl.NotifyCode(curPlayer, 'VipTiyan_Timeout') - - Sycn_VIPTime(curPlayer, isForce=True) - GameWorld.DebugLog(' VIP体验卡结束!', curPlayer.GetID()) - - #删除体验技能 - skillManager = curPlayer.GetSkillManager() - if skillManager.FindSkillBySkillTypeID(ChConfig.Def_SkillID_LFZ): - skillManager.DeleteSkillBySkillTypeID(ChConfig.Def_SkillID_LFZ) - # 重刷被动技能 - PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer) - # 重刷技能战力 - PlayerControl.PlayerControl(curPlayer).RefreshAllSkill() - return True - - return - -def GetVIPExperienceTime(curPlayer, isLogin=False): - ## 是否VIP体验中 - startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_VipExperienceStartTime) - - if not startTime: - return 0 - if curPlayer.GetVIPLv(): - - return 0 - curTime = int(time.time()) - experienceTime = IpyGameDataPY.GetFuncCfg('VIPExperience', 2) - if curTime - startTime >= experienceTime: - return 0 - return experienceTime - (curTime - startTime) - - -#根据特权ID 和 VIP等级获得特权值 -#tequanID 特权ID -#playerVipLv 玩家VIP等级,获得对应vip等级的特权值,-1时获得玩家VIP等级对应的特权值 -def GetPrivilegeValue(curPlayer, privilegeID, playerVipLv=-1, isCheckTime=True): - #if privilegeID not in ChConfig.VIPPrivilegeList: - # return 0 - if not privilegeID: - return 0 - isExperience = False - if playerVipLv != -1: - vipLV = playerVipLv - elif GetVIPExperienceTime(curPlayer): - isExperience = True - VIPExperiencePrivilegeDict = IpyGameDataPY.GetFuncCfg('VIPExperience', 1) - vipLV = VIPExperiencePrivilegeDict.get(privilegeID, 0) - else: - vipLV = curPlayer.GetVIPLv() - vipMsg = IpyGameDataPY.GetIpyGameData('VipPrivilege', privilegeID) - if not vipMsg: - return 0 - priVlaue = getattr(vipMsg, 'GetVIP%d' % vipLV)() - if not isCheckTime: - return priVlaue - if vipLV and GetCurVIPTime(curPlayer) <= 0 and playerVipLv == -1 and not isExperience: - priVlaue = vipMsg.GetVIP0() - return priVlaue - -#获取VIP特权表特权数据 -def GetVipPrivilegeData(privilegeID): - return IpyGameDataPY.GetIpyGameData('VipPrivilege', privilegeID) - - -#--------------------------------------------------------------------- -##获取当前储值应该拥有的VIP等级 -def RefreshVIPAttr(curPlayer): - CalcVIPAttr(curPlayer) - PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState() - return - -def CalcVIPAttr(curPlayer): - allAttrList = [{} for _ in range(4)] - - # 属性需要判断是否过期 - #if GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_VIPKillNPCAddAtk): - mwID = IpyGameDataPY.GetFuncCfg("VIPAddAtkEXP", 2) # VIP杀怪加属性所需激活法宝 - if PlayerMagicWeapon.GetIsActiveMagicWeapon(curPlayer, mwID): - killLV = GetVIPKillNPCLV(curPlayer) - killLVIpyData = IpyGameDataPY.GetIpyGameData("VIPKillNPC", killLV) - if killLVIpyData: - PlayerControl.CalcAttrDict_Type(ShareDefine.Def_Effect_MinAtk, killLVIpyData.GetAddMinAtk(), allAttrList) - PlayerControl.CalcAttrDict_Type(ShareDefine.Def_Effect_MaxAtk, killLVIpyData.GetAddMaxAtk(), allAttrList) - - PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_VIP, allAttrList) - return - -#// A8 05 VIP杀怪等级信息同步开关 #tagCMVIPKillNPCLVInfoSwitch -# -#struct tagCMVIPKillNPCLVInfoSwitch -#{ -# tagHead Head; -# BYTE IsOn; // 是否开启同步 -#}; -def OnVIPKillNPCLVInfoSwitch(index, clientPack, tick): - curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - isOn = clientPack.IsOn - curPlayer.SetDict(ChConfig.Def_PlayerKey_SyncVIPKillNPCLVInfo, isOn) - if isOn: - SyncVIPKillNPCLVInfo(curPlayer) - GameWorld.DebugLog("VIP杀怪等级信息同步开关, isOn=%s" % isOn, curPlayer.GetPlayerID()) - return - -def DoAddVIPKillLVExp(curPlayer, npcLV, killCount=1): - ''' 击杀NPC增加VIP杀怪等级经验,只算击杀的,队员击杀无效 - ''' - - # 过期时也有效 - #if not GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_VIPKillNPCAddAtk, isCheckTime=False): - # return - mwID = IpyGameDataPY.GetFuncCfg("VIPAddAtkEXP", 2) # VIP杀怪加属性所需激活法宝 - if not mwID or not PlayerMagicWeapon.GetIsActiveMagicWeapon(curPlayer, mwID): - return - - addExp = eval(IpyGameDataPY.GetFuncCompileCfg("VIPAddAtkEXP", 1)) - addExp *= killCount - if not addExp: - return - totalKillLVExp = GetVIPKillNPCLVExp(curPlayer) + addExp - - # 满级也继续加 - befKillLV = GetVIPKillNPCLV(curPlayer) - maxKillLV = IpyGameDataPY.IPY_Data().GetVIPKillNPCCount() - aftKillLV = befKillLV - # 非满级才处理升级逻辑 - if befKillLV < maxKillLV: - aftKillLV, totalKillLVExp = __DoVIPKillNPCLVUp(curPlayer, befKillLV, maxKillLV, totalKillLVExp) - totalKillLVExp = SetVIPKillNPCLVExp(curPlayer, totalKillLVExp) - #GameWorld.DebugLog("杀怪增加VIP杀怪等级经验: npcLV=%s,addExp=%s,totalKillLVExp=%s,befKillLV=%s,aftKillLV=%s,maxKillLV=%s" - # % (npcLV, addExp, totalKillLVExp, befKillLV, aftKillLV, maxKillLV), curPlayer.GetPlayerID()) - #同步客户端 - if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_SyncVIPKillNPCLVInfo) or befKillLV != aftKillLV: - SyncVIPKillNPCLVInfo(curPlayer) - return - -def __DoVIPKillNPCLVUp(curPlayer, befKillLV, maxKillLV, totalKillLVExp): - ## 处理VIP击杀NPC等级升级 - - aftKillLV = befKillLV - killLVIpyData = IpyGameDataPY.GetIpyGameData("VIPKillNPC", aftKillLV) - if killLVIpyData: - lvUPNeedExp = killLVIpyData.GetLVExpPoint() * ChConfig.Def_PerPointValue + killLVIpyData.GetLVExp() - while killLVIpyData and totalKillLVExp >= lvUPNeedExp: - totalKillLVExp -= lvUPNeedExp - aftKillLV += 1 - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_VIPKillLV, aftKillLV) - - if aftKillLV >= maxKillLV: - break - - killLVIpyData = IpyGameDataPY.GetIpyGameData("VIPKillNPC", aftKillLV) - if killLVIpyData: - lvUPNeedExp = killLVIpyData.GetLVExpPoint() * ChConfig.Def_PerPointValue + killLVIpyData.GetLVExp() - - if befKillLV != aftKillLV: - RefreshVIPAttr(curPlayer) - - return aftKillLV, totalKillLVExp - -def GetVIPKillNPCLV(curPlayer): return max(1, curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_VIPKillLV)) - -def GetVIPKillNPCLVExp(curPlayer): - exp = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_VIPKillLVExp) - expPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_VIPKillLVExpPoint) - return expPoint * ChConfig.Def_PerPointValue + exp - -def SetVIPKillNPCLVExp(curPlayer, totalKillLVExp): - totalKillLVExp = min(totalKillLVExp, ChConfig.Def_HugeValue) - updExp = totalKillLVExp % ChConfig.Def_PerPointValue - updExpPoint = totalKillLVExp / ChConfig.Def_PerPointValue - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_VIPKillLVExp, updExp) - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_VIPKillLVExpPoint, updExpPoint) - return totalKillLVExp - -def SyncVIPKillNPCLVInfo(curPlayer): - killLVInfo =ChPyNetSendPack.tagMCVIPKillNPCLVInfo() - killLVInfo.KillLV = GetVIPKillNPCLV(curPlayer) - killLVInfo.KillLVExpPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_VIPKillLVExpPoint) - killLVInfo.KillLVExp = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_VIPKillLVExp) - NetPackCommon.SendFakePack(curPlayer, killLVInfo) - return - - #=============================================================================== # // A8 06 查询充值结果 #tagCMQueryRecharge -- Gitblit v1.8.0