10337 【越南】【英文】【BT】【砍树】爬塔通关类的支持一键过关
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B1 08 快速一键过关副本 #tagCMFBQuickPass
|
| | |
|
| | | class tagCMFBQuickPass(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("MapID", c_int), |
| | | ("LineID", c_ushort), |
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xB1
|
| | | self.SubCmd = 0x08
|
| | | return
|
| | |
|
| | | def ReadData(self, stringData, _pos=0, _len=0):
|
| | | self.Clear()
|
| | | memmove(addressof(self), stringData[_pos:], self.GetLength())
|
| | | return _pos + self.GetLength()
|
| | |
|
| | | def Clear(self):
|
| | | self.Cmd = 0xB1
|
| | | self.SubCmd = 0x08
|
| | | self.MapID = 0
|
| | | self.LineID = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagCMFBQuickPass)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// B1 08 快速一键过关副本 //tagCMFBQuickPass:
|
| | | Cmd:%s,
|
| | | SubCmd:%s,
|
| | | MapID:%d,
|
| | | LineID:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.MapID,
|
| | | self.LineID
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagCMFBQuickPass=tagCMFBQuickPass()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMFBQuickPass.Cmd,m_NAtagCMFBQuickPass.SubCmd))] = m_NAtagCMFBQuickPass
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B1 06 助战召唤 #tagCMHelpBattleCall
|
| | |
|
| | | class tagCMHelpBattleCall(Structure):
|
| | |
| | | PacketSubCMD_8=0x04
|
| | | PacketCallFunc_8=OnClientStartFB
|
| | |
|
| | | PacketCMD_9=
|
| | | PacketSubCMD_9=
|
| | | PacketCallFunc_9=
|
| | | PacketCMD_9=0xB1
|
| | | PacketSubCMD_9=0x08
|
| | | PacketCallFunc_9=OnFBQuickPass
|
| | |
|
| | | PacketCMD_10=
|
| | | PacketSubCMD_10=
|
| | |
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B1 08 快速一键过关副本 #tagCMFBQuickPass
|
| | |
|
| | | class tagCMFBQuickPass(Structure):
|
| | | _pack_ = 1
|
| | | _fields_ = [
|
| | | ("Cmd", c_ubyte),
|
| | | ("SubCmd", c_ubyte),
|
| | | ("MapID", c_int), |
| | | ("LineID", c_ushort), |
| | | ]
|
| | |
|
| | | def __init__(self):
|
| | | self.Clear()
|
| | | self.Cmd = 0xB1
|
| | | self.SubCmd = 0x08
|
| | | return
|
| | |
|
| | | def ReadData(self, stringData, _pos=0, _len=0):
|
| | | self.Clear()
|
| | | memmove(addressof(self), stringData[_pos:], self.GetLength())
|
| | | return _pos + self.GetLength()
|
| | |
|
| | | def Clear(self):
|
| | | self.Cmd = 0xB1
|
| | | self.SubCmd = 0x08
|
| | | self.MapID = 0
|
| | | self.LineID = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | | return sizeof(tagCMFBQuickPass)
|
| | |
|
| | | def GetBuffer(self):
|
| | | return string_at(addressof(self), self.GetLength())
|
| | |
|
| | | def OutputString(self):
|
| | | DumpString = '''// B1 08 快速一键过关副本 //tagCMFBQuickPass:
|
| | | Cmd:%s,
|
| | | SubCmd:%s,
|
| | | MapID:%d,
|
| | | LineID:%d
|
| | | '''\
|
| | | %(
|
| | | self.Cmd,
|
| | | self.SubCmd,
|
| | | self.MapID,
|
| | | self.LineID
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
|
| | | m_NAtagCMFBQuickPass=tagCMFBQuickPass()
|
| | | ChNetPackDict[eval("0x%02x%02x"%(m_NAtagCMFBQuickPass.Cmd,m_NAtagCMFBQuickPass.SubCmd))] = m_NAtagCMFBQuickPass
|
| | |
|
| | |
|
| | | #------------------------------------------------------
|
| | | # B1 06 助战召唤 #tagCMHelpBattleCall
|
| | |
|
| | | class tagCMHelpBattleCall(Structure):
|
| | |
| | |
|
| | | return callFunc(curPlayer, mapID, lineID, cnt, dataEx)
|
| | |
|
| | | def OnPlayerFBQuickPass(curPlayer, mapID, lineID):
|
| | | '''副本快速过关验证
|
| | | @param mapID: 数据地图ID
|
| | | @param lineID: 目标关卡线路ID,可一次性跳多关,由前端发包决定
|
| | | @return: (bossID, quickCnt) 或 None
|
| | | @note: bossID 目标NPCID - 目标关卡所需要挑战的主NPCID,一般是boss,用于验证战力是否满足快速过关
|
| | | @note: quickCnt 本次总共跳过几关 - 默认1
|
| | | '''
|
| | | do_FBLogic_ID = __GetFBLogic_MapID(mapID)
|
| | | |
| | | callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "OnPlayerFBQuickPass"))
|
| | | |
| | | # 没有额外条件判断默认返回True
|
| | | if callFunc == None:
|
| | | return
|
| | | |
| | | return callFunc(curPlayer, mapID, lineID)
|
| | |
|
| | | def OnPlayerFBQuickPassResult(curPlayer, mapID, lineID):
|
| | | '''副本快速过关结果
|
| | | '''
|
| | | do_FBLogic_ID = __GetFBLogic_MapID(mapID)
|
| | | |
| | | callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "OnPlayerFBQuickPassResult"))
|
| | | |
| | | if callFunc == None:
|
| | | return
|
| | |
|
| | | return callFunc(curPlayer, mapID, lineID)
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | ## 切换地图询问(只询问第一条线) 判断是否可以进入副本
|
| | |
| | | return __CheckCanChallenge(curPlayer, nextFloorID) |
| | | |
| | | ## 检查可否进行挑战 |
| | | def __CheckCanChallenge(curPlayer, floorID): |
| | | def __CheckCanChallenge(curPlayer, floorID, checkPre=True): |
| | | playerID = curPlayer.GetPlayerID() |
| | | ipyData = GetTowerIpyData(floorID) |
| | | if not ipyData: |
| | |
| | | GameWorld.DebugLog("该境界塔层已过关: floorID=%s" % floorID, playerID) |
| | | return False |
| | | |
| | | if floorID > curFloorID + 1: |
| | | if checkPre and floorID > curFloorID + 1: |
| | | GameWorld.DebugLog("上一层未过关: floorID=%s > curFloorID=%s+1" % (floorID, curFloorID), playerID) |
| | | return False |
| | | |
| | |
| | | return |
| | | |
| | | ## 获取BossID |
| | | def __GetRealmTowerBossID(): |
| | | gameFB = GameWorld.GetGameFB() |
| | | floorID = gameFB.GetGameFBDictByKey(FBDict_Floor) |
| | | def __GetRealmTowerBossID(floorID=-1): |
| | | if floorID == -1: |
| | | gameFB = GameWorld.GetGameFB() |
| | | floorID = gameFB.GetGameFBDictByKey(FBDict_Floor) |
| | | ipyData = GetTowerIpyData(floorID) |
| | | if not ipyData: |
| | | GameWorld.ErrLog("__GetRealmTowerBossID() can not find %s in RealmTowerNPC.txt" % floorID) |
| | |
| | | |
| | | StartfloorID(curPlayer, floorID, tick) |
| | | return |
| | | |
| | | def OnPlayerFBQuickPass(curPlayer, mapID, lineID): |
| | | '''副本快速过关验证 |
| | | @param mapID: 数据地图ID |
| | | @param lineID: 目标关卡线路ID,可一次性跳多关,由前端发包决定 |
| | | @return: (bossID, quickCnt) 或 None |
| | | @note: bossID 目标NPCID - 目标关卡所需要挑战的主NPCID,一般是boss,用于验证战力是否满足快速过关 |
| | | @note: quickCnt 本次总共跳过几关 - 默认1 |
| | | ''' |
| | | |
| | | if not __CheckCanChallenge(curPlayer, lineID, False): |
| | | return |
| | | curLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RealmTowerFloor) |
| | | bossID = __GetRealmTowerBossID(lineID) |
| | | quickCnt = lineID - curLineID |
| | | |
| | | return bossID, quickCnt |
| | | |
| | | def OnPlayerFBQuickPassResult(curPlayer, mapID, lineID): |
| | | '''副本快速过关结果 |
| | | ''' |
| | | |
| | | playerID = curPlayer.GetPlayerID() |
| | | curLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RealmTowerFloor) |
| | | fromLineID = curLineID + 1 |
| | | GameWorld.DebugLog("处理快速过关结算: mapID=%s,fromLineID=%s to %s" % (mapID, fromLineID, lineID), playerID) |
| | | |
| | | itemListTotal = [] |
| | | for floorID in range(fromLineID, lineID + 1): |
| | | ipyData = GetTowerIpyData(floorID) |
| | | if not ipyData: |
| | | continue |
| | | |
| | | #更新关卡 |
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_RealmTowerFloor, floorID) |
| | | GameWorld.DebugLog('更新境界塔快速过关: floorID=%s' % floorID, playerID) |
| | | |
| | | # 给过关奖励 |
| | | giveItemList = ipyData.GetRewardItemList() |
| | | itemListTotal += giveItemList |
| | | |
| | | prizeItemList = GameWorld.MergeItemList(itemListTotal) |
| | | ItemControler.GivePlayerItemOrMail(curPlayer, prizeItemList, None, ["RealmTower", False, {}]) |
| | | quickPassDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(prizeItemList), "quickPass":1} |
| | | __SendRealmTowerOverInfo(curPlayer, floorID, True, quickPassDict) |
| | | SyncRealmTowerInfo(curPlayer) |
| | | return |
| | |
| | |
|
| | | return
|
| | |
|
| | | def OnPlayerFBQuickPass(curPlayer, mapID, lineID):
|
| | | '''副本快速过关验证
|
| | | @param mapID: 数据地图ID
|
| | | @param lineID: 目标关卡线路ID,可一次性跳多关,由前端发包决定
|
| | | @return: (bossID, quickCnt) 或 None
|
| | | @note: bossID 目标NPCID - 目标关卡所需要挑战的主NPCID,一般是boss,用于验证战力是否满足快速过关
|
| | | @note: quickCnt 本次总共跳过几关 - 默认1
|
| | | '''
|
| | | |
| | | if not __CheckCanChallenge(curPlayer, lineID):
|
| | | return
|
| | | curLineID = __GetSkyTowerCurFloor(curPlayer)
|
| | | bossID = __GetSkyTowerBossID(lineID)
|
| | | quickCnt = lineID - curLineID
|
| | | |
| | | return bossID, quickCnt
|
| | |
|
| | | def OnPlayerFBQuickPassResult(curPlayer, mapID, lineID):
|
| | | '''副本快速过关结果
|
| | | '''
|
| | | |
| | | playerID = curPlayer.GetPlayerID()
|
| | | curLineID = __GetSkyTowerCurFloor(curPlayer)
|
| | | fromLineID = curLineID + 1
|
| | | GameWorld.DebugLog("处理快速过关结算: mapID=%s,fromLineID=%s to %s" % (mapID, fromLineID, lineID), playerID)
|
| | | |
| | | itemListTotal = []
|
| | | for floorID in range(fromLineID, lineID + 1):
|
| | | ipyData = GetTowerIpyData(floorID)
|
| | | if not ipyData:
|
| | | continue
|
| | | |
| | | if ipyData.GetIsNotify():
|
| | | sysMark = 'KillGodTowerInfo_1'# if floorID == maxLevel else 'GeRen_liubo_471172'
|
| | | PlayerControl.WorldNotify(0, sysMark, [curPlayer.GetPlayerName(), floorID])
|
| | | |
| | | #更新关卡
|
| | | SetSkyTowerCurfloorID(curPlayer, floorID)
|
| | | |
| | | #过关奖励
|
| | | giveItemDict = ipyData.GetReward()
|
| | | giveItemList = [[itemID, itemCnt, 0] for itemID, itemCnt in giveItemDict.items()]
|
| | | itemListTotal += giveItemList
|
| | | |
| | | PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_SkyTower)
|
| | | |
| | | # 全服目标
|
| | | ipyDataServer = IpyGameDataPY.GetIpyGameDataNotLog("SkyTowerServerChallenge", floorID)
|
| | | if ipyDataServer:
|
| | | maxNeedPassCount = 0
|
| | | rankRewardInfo = ipyDataServer.GetPassRankRewardInfo()
|
| | | for rank in rankRewardInfo.keys():
|
| | | maxNeedPassCount = max(maxNeedPassCount, int(rank))
|
| | | for needPlayerCount in ipyDataServer.GetServerRewardInfo().keys():
|
| | | maxNeedPassCount = max(maxNeedPassCount, int(needPlayerCount))
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | msgInfo = str(["ServerChallengePass", [floorID, maxNeedPassCount, rankRewardInfo]])
|
| | | GameWorld.DebugLog("全服过关信息同步GameServer: %s" % msgInfo, playerID)
|
| | | GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "SkyTower", msgInfo, len(msgInfo))
|
| | | |
| | | prizeItemList = GameWorld.MergeItemList(itemListTotal)
|
| | | ItemControler.GivePlayerItemOrMail(curPlayer, prizeItemList, None, ["SKYTower", False, {}])
|
| | | |
| | | quickPassDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(prizeItemList), "quickPass":1}
|
| | | __SendSkyTowerOverInfo(curPlayer, floorID, True, quickPassDict)
|
| | | SyncSkyTowerInfo(curPlayer, 0) # 同步最新关卡信息
|
| | | if floorID >= 10:
|
| | | PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_SkyTower, floorID)
|
| | | |
| | | return
|
| | |
| | |
|
| | |
|
| | | ## 给过关奖励
|
| | | def __GiveFBPassPrize(curPlayer, fbLevel):
|
| | | def __GiveFBPassPrize(curPlayer, fbLevel, moneyDictTotal=None, itemListTotal=None):
|
| | | ipyData = GetTowerIpyData(fbLevel)
|
| | | if not ipyData:
|
| | | return {}
|
| | |
| | | moneyDict = {ShareDefine.TYPE_Price_Rune:addJH, ShareDefine.TYPE_Price_Ysog:RuneMagicEssence}
|
| | | prizeDict = {FBCommon.Over_money:FBCommon.GetJsonMoneyList(moneyDict), FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(prizeItemList)}
|
| | |
|
| | | if isinstance(moneyDictTotal, dict):
|
| | | for moneyType, addValue in moneyDict.items():
|
| | | moneyDictTotal[moneyType] = moneyDictTotal.get(moneyType, 0) + addValue
|
| | | if isinstance(itemListTotal, list):
|
| | | itemListTotal += prizeItemList
|
| | | # for _ in xrange(challengeCnt):
|
| | | # EventReport.WriteEvent_custom_mission_log(curPlayer, ChConfig.CME_FB_TrialTower, ChConfig.CME_Log_End, 1, cmeInfoEx=bossName)
|
| | | return prizeDict
|
| | |
| | | #BOSS复活活动
|
| | | PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_TowerSweep, 1)
|
| | | PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_TowerSweep, 1)
|
| | | return True |
| | | return True
|
| | |
|
| | | def OnPlayerFBQuickPass(curPlayer, mapID, lineID):
|
| | | '''副本快速过关验证
|
| | | @param mapID: 数据地图ID
|
| | | @param lineID: 目标关卡线路ID,可一次性跳多关,由前端发包决定
|
| | | @return: (bossID, quickCnt) 或 None
|
| | | @note: bossID 目标NPCID - 目标关卡所需要挑战的主NPCID,一般是boss,用于验证战力是否满足快速过关
|
| | | @note: quickCnt 本次总共跳过几关 - 默认1
|
| | | '''
|
| | | |
| | | ipyData = GetTowerIpyData(lineID)
|
| | | if not ipyData:
|
| | | return
|
| | | curLineID = __GetTrialLevelCurPassLV(curPlayer)
|
| | | if lineID <= curLineID:
|
| | | GameWorld.DebugLog("符印塔本关已过关, 无法挑战! lineID=%s" % lineID, curPlayer.GetPlayerID())
|
| | | return
|
| | | bossID = ipyData.GetNPCID()
|
| | | quickCnt = 0 #lineID - curLineID
|
| | | |
| | | fromLineID = curLineID + 1
|
| | | for passLineID in range(fromLineID, lineID + 1):
|
| | | # 符印塔lineID可能会跳,这里遍历不输出找不到的lineID
|
| | | ipyData = IpyGameDataPY.GetIpyGameDataNotLog('RuneTower', passLineID)
|
| | | if not ipyData:
|
| | | continue
|
| | | quickCnt += 1
|
| | | |
| | | return bossID, quickCnt
|
| | |
|
| | | def OnPlayerFBQuickPassResult(curPlayer, mapID, lineID):
|
| | | '''副本快速过关结果
|
| | | '''
|
| | | |
| | | playerID = curPlayer.GetPlayerID() |
| | | curLineID = __GetTrialLevelCurPassLV(curPlayer)
|
| | | fromLineID = curLineID + 1
|
| | | GameWorld.DebugLog("处理快速过关结算: mapID=%s,fromLineID=%s to %s" % (mapID, fromLineID, lineID), playerID)
|
| | | |
| | | moneyDictTotal = {}
|
| | | itemListTotal = []
|
| | | for passLineID in range(fromLineID, lineID + 1):
|
| | | ipyData = IpyGameDataPY.GetIpyGameDataNotLog('RuneTower', passLineID)
|
| | | if not ipyData:
|
| | | continue
|
| | | |
| | | if ipyData.GetIsNotify():
|
| | | IPY_Data = IpyGameDataPY.IPY_Data()
|
| | | maxLevel = IPY_Data.GetRuneTowerByIndex(IPY_Data.GetRuneTowerCount()-1).GetID()
|
| | | sysMark = 'RuneTowerInfo_1' if passLineID == maxLevel else 'GeRen_liubo_471172'
|
| | | PlayerControl.WorldNotify(0, sysMark, [curPlayer.GetPlayerName(), passLineID / 100])
|
| | | |
| | | #更新关卡
|
| | | SetTrialLevelCurPassLV(curPlayer, passLineID)
|
| | | # 给过关奖励
|
| | | __GiveFBPassPrize(curPlayer, passLineID, moneyDictTotal, itemListTotal)
|
| | | |
| | | #任务
|
| | | EventShell.EventRespons_TrialTowerCnt(curPlayer, passLineID)
|
| | | #每日任务
|
| | | PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_Tower)
|
| | | |
| | | prizeItemList = GameWorld.MergeItemList(itemListTotal)
|
| | | quickPassDict = {FBCommon.Over_money:FBCommon.GetJsonMoneyList(moneyDictTotal), |
| | | FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(prizeItemList),
|
| | | "quickPass":1}
|
| | | __SendTrialTowerOverInfo(curPlayer, passLineID, True, quickPassDict)
|
| | | SyncTrialLevelInfo(curPlayer) # 同步最新关卡信息
|
| | | return
|
| | |
| | | packData.Cnt = len(packData.InfoList)
|
| | | NetPackCommon.SendFakePack(curPlayer, packData)
|
| | | return
|
| | |
|
| | | #// B1 08 快速一键过关副本 #tagCMFBQuickPass
|
| | | #
|
| | | #struct tagCMFBQuickPass
|
| | | #{
|
| | | # tagHead Head;
|
| | | # DWORD MapID;
|
| | | # WORD LineID;
|
| | | #};
|
| | | def OnFBQuickPass(playerIndex, clientData, tick):
|
| | | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | mapID = clientData.MapID
|
| | | lineID = clientData.LineID
|
| | | GameWorld.DebugLog("玩家请求快速一键过关副本: mapID=%s,lineID=%s" % (mapID, lineID), playerID)
|
| | | |
| | | fbIpyData = FBCommon.GetFBIpyData(mapID)
|
| | | fbLineIpyData = FBCommon.GetFBLineIpyData(mapID, lineID)
|
| | | if FBCommon.CheckCanEnterFBComm(curPlayer, mapID, lineID, fbIpyData, fbLineIpyData) != ShareDefine.EntFBAskRet_OK:
|
| | | return
|
| | | |
| | | reqRet = FBLogic.OnPlayerFBQuickPass(curPlayer, mapID, lineID)
|
| | | if not reqRet or len(reqRet) != 2:
|
| | | GameWorld.DebugLog("无法一键过关副本: mapID=%s,lineID=%s" % (mapID, lineID), playerID)
|
| | | return
|
| | | bossID, quickCnt = reqRet
|
| | | if bossID:
|
| | | npcData = GameWorld.GetGameData().FindNPCDataByID(bossID)
|
| | | if not npcData:
|
| | | return
|
| | | npcFightPower = NPCCommon.GetSuppressFightPower(npcData)
|
| | | quickNeedRatio = IpyGameDataPY.GetFuncCfg("FBQuickPass", 1)
|
| | | quickNeedFightPower = int(npcFightPower * quickNeedRatio)
|
| | | curFightPower = PlayerControl.GetFightPower(curPlayer)
|
| | | if quickNeedFightPower and curFightPower < quickNeedFightPower:
|
| | | GameWorld.DebugLog("无法一键过关副本! 战力限制: mapID=%s,lineID=%s,bossID=%s,npcFightPower=%s,quickNeedFightPower=%s > %s" |
| | | % (mapID, lineID, bossID, npcFightPower, quickNeedFightPower, curFightPower), playerID)
|
| | | return
|
| | | |
| | | #增加副本进入次数
|
| | | if fbIpyData and fbIpyData.GetDayTimes() and quickCnt:
|
| | | # 跳关超过1关的要重新验证下
|
| | | if quickCnt > 1 and FBCommon.CheckCanEnterFBComm(curPlayer, mapID, lineID, fbIpyData, fbLineIpyData, quickCnt) != ShareDefine.EntFBAskRet_OK:
|
| | | return
|
| | | FBCommon.AddEnterFBCount(curPlayer, mapID, quickCnt)
|
| | | |
| | | #扫荡结果给奖励等
|
| | | FBLogic.OnPlayerFBQuickPassResult(curPlayer, mapID, lineID)
|
| | | return
|
| | |
|