#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package GameWorldLogic.FBProcess.FBHelpBattle
|
#
|
# @todo:¸±±¾Öúսϵͳ
|
# @author hxp
|
# @date 2018-11-24
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ¸±±¾Öúսϵͳ
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2018-11-24 22:30"""
|
#-------------------------------------------------------------------------------
|
|
import GameWorld
|
import ChConfig
|
import PlayerControl
|
import ChPyNetSendPack
|
import NetPackCommon
|
import PlayerViewCacheTube
|
import PlayerActGarbageSorting
|
import FBCommon
|
import IpyGameDataPY
|
import ShareDefine
|
import PyGameData
|
import random
|
import GameMap
|
import NPCCommon
|
import FBLogic
|
import IPY_GameWorld
|
import PlayerActivity
|
import ItemControler
|
|
MaxRobotID = 100 # ×î´ó»úÆ÷ÈËNPC¶¨ÒåID
|
|
def DoPlayerOnDay(curPlayer):
|
checkInInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HelpBattleCheckInCount)
|
checkInCount = checkInInfo / 10 # ÀۼƵǼÇ
|
todayIsCheckIn = checkInInfo % 10 # ½ñÌìÊÇ·ñÒѵǼÇ
|
if todayIsCheckIn:
|
checkInInfo = checkInCount * 10 + 0
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HelpBattleCheckInCount, checkInInfo)
|
SyncCheckInState(curPlayer, 0, False)
|
return
|
|
def DoPlayerLogin(curPlayer):
|
checkInInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HelpBattleCheckInCount)
|
todayIsCheckIn = checkInInfo % 10 # ½ñÌìÊÇ·ñÒѵǼÇ
|
if todayIsCheckIn:
|
SyncCheckInState(curPlayer, 1, True)
|
return
|
|
def SyncCheckInState(curPlayer, checkInState, isLogin):
|
## ͬ²½µÇ¼Ç״̬
|
checkInPack = ChPyNetSendPack.tagMCHelpBattleCheckInResult()
|
checkInPack.IsOK = checkInState
|
checkInPack.IsLogin = int(isLogin)
|
NetPackCommon.SendFakePack(curPlayer, checkInPack)
|
return
|
|
def GameServer_FBHelpBattleResult(curPlayer, msgList, tick):
|
## GameServer½á¹û·µ»Ø´¦Àí
|
|
if not msgList:
|
return
|
|
cmd = msgList[0]
|
# µÇ¼Ç
|
if cmd == "CheckIn":
|
__OnHelpBattleCheckInResult(curPlayer, msgList, tick)
|
|
# Ë¢ÐÂ
|
elif cmd == "Refresh":
|
__OnHelpBattleRefreshResult(curPlayer, msgList, tick)
|
|
# ɨµ´ÕÙ»½
|
elif cmd == "SweepCall":
|
__OnHelpBattleSweepCallResult(curPlayer, msgList, tick)
|
|
return
|
|
#// B1 05 ÖúÕ½µÇ¼Ç #tagCMHelpBattleCheckIn
|
#
|
#struct tagCMHelpBattleCheckIn
|
#{
|
# tagHead Head;
|
#};
|
def OnHelpBattleCheckIn(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
checkInInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HelpBattleCheckInCount)
|
checkInCount = checkInInfo / 10 # ÀۼƵǼÇ
|
todayIsCheckIn = checkInInfo % 10 # ½ñÌìÊÇ·ñÒѵǼÇ
|
if todayIsCheckIn:
|
GameWorld.DebugLog("µ±ÌìÒѵǼǣ¬²»ÐèÒªÖØ¸´µÇ¼Ç£¡", curPlayer.GetPlayerID())
|
return
|
fightPower = PlayerControl.GetFightPower(curPlayer)
|
msgInfo = str(["CheckIn", checkInCount, fightPower])
|
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "FBHelpBattle", msgInfo, len(msgInfo))
|
return
|
|
def __OnHelpBattleCheckInResult(curPlayer, msgList, tick):
|
## µÇ¼Ç·µ»Ø
|
cmd, checkInCount, fightPower, isOK, haveViewCache = msgList
|
if isOK:
|
checkInInfo = (checkInCount + 1) * 10 + 1
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HelpBattleCheckInCount, checkInInfo)
|
PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_HelpBattleCheckIn)
|
PlayerActGarbageSorting.AddActGarbageTaskProgress(curPlayer, ChConfig.Def_GarbageTask_HelpBattle)
|
|
# ûÓÐÊý¾Ý»º´æµÄ»°£¬ÂíÉÏͬ²½Ò»´Î
|
if not haveViewCache:
|
PlayerViewCacheTube.UpdateGameServerPlayerCache(curPlayer, tick, False)
|
|
SyncCheckInState(curPlayer, 1, False)
|
|
GameWorld.DebugLog("FBHelpBattleResult: %s,checkInCount=%s,fightPower=%s,isOK=%s,haveViewCache=%s"
|
% (cmd, checkInCount, fightPower, isOK, haveViewCache), curPlayer.GetPlayerID())
|
return
|
|
#// B1 06 ÖúÕ½ÕÙ»½ #tagCMHelpBattleCall
|
#
|
#struct tagCMHelpBattleCall
|
#{
|
# tagHead Head;
|
# BYTE IsOneKeyCall; // ÊÇ·ñÒ»¼üÕÙ»½
|
# DWORD PlayerID; // ÕÙ»½µÄÍæ¼ÒID£¬´óÓÚ1СÓÚ100´ú±í»úÆ÷ÈË
|
# BYTE IsGoldCall; // ÊÇ·ñÏÉÓñÕÙ»½
|
#};
|
def OnHelpBattleCall(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
isOneKeyCall = clientData.IsOneKeyCall
|
calledPlayerID = clientData.PlayerID
|
#isGoldCall = clientData.IsGoldCall
|
|
playerID = curPlayer.GetPlayerID()
|
gameFB = GameWorld.GetGameFB()
|
|
mapID = FBCommon.GetRecordMapID(curPlayer.GetMapID())
|
funcLineID = FBCommon.GetFBPropertyMark()
|
ipyData = IpyGameDataPY.GetIpyGameData("FBHelpBattle", mapID, funcLineID)
|
if not ipyData:
|
return
|
|
helpBattlePlayerDict = PyGameData.g_fbHelpBattlePlayerDict.get(playerID, {})
|
maxHelpPlayerCount = IpyGameDataPY.GetFuncCfg("HelpBattleCall", 2) # ×î´óÖúÕ½ÈËÊý
|
calledCount = 0
|
freePlayerIDList = []
|
helpNPCRobotIDList = []
|
for helpPlayerID, helpPlayerInfoDict in helpBattlePlayerDict.items():
|
objID = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_HelpBattleFBObjID % helpPlayerID)
|
if objID:
|
if helpPlayerID == calledPlayerID:
|
GameWorld.DebugLog("¸ÃÖúÕ½»úÆ÷ÈËIDÒѾÕÙ»½¹ý£¬²»ÔÊÐíÖØ¸´ÕÙ»½!calledPlayerID=%s" % calledPlayerID)
|
return
|
calledCount += 1
|
# ͳ¼ÆÃâ·ÑµÄδÕÙ»½µÄ
|
elif not helpPlayerInfoDict.get("NeedGoldCall", 0):
|
if "Name" in helpPlayerInfoDict:
|
freePlayerIDList.append(helpPlayerID)
|
else:
|
helpNPCRobotIDList.append(helpPlayerID)
|
if calledCount >= maxHelpPlayerCount:
|
GameWorld.Log("ÒѾÕÙ»½ÂúÈËÊý£¡ÎÞ·¨ÔÙÕÙ»½£¡calledCount=%s" % calledCount, playerID)
|
return
|
|
calledPlayerDict = {} # {±»ÕÙ»½µÄÍæ¼ÒID:¹ØÏµ, ...}
|
# ÓÅÏÈÕÙ»½Ãâ·ÑÍæ¼Ò¾µÏñ£¬²»×ã²ÅÕÐNPC£¬Ôݲ»×öÕ½Á¦ÅÅÐò
|
if isOneKeyCall:
|
lackCount = maxHelpPlayerCount - calledCount
|
if freePlayerIDList:
|
randIDList = random.sample(freePlayerIDList, min(lackCount, len(freePlayerIDList)))
|
lackCount -= len(randIDList)
|
for randID in randIDList:
|
helpPlayerInfoDict = helpBattlePlayerDict[randID]
|
calledPlayerDict[randID] = helpPlayerInfoDict.get("Relation", 0)
|
if lackCount > 0 and helpNPCRobotIDList:
|
for robotID in helpNPCRobotIDList[:lackCount]:
|
calledPlayerDict[robotID] = 0
|
|
# ÐÞ¸ÄÁ˹æÔò£¬ÎÞÉç½»ÈËÊý¼°»úÆ÷ÈËÈËÊý×öÁËÏÞÖÆ£¬ËùÒÔ¿ÉÄܳöÏÖÈËÊý²»×ãµÄÇé¿ö£¬¹ÊÆÁ±Î´ËÅжÏ
|
# if calledCount + len(calledPlayerDict) < maxHelpPlayerCount:
|
# GameWorld.ErrLog("ÎÞ·¨Ò»¼üÕÙ»½!ÈËÊý²»×ã! calledCount=%s,calledPlayerDict=%s,maxHelpPlayerCount=%s"
|
# % (calledCount, calledPlayerDict, maxHelpPlayerCount), playerID)
|
# return
|
else:
|
if calledPlayerID not in helpBattlePlayerDict:
|
GameWorld.ErrLog("²»´æÔÚ¸ÃÖúÕ½Íæ¼Ò£¬ÎÞ·¨ÕÙ»½£¡calledPlayerID=%s" % (calledPlayerID), playerID)
|
return
|
helpPlayerInfoDict = helpBattlePlayerDict[calledPlayerID]
|
if helpPlayerInfoDict.get("NeedGoldCall", 0):
|
goldCallCost = IpyGameDataPY.GetFuncCfg("HelpBattleCall", 5) # ¸¶·ÑÕÙ»½ÏûºÄÏÉÓñ£¬ÓÅÏÈÏûºÄ°óÓñ
|
# âýÓ¢°æ¸ÄΪֱ½Ó¿Û°óÓñÁéʯ 2019/10/8
|
costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Paper, goldCallCost)
|
if not costMoneyList:
|
return
|
|
infoDict = {"MapID":mapID, 'lineID':funcLineID, "Type":"Call"}
|
for moneyType, moneyNum in costMoneyList:
|
PlayerControl.PayMoney(curPlayer, moneyType, moneyNum, ChConfig.Def_Cost_FBHelpBattle, infoDict)
|
calledPlayerDict[calledPlayerID] = helpPlayerInfoDict.get("Relation", 0)
|
|
# Ö±½ÓÔÚµØÍ¼ÕÙ»½³öÀ´
|
robotNPCID = IpyGameDataPY.GetFuncCfg("HelpBattleRobot", 1)
|
posX, posY = curPlayer.GetPosX(), curPlayer.GetPosY()
|
for calledPlayerID in calledPlayerDict.keys():
|
if calledPlayerID not in helpBattlePlayerDict:
|
continue
|
helpPlayerInfoDict = helpBattlePlayerDict[calledPlayerID]
|
job = helpPlayerInfoDict.get("Job", 1)
|
if "FightPower" in helpPlayerInfoDict:
|
fightPower = helpPlayerInfoDict["FightPower"]
|
npcLV = helpPlayerInfoDict["LV"]
|
else:
|
fightPower = ipyData.GetRobotFightPower()
|
npcLV = ipyData.GetRobotLV()
|
calledPlayerDict.pop(calledPlayerID) # ÕÐNPC²»Í¨ÖªGameServer
|
|
jobSkillDict = ipyData.GetRobotSkillsDict()
|
|
position = GameMap.GetEmptyPlaceInAreaEx(posX, posY, 2, 6)
|
npcPosX, npcPosY = position.GetPosX(), position.GetPosY()
|
helpBattleNPC = NPCCommon.SummonMapNpc(robotNPCID, npcPosX, npcPosY)
|
if not helpBattleNPC:
|
continue
|
objID = helpBattleNPC.GetID()
|
helpBattleNPC.SetIsNeedProcess(True)
|
GameWorld.Log("ÕÙ»½ÖúÕ½³É¹¦: calledPlayerID=%s,objID=%s,fightPower=%s" % (calledPlayerID, objID, fightPower), playerID)
|
gameFB.SetGameFBDict(ChConfig.Def_FB_HelpBattleFBObjID % calledPlayerID, objID)
|
helpBattleNPC.SetDict(ChConfig.Def_NPC_Dict_AtkDelayTick, calledCount * 1000) # °´×ª»»Ë³Ðòÿ¸öÑÓ³¤1Ãë¹¥»÷£¬·ÀÖ¹¶¯×÷Ò»ÖÂ
|
calledCount += 1
|
# ÉèÖÃÖúÕ½ÊôÐÔ
|
npcControl = NPCCommon.NPCControl(helpBattleNPC)
|
npcControl.SetHelpBattleRobotRebornAttr(fightPower)
|
__DoGiveHelpBattleRobotSkill(helpBattleNPC, jobSkillDict, job, npcLV)
|
|
# ֪ͨǰ¶ËÕÙ»½³É¹¦
|
callResultPack = ChPyNetSendPack.tagMCHelpBattleCallResult()
|
callResultPack.ObjID = objID
|
callResultPack.PlayerID = calledPlayerID
|
callResultPack.Job = job
|
NetPackCommon.SendFakePack(curPlayer, callResultPack)
|
|
# ÕÙ»½Âúºó£¬Ç°¶Ë¹Ø±Õ½çÃæÄ¬ÈÏ·¢Ò»¼üÕÙ»½£¬ÎÞÂÛÕжàÉÙÈ˶¼Ö±½Ó¿ªÊ¼
|
if isOneKeyCall or calledCount >= len(helpBattlePlayerDict) or calledCount >= maxHelpPlayerCount:
|
FBLogic.OnCallHelpBattleOK(curPlayer, tick)
|
|
# ֪ͨGameServer
|
if calledPlayerDict:
|
msgInfo = str(["Call", mapID, funcLineID, calledPlayerDict])
|
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "FBHelpBattle", msgInfo, len(msgInfo))
|
GameWorld.Log("GameServer_QueryPlayerResult: %s" % msgInfo, curPlayer.GetID())
|
return
|
|
def __DoGiveHelpBattleRobotSkill(curNPC, jobSkillDict, job, npcLV):
|
skillManager = curNPC.GetSkillManager()
|
if job not in jobSkillDict:
|
return
|
skillInfoDict = jobSkillDict[job]
|
#{Ö°Òµ:{(¼¼ÄÜID,...):ËùÐèµÈ¼¶, ¼¼ÄÜID:ËùÐèµÈ¼¶, ...}, ...}
|
#{1:{(12000, 12001, 12002, 12003):1, 12011:7, 12012:15, 12013:30, 12014:80, 12015:140}, 2:{(12100, 12101, 12102, 12103):1, 12111:7, 12112:15, 12114:80, 12115:140}}
|
skillIDList = []
|
for skillInfo, needLV in skillInfoDict.items():
|
if npcLV < needLV:
|
continue
|
if isinstance(skillInfo, int):
|
skillIDList.append(skillInfo)
|
else:
|
skillIDList += list(skillInfo)
|
GameWorld.DebugLog(" ¸øÖúÕ½»úÆ÷È˼¼ÄÜ: job=%s,npcLV=%s, %s" % (job, npcLV, skillIDList))
|
for skillID in skillIDList:
|
skillManager.LearnSkillByID(skillID)
|
return
|
|
#// B1 07 ÖúսˢР#tagCMHelpBattleRefresh
|
#
|
#struct tagCMHelpBattleRefresh
|
#{
|
# tagHead Head;
|
#};
|
def OnHelpBattleRefresh(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
SendGameServer_RefreshHelpBattlePlayer(curPlayer, isClientRefresh=True)
|
return
|
|
def SendGameServer_RefreshHelpBattlePlayer(curPlayer, mapID=0, funcLineID=0, isClientRefresh=False):
|
## ·¢ËÍGameServerÇëÇóË¢ÐÂÖúÕ½Íæ¼ÒÁбí
|
if not mapID:
|
mapID = FBCommon.GetRecordMapID(curPlayer.GetMapID())
|
if not funcLineID:
|
funcLineID = FBCommon.GetFBPropertyMark()
|
ipyData = IpyGameDataPY.GetIpyGameData("FBHelpBattle", mapID, funcLineID)
|
if not ipyData:
|
return
|
playerID = curPlayer.GetPlayerID()
|
gameFB = GameWorld.GetGameFB()
|
costMoneyList = []
|
calledPlayerIDDict = {} # ÒѾÕÙ»½µÄÍæ¼ÒID×Öµä {playerID:[ÊÇ·ñ¸¶·ÑÕÙ»½, Ö°Òµ], ...}
|
|
refreshCount = gameFB.GetPlayerGameFBDictByKey(playerID, ChConfig.FBPD_HelpBattleRefreshCount)
|
if isClientRefresh:
|
freeRefreshCount = IpyGameDataPY.GetFuncCfg("HelpBattleRefresh", 1)
|
goldRefreshCount = IpyGameDataPY.GetFuncCfg("HelpBattleRefresh", 2)
|
if refreshCount >= (freeRefreshCount + goldRefreshCount):
|
GameWorld.DebugLog("³¬¹ýË¢ÐÂÖúÕ½Áбí´ÎÊý£¡ÎÞ·¨Ë¢ÐÂ!refreshCount=%s" % (refreshCount), playerID)
|
return
|
|
if refreshCount >= freeRefreshCount:
|
costGold = IpyGameDataPY.GetFuncCfg("HelpBattleRefresh", 3)
|
# âýÓ¢°æ¸ÄΪֱ½Ó¿Û°óÓñÁéʯ 2019/10/8
|
costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Paper, costGold)
|
if not costMoneyList:
|
GameWorld.DebugLog("»õ±Ò²»×ã!ÎÞ·¨Ë¢ÐÂÖúÕ½£¡")
|
return
|
|
# »ñÈ¡ÒѾÕÙ»½µÄÍæ¼Ò¾µÏñID
|
helpBattlePlayerDict = PyGameData.g_fbHelpBattlePlayerDict.get(playerID, {})
|
for helpPlayerID, helpPlayerInfoDict in helpBattlePlayerDict.items():
|
objID = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_HelpBattleFBObjID % helpPlayerID)
|
if not objID:
|
continue
|
needGoldCall = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_HelpBattleGoldCall % helpPlayerID)
|
job = helpPlayerInfoDict.get("Job", 1)
|
relation = helpPlayerInfoDict.get("Relation", 0) # ¹ØÏµÐèÒÔË¢ÐÂÁбíʱµÄΪ׼£¬Èç¹ûÒѾÕÙ»½ÁË£¬ÔòÒѵ±Ê±µÄΪ׼
|
calledPlayerIDDict[helpPlayerID] = [needGoldCall, job, relation]
|
|
# ·Ç¿Í»§¶ËˢеÄÊÓÎªÖØÐ¿ªÊ¼£¬ÖØÖÃˢдÎÊý
|
else:
|
if not refreshCount:
|
gameFB.SetPlayerGameFBDict(playerID, ChConfig.FBPD_HelpBattleRefreshCount, 0)
|
gameFB.SetGameFBDict(ChConfig.FBPD_HelpBattleFBFightPower, ipyData.GetFightPowerMin())
|
gameFB.SetGameFBDict(ChConfig.FBPD_HelpBattleFBBaseHurt, ipyData.GetRobotBaseHurt())
|
GameWorld.DebugLog("ÉèÖø±±¾Õ½Á¦=%s,±£µ×É˺¦=%s" % (ipyData.GetFightPowerMin(), ipyData.GetRobotBaseHurt()))
|
|
msgInfo = str(["Refresh", mapID, funcLineID, isClientRefresh, costMoneyList, calledPlayerIDDict])
|
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "FBHelpBattle", msgInfo, len(msgInfo))
|
GameWorld.Log("SendGameServer_RefreshHelpBattlePlayer %s" % (msgInfo), playerID)
|
return
|
|
def __OnHelpBattleRefreshResult(curPlayer, msgList, tick):
|
## ˢзµ»Ø
|
cmd, mapID, funcLineID, isClientRefresh, costMoneyList, calledPlayerIDDict, helpBattlePlayerDict = msgList
|
|
playerID = curPlayer.GetPlayerID()
|
gameFB = GameWorld.GetGameFB()
|
|
# ¿ÛÇ®£¬¼ÓˢдÎÊý
|
infoDict = {"MapID":mapID, 'lineID':funcLineID, "Type":"Refresh"}
|
for moneyType, moneyNum in costMoneyList:
|
PlayerControl.PayMoney(curPlayer, moneyType, moneyNum, ChConfig.Def_Cost_FBHelpBattle, infoDict)
|
refreshCount = gameFB.GetPlayerGameFBDictByKey(playerID, ChConfig.FBPD_HelpBattleRefreshCount)
|
if isClientRefresh:
|
refreshCount += 1
|
gameFB.SetPlayerGameFBDict(playerID, ChConfig.FBPD_HelpBattleRefreshCount, refreshCount)
|
|
GameWorld.Log("FBHelpBattleResult: %s,mapID=%s,funcLineID=%s,isClientRefresh=%s,costMoneyList=%s,calledPlayerIDDict=%s,refreshCount=%s"
|
% (cmd, mapID, funcLineID, isClientRefresh, costMoneyList, calledPlayerIDDict, refreshCount), playerID)
|
GameWorld.Log(" helpBattlePlayerDict=%s" % (helpBattlePlayerDict), playerID)
|
PyGameData.g_fbHelpBattlePlayerDict[playerID] = helpBattlePlayerDict
|
|
# ֪ͨǰ¶Ë
|
helpPlayerListPack = ChPyNetSendPack.tagMCHelpBattleList()
|
helpPlayerListPack.RefreshCount = refreshCount
|
helpPlayerListPack.HelpPlayerList = []
|
for helpPlayerID, helpPlayerInfoDict in helpBattlePlayerDict.items():
|
helpPlayer = ChPyNetSendPack.tagMCHelpBattlePlayer()
|
helpPlayer.ObjID = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_HelpBattleFBObjID % helpPlayerID) # »ñÈ¡ÒѾÕÙ»½µÄ¶ÔÓ¦objID
|
helpPlayer.PlayerID = helpPlayerID
|
helpPlayer.Job = helpPlayerInfoDict.get("Job", 1)
|
# Íæ¼Ò¾µÏñ²ÅÓÐÃû×Ö£¬ÖúÕ½NPCÃû×Öǰ¶Ë´¦Àí
|
if "Name" in helpPlayerInfoDict:
|
helpPlayer.Name = helpPlayerInfoDict["Name"]
|
helpPlayer.NameLen = len(helpPlayer.Name)
|
helpPlayer.LV = helpPlayerInfoDict["LV"]
|
helpPlayer.Face = helpPlayerInfoDict["Face"]
|
helpPlayer.FacePic = helpPlayerInfoDict["FacePic"]
|
helpPlayer.RealmLV = helpPlayerInfoDict["RealmLV"]
|
helpPlayer.FightPower = helpPlayerInfoDict["FightPower"]
|
helpPlayer.Relation = helpPlayerInfoDict.get("Relation", 0)
|
helpPlayer.IsNeedGold = helpPlayerInfoDict.get("NeedGoldCall", 0)
|
helpPlayerListPack.HelpPlayerList.append(helpPlayer)
|
helpPlayerListPack.HelpCount = len(helpPlayerListPack.HelpPlayerList)
|
NetPackCommon.SendFakePack(curPlayer, helpPlayerListPack)
|
return
|
|
def SendGameServer_SweepCallHelpBattlePlayer(curPlayer, mapID, funcLineID):
|
## ·¢ËÍGameServerÇëÇóɨµ´ÖúÕ½Íæ¼Ò
|
ipyData = IpyGameDataPY.GetIpyGameData("FBHelpBattle", mapID, funcLineID)
|
if not ipyData:
|
return
|
playerID = curPlayer.GetPlayerID()
|
msgInfo = str(["SweepCall", mapID, funcLineID])
|
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "FBHelpBattle", msgInfo, len(msgInfo))
|
GameWorld.Log("SendGameServer_SweepCallHelpBattlePlayer %s" % (msgInfo), playerID)
|
return
|
|
def __OnHelpBattleSweepCallResult(curPlayer, msgList, tick):
|
## Öúսɨµ´½á¹û´¦Àí
|
cmd, mapID, funcLineID, helpBattlePlayerDict = msgList
|
playerID = curPlayer.GetPlayerID()
|
GameWorld.DebugLog("__OnHelpBattleSweepCallResult %s,mapID=%s,funcLineID=%s,helpBattlePlayerDict=%s"
|
% (cmd, mapID, funcLineID, helpBattlePlayerDict), playerID)
|
|
fbFuncIpyData = IpyGameDataPY.GetIpyGameData("FBFunc", mapID)
|
if not fbFuncIpyData:
|
return
|
|
assistPlayerIDList = []
|
for helpPlayerID in helpBattlePlayerDict.keys():
|
if helpPlayerID <= MaxRobotID:
|
continue
|
assistPlayerIDList.append(helpPlayerID)
|
__DoGivePlayerAssistLihe(curPlayer, mapID, funcLineID, assistPlayerIDList)
|
|
#ɨµ´½á¹û¸ø½±ÀøµÈ
|
FBLogic.OnPlayerFBHelpBattleSweepResult(curPlayer, mapID, funcLineID, helpBattlePlayerDict)
|
return
|
|
def DoFBHelpBattleFinish(curPlayer, mapID, lineID):
|
## ¸±±¾ÖúÕ½Íê³É
|
|
assistPlayerIDList = []
|
gameFB = GameWorld.GetGameFB()
|
playerID = curPlayer.GetPlayerID()
|
helpBattlePlayerDict = PyGameData.g_fbHelpBattlePlayerDict.get(playerID, {})
|
for helpPlayerID in helpBattlePlayerDict.keys():
|
objID = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_HelpBattleFBObjID % helpPlayerID)
|
if not objID:
|
continue
|
if helpPlayerID <= MaxRobotID:
|
continue
|
assistPlayerIDList.append(helpPlayerID)
|
__DoGivePlayerAssistLihe(curPlayer, mapID, lineID, assistPlayerIDList)
|
|
return
|
|
def __DoGivePlayerAssistLihe(curPlayer, mapID, lineID, assistPlayerIDList):
|
## ¸øÍæ¼ÒÐÖúÀñºÐ½±Àø
|
|
if not assistPlayerIDList:
|
return
|
|
liheItemID = 0
|
mapAssistGiftDict = IpyGameDataPY.GetFuncEvalCfg("AssistAward", 2, {})
|
mapID = FBCommon.GetRecordMapID(mapID)
|
if str(mapID) in mapAssistGiftDict:
|
liheItemID = mapAssistGiftDict[str(mapID)][0]
|
if not liheItemID:
|
return
|
|
ItemControler.GivePlayerItemOrMail(curPlayer, [[liheItemID, 1, 0]])
|
|
msgInfo = str(["AssistFinish", liheItemID, mapID, lineID, assistPlayerIDList])
|
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "FBHelpBattle", msgInfo, len(msgInfo))
|
return
|
|
|
def __GetTeamFBMemRelationInfo(curPlayer, isHelp, leavePlayerID):
|
## ¼ÆËã¶ÓÔ±¼äÏ໥¼Ó³ÉÐÅÏ¢£¬ÀëÏßÍæ¼Ò²»Ëã
|
relation = 0
|
relationAdd = 0 # Éç½»¹ØÏµ¼Ó³É
|
relationPlayerID = 0
|
relationPlayerName = ""
|
teamID = curPlayer.GetTeamID()
|
if teamID not in PyGameData.g_teamFBMemRelationDict:
|
return relation, relationAdd, relationPlayerID, relationPlayerName
|
|
playerManager = GameWorld.GetMapCopyPlayerManager()
|
friendList, memFamilyIDDict, memNameDict = PyGameData.g_teamFBMemRelationDict[teamID]
|
relationList = IpyGameDataPY.GetFuncEvalCfg("HelpBattlePoint", 3, []) # Éç½»¹ØÏµÓÅÏȼ¶
|
relationCoinAddDict = IpyGameDataPY.GetFuncEvalCfg("HelpBattlePoint", 2, {}) # Éç½»¹ØÏµ¼Ó³É {"Éç½»¹ØÏµ":[¹ý¹Ø¼Ó³É, ÖúÕ½¼Ó³É], ...}
|
playerID = curPlayer.GetPlayerID()
|
familyID = curPlayer.GetFamilyID()
|
if isHelp:
|
# ÖúÕ½µÄËæ±ãȡһλÓÅÏȼ¶×î¸ßµÄ¼´¿É
|
defaultRelationPlayerID = 0
|
for memPlayerID, memFamilyID in memFamilyIDDict.items():
|
memRelation, relationPlayerID = __GetTemMemRelation(playerManager, playerID, familyID, memPlayerID, memFamilyID, relationList, friendList, leavePlayerID)
|
if not memRelation:
|
if not defaultRelationPlayerID and relationPlayerID:
|
defaultRelationPlayerID = relationPlayerID
|
continue
|
relation = memRelation
|
relationAddList = relationCoinAddDict.get(str(memRelation), [])
|
relationAdd += relationAddList[1] if len(relationAddList) == 2 else 0
|
relationPlayerName = memNameDict[relationPlayerID]
|
return relation, relationAdd, relationPlayerID, relationPlayerName
|
|
relationPlayerID = defaultRelationPlayerID
|
relationPlayerName = memNameDict.get(relationPlayerID, "")
|
GameWorld.DebugLog("ÖúսĬÈÏÎÞ¹ØÏµ¶ÓÔ±£º relationPlayerID=%s,relationPlayerName=%s" % (relationPlayerID, relationPlayerName), playerID)
|
else:
|
# ·ÇÖúÕ½ÏíÊÜËùÓжÓÔ±¼Ó³É
|
for memPlayerID, memFamilyID in memFamilyIDDict.items():
|
memRelation = __GetTemMemRelation(playerManager, playerID, familyID, memPlayerID, memFamilyID, relationList, friendList, leavePlayerID)[0]
|
if not memRelation:
|
continue
|
if memRelation == relationList[0]:
|
relation = memRelation
|
elif relation:
|
relation = memRelation
|
relationAddList = relationCoinAddDict.get(str(memRelation), [])
|
relationAdd += relationAddList[0] if len(relationAddList) == 2 else 0
|
|
return relation, relationAdd, relationPlayerID, relationPlayerName
|
|
def __GetTemMemRelation(playerManager, playerID, familyID, memPlayerID, memFamilyID, relationList, friendList, leavePlayerID):
|
## ÀëÏßÍæ¼Ò²»ËãÉç½»¹ØÏµ
|
if leavePlayerID and memPlayerID == leavePlayerID:
|
return 0, 0
|
if playerID == memPlayerID:
|
return 0, 0
|
memPlayer = playerManager.FindPlayerByID(memPlayerID)
|
if memPlayer == None or memPlayer.IsEmpty():
|
return 0, 0
|
for checkRelation in relationList:
|
if checkRelation == 1:
|
if [playerID, memPlayerID] in friendList:
|
return checkRelation, memPlayerID
|
if checkRelation == 2:
|
if playerID != memPlayerID and familyID and familyID == memFamilyID:
|
return checkRelation, memPlayerID
|
return 0, memPlayerID
|
|
def RefershTeamFBMemRelation(tick, leavePlayerID=0):
|
## Ë¢ÐÂ×é¶Ó¸±±¾¶ÓÔ±¹ØÏµ
|
playerManager = GameWorld.GetMapCopyPlayerManager()
|
for i in xrange(playerManager.GetPlayerCount()):
|
player = playerManager.GetPlayerByIndex(i)
|
if player == None or player.IsEmpty():
|
continue
|
if leavePlayerID and player.GetPlayerID() == leavePlayerID:
|
PyGameData.g_teamFBMemRelationAddDict.pop(leavePlayerID, 0)
|
continue
|
relation, relationAdd, relationPlayerID, relationPlayerName = __GetTeamFBMemRelationInfo(player, FBCommon.GetIsHelpFight(player), leavePlayerID)
|
PyGameData.g_teamFBMemRelationAddDict[player.GetPlayerID()] = [relation, relationAdd, relationPlayerID, relationPlayerName]
|
|
for index in xrange(playerManager.GetPlayerCount()):
|
player = playerManager.GetPlayerByIndex(index)
|
if player == None or player.IsEmpty():
|
continue
|
if leavePlayerID and player.GetPlayerID() == leavePlayerID:
|
continue
|
FBLogic.DoFBHelp(player, tick)
|
|
return
|
|
def GetTeamFBMemRelationInfo(playerID):
|
if playerID not in PyGameData.g_teamFBMemRelationAddDict:
|
return 0, 0
|
return PyGameData.g_teamFBMemRelationAddDict[playerID][:2]
|
|