#!/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 PlayerBillboard
|
import ChPyNetSendPack
|
import NetPackCommon
|
import PlayerViewCacheTube
|
import FBCommon
|
import IpyGameDataPY
|
import ShareDefine
|
import PyGameData
|
import random
|
import GameMap
|
import NPCCommon
|
import FBLogic
|
import PlayerVip
|
import IPY_GameWorld
|
import PlayerActivity
|
|
import time
|
|
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)
|
|
# ÖØÖÃÿÈÕÒÑ»ñµÃÏÉÔµ±Ò
|
ondaySetXianyuanCoin = 0
|
ondayLoginSetXianyuanCoin = curPlayer.GetDictByKey(ChConfig.Def_PDict_TodayXianyuanCoinOnLogin)
|
if ondayLoginSetXianyuanCoin:
|
# ÕâÀï×öʱ¼ä±È½Ï£¬Ô¤·ÀÍæ¼ÒµÇ¼ºó¾ÍûÓÐÔÙÇл»µØÍ¼£¬ÔÙ´ÎÔڸõØÍ¼¹ýÌì»áµ¼ÖÂÉèÖÃÖµ´íÎóÎÊÌâ
|
loginAddCoinTime = curPlayer.GetDictByKey(ChConfig.Def_PDict_LoginAddTodayXianyuanCoinTime)
|
if GameWorld.CheckTimeIsSameServerDayEx(loginAddCoinTime):
|
ondaySetXianyuanCoin = ondayLoginSetXianyuanCoin
|
GameWorld.DebugLog("Íæ¼Ò¹ýÌìʱ£¬µÇ¼Ôö¼ÓÏÉÔµ±ÒÓÐÖµ£¬ÈÔÈ»ÊÇͬһÌ죬ÏÉÔµ±ÒÖØÖÃΪµÇ¼ʱÔö¼ÓµÄÏÉÔµ±Ò£¡ondayLoginSetXianyuanCoin=%s" % ondayLoginSetXianyuanCoin)
|
else:
|
GameWorld.DebugLog("Íæ¼Ò¹ýÌìʱ£¬µÇ¼Ôö¼ÓÏÉÔµ±ÒÓÐÖµ£¬µ«ÊDz»ÊÇͬһÌìÁË£¬ÏÉÔµ±ÒÖØÖÃΪ0£¡")
|
PlayerControl.SetTodayXianyuanCoin(curPlayer, ondaySetXianyuanCoin)
|
GameWorld.DebugLog("Íæ¼Ò¹ýÌìÉèÖýñÈÕÒÑ»ñµÃÏÉÔµ±Ò: ondaySetXianyuanCoin=%s,ondayLoginSetXianyuanCoin=%s"
|
% (ondaySetXianyuanCoin, ondayLoginSetXianyuanCoin))
|
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 == "HelpRecord":
|
__OnHelpBattleRecord(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 = curPlayer.GetFightPower()
|
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)
|
|
# ûÓÐÊý¾Ý»º´æµÄ»°£¬ÂíÉÏͬ²½Ò»´Î
|
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) # ¸¶·ÑÕÙ»½ÏûºÄÏÉÓñ£¬ÓÅÏÈÏûºÄ°óÓñ
|
costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, ShareDefine.TYPE_Price_Gold_Paper_Money, 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 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)
|
costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, ShareDefine.TYPE_Price_Gold_Paper_Money, 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.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
|
|
reason = 0
|
addCoinRate = 10000 # »ù´¡±¶ÂÊ
|
baseFBPoint = fbFuncIpyData.GetFBPoint() # ¹ý¹Ø - »ù´¡ÏÉÔµ±Ò
|
|
xianyuanCoinUpper = IpyGameDataPY.GetFuncCfg("HelpBattlePoint", 1) # ÿÈÕÏÉÔµ±ÒÉÏÏÞ
|
relationCoinAddDict = IpyGameDataPY.GetFuncEvalCfg("HelpBattlePoint", 2, {}) # Éç½»¹ØÏµ¼Ó³É {"Éç½»¹ØÏµ":[¹ý¹Ø¼Ó³É, ÖúÕ½¼Ó³É], ...}
|
todayXianyuanCoin = PlayerControl.GetTodayXianyuanCoin(curPlayer) # ½ñÈÕÒÑ»ñµÃÏÉÔµ±Ò
|
playerXianyuanCoinUpper = xianyuanCoinUpper
|
if curPlayer.GetVIPLv():
|
playerXianyuanCoinUpper += PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_XianyuanCoinUpperAdd)
|
addCoinRate += PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_XianyuanCoinAddPer)
|
|
relation, relationAdd = 0, 0
|
for helpPlayerInfoDict in helpBattlePlayerDict.values():
|
relation = helpPlayerInfoDict.get("Relation", 0)
|
if not relation:
|
continue
|
relationAddList = relationCoinAddDict.get(str(relation), [])
|
relationAdd += relationAddList[0] if len(relationAddList) == 2 else 0
|
|
coinAdd = 0
|
if baseFBPoint:
|
coinAdd = int((baseFBPoint + relationAdd) * addCoinRate / 10000.0)
|
canAddMax = max(playerXianyuanCoinUpper - todayXianyuanCoin, 0)
|
coinAddReal = min(coinAdd, canAddMax) # ʵ¼Ê¼ÓÏÉÔµ±Ò
|
if canAddMax == 0 and not reason:
|
reason = 2
|
|
GameWorld.DebugLog("ɨµ´¸±±¾Ôö¼ÓÏÉÔµ±Ò: baseFBPoint=%s,relationAdd=%s,addCoinRate=%s,coinAdd=%s,canAddMax=%s,coinAddReal=%s"
|
% (baseFBPoint, relationAdd, addCoinRate, coinAdd, canAddMax, coinAddReal), playerID)
|
if coinAddReal:
|
addDataDict = {"MapID":mapID, "FuncLineID":funcLineID, "IsSweep":1}
|
PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_XianyuanCoin, coinAddReal, addDataDict=addDataDict)
|
PlayerControl.AddTodayXianyuanCoin(curPlayer, coinAddReal)
|
|
#ɨµ´½á¹û¸ø½±ÀøµÈ
|
FBLogic.OnPlayerFBHelpBattleSweepResult(curPlayer, mapID, funcLineID, helpBattlePlayerDict, coinAddReal, reason)
|
|
# ֪ͨ×Ô¼º»ñµÃÏÉÔµ±Ò
|
msgPack = ChPyNetSendPack.tagMCAddXianyuanCoinMsg()
|
msgPack.MapID = mapID
|
msgPack.FuncLineID = funcLineID
|
msgPack.Relation = relation
|
msgPack.RelationCoinAdd = relationAdd
|
msgPack.XianyuanCoinAdd = coinAddReal
|
msgPack.Reason = reason
|
#msgPack.CallPlayerID = relationPlayerID
|
#msgPack.CallPlayerName = relationPlayerName
|
msgPack.NameLen = len(msgPack.CallPlayerName)
|
msgPack.IsSweep = 1
|
NetPackCommon.SendFakePack(curPlayer, msgPack)
|
return
|
|
def __OnHelpBattleRecord(curPlayer, msgList, tick):
|
## ÖúÕ½¼Ç¼ͬ²½
|
cmd, helpRecordList, isLogin = msgList
|
playerID = curPlayer.GetPlayerID()
|
GameWorld.DebugLog("__OnHelpBattleRecord %s,helpRecordList=%s" % (cmd, helpRecordList), playerID)
|
|
addXianyuanCoinTotal = 0 # ÀÛ¼ÆÐèÒªÔö¼ÓµÄÏÉÔµ±Ò
|
addXianyuanCoinTotalTotay = 0 # ÀÛ¼ÆÐèÒªÔö¼ÓµÄ½ñÈÕÏÉÔµ±Ò
|
drList = []
|
|
totalHelpCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HelpBattleTotalCount)
|
recordPack = ChPyNetSendPack.tagMCHelpBattleRecordList()
|
recordPack.RecordList = []
|
for recordInfo in helpRecordList:
|
callPlayerID, callPlayerName, mapID, funcLineID, xianyuanCoinAdd, relation, vipLV, recordTime = recordInfo
|
timeStr = GameWorld.ChangeTimeNumToStr(recordTime)
|
isSameDay = GameWorld.CheckTimeIsSameServerDayEx(recordTime)
|
|
record = ChPyNetSendPack.tagMCHelpBattleRecord()
|
record.CallPlayerID = callPlayerID
|
record.CallPlayerName = callPlayerName
|
record.NameLen = len(record.CallPlayerName)
|
record.MapID = mapID
|
record.FuncLineID = funcLineID
|
record.XianyuanCoinAdd = xianyuanCoinAdd
|
record.Relation = relation
|
record.VIPLV = vipLV
|
record.HelpTime = timeStr
|
recordPack.RecordList.append(record)
|
drList.append({"CallPlayerID":callPlayerID, "MapID":mapID, "FuncLineID":funcLineID, "XianyuanCoinAdd":xianyuanCoinAdd,
|
"Relation":relation, "VIPLV":vipLV, "HelpTime":timeStr, "IsSameDay":isSameDay})
|
addXianyuanCoinTotal += xianyuanCoinAdd
|
if isSameDay:
|
addXianyuanCoinTotalTotay += xianyuanCoinAdd
|
totalHelpCount += 1
|
|
recordPack.RecordCount = len(recordPack.RecordList)
|
NetPackCommon.SendFakePack(curPlayer, recordPack)
|
|
addDataDict = {"HelpList":drList}
|
GameWorld.DebugLog(" addXianyuanCoinTotal=%s,addXianyuanCoinTotalTotay=%s,totalHelpCount=%s,isLogin=%s"
|
% (addXianyuanCoinTotal, addXianyuanCoinTotalTotay, totalHelpCount, isLogin), playerID)
|
PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_XianyuanCoin, addXianyuanCoinTotal, addDataDict=addDataDict, isSysHint=False)
|
if addXianyuanCoinTotalTotay:
|
PlayerControl.AddTodayXianyuanCoin(curPlayer, addXianyuanCoinTotalTotay)
|
if isLogin:
|
curPlayer.SetDict(ChConfig.Def_PDict_TodayXianyuanCoinOnLogin, addXianyuanCoinTotalTotay)
|
curPlayer.SetDict(ChConfig.Def_PDict_LoginAddTodayXianyuanCoinTime, int(time.time()))
|
GameWorld.Log(" µÇ¼ʱ½ñÈÕÖúÕ½ÐÅÏ¢: addXianyuanCoinTotalTotay=%s" % (addXianyuanCoinTotalTotay), playerID)
|
|
# ¸üÐÂ×ÜÖúÕ½´ÎÊý£¬¸üÐÂÅÅÐаñ
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HelpBattleTotalCount, totalHelpCount)
|
if totalHelpCount >= IpyGameDataPY.GetFuncCfg("HelpBattleRefresh", 4):
|
PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_FBHelpBattle, totalHelpCount)
|
return
|
|
def DoFBAddXianyuanCoin(curPlayer, mapID, lineID, isHelp=False):
|
'''ÕæÈËÌôÕ½¸±±¾Ôö¼ÓÏÉÔµ±Ò£¬°üº¬¹ý¹Ø»òÖúÕ½£¨²»º¬¾µÏñÖúÕ½£©
|
@param isHelp: ÊÇ·ñÖúÕ½µÄ
|
@return: »ñµÃµÄÏÉÔµ±Ò, ÎÞ·¨»ñµÃÏÉÔµ±ÒÔÒò(1-´ïµ½ÖúÕ½´ÎÊýÉÏÏÞ£¬2-´ïµ½Ã¿ÈÕ»ñµÃÏÉÔµ±ÒÉÏÏÞ)
|
'''
|
playerID = curPlayer.GetPlayerID()
|
fbFuncIpyData = IpyGameDataPY.GetIpyGameData("FBFunc", mapID)
|
if not fbFuncIpyData:
|
return 0, 0
|
|
reason = 0
|
addCoinRate = 10000 # »ù´¡±¶ÂÊ
|
if not isHelp:
|
baseFBPoint = fbFuncIpyData.GetFBPoint() # ¹ý¹Ø - »ù´¡ÏÉÔµ±Ò
|
else:
|
baseFBPoint = fbFuncIpyData.GetHelpPoint() # ÖúÕ½
|
dayHelpCountMax = fbFuncIpyData.GetDayHelpCountMax() # ÕæÊµÖúսÿÈÕ¿É»ñµÃÏÉÔµ±Ò´ÎÊý
|
if dayHelpCountMax:
|
todayHelpCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FBRealHelpCount % mapID)
|
if todayHelpCount >= dayHelpCountMax:
|
baseFBPoint = 0
|
reason = 1
|
GameWorld.DebugLog("´ïµ½Ã¿ÈÕÖúÕ½¿É»ñµÃÏÉÔµ±Ò´ÎÊýÉÏÏÞ£¡ÎÞ·¨ÔÙ»ñµÃ!mapID=%s" % (mapID), playerID)
|
else:
|
todayHelpCount += 1
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FBRealHelpCount % mapID, todayHelpCount)
|
GameWorld.DebugLog("Ôö¼ÓÿÈÕÖúÕ½¿É»ñµÃÏÉÔµ±Ò´ÎÊý!mapID=%s,todayHelpCount=%s" % (mapID, todayHelpCount), playerID)
|
|
xianyuanCoinUpper = IpyGameDataPY.GetFuncCfg("HelpBattlePoint", 1) # ÿÈÕÏÉÔµ±ÒÉÏÏÞ
|
relationCoinAddDict = IpyGameDataPY.GetFuncEvalCfg("HelpBattlePoint", 2, {}) # Éç½»¹ØÏµ¼Ó³É {"Éç½»¹ØÏµ":[¹ý¹Ø¼Ó³É, ÖúÕ½¼Ó³É], ...}
|
todayXianyuanCoin = PlayerControl.GetTodayXianyuanCoin(curPlayer) # ½ñÈÕÒÑ»ñµÃÏÉÔµ±Ò
|
playerXianyuanCoinUpper = xianyuanCoinUpper
|
if curPlayer.GetVIPLv():
|
playerXianyuanCoinUpper += PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_XianyuanCoinUpperAdd)
|
addCoinRate += PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_XianyuanCoinAddPer)
|
|
#´ïµ½ÉÏÏÞÒ²ÐèÒª¼Ç¼£¬ËùÒÔÕâÀïÔݲ»ÏÞÖÆ
|
#if todayXianyuanCoin >= playerXianyuanCoinUpper:
|
# GameWorld.DebugLog("Íæ¼Ò½ñÈÕÏÉÔµ±ÒÒÑ´ïÉÏÏÞ£¡todayXianyuanCoin=%s,playerXianyuanCoinUpper=%s"
|
# % (todayXianyuanCoin, playerXianyuanCoinUpper), playerID)
|
# return
|
|
relation, relationAdd, relationPlayerID, relationPlayerName = 0, 0, 0, ""
|
|
fbType = GameWorld.GetMap().GetMapFBType()
|
if fbType == IPY_GameWorld.fbtSingle:
|
gameFB = GameWorld.GetGameFB()
|
helpBattlePlayerDict = PyGameData.g_fbHelpBattlePlayerDict.get(playerID, {})
|
for helpPlayerID, helpPlayerInfoDict in helpBattlePlayerDict.items():
|
objID = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_HelpBattleFBObjID % helpPlayerID)
|
if not objID:
|
continue
|
relation = helpPlayerInfoDict.get("Relation", 0)
|
if not relation:
|
continue
|
relationAddList = relationCoinAddDict.get(str(relation), [])
|
relationAdd += relationAddList[0] if len(relationAddList) == 2 else 0
|
elif fbType == IPY_GameWorld.fbtTeam:
|
if playerID in PyGameData.g_teamFBMemRelationAddDict:
|
relation, relationAdd, relationPlayerID, relationPlayerName = PyGameData.g_teamFBMemRelationAddDict.pop(playerID)
|
|
coinAdd = 0
|
if baseFBPoint:
|
coinAdd = int((baseFBPoint + relationAdd) * addCoinRate / 10000.0)
|
canAddMax = max(playerXianyuanCoinUpper - todayXianyuanCoin, 0)
|
coinAddReal = min(coinAdd, canAddMax) # ʵ¼Ê¼ÓÏÉÔµ±Ò
|
if canAddMax == 0 and not reason:
|
reason = 2
|
|
if isHelp and not relationPlayerID:
|
relationPlayerID = 1
|
#GameWorld.DebugLog("ûÓÐÖúսĿ±êÔòÉèÖÃrelationPlayerIDΪ1£¬±ê¼ÇÊÇÖúÕ½µÄ£¡")
|
|
GameWorld.DebugLog("ÌôÕ½¸±±¾Ôö¼ÓÏÉÔµ±Ò: baseFBPoint=%s,relationAdd=%s,addCoinRate=%s,coinAdd=%s,canAddMax=%s,coinAddReal=%s,relationPlayerID=%s"
|
% (baseFBPoint, relationAdd, addCoinRate, coinAdd, canAddMax, coinAddReal, relationPlayerID), playerID)
|
if coinAddReal:
|
addDataDict = {"MapID":mapID, "FuncLineID":lineID}
|
PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_XianyuanCoin, coinAddReal, addDataDict=addDataDict)
|
PlayerControl.AddTodayXianyuanCoin(curPlayer, coinAddReal)
|
|
# ֪ͨ×Ô¼º»ñµÃÏÉÔµ±Ò
|
msgPack = ChPyNetSendPack.tagMCAddXianyuanCoinMsg()
|
msgPack.MapID = mapID
|
msgPack.FuncLineID = lineID
|
msgPack.Relation = relation
|
msgPack.RelationCoinAdd = relationAdd
|
msgPack.XianyuanCoinAdd = coinAddReal
|
msgPack.Reason = reason
|
msgPack.CallPlayerID = relationPlayerID
|
msgPack.CallPlayerName = relationPlayerName
|
msgPack.NameLen = len(msgPack.CallPlayerName)
|
NetPackCommon.SendFakePack(curPlayer, msgPack)
|
return coinAddReal, reason
|
|
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]
|
|