349 【配套功能】功能预告-服务端(功能开启增加主线关卡进度条件)
| | |
| | | WORD LimiRealmLV; //需要境界等级
|
| | | DWORD LimitMissionID; //需要完成的任务ID
|
| | | WORD LimitOpenDay; //开服第几天开启
|
| | | WORD LimitManLevel; //关卡进度波
|
| | | char MailKey; //邮件
|
| | | list AwardList; //奖励列表[[物品ID,个数], ...]
|
| | | };
|
| | |
| | | {
|
| | | BYTE _DayID; //天数
|
| | | dict Reward; //奖励 {"职业":[[物品ID,个数],...], ...}
|
| | | };
|
| | |
|
| | | //七天限时特惠表
|
| | |
|
| | | struct tagSpringSale
|
| | | {
|
| | | BYTE _GiftID; //礼包ID
|
| | | BYTE SellDay; //创角第几天上架
|
| | | BYTE BuyNumLimit; //每人限购数量
|
| | | WORD GiftPrice; //礼包价格,仙玉
|
| | | list GiftItemList; //礼包物品信息列表[[物品ID,个数,是否绑定], ...]
|
| | | };
|
| | |
|
| | | //充值商品编号表
|
| | |
| | | openFuncIDList = [openFuncID]
|
| | |
|
| | | if openFuncIDList:
|
| | | needLV, needRealmLV, needMissionIDList = __GetOpenFuncLimit(curPlayer, openFuncIDList)
|
| | | needLV, needRealmLV, needMissionIDList, needMainLevel = __GetOpenFuncLimit(curPlayer, openFuncIDList)
|
| | | if needRealmLV:
|
| | | openFuncIDList.append(ShareDefine.GameFuncID_Official)
|
| | | needLV, needRealmLV, needMissionIDList = __GetOpenFuncLimit(curPlayer, openFuncIDList)
|
| | | needLV, needRealmLV, needMissionIDList, needMainLevel = __GetOpenFuncLimit(curPlayer, openFuncIDList)
|
| | |
|
| | | GameWorld.DebugLog("GM处理等级开启功能: openFuncID=%s,openFuncIDList=%s,needLV=%s" % (openFuncID, openFuncIDList, needLV), curPlayer.GetPlayerID())
|
| | |
|
| | |
| | | if not curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_MissionFinish % limitMissionID):
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_MissionFinish % limitMissionID, 1)
|
| | |
|
| | | GameWorld.DebugLog("GM处理任务开启功能: needMissionIDList=%s" % needMissionIDList, curPlayer.GetPlayerID())
|
| | | if needMainLevel:
|
| | | PlayerControl.SetMainLevelPassValue(curPlayer, needMainLevel)
|
| | | GameWorld.DebugLog("GM处理任务开启功能: needMissionIDList=%s,needMainLevel=%s" % (needMissionIDList, needMainLevel), curPlayer.GetPlayerID())
|
| | | #最后强制触发一次
|
| | | GameFuncComm.DoFuncOpenLogic(curPlayer, checkServerDay=False)
|
| | | return
|
| | |
| | | needLV = 0
|
| | | needRealmLV = 0
|
| | | needMissionIDList = []
|
| | | needMainLevel = 0
|
| | |
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | funcOpenLVCount = ipyDataMgr.GetFuncOpenLVCount()
|
| | |
| | | limitMissionID = ipyData.GetLimitMissionID()
|
| | | if limitMissionID and limitMissionID not in needMissionIDList:
|
| | | needMissionIDList.append(limitMissionID)
|
| | | return needLV, needRealmLV, needMissionIDList
|
| | | |
| | | limitManLevel = ipyData.GetLimitManLevel()
|
| | | if limitManLevel and needMainLevel < limitManLevel:
|
| | | needMainLevel = limitManLevel
|
| | | |
| | | return needLV, needRealmLV, needMissionIDList, needMainLevel
|
| | |
|
| | | def DoGMCloseFunc(curPlayer, closeFuncID):
|
| | | ## GM关闭功能
|
| | |
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_GameFuncFirstTouch % keyNum, 0)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_GameFuncAwardState % keyNum, 0)
|
| | |
|
| | | needLV, needRealmLV, needMissionIDList = __GetOpenFuncLimit(curPlayer, [])
|
| | | needLV, needRealmLV, needMissionIDList, needMainLevel = __GetOpenFuncLimit(curPlayer, [])
|
| | | for missionID in needMissionIDList:
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_MissionFinish % missionID, 0)
|
| | | |
| | | |
| | | if needMainLevel:
|
| | | PlayerControl.SetMainLevelPassInfo(curPlayer, 1, 1, 0)
|
| | | |
| | | GameFuncComm.Sync_FuncOpenState(curPlayer, isSyncUnOpen=True)
|
| | | GameWorld.DebugAnswer(curPlayer, "关闭所有功能!")
|
| | | return
|
| | |
| | | limitMissionID = ipyData.GetLimitMissionID()
|
| | | if limitMissionID:
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_MissionFinish % limitMissionID, 0)
|
| | | |
| | | |
| | | limitManLevel = ipyData.GetLimitManLevel()
|
| | | if limitManLevel and PlayerControl.GetMainLevelPassValue(curPlayer) >= limitManLevel:
|
| | | __SetPassMainLevelWavePre(curPlayer)
|
| | | |
| | | GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_GameFuncFirstTouch, closeFuncID, 0)
|
| | | GameFuncComm.Sync_FuncOpenState(curPlayer, isSyncUnOpen=True)
|
| | | GameWorld.DebugAnswer(curPlayer, "关闭功能: %s" % closeFuncID)
|
| | | return
|
| | |
|
| | | def __SetPassMainLevelWavePre(curPlayer):
|
| | | ## 设置已过关主线进度到上一波
|
| | | passChapterID, passLevelNum, passWave = PlayerControl.GetMainLevelPassInfo(curPlayer) # 当前过关进度包含波,所以需要取上一关的
|
| | | if passWave > 0:
|
| | | passWave -= 1
|
| | | PlayerControl.SetMainLevelPassInfo(curPlayer, passChapterID, passLevelNum, passWave)
|
| | | return
|
| | | |
| | | passWave = 0
|
| | | if passLevelNum > 1:
|
| | | passLevelNum -= 1
|
| | | PlayerControl.SetMainLevelPassInfo(curPlayer, passChapterID, passLevelNum, passWave)
|
| | | return
|
| | | |
| | | if passChapterID > 1: # 取上一章节
|
| | | passChapterID -= 1
|
| | | levelDataList = IpyGameDataPY.GetIpyGameDataByCondition("MainLevel", {"ChapterID":passChapterID}, True)
|
| | | passLevelNum = len(levelDataList) if levelDataList else 0
|
| | | PlayerControl.SetMainLevelPassInfo(curPlayer, passChapterID, passLevelNum, passWave)
|
| | | return
|
| | | |
| | | PlayerControl.SetMainLevelPassInfo(curPlayer, 1, 1, 0)
|
| | | return
|
| | |
| | | ("WORD", "LimiRealmLV", 0),
|
| | | ("DWORD", "LimitMissionID", 0),
|
| | | ("WORD", "LimitOpenDay", 0),
|
| | | ("WORD", "LimitManLevel", 0),
|
| | | ("char", "MailKey", 0),
|
| | | ("list", "AwardList", 0),
|
| | | ),
|
| | |
| | | "LoginDayAward":(
|
| | | ("BYTE", "DayID", 1),
|
| | | ("dict", "Reward", 0),
|
| | | ),
|
| | |
|
| | | "SpringSale":(
|
| | | ("BYTE", "GiftID", 1),
|
| | | ("BYTE", "SellDay", 0),
|
| | | ("BYTE", "BuyNumLimit", 0),
|
| | | ("WORD", "GiftPrice", 0),
|
| | | ("list", "GiftItemList", 0),
|
| | | ),
|
| | |
|
| | | "OrderInfo":(
|
| | |
| | | def GetLimiRealmLV(self): return self.attrTuple[2] # 需要境界等级 WORD
|
| | | def GetLimitMissionID(self): return self.attrTuple[3] # 需要完成的任务ID DWORD
|
| | | def GetLimitOpenDay(self): return self.attrTuple[4] # 开服第几天开启 WORD
|
| | | def GetMailKey(self): return self.attrTuple[5] # 邮件 char
|
| | | def GetAwardList(self): return self.attrTuple[6] # 奖励列表[[物品ID,个数], ...] list |
| | | def GetLimitManLevel(self): return self.attrTuple[5] # 关卡进度波 WORD
|
| | | def GetMailKey(self): return self.attrTuple[6] # 邮件 char
|
| | | def GetAwardList(self): return self.attrTuple[7] # 奖励列表[[物品ID,个数], ...] list |
| | | |
| | | # 合成表 |
| | | class IPY_ItemCompound(): |
| | |
| | | |
| | | def GetDayID(self): return self.attrTuple[0] # 天数 BYTE
|
| | | def GetReward(self): return self.attrTuple[1] # 奖励 {"职业":[[物品ID,个数],...], ...} dict |
| | | |
| | | # 七天限时特惠表 |
| | | class IPY_SpringSale(): |
| | | |
| | | def __init__(self): |
| | | self.attrTuple = None |
| | | return |
| | | |
| | | def GetGiftID(self): return self.attrTuple[0] # 礼包ID BYTE
|
| | | def GetSellDay(self): return self.attrTuple[1] # 创角第几天上架 BYTE
|
| | | def GetBuyNumLimit(self): return self.attrTuple[2] # 每人限购数量 BYTE
|
| | | def GetGiftPrice(self): return self.attrTuple[3] # 礼包价格,仙玉 WORD
|
| | | def GetGiftItemList(self): return self.attrTuple[4] # 礼包物品信息列表[[物品ID,个数,是否绑定], ...] list |
| | | |
| | | # 充值商品编号表 |
| | | class IPY_OrderInfo(): |
| | |
| | | self.__LoadFileData("ChestsAward", onlyCheck)
|
| | | self.__LoadFileData("VIPKillNPC", onlyCheck)
|
| | | self.__LoadFileData("LoginDayAward", onlyCheck)
|
| | | self.__LoadFileData("SpringSale", onlyCheck)
|
| | | self.__LoadFileData("OrderInfo", onlyCheck)
|
| | | self.__LoadFileData("CTG", onlyCheck)
|
| | | self.__LoadFileData("CTGSelectItem", onlyCheck)
|
| | |
| | | def GetLoginDayAwardByIndex(self, index): |
| | | self.CheckLoadData("LoginDayAward") |
| | | return self.ipyLoginDayAwardCache[index]
|
| | | |
| | | def GetSpringSaleCount(self): |
| | | self.CheckLoadData("SpringSale") |
| | | return self.ipySpringSaleLen
|
| | | def GetSpringSaleByIndex(self, index): |
| | | self.CheckLoadData("SpringSale") |
| | | return self.ipySpringSaleCache[index]
|
| | | |
| | | def GetOrderInfoCount(self): |
| | | self.CheckLoadData("OrderInfo") |
| | |
| | | if limitOpenDay and serverDay < limitOpenDay and checkServerDay:
|
| | | continue
|
| | |
|
| | | limitManLevel = ipyData.GetLimitManLevel()
|
| | | if limitManLevel and limitManLevel < PlayerControl.GetMainLevelPassValue(curPlayer):
|
| | | continue
|
| | | |
| | | # 先更新值再处理开启逻辑,不能可能导致在功能开启逻辑中再开启功能引发的递归死循环
|
| | | befValue, updValue = GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_GameFuncFirstTouch, funcID, 1)
|
| | | if befValue == updValue:
|