|  |  |  | 
|---|
|  |  |  | import PlayerWeekParty | 
|---|
|  |  |  | import FamilyRobBoss | 
|---|
|  |  |  | import IpyGameDataPY | 
|---|
|  |  |  | import PlayerState | 
|---|
|  |  |  | import PyGameData | 
|---|
|  |  |  | import PlayerTeam | 
|---|
|  |  |  | import PlayerVip | 
|---|
|  |  |  | 
|---|
|  |  |  | ) = range(Def_CollNPCCfg_Len) | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ## 该NPC可否同时采集 | 
|---|
|  |  |  | #  @param curNPC:采集NPC实例 | 
|---|
|  |  |  | #  @return False-不可以,True-可以 | 
|---|
|  |  |  | def CanNPCCollectTogether(curNPC): | 
|---|
|  |  |  | npcID = curNPC.GetNPCID() | 
|---|
|  |  |  | collectNPCCfg = ReadChConfig.GetEvalChConfig('CollectNPCCfg') | 
|---|
|  |  |  | if npcID not in collectNPCCfg: | 
|---|
|  |  |  | def CheckCanCollectByNPCID(curPlayer, npcID, collectNPCIpyData): | 
|---|
|  |  |  | # 根据NPCID判断是否可以采集 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if GameWorld.IsCrossServer(): | 
|---|
|  |  |  | return True | 
|---|
|  |  |  |  | 
|---|
|  |  |  | collectNPCInfo = collectNPCCfg[npcID] | 
|---|
|  |  |  | if len(collectNPCInfo) != Def_CollNPCCfg_Len: | 
|---|
|  |  |  | return True | 
|---|
|  |  |  |  | 
|---|
|  |  |  | canCollTogether = collectNPCInfo[Def_CollNPCCfg_CanTogether] | 
|---|
|  |  |  | return canCollTogether | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ## 采集NPC开始采集 | 
|---|
|  |  |  | #  @param curPlayer:采集玩家实例 | 
|---|
|  |  |  | #  @param curNPC:采集NPC实例 | 
|---|
|  |  |  | #  @return False-非采集NPC,True-是采集NPC逻辑 | 
|---|
|  |  |  | def DoCollectNPCBegin(curPlayer, curNPC): | 
|---|
|  |  |  | npcID = curNPC.GetNPCID() | 
|---|
|  |  |  | collectNPCCfg = ReadChConfig.GetEvalChConfig('CollectNPCCfg') | 
|---|
|  |  |  | if npcID not in collectNPCCfg: | 
|---|
|  |  |  | GameWorld.DebugLog("DoCollectNPCBegin 非特定采集NPC...") | 
|---|
|  |  |  | limitMaxTime = collectNPCIpyData.GetMaxCollectCount() | 
|---|
|  |  |  | if limitMaxTime > 0 and GetTodayCollectCount(curPlayer, npcID) >= limitMaxTime: | 
|---|
|  |  |  | PlayerControl.NotifyCode(curPlayer, collectNPCIpyData.GetCollectCountLimitNotify(), [limitMaxTime]) | 
|---|
|  |  |  | return False | 
|---|
|  |  |  |  | 
|---|
|  |  |  | collectNPCInfo = collectNPCCfg[npcID] | 
|---|
|  |  |  | if len(collectNPCInfo) != Def_CollNPCCfg_Len: | 
|---|
|  |  |  | GameWorld.ErrLog("CollectNPCCfg.txt配置错误,npcID=%s" % npcID) | 
|---|
|  |  |  | return True | 
|---|
|  |  |  | #如果是打坐召唤的NPC | 
|---|
|  |  |  | isSitCollect = npcID == IpyGameDataPY.GetFuncCfg('RealmSitNPCID') | 
|---|
|  |  |  | if isSitCollect: | 
|---|
|  |  |  | summonOwner = GetSummonNPCOwner(IPY_GameWorld.gotPlayer, curNPC) | 
|---|
|  |  |  | #ownerDetail = GetNpcObjOwnerDetail(curNPC) | 
|---|
|  |  |  | if not summonOwner: | 
|---|
|  |  |  | return True | 
|---|
|  |  |  | if summonOwner.GetID() == curPlayer.GetID(): | 
|---|
|  |  |  | GameWorld.DebugLog("不能采集自己的打坐召唤兽 summonOwner.GetID()=%s" % summonOwner.GetID()) | 
|---|
|  |  |  | #背包空间判断 | 
|---|
|  |  |  | if collectNPCIpyData.GetCollectAward() and not ItemCommon.CheckPackHasSpace(curPlayer, IPY_GameWorld.rptItem): | 
|---|
|  |  |  | PlayerControl.NotifyCode(curPlayer, "GeRen_lhs_202580") | 
|---|
|  |  |  | return False | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #消耗物品采集,待扩展... | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return True | 
|---|
|  |  |  |  | 
|---|
|  |  |  | canCollTogether = collectNPCInfo[Def_CollNPCCfg_CanTogether] | 
|---|
|  |  |  | def GetTodayCollectCount(curPlayer, npcID): | 
|---|
|  |  |  | ## 获取采集NPC今日已采集次数 | 
|---|
|  |  |  | todayCollTime = 0 | 
|---|
|  |  |  | collectTimeShareIDList = IpyGameDataPY.GetFuncEvalCfg("CollectNPC", 1) | 
|---|
|  |  |  | for npcIDList in collectTimeShareIDList: | 
|---|
|  |  |  | if npcID not in npcIDList: | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | for collNPCID in npcIDList: | 
|---|
|  |  |  | todayCollTime += curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CollNpcIDCollTime % collNPCID) | 
|---|
|  |  |  | return todayCollTime | 
|---|
|  |  |  | return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CollNpcIDCollTime % npcID) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def OnCollectNPCBegin(curPlayer, curNPC, tick): | 
|---|
|  |  |  | ## 采集NPC开始采集 | 
|---|
|  |  |  | npcID = curNPC.GetNPCID() | 
|---|
|  |  |  | collectNPCIpyData = IpyGameDataPY.GetIpyGameData("CollectNPC", npcID) | 
|---|
|  |  |  | if not collectNPCIpyData: | 
|---|
|  |  |  | GameWorld.DebugLog("非特定采集NPC...") | 
|---|
|  |  |  | return False | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if not CheckCanCollectByNPCID(curPlayer, npcID, collectNPCIpyData): | 
|---|
|  |  |  | return True | 
|---|
|  |  |  |  | 
|---|
|  |  |  | canCollTogether = 1 | 
|---|
|  |  |  | collectPlayerID = GetCollectNPCPlayerID(curNPC) | 
|---|
|  |  |  | # 如果不允许同时采,且有人在采,则直接返回 | 
|---|
|  |  |  | if not canCollTogether and collectPlayerID > 0 and collectPlayerID != curPlayer.GetPlayerID(): | 
|---|
|  |  |  | GameWorld.DebugLog("DoCollectNPCBegin 不允许同时采集!") | 
|---|
|  |  |  | sysMark = collectNPCInfo[Def_CollNPCCfg_SysMsgMark] | 
|---|
|  |  |  | GameWorld.DebugLog("不允许同时采集!") | 
|---|
|  |  |  | sysMark = "GeRen_liubo_436832" | 
|---|
|  |  |  | if sysMark: | 
|---|
|  |  |  | PlayerControl.NotifyCode(curPlayer, sysMark) | 
|---|
|  |  |  | return True | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 采集次数判断 | 
|---|
|  |  |  | limitMaxTime, todayCollTime = 0, 0 | 
|---|
|  |  |  | collLimitInfo = GetCollTimeLimitInfo(curPlayer, npcID) | 
|---|
|  |  |  | if collLimitInfo: | 
|---|
|  |  |  | limitMaxTime, todayCollTime = collLimitInfo | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if limitMaxTime > 0 and todayCollTime >= limitMaxTime: | 
|---|
|  |  |  |  | 
|---|
|  |  |  | PlayerControl.NotifyCode(curPlayer, collectNPCInfo[Def_CollNPCCfg_LimitSysMsgMark], [limitMaxTime]) | 
|---|
|  |  |  | DoCollectNPCBegin(curPlayer, curNPC, collectNPCIpyData, tick) | 
|---|
|  |  |  | return True | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 采集消耗 | 
|---|
|  |  |  | isAutoBuy = True #默认自动购买 | 
|---|
|  |  |  | costItemInfo = collectNPCInfo[Def_CollNPCCfg_CostItemInfo] | 
|---|
|  |  |  | if costItemInfo: | 
|---|
|  |  |  | costItemID, costItemCnt = costItemInfo | 
|---|
|  |  |  | if costItemID > 0: | 
|---|
|  |  |  | itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) | 
|---|
|  |  |  | enough, indexList, hasBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx( | 
|---|
|  |  |  | costItemID, itemPack, costItemCnt) | 
|---|
|  |  |  | if not enough and not isAutoBuy: | 
|---|
|  |  |  | GameWorld.DebugLog("DoCollectNPCLogic 采集消耗物品不足,npcID=%s,costItemID=%s,cnt=%s" \ | 
|---|
|  |  |  | % (npcID, costItemID, costItemCnt)) | 
|---|
|  |  |  | PlayerControl.NotifyCode(curPlayer, collectNPCInfo[Def_CollNPCCfg_NotCostItemNotify], | 
|---|
|  |  |  | [npcID, costItemID, costItemCnt]) | 
|---|
|  |  |  | return True | 
|---|
|  |  |  | def DoCollectNPCBegin(curPlayer, curNPC, collectNPCIpyData, tick): | 
|---|
|  |  |  | ## 开始采集 | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 改为在采集成功后扣除道具 | 
|---|
|  |  |  | #ItemCommon.ReduceItem(curPlayer, itemPack, indexList, costItemCnt, False) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #背包空间判断 | 
|---|
|  |  |  | if not ItemCommon.CheckPackHasSpace(curPlayer, IPY_GameWorld.rptItem): | 
|---|
|  |  |  | PlayerControl.NotifyCode(curPlayer, "GeRen_lhs_202580") | 
|---|
|  |  |  | return True | 
|---|
|  |  |  |  | 
|---|
|  |  |  | canCollTogether = 1 | 
|---|
|  |  |  | if not canCollTogether and not SetCollectNPC(curPlayer, curNPC): | 
|---|
|  |  |  | GameWorld.ErrLog("DoCollectNPCBegin SetCollectNPC fail!") | 
|---|
|  |  |  | return True | 
|---|
|  |  |  | GameWorld.ErrLog("SetCollectNPC fail!") | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 采集耗时 | 
|---|
|  |  |  | prepareTime = collectNPCInfo[Def_CollNPCCfg_PrepareTime] | 
|---|
|  |  |  | prepareTime = collectNPCIpyData.GetPrepareTime() * 1000 | 
|---|
|  |  |  | collTimeReduceRate = PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_CollTimeReduceRate) | 
|---|
|  |  |  | if collTimeReduceRate: | 
|---|
|  |  |  | prepareTime = max(1000, int(prepareTime * (ShareDefine.Def_MaxRateValue - collTimeReduceRate) / float(ShareDefine.Def_MaxRateValue))) | 
|---|
|  |  |  | PlayerControl.Sync_PrepareBegin(curPlayer, prepareTime, IPY_GameWorld.pstMissionCollecting, prepareID=curNPC.GetID()) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | PlayerControl.Sync_PrepareBegin(curPlayer, prepareTime, IPY_GameWorld.pstMissionCollecting, \ | 
|---|
|  |  |  | prepareID=curNPC.GetID()) | 
|---|
|  |  |  | if collectNPCIpyData.GetLostHPPer(): | 
|---|
|  |  |  | curPlayer.SetDict(ChConfig.Def_PlayerKey_CollectLostHPTick, tick) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | FBLogic.OnBeginCollect(curPlayer, curNPC) | 
|---|
|  |  |  | ##添加这个NPC的伤血列表,用于判断可否同时采集,改为字典判断 | 
|---|
|  |  |  | AttackCommon.AddHurtValue(curNPC, curPlayer.GetPlayerID(), ChConfig.Def_NPCHurtTypePlayer, 1) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def GetCollTimeLimitInfo(curPlayer, npcID): | 
|---|
|  |  |  | ## 获取采集次数限制信息 | 
|---|
|  |  |  | npcIDCollectCntLimitDict = ReadChConfig.GetEvalChConfig("CollectNPCIDTimeLimit") | 
|---|
|  |  |  | for npcIDTuple in npcIDCollectCntLimitDict.keys(): | 
|---|
|  |  |  | if npcID not in npcIDTuple: | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | limitMaxTime = npcIDCollectCntLimitDict[npcIDTuple][0] | 
|---|
|  |  |  | todayCollTime = 0 | 
|---|
|  |  |  | for collNPCID in npcIDTuple: | 
|---|
|  |  |  | todayCollTime += curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CollNpcIDCollTime % collNPCID) | 
|---|
|  |  |  | GameWorld.DebugLog("    limitMaxTime=%s,todayCollTime=%s" % (limitMaxTime, todayCollTime)) | 
|---|
|  |  |  | return limitMaxTime, todayCollTime | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ## 设置玩家采集该NPC | 
|---|
|  |  |  | #  @param curPlayer:玩家实例 | 
|---|
|  |  |  | #  @param curNPC:采集NPC实例 | 
|---|
|  |  |  | #  @return False-失败,True-成功 | 
|---|
|  |  |  | def SetCollectNPC(curPlayer, curNPC): | 
|---|
|  |  |  | ## 设置玩家采集该NPC | 
|---|
|  |  |  | curPlayerID = curPlayer.GetPlayerID() | 
|---|
|  |  |  | curNPCObjID = curNPC.GetID() | 
|---|
|  |  |  | curCollectPlayerID = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_CollectPlayerID) | 
|---|
|  |  |  | 
|---|
|  |  |  | #GameWorld.DebugLog("    set collectNPCObjID 0") | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def DoCollectNPCOK(curPlayer, npcID, tick): | 
|---|
|  |  |  | ## 采集NPC采集结束 | 
|---|
|  |  |  | #  @param curPlayer:采集玩家实例 | 
|---|
|  |  |  | #  @param npcID:采集NPCID | 
|---|
|  |  |  | #  @return False-非采集NPC,True-是采集NPC逻辑 | 
|---|
|  |  |  | def DoCollectNPCOK(curPlayer, npcID): | 
|---|
|  |  |  | isOK = DoGetCollectionNPCAwardLogic(curPlayer, npcID, True, 1) | 
|---|
|  |  |  | ClearCollectNPC(curPlayer) | 
|---|
|  |  |  | return isOK | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #// A2 20 开启采集NPC奖励箱子 #tagCMOpenCollNPCBox | 
|---|
|  |  |  | # | 
|---|
|  |  |  | #struct    tagCMOpenCollNPCBox | 
|---|
|  |  |  | #{ | 
|---|
|  |  |  | #    tagHead        Head; | 
|---|
|  |  |  | #    DWORD        MapID;        //MapID | 
|---|
|  |  |  | #    DWORD        NPCID;        //NPCID | 
|---|
|  |  |  | #    BYTE        OpenCnt;        //开启次数 | 
|---|
|  |  |  | #    BYTE        IsAutoBuy;    //消耗道具不足是否自动购买 | 
|---|
|  |  |  | #    BYTE        IsOnlyGold;    //是否只消耗钻石 | 
|---|
|  |  |  | #}; | 
|---|
|  |  |  | def OnOpenCollNPCBox(index, clientData, tick): | 
|---|
|  |  |  | mapID = clientData.MapID | 
|---|
|  |  |  | npcID = clientData.NPCID | 
|---|
|  |  |  | openCnt = clientData.OpenCnt | 
|---|
|  |  |  | isAutoBuy = clientData.IsAutoBuy | 
|---|
|  |  |  | isOnlyGold = clientData.IsOnlyGold | 
|---|
|  |  |  | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) | 
|---|
|  |  |  | collLimitInfo = GetCollTimeLimitInfo(curPlayer, npcID) | 
|---|
|  |  |  | if not collLimitInfo: | 
|---|
|  |  |  | GameWorld.DebugLog("该NPC不是自定义采集NPC箱子, 不可开启! npcID=%s" % npcID) | 
|---|
|  |  |  | return | 
|---|
|  |  |  | GameWorld.DebugLog("OnOpenCollNPCBox...npcID=%s,openCnt=%s,isAutoBuy=%s" % (npcID, openCnt, isAutoBuy)) | 
|---|
|  |  |  | DoGetCollectionNPCAwardLogic(curPlayer, npcID, isAutoBuy, openCnt, mapID, isOnlyGold) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ## isOnlyGold:是否全消耗钻石,不扣道具 | 
|---|
|  |  |  | def DoGetCollectionNPCAwardLogic(curPlayer, npcID, isAutoBuy=False, collectCnt=1, mapID=None, isOnlyGold=False): | 
|---|
|  |  |  | GameWorld.DebugLog("DoGetCollectionNPCAwardLogic...npcID=%s,collectCnt=%s" % (npcID, collectCnt)) | 
|---|
|  |  |  | collectNPCCfg = ReadChConfig.GetEvalChConfig('CollectNPCCfg') | 
|---|
|  |  |  | if npcID not in collectNPCCfg: | 
|---|
|  |  |  | collectNPCIpyData = IpyGameDataPY.GetIpyGameData("CollectNPC", npcID) | 
|---|
|  |  |  | if not collectNPCIpyData: | 
|---|
|  |  |  | GameWorld.DebugLog("    非特定采集NPC...npcID=%s" % npcID) | 
|---|
|  |  |  | return False | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | PlayerState.DoCollectingLostHP(curPlayer, collectNPCIpyData, tick, True) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if GameWorld.IsCrossServer(): | 
|---|
|  |  |  | # 发送回本服采集完成 | 
|---|
|  |  |  | serverGroupID = PlayerControl.GetPlayerServerGroupID(curPlayer) | 
|---|
|  |  |  | msgInfo = {"Result":1, "PlayerID":curPlayer.GetPlayerID(), "NPCID":npcID} | 
|---|
|  |  |  | GameWorld.SendMsgToClientServer(ShareDefine.CrossServerMsg_CollectNPCOK, msgInfo, [serverGroupID]) | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | DoGiveCollectNPCAward(curPlayer, npcID, collectNPCIpyData) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | FBLogic.OnCollectOK(curPlayer, npcID, tick) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ClearCollectNPC(curPlayer) | 
|---|
|  |  |  | return True | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def CrossServerMsg_CollectNPCOK(curPlayer, msgData): | 
|---|
|  |  |  | ## 收到跨服同步的采集完成 | 
|---|
|  |  |  | if not msgData["Result"]: | 
|---|
|  |  |  | return | 
|---|
|  |  |  | npcID = msgData["NPCID"] | 
|---|
|  |  |  | collectNPCIpyData = IpyGameDataPY.GetIpyGameData("CollectNPC", npcID) | 
|---|
|  |  |  | if collectNPCIpyData: | 
|---|
|  |  |  | DoGiveCollectNPCAward(curPlayer, npcID, collectNPCIpyData) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def DoGiveCollectNPCAward(curPlayer, npcID, collectNPCIpyData, collectCnt=1): | 
|---|
|  |  |  | GameWorld.DebugLog("给采集奖励: npcID=%s,collectCnt=%s" % (npcID, collectCnt)) | 
|---|
|  |  |  | if collectCnt <= 0: | 
|---|
|  |  |  | return True | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | collectNPCInfo = collectNPCCfg[npcID] | 
|---|
|  |  |  | if len(collectNPCInfo) != Def_CollNPCCfg_Len: | 
|---|
|  |  |  | GameWorld.ErrLog("CollectNPCCfg.txt配置错误,npcID=%s" % npcID) | 
|---|
|  |  |  | return True | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 采集消耗 | 
|---|
|  |  |  | costItemID, costItemCnt = 0, 0 | 
|---|
|  |  |  | costItemInfo = collectNPCInfo[Def_CollNPCCfg_CostItemInfo] | 
|---|
|  |  |  | if costItemInfo and len(costItemInfo) == 2: | 
|---|
|  |  |  | costItemID, costItemCnt = costItemInfo | 
|---|
|  |  |  |  | 
|---|
|  |  |  | curNPC = GameWorld.GetGameData().FindNPCDataByID(npcID) | 
|---|
|  |  |  | if not curNPC: | 
|---|
|  |  |  | return True | 
|---|
|  |  |  |  | 
|---|
|  |  |  | limitMaxTime = 0 # 0表示不限制次数 | 
|---|
|  |  |  | todayCollTime = 0 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 根据NPCID | 
|---|
|  |  |  | collLimitInfo = GetCollTimeLimitInfo(curPlayer, npcID) | 
|---|
|  |  |  | if collLimitInfo: | 
|---|
|  |  |  | limitMaxTime, todayCollTime = collLimitInfo | 
|---|
|  |  |  |  | 
|---|
|  |  |  | limitMaxTime = collectNPCIpyData.GetMaxCollectCount() | 
|---|
|  |  |  | if limitMaxTime > 0: | 
|---|
|  |  |  | todayCollTime = GetTodayCollectCount(curPlayer, npcID) | 
|---|
|  |  |  | canCollectCnt = max(0, limitMaxTime - todayCollTime) | 
|---|
|  |  |  | collectCnt = min(collectCnt, canCollectCnt) | 
|---|
|  |  |  | if collectCnt <= 0: | 
|---|
|  |  |  | GameWorld.DebugLog("    该NPC已达到最大采集次数: todayCollTime=%s,limitMaxTime=%s" % (todayCollTime, limitMaxTime)) | 
|---|
|  |  |  | return True | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | costItemCntTotal = costItemCnt * collectCnt | 
|---|
|  |  |  | # 需要消耗道具的情况 | 
|---|
|  |  |  | bindCnt = 0 | 
|---|
|  |  |  | if costItemID > 0 and costItemCntTotal > 0: | 
|---|
|  |  |  | costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID) | 
|---|
|  |  |  | lackCnt = max(0, costItemCntTotal - bindCnt - unBindCnt) if not isOnlyGold else costItemCntTotal | 
|---|
|  |  |  | lackCost = 0 # 缺少道具个数 | 
|---|
|  |  |  | itemGold = 0 # 自动购买单价 | 
|---|
|  |  |  | if lackCnt > 0 and not isAutoBuy: | 
|---|
|  |  |  | GameWorld.DebugLog("    采集消耗物品不足,npcID=%s,costItemID=%s,costItemCnt=%s,collectCnt=%s,hasCnt=(%s+%s)" \ | 
|---|
|  |  |  | % (npcID, costItemID, costItemCnt, collectCnt, bindCnt, unBindCnt)) | 
|---|
|  |  |  | PlayerControl.NotifyCode(curPlayer, collectNPCInfo[Def_CollNPCCfg_NotCostItemNotify], | 
|---|
|  |  |  | [npcID, costItemID, costItemCnt]) | 
|---|
|  |  |  | return True | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if lackCnt > 0: | 
|---|
|  |  |  | itemGold = PlayerSuperMarket.GetStoreItemPrice(costItemID, IPY_GameWorld.TYPE_Price_Gold_Money) | 
|---|
|  |  |  | lackCost = lackCnt * itemGold | 
|---|
|  |  |  | if lackCost <= 0: | 
|---|
|  |  |  | return True | 
|---|
|  |  |  | if not PlayerControl.HaveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, lackCost, True): | 
|---|
|  |  |  | return True | 
|---|
|  |  |  |  | 
|---|
|  |  |  | giveItemInfoList = [] | 
|---|
|  |  |  | # 饼图随机表, 独立概率随机表 | 
|---|
|  |  |  | prizeInfo = __GetGiveCollectItemInfo(curPlayer, collectNPCInfo[Def_CollNPCCfg_GiveItemModeID]) | 
|---|
|  |  |  | pieRandomList, randomAllInfoList = prizeInfo[:2] | 
|---|
|  |  |  | besureInfoList = prizeInfo[2] if len(prizeInfo) > 2 else [] # 按次数必出配置 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if not mapID: | 
|---|
|  |  |  | mapID = GameWorld.GetMap().GetMapID() | 
|---|
|  |  |  |  | 
|---|
|  |  |  | successCnt = 0 # 成功次数 | 
|---|
|  |  |  | if pieRandomList or randomAllInfoList: | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for i in xrange(collectCnt): | 
|---|
|  |  |  | isBind = 1 if successCnt < bindCnt else 0 | 
|---|
|  |  |  | getItemInfo = __DoGiveCollectionNPCSingleAward(curPlayer, mapID, npcID, isBind, pieRandomList, randomAllInfoList, besureInfoList) | 
|---|
|  |  |  | if not getItemInfo: | 
|---|
|  |  |  | break | 
|---|
|  |  |  | giveItemInfoList.extend(getItemInfo) | 
|---|
|  |  |  | successCnt += 1 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if successCnt <= 0: | 
|---|
|  |  |  | return True | 
|---|
|  |  |  | else: | 
|---|
|  |  |  | successCnt = collectCnt | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 给额外奖励 | 
|---|
|  |  |  | reLV = curPlayer.GetLV() | 
|---|
|  |  |  | reExp = PlayerControl.GetPlayerReExp(curPlayer) | 
|---|
|  |  |  | reMoney = PlayerControl.GetPlayerReMoney(curPlayer) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | addExp = eval(collectNPCInfo[Def_CollNPCCfg_ExpFormat]) * successCnt | 
|---|
|  |  |  | addMoney = eval(collectNPCInfo[Def_CollNPCCfg_MoneyFormat]) * successCnt | 
|---|
|  |  |  | addZhenQi = collectNPCInfo[Def_CollNPCCfg_ZhenQi] * successCnt | 
|---|
|  |  |  |  | 
|---|
|  |  |  | playerControl = PlayerControl.PlayerControl(curPlayer) | 
|---|
|  |  |  | playerControl.AddExp(addExp) | 
|---|
|  |  |  | addDataDict = {ChConfig.Def_Give_Reason_SonKey:npcID} | 
|---|
|  |  |  | PlayerControl.GiveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, addMoney, | 
|---|
|  |  |  | ChConfig.Def_GiveMoney_CollectNPC, addDataDict) | 
|---|
|  |  |  | PlayerControl.PlayerAddZhenQi(curPlayer, addZhenQi, True, True, "Collection") | 
|---|
|  |  |  | GameWorld.DebugLog("    successCnt=%s,addExp=%s,addMoney=%s,addZhenQi=%s" | 
|---|
|  |  |  | % (successCnt, addExp, addMoney, addZhenQi)) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 需要消耗道具的情况, 扣除消耗 | 
|---|
|  |  |  | if costItemID > 0 and costItemCntTotal > 0: | 
|---|
|  |  |  | unCostCnt = successCnt # 未扣除的消耗个数 | 
|---|
|  |  |  | if not isOnlyGold: | 
|---|
|  |  |  | bindIndexList, unBindIndexList = costItemIndexList | 
|---|
|  |  |  | itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) | 
|---|
|  |  |  | if bindCnt > 0: | 
|---|
|  |  |  | bindCostCnt = bindCnt if unCostCnt >= bindCnt else unCostCnt # 绑定道具消耗个数 | 
|---|
|  |  |  | unCostCnt -= bindCostCnt | 
|---|
|  |  |  | ItemCommon.ReduceItem(curPlayer, itemPack, bindIndexList, bindCostCnt, True, "CollectNPC") | 
|---|
|  |  |  | GameWorld.DebugLog("        扣除绑定道具: %s" % (bindCostCnt), curPlayer.GetPlayerID()) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if unCostCnt > 0 and unBindCnt > 0: | 
|---|
|  |  |  | unBindCostCnt = unBindCnt if unCostCnt >= unBindCnt else unCostCnt # 绑定道具消耗个数 | 
|---|
|  |  |  | unCostCnt -= unBindCostCnt | 
|---|
|  |  |  | ItemCommon.ReduceItem(curPlayer, itemPack, unBindIndexList, unBindCostCnt, True, "CollectNPC") | 
|---|
|  |  |  | GameWorld.DebugLog("        扣除未绑道具: %s" % (unBindCostCnt), curPlayer.GetPlayerID()) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if unCostCnt > 0: | 
|---|
|  |  |  | reduceGold = int(unCostCnt * itemGold) | 
|---|
|  |  |  | infoDict = {"PerGold":itemGold, "unCostCnt":unCostCnt, ChConfig.Def_Cost_Reason_SonKey:costItemID} | 
|---|
|  |  |  | PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, reduceGold, | 
|---|
|  |  |  | ChConfig.Def_Cost_BuyStoreItem, infoDict, unCostCnt) | 
|---|
|  |  |  | GameWorld.DebugLog("        扣除消耗钻石: unCostCnt=%s,perGold=%s,reduceGold=%s" | 
|---|
|  |  |  | % (unCostCnt, itemGold, reduceGold), curPlayer.GetPlayerID()) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 增加当日采集次数 | 
|---|
|  |  |  | if collLimitInfo: | 
|---|
|  |  |  | updCollTime = todayCollTime + successCnt | 
|---|
|  |  |  | updCollTime = todayCollTime + collectCnt | 
|---|
|  |  |  | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CollNpcIDCollTime % npcID, updCollTime) | 
|---|
|  |  |  | SyncCollNPCTime(curPlayer, npcIDList=[npcID]) | 
|---|
|  |  |  | SyncCollNPCTime(curPlayer, [npcID]) | 
|---|
|  |  |  | GameWorld.DebugLog("        增加当日采集次数: todayCollTime=%s,updCollTime=%s" % (todayCollTime, updCollTime)) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | giveItemList = collectNPCIpyData.GetCollectAward() | 
|---|
|  |  |  | if giveItemList: | 
|---|
|  |  |  | itemID, itemCount, isBind = giveItemList | 
|---|
|  |  |  | ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isBind, [IPY_GameWorld.rptItem]) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #采集成就 | 
|---|
|  |  |  | PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Collect, successCnt, [npcID]) | 
|---|
|  |  |  | SyncCollectionItemInfo(curPlayer, addExp, addMoney, addZhenQi, giveItemInfoList, npcID) | 
|---|
|  |  |  | #DataRecordPack.DR_CollectNPCOK(curPlayer, npcID, addMoney, addExp, addZhenQi, giveItemInfoList) | 
|---|
|  |  |  | return True | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def __DoGiveCollectionNPCSingleAward(curPlayer, mapID, npcID, setBind, pieRandomList, randomAllInfoList, besureInfoList): | 
|---|
|  |  |  | # 单次采集NPC箱子奖励 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | giveItemInfoList = [] # 最终会给到玩家身上的物品列表 | 
|---|
|  |  |  | #GameWorld.DebugLog("    给物品几率列表giveItemRateList=%s" % giveItemInfoList) | 
|---|
|  |  |  | # 先随机饼图概率物品 | 
|---|
|  |  |  | if pieRandomList: | 
|---|
|  |  |  | pieRandomItemInfo = GameWorld.GetResultByRandomList(pieRandomList) | 
|---|
|  |  |  | giveItemInfoList.append(pieRandomItemInfo) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #GameWorld.DebugLog("    饼图物品giveItemInfoList=%s" % giveItemInfoList) | 
|---|
|  |  |  | # 再处理各自概率的物品 | 
|---|
|  |  |  | if randomAllInfoList: | 
|---|
|  |  |  | maxRandomCnt, randomInfoList = randomAllInfoList | 
|---|
|  |  |  | randomInfoListEx = [] | 
|---|
|  |  |  | for itemInfo in randomInfoList: | 
|---|
|  |  |  | giveRate = itemInfo[0] | 
|---|
|  |  |  | appendItemInfo = itemInfo[1:] | 
|---|
|  |  |  | # 最大概率必出,不受maxRandomCnt影响 | 
|---|
|  |  |  | if giveRate == ShareDefine.Def_MaxRateValue: | 
|---|
|  |  |  | giveItemInfoList.append(appendItemInfo) | 
|---|
|  |  |  | maxRandomCnt -= 1 | 
|---|
|  |  |  | continue | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if not GameWorld.CanHappen(giveRate, ShareDefine.Def_MaxRateValue): | 
|---|
|  |  |  | continue | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 先加到待出列表里,再按需要出的个数随机 | 
|---|
|  |  |  | randomInfoListEx.append(appendItemInfo) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #GameWorld.DebugLog("    maxRandomCnt=%s,randomInfoListEx=%s" % (maxRandomCnt, randomInfoListEx)) | 
|---|
|  |  |  | #GameWorld.DebugLog("    giveItemInfoList=%s" % giveItemInfoList) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if maxRandomCnt > 0 and randomInfoListEx: | 
|---|
|  |  |  | getRandomCnt = min(maxRandomCnt, len(randomInfoListEx)) | 
|---|
|  |  |  | giveItemInfoList.extend(random.sample(randomInfoListEx, getRandomCnt)) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 必出物品 | 
|---|
|  |  |  | if besureInfoList: | 
|---|
|  |  |  | collTotalCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CollNpcCollTotalCnt % npcID) | 
|---|
|  |  |  | besureCnt, besureItemInfo = besureInfoList | 
|---|
|  |  |  | if collTotalCnt == besureCnt: | 
|---|
|  |  |  | giveItemInfoList = [besureItemInfo] # 必出时设定只给必出的物品 | 
|---|
|  |  |  | GameWorld.DebugLog("    此次必出物品, npcID=%s,besureCnt=%s,collTotalCnt=%s" % (npcID, besureCnt, collTotalCnt)) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if collTotalCnt <= besureCnt: | 
|---|
|  |  |  | # 目前只在小于等于的时候才增加次数,为以后如果需要做多个必出配置时,老玩家不用再管key的值 | 
|---|
|  |  |  | collTotalCnt += 1 | 
|---|
|  |  |  | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CollNpcCollTotalCnt % npcID, collTotalCnt) | 
|---|
|  |  |  | GameWorld.DebugLog("    更新采集总次数: %s" % collTotalCnt) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | GameWorld.DebugLog("    最终可得到物品giveItemInfoList=%s" % giveItemInfoList) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | syncItemInfoList = [] # 同步的采集到的物品信息列表 | 
|---|
|  |  |  | for itemID, itemCnt, isBind in giveItemInfoList: | 
|---|
|  |  |  | if not ItemCommon.CheckPackHasSpace(curPlayer, IPY_GameWorld.rptItem): | 
|---|
|  |  |  | break | 
|---|
|  |  |  |  | 
|---|
|  |  |  | isBind = setBind or isBind | 
|---|
|  |  |  |  | 
|---|
|  |  |  | getItemObj = ItemControler.GetOutPutItemObj(itemID) | 
|---|
|  |  |  | #        elif itemType == 1: | 
|---|
|  |  |  | #            itemDictData = ItemControler.GetAppointItemDictData(itemID, isBind) | 
|---|
|  |  |  | #            getItemObj = ItemControler.GetItemByData(itemDictData) | 
|---|
|  |  |  | #        elif itemType == 2: | 
|---|
|  |  |  | #            quality = ItemCommon.GetRandEquipQualityByTable(itemID, "CollectEquipRandQuality") | 
|---|
|  |  |  | #            if quality == 0: | 
|---|
|  |  |  | #                isBroadcast = False | 
|---|
|  |  |  | #                getItemObj = ItemCommon.RandNormalEquip(curPlayer, itemID, isBind, "CollectNormalEquip") | 
|---|
|  |  |  | #            else: | 
|---|
|  |  |  | #                getItemObj, isBroadcast = ItemCommon.RandGreateEquip(curPlayer, itemID, isBind, "CollectGreateEquip", quality) | 
|---|
|  |  |  | #            if getItemObj == None: | 
|---|
|  |  |  | #                continue | 
|---|
|  |  |  | # | 
|---|
|  |  |  | #            itemID = getItemObj.GetItemTypeID() | 
|---|
|  |  |  | userData = getItemObj.GetUserData() | 
|---|
|  |  |  | getItemObj.SetCount(itemCnt) | 
|---|
|  |  |  | getItemObj.SetIsBind(isBind) | 
|---|
|  |  |  | ItemCommon.NotifyItemDropByKill(curPlayer, getItemObj, npcID) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #SendGameServerGoodItemRecord(mapID, npcID, curPlayer.GetPlayerName(), curPlayer.GetPlayerID(), itemID) | 
|---|
|  |  |  | #可以放入背包 | 
|---|
|  |  |  | if not ItemControler.DoLogic_PutItemInPack(curPlayer, getItemObj, True, True, | 
|---|
|  |  |  | event=["CollectNPC", False, {"npcID":npcID}]): | 
|---|
|  |  |  | break | 
|---|
|  |  |  | syncItemInfoList.append([itemID, itemCnt, isBind, userData]) | 
|---|
|  |  |  | return syncItemInfoList | 
|---|
|  |  |  | PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_Collect, collectCnt, [npcID]) | 
|---|
|  |  |  | #SyncCollectionItemInfo(curPlayer, addExp, addMoney, addZhenQi, giveItemInfoList, npcID) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ## 采集结果同步 | 
|---|
|  |  |  | #  @param None | 
|---|
|  |  |  | #  @param None | 
|---|
|  |  |  | def SyncCollectionItemInfo(curPlayer, addExp, addMoney, addZhenQi, syncItemInfoList, collectNPCID=0): | 
|---|
|  |  |  | return #暂不同步 | 
|---|
|  |  |  | if addExp <= 0 and addMoney <= 0 and addZhenQi <= 0 and not syncItemInfoList: | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | collItemInfo = ChPyNetSendPack.tagMCCollectionItemInfo() | 
|---|
|  |  |  | collItemInfo.Clear() | 
|---|
|  |  |  | collItemInfo.NPCID = collectNPCID | 
|---|
|  |  |  | collItemInfo.Exp = addExp | 
|---|
|  |  |  | collItemInfo.SilverMoney = addMoney | 
|---|
|  |  |  | collItemInfo.ZhenQi = addZhenQi | 
|---|
|  |  |  | collItemInfo.CollItemList = [] | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for syncItemInfo in syncItemInfoList: | 
|---|
|  |  |  | itemType, itemID, itemCnt, isBind, itemInfo = 0, 0, 0, 0, "" | 
|---|
|  |  |  | if len(syncItemInfo) == 3: | 
|---|
|  |  |  | itemID, itemCnt, isBind = syncItemInfo | 
|---|
|  |  |  | elif len(syncItemInfo) == 4: | 
|---|
|  |  |  | itemType, itemID, itemCnt, isBind = syncItemInfo | 
|---|
|  |  |  | elif len(syncItemInfo) == 5: | 
|---|
|  |  |  | itemType, itemID, itemCnt, isBind, itemInfo = syncItemInfo | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if itemID <= 0: | 
|---|
|  |  |  | continue | 
|---|
|  |  |  |  | 
|---|
|  |  |  | collItem = ChPyNetSendPack.tagMCCollectionItem() | 
|---|
|  |  |  | collItem.Clear() | 
|---|
|  |  |  | collItem.ItemType = itemType | 
|---|
|  |  |  | collItem.ItemID = itemID | 
|---|
|  |  |  | collItem.ItemCnt = itemCnt | 
|---|
|  |  |  | collItem.IsBind = isBind | 
|---|
|  |  |  | collItem.ItemInfoLen = len(itemInfo) | 
|---|
|  |  |  | collItem.ItemInfo = itemInfo | 
|---|
|  |  |  | collItemInfo.CollItemList.append(collItem) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | collItemInfo.CollItemIDCnt = len(collItemInfo.CollItemList) | 
|---|
|  |  |  | NetPackCommon.SendFakePack(curPlayer, collItemInfo) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ## 给采集物品信息列表 | 
|---|
|  |  |  | #  @param curPlayer:玩家实例 | 
|---|
|  |  |  | #  @param awardItemInfoDict:奖励物品配置字典 | 
|---|
|  |  |  | #  @return None | 
|---|
|  |  |  | def __GetGiveCollectItemInfo(curPlayer, lvModeIDDict): | 
|---|
|  |  |  | if not lvModeIDDict: | 
|---|
|  |  |  | return [[], []] | 
|---|
|  |  |  |  | 
|---|
|  |  |  | modeID = "" | 
|---|
|  |  |  | playerLV = curPlayer.GetLV() | 
|---|
|  |  |  | for lvKey, mIDStr in lvModeIDDict.items(): | 
|---|
|  |  |  | if lvKey[0] <= playerLV <= lvKey[1]: | 
|---|
|  |  |  | modeID = mIDStr | 
|---|
|  |  |  | break | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if not modeID: | 
|---|
|  |  |  | return [[], []] | 
|---|
|  |  |  |  | 
|---|
|  |  |  | collectItemInfoDict = ReadChConfig.GetEvalChConfig('CollectItemInfo_%s' % modeID) | 
|---|
|  |  |  | if not collectItemInfoDict: | 
|---|
|  |  |  | return [[], []] | 
|---|
|  |  |  |  | 
|---|
|  |  |  | infoKey = () # 默认key | 
|---|
|  |  |  | job = curPlayer.GetJob() | 
|---|
|  |  |  | for key in collectItemInfoDict.keys(): | 
|---|
|  |  |  | # 如果玩家职业在配置的key里,则取指定的key信息 | 
|---|
|  |  |  | if job in key: | 
|---|
|  |  |  | infoKey = key | 
|---|
|  |  |  | break | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if infoKey not in collectItemInfoDict: | 
|---|
|  |  |  | GameWorld.ErrLog('CollectItemInfo_%s.txt can not find key=%s!' % (modeID, infoKey)) | 
|---|
|  |  |  | return [[], []] | 
|---|
|  |  |  | GameWorld.DebugLog("    __GetGiveCollectItemInfo job=%s,modeID=%s,key=%s,itemList=%s" | 
|---|
|  |  |  | % (job, modeID, infoKey, collectItemInfoDict[infoKey])) | 
|---|
|  |  |  | return collectItemInfoDict[infoKey] | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def SyncCollNPCTime(curPlayer, npcIDList=[]): | 
|---|
|  |  |  | ## 同步采集NPC功能号采集次数 | 
|---|
|  |  |  | #  @param curPlayer:采集玩家实例 | 
|---|
|  |  |  | #  @param funcType:功能号,默认为0,即同步配表中全部 | 
|---|
|  |  |  | #  @return None | 
|---|
|  |  |  | def SyncCollNPCTime(curPlayer, funcTypeList=[], npcIDList=[]): | 
|---|
|  |  |  | if not npcIDList: | 
|---|
|  |  |  | collectNPCIDTimeLimit = ReadChConfig.GetEvalChConfig('CollectNPCIDTimeLimit') | 
|---|
|  |  |  | for npcIDTuple in collectNPCIDTimeLimit.keys(): | 
|---|
|  |  |  | npcIDList += list(npcIDTuple) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if npcIDList: | 
|---|
|  |  |  | npcIDCollInfo = ChPyNetSendPack.tagMCNPCIDCollectionCntInfo() | 
|---|
|  |  |  | npcIDCollInfo.Clear() | 
|---|
|  |  |  | npcIDCollInfo.NPCCollCntList = [] | 
|---|
|  |  |  | isSyncAll = False | 
|---|
|  |  |  | if not npcIDList: | 
|---|
|  |  |  | isSyncAll = True | 
|---|
|  |  |  | ipyDataMgr = IpyGameDataPY.IPY_Data() | 
|---|
|  |  |  | for index in xrange(ipyDataMgr.GetCollectNPCCount()): | 
|---|
|  |  |  | ipyData = ipyDataMgr.GetCollectNPCByIndex(index) | 
|---|
|  |  |  | if ipyData.GetMaxCollectCount(): | 
|---|
|  |  |  | npcIDList.append(ipyData.GetNPCID()) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if not npcIDList: | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | syncList = [] | 
|---|
|  |  |  | for npcID in npcIDList: | 
|---|
|  |  |  | collCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CollNpcIDCollTime % npcID) | 
|---|
|  |  |  | if isSyncAll and not collCount: | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | collCntInfo = ChPyNetSendPack.tagMCNPCIDCollectionCnt() | 
|---|
|  |  |  | collCntInfo.Clear() | 
|---|
|  |  |  | collCntInfo.NPCID = npcID | 
|---|
|  |  |  | collCntInfo.CollectionCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CollNpcIDCollTime % npcID) | 
|---|
|  |  |  | npcIDCollInfo.NPCCollCntList.append(collCntInfo) | 
|---|
|  |  |  | collCntInfo.CollectionCnt = collCount | 
|---|
|  |  |  | syncList.append(collCntInfo) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if not syncList: | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | npcIDCollInfo = ChPyNetSendPack.tagMCNPCIDCollectionCntInfo() | 
|---|
|  |  |  | npcIDCollInfo.Clear() | 
|---|
|  |  |  | npcIDCollInfo.NPCCollCntList = syncList | 
|---|
|  |  |  | npcIDCollInfo.CollNPCCnt = len(npcIDCollInfo.NPCCollCntList) | 
|---|
|  |  |  | NetPackCommon.SendFakePack(curPlayer, npcIDCollInfo) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def CollNPCTimeOnDay(curPlayer): | 
|---|
|  |  |  | ## 采集NPCOnDay处理 | 
|---|
|  |  |  | #  @param curPlayer:玩家实例 | 
|---|
|  |  |  | #  @return None | 
|---|
|  |  |  | def CollNPCTimeOnDay(curPlayer, funcTypeList=[]): | 
|---|
|  |  |  | collectNPCIDTimeLimit = ReadChConfig.GetEvalChConfig('CollectNPCIDTimeLimit') | 
|---|
|  |  |  | for npcIDTuple, collCntInfo in collectNPCIDTimeLimit.items(): | 
|---|
|  |  |  | isResetOnDay = collCntInfo[1] | 
|---|
|  |  |  | if not isResetOnDay: | 
|---|
|  |  |  | resetNPCIDList = [] | 
|---|
|  |  |  | ipyDataMgr = IpyGameDataPY.IPY_Data() | 
|---|
|  |  |  | for index in xrange(ipyDataMgr.GetCollectNPCCount()): | 
|---|
|  |  |  | ipyData = ipyDataMgr.GetCollectNPCByIndex(index) | 
|---|
|  |  |  | npcID = ipyData.GetNPCID() | 
|---|
|  |  |  | if not ipyData.GetMaxCollectCount(): | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | for npcID in npcIDTuple: | 
|---|
|  |  |  | if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CollNpcIDCollTime % npcID): | 
|---|
|  |  |  | continue | 
|---|
|  |  |  | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CollNpcIDCollTime % npcID, 0) | 
|---|
|  |  |  | resetNPCIDList.append(npcID) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | SyncCollNPCTime(curPlayer) | 
|---|
|  |  |  | if resetNPCIDList: | 
|---|
|  |  |  | SyncCollNPCTime(curPlayer, resetNPCIDList) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | #  @param None None | 
|---|
|  |  |  | #  @return None | 
|---|
|  |  |  | def OnBuyCollectionCnt(index, clientData, tick): | 
|---|
|  |  |  | #    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) | 
|---|
|  |  |  | # | 
|---|
|  |  |  | #    if not curPlayer: | 
|---|
|  |  |  | #        return | 
|---|
|  |  |  | # | 
|---|
|  |  |  | #    funcType = clientData.FuncType | 
|---|
|  |  |  | #    #buyCnt = clientData.BuyCnt # 暂时默认购买一次 | 
|---|
|  |  |  | # | 
|---|
|  |  |  | #    playerID = curPlayer.GetPlayerID() | 
|---|
|  |  |  | #    CollectNPCFuncTimeBuyCostDict = ReadChConfig.GetEvalChConfig('CollectNPCFuncTimeBuyCost') | 
|---|
|  |  |  | #    if funcType not in CollectNPCFuncTimeBuyCostDict: | 
|---|
|  |  |  | #        GameWorld.Log("采集功能次数限制类型,不能购买!funcType=%s" % funcType, playerID) | 
|---|
|  |  |  | #        return | 
|---|
|  |  |  | # | 
|---|
|  |  |  | #    buyTimeKey = ChConfig.Def_PDict_CollNpcBuyTime % funcType | 
|---|
|  |  |  | #    alreadyBuyCnt = curPlayer.NomalDictGetProperty(buyTimeKey) | 
|---|
|  |  |  | #    costFormat = CollectNPCFuncTimeBuyCostDict[funcType] | 
|---|
|  |  |  | #    costGold = eval(costFormat) | 
|---|
|  |  |  | # | 
|---|
|  |  |  | #    if not PlayerControl.HaveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costGold): | 
|---|
|  |  |  | #        return | 
|---|
|  |  |  | # | 
|---|
|  |  |  | #    isOK = PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costGold, | 
|---|
|  |  |  | #                                  ShareDefine.Def_GoldCostType_BuyCollectionTime, alreadyBuyCnt) | 
|---|
|  |  |  | # | 
|---|
|  |  |  | #    if not isOK: | 
|---|
|  |  |  | #        return | 
|---|
|  |  |  | # | 
|---|
|  |  |  | #    # 增加购买次数 | 
|---|
|  |  |  | #    PlayerControl.NomalDictSetProperty(curPlayer, buyTimeKey, alreadyBuyCnt + 1) | 
|---|
|  |  |  | #    SyncCollNPCTime(curPlayer, [funcType]) | 
|---|
|  |  |  | #    GameWorld.Log("购买采集次数:funcType=%s,alreadyBuyCnt=%s,costGold=%s" % (funcType, alreadyBuyCnt, costGold), playerID) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #// A5 0A 购买可击杀boss次数 #tagCMBuyKillBossCnt | 
|---|