From 38904391ac59bc51133e66b9b5150c6b5db46ec4 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期二, 08 十月 2019 17:58:00 +0800 Subject: [PATCH] 8301 【恺英】【后端】仙缘币货币调整(改为给灵石,刷新召唤改为消耗灵石) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py | 210 ++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 162 insertions(+), 48 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py index f04aebc..884bcff 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFairyDomain.py @@ -19,18 +19,24 @@ import ChConfig import ChPyNetSendPack import NetPackCommon +import PlayerBossReborn import ShareDefine import GameWorld import GameLogic_CrossGrassland import PlayerControl import IpyGameDataPY import PlayerActivity -import ItemControler +import PlayerWeekParty +import PlayerFairyCeremony +import PlayerNewFairyCeremony +import ItemCommon +import PyGameData import EventShell +import FBCommon +import NPCCommon import copy import random -import FBCommon #0-奇遇 1-宝藏 2-仙草 3-妖王 4-灵草 ( @@ -56,10 +62,46 @@ AdventuresType4, ) = range(1, 5) +#事件副本类型 +( +FDEventFBType_Client, #前端本0 +FDEventFBType_Server, #本服本1 +FDEventFBType_CrossServer, #跨服本2 +) = range(3) def OnLogin(curPlayer): NotifyVisitFairyDomainInfo(curPlayer) NotifyFairyAdventuresInfo(curPlayer) + return + + +def OnHour(curPlayer): + __ResetFairyDomainCntLimit(curPlayer, 1) + return + + +def OnDay(curPlayer): + __ResetFairyDomainCntLimit(curPlayer, 2) + return + + +def __ResetFairyDomainCntLimit(curPlayer, resetType): + ## 重置个人缥缈事件出现次数记录 + ipyMgr = IpyGameDataPY.IPY_Data() + for i in xrange(ipyMgr.GetFairyDomainCount()): + ipyData = ipyMgr.GetFairyDomainByIndex(i) + eventID = ipyData.GetID() + appearCntInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventAppearCnt % eventID) + if not appearCntInfo: + continue + hourAppearCntPri, dayAppearCntPri = appearCntInfo % 1000, appearCntInfo / 1000 + if resetType == 1: + updAppearCntInfo = dayAppearCntPri * 1000 + elif resetType == 2: + updAppearCntInfo = hourAppearCntPri + else: + return + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventAppearCnt % eventID, updAppearCntInfo) return @@ -74,7 +116,7 @@ curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) otherCntRateList = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 2) - maxEventCnt = max([info[1] for info in otherCntRateList]) + 1 #最大可出现事件个数 + maxEventCnt = GetMaxEventCnt() #最大可出现事件个数 fairyDomainState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainState) #是否寻访中 0未寻访 1寻访中 2任务标记可寻访 if clientData.Type == 1: #结束寻访 if fairyDomainState != 1: @@ -95,11 +137,11 @@ if fairyDomainState == 1: GameWorld.DebugLog(" 正在寻访仙域中!请先退出寻访") return - - if fairyDomainState != 2 and not PlayerActivity.AddDailyActionFinishCnt(curPlayer, dailyID): - GameWorld.DebugLog(" 寻访仙域次数不足!") + costPoint = IpyGameDataPY.GetFuncCfg('ImmortalDomainActivePoint', 2) + if not PlayerActivity.CostActivityPoint(curPlayer, costPoint, True): + GameWorld.DebugLog(" 寻访仙域需要活跃点不足!costPoint=%s"%costPoint) return - + #随机事件 重置事件状态 visitCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainVisitCnt) appointIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog('FairyDomainAppoint', visitCnt + 1) @@ -109,18 +151,19 @@ fdEventIDList.append(appointIpyData.GetEventID()) else: fdEventTypeDict = {} - #先随机奇遇事件 - fortuitousEventRate = IpyGameDataPY.GetFuncCfg('ImmortalDomain') - if GameWorld.CanHappen(fortuitousEventRate): - fdEventTypeDict[FDEventType0] = 1 - + #先随机独立事件 + singleEventRateDict = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 1, {}) + for eventType, rate in singleEventRateDict.items(): + if GameWorld.CanHappen(rate): + fdEventTypeDict[eventType] = 1 + otherCnt = GameWorld.GetResultByRandomList(otherCntRateList, 0) if otherCnt: otherEventRateList = copy.deepcopy(IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 3)) unRepeatTypeList = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 4) for _ in xrange(otherCnt): - otherEventType = GameWorld.GetResultByRandomList(otherEventRateList, 0) - if not otherEventType: + otherEventType = GameWorld.GetResultByRandomList(otherEventRateList) + if otherEventType is None: continue if otherEventType in unRepeatTypeList: for index, info in enumerate(otherEventRateList): @@ -135,7 +178,21 @@ if not randomList: continue fdEventIDList += randomList - + #更新个人出现次数 + for fdEventID in fdEventIDList: + appearCntInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventAppearCnt % fdEventID) + hourAppearCntPri, dayAppearCntPri = appearCntInfo % 1000, appearCntInfo / 1000 + updAppearCntInfo = (dayAppearCntPri + 1) * 1000 + (hourAppearCntPri + 1) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventAppearCnt % fdEventID, updAppearCntInfo) + #更新全服出现次数 + msgStr = str(fdEventIDList) + GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'AddFairyDomainEvent', msgStr, len(msgStr)) + if not fdEventIDList: + fdEventIDList = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 5) + GameWorld.Log('寻访仙域, 没有随机出事件,使用默认事件!! playerLV=%s,visitCnt=%s,默认fdEventIDList=%s'%(curPlayer.GetLV(), visitCnt, fdEventIDList), curPlayer.GetID()) + if not fdEventIDList: + return + PlayerActivity.CostActivityPoint(curPlayer, costPoint) #奇遇事件 随机档位数据 openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1 for fdEventID in fdEventIDList: @@ -147,16 +204,12 @@ continue conditionList = ipyData.GetCondition() if not conditionList: - fdEventIDList.remove(fdEventID) - continue - condition = random.choice(conditionList) - index = conditionList.index(condition) + index = 0 + else: + condition = random.choice(conditionList) + index = conditionList.index(condition) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyAdventuresData % fdEventID, ipyData.GetID() * 100 + index) - - if not fdEventIDList: - GameWorld.Log('寻访仙域, 没有随机出事件!!') - return - + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainVisitCnt, min(visitCnt + 1, ChConfig.Def_UpperLimit_DWord)) #设置事件 for i in xrange(maxEventCnt): @@ -173,13 +226,19 @@ #通知 NotifyVisitFairyDomainInfo(curPlayer, fdEventIDList) NotifyFairyAdventuresInfo(curPlayer) + + PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_FairyDomain, 1) + PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_FairyDomain, 1) + PlayerFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_FairyDomain, 1) + PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_FairyDomain, 1) return + def EndFairyDomain(curPlayer): + GameWorld.DebugLog("EndFairyDomain", curPlayer.GetID()) ##结束寻访 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainState, 0) - otherCntRateList = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 2) - maxEventCnt = max([info[1] for info in otherCntRateList]) + 1 #最大可出现事件个数 + maxEventCnt = GetMaxEventCnt() #最大可出现事件个数 for i in xrange(maxEventCnt): fdEventID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventID % i) if fdEventID: @@ -187,6 +246,7 @@ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventState % fdEventID, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyAdventuresData % fdEventID, 0) return + def __RandomFDEventByType(curPlayer, eventType, cnt): ##根据事件类型随机事件 @@ -206,15 +266,47 @@ if lvLimit and not (lvLimit[0] <= curLV <= lvLimit[1]): #等级范围不满足 continue - + eventID = ipyData.GetID() + appearCntInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventAppearCnt % eventID) + hourAppearCntPri, dayAppearCntPri = appearCntInfo % 1000, appearCntInfo / 1000 + hourCntPriLimit, dayCntPriLimit = ipyData.GetHourCntPriLimit(), ipyData.GetDayCntPriLimit() + if hourCntPriLimit and hourAppearCntPri >= hourCntPriLimit: + #超过本小时个人可出现次数上限 + continue + if dayCntPriLimit and dayAppearCntPri >= dayCntPriLimit: + #超过今日个人可出现次数上限 + continue + if eventID in PyGameData.g_fairyDomainLimit: + #超过全服可出现次数 + continue rate += ipyData.GetWeight() randomRateList.append([rate, ipyData.GetID()]) if not randomRateList: - GameWorld.DebugLog(' 缥缈仙域刷新池 随机库获取错误 !eventType=%s' % eventType, curPlayer.GetID()) + GameWorld.DebugLog(' 缥缈仙域刷新池 该类型没有符合条件的事件!eventType=%s' % eventType, curPlayer.GetID()) return [] - randomResultList = GameWorld.GetResultByRandomListEx(randomRateList, cnt, []) - + realCnt = min(len(randomRateList), cnt) + randomResultList = GameWorld.GetResultByRandomListEx(randomRateList, realCnt, []) + GameWorld.DebugLog('eventType=%s, cnt=%s,randomRateList=%s,randomResultList=%s' % (eventType, cnt, randomRateList, randomResultList)) return randomResultList + + +def GetFairyDomainFBEventState(curPlayer, mapID, lineID): + ## 获取缥缈相关副本寻访状态 + ipyData = IpyGameDataPY.GetIpyGameDataByCondition("FairyDomain", {"MapID":mapID, "LineID":lineID}) + if not ipyData: + return FDEventState_No + fdeventID = ipyData.GetID() + curState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventState % fdeventID) + return curState + + +def SetFairyDomainFBEventState(curPlayer, mapID, lineID, state): + ## 设置缥缈相关副本寻访状态 + ipyData = IpyGameDataPY.GetIpyGameDataByCondition("FairyDomain", {"MapID":mapID, "LineID":lineID}) + if not ipyData: + return False + fdeventID = ipyData.GetID() + return SetFairyDomainEventState(curPlayer, fdeventID, state) def SetFairyDomainEventState(curPlayer, fdeventID, state): @@ -228,14 +320,14 @@ return if curState == state: return True - + ipyData = IpyGameDataPY.GetIpyGameData('FairyDomain', fdeventID) + if not ipyData: + return if state == FDEventState_Visiting: if curState != FDEventState_CanVisit: GameWorld.DebugLog('缥缈仙域事件状态设置错误,fdeventID=%s, state=%s, curState=%s' % (fdeventID, state, curState)) return - ipyData = IpyGameDataPY.GetIpyGameData('FairyDomain', fdeventID) - if not ipyData: - return + costEnergy = ipyData.GetCostEnergy() curEnergy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEnergy) if curEnergy < costEnergy: @@ -248,20 +340,20 @@ GameLogic_CrossGrassland.DoResetCrossGrassland(curPlayer, ipyData.GetEventType(), fdeventID) elif state == FDEventState_Visited: - if curState != FDEventState_Visiting: - GameWorld.Log('缥缈仙域事件状态设置错误,fdeventID=%s, state=%s, curState=%s' % (fdeventID, state, curState)) - return - EventShell.EventRespons_FairyDomain(curPlayer) + #设置结束,暂不做限制,防止异常导致无法结束 +# if curState != FDEventState_Visiting: +# GameWorld.Log('缥缈仙域事件状态设置错误,fdeventID=%s, state=%s, curState=%s' % (fdeventID, state, curState)) +# return + EventShell.EventRespons_FairyDomain(curPlayer, ipyData.GetEventType()) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FairyDomainEventState % fdeventID, state) NotifyVisitFairyDomainInfo(curPlayer, [fdeventID], 0) return True -def NotifyVisitFairyDomainInfo(curPlayer, fdEventList=[], isAll=1): +def NotifyVisitFairyDomainInfo(curPlayer, fdEventList=None, isAll=1): if not fdEventList: syncFDEventList = [] - otherCntRateList = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 2) - maxEventCnt = max([info[1] for info in otherCntRateList]) + 1 #最大可出现事件个数 + maxEventCnt = GetMaxEventCnt() #最大可出现事件个数 for i in xrange(maxEventCnt): fdEventID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventID % i) if fdEventID: @@ -284,6 +376,11 @@ NetPackCommon.SendFakePack(curPlayer, packData) return +def GetMaxEventCnt(): + # 最大可出现事件个数 + otherCntRateList = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 2) + maxEventCnt = max([info[1] for info in otherCntRateList]) + len(IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain')) + return maxEventCnt ###=========================奇遇=============================== def NotifyFairyAdventuresInfo(curPlayer): @@ -292,8 +389,7 @@ packData = ChPyNetSendPack.tagMCFairyAdventuresInfo() packData.InfoList = [] - otherCntRateList = IpyGameDataPY.GetFuncEvalCfg('ImmortalDomain', 2) - maxEventCnt = max([info[1] for info in otherCntRateList]) + 1 #最大可出现事件个数 + maxEventCnt = GetMaxEventCnt() #最大可出现事件个数 for i in xrange(maxEventCnt): fdEventID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FairyDomainEventID % i) if fdEventID not in AdventuresTypeList: @@ -357,12 +453,14 @@ gearAwardList = ipyData.GetGearAward() if not gearAwardList: return - itemRateList = gearAwardList[index] if index < len(gearAwardList) else gearAwardList[-1] - giveItemList = [GameWorld.GetResultByWeightList(itemRateList)] + giveItemList = [] + itemRandomList = gearAwardList[index] if index < len(gearAwardList) else gearAwardList[-1] + for itemRateList in itemRandomList: + itemRateList = ItemCommon.GetWeightItemListByAlchemyDiffLV(curPlayer, itemRateList, 0) + giveItemList.append(GameWorld.GetResultByWeightList(itemRateList)) else: giveItemList = [ipyData.GetBasicAward()] - - ItemControler.GivePlayerItemOrMail(curPlayer, giveItemList) + NPCCommon.DoGiveItemByVirtualDrop(curPlayer, giveItemList, 0) msgDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(giveItemList)} FBCommon.Notify_FB_Over(curPlayer, msgDict) GameWorld.DebugLog('缥缈奇遇领奖 msgDict=%s, fdeventID=%s' % (msgDict, fdeventID)) @@ -375,4 +473,20 @@ ipyData = IpyGameDataPY.GetIpyGameDataByCondition('FairyDomainAppoint', {'Cnt':visitCnt, 'EventID':fdEventID}, False, False) if not ipyData: return - return ipyData.GetAward() + job = curPlayer.GetJob() + itemList = [] + for itemInfo in ipyData.GetAward(): + if type(itemInfo[0]) == dict: + if job not in itemInfo[0]: + continue + itemList.append([itemInfo[0][job], itemInfo[1], itemInfo[2]]) + else: + itemList.append(itemInfo) + + for itemRateList in ipyData.GetRandomAward(): + itemRateList = ItemCommon.GetWeightItemListByAlchemyDiffLV(curPlayer, itemRateList, 1) + giveItem = GameWorld.GetResultByWeightList(itemRateList) + if not giveItem: + continue + itemList.append(giveItem) + return itemList -- Gitblit v1.8.0