From acbbad4fb7e7aff47ce3066d0ec6eccc34b43d30 Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期五, 11 一月 2019 10:44:18 +0800
Subject: [PATCH] 5817 【后端】【1.5】限时抢购支持对应不同的职业
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py | 360 +++++++++++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 318 insertions(+), 42 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py
index c64f99c..f9d5821 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py
@@ -18,6 +18,7 @@
import GameWorld
import ChConfig
import PlayerControl
+import PlayerBillboard
import ChPyNetSendPack
import NetPackCommon
import PlayerViewCacheTube
@@ -30,12 +31,49 @@
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 # 累计登记
- checkInInfo = (checkInCount + 1) * 10 + 0
- PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HelpBattleCheckInCount, checkInInfo)
+ 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("玩家过天时,登录增加仙缘币有值,但是不是同一天了,仙缘币重置为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):
@@ -50,13 +88,17 @@
__OnHelpBattleCheckInResult(curPlayer, msgList, tick)
# 刷新
- if cmd == "Refresh":
+ elif cmd == "Refresh":
__OnHelpBattleRefreshResult(curPlayer, msgList, tick)
# 助战记录
- if cmd == "HelpRecord":
+ elif cmd == "HelpRecord":
__OnHelpBattleRecord(curPlayer, msgList, tick)
+ # 扫荡召唤
+ elif cmd == "SweepCall":
+ __OnHelpBattleSweepCallResult(curPlayer, msgList, tick)
+
return
#// B1 05 助战登记 #tagCMHelpBattleCheckIn
@@ -84,14 +126,13 @@
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)
- checkInPack = ChPyNetSendPack.tagMCHelpBattleCheckInResult()
- checkInPack.IsOK = isOK
- NetPackCommon.SendFakePack(curPlayer, checkInPack)
+ SyncCheckInState(curPlayer, 1, False)
GameWorld.DebugLog("FBHelpBattleResult: %s,checkInCount=%s,fightPower=%s,isOK=%s,haveViewCache=%s"
% (cmd, checkInCount, fightPower, isOK, haveViewCache), curPlayer.GetPlayerID())
@@ -129,6 +170,9 @@
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):
@@ -198,8 +242,10 @@
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)
@@ -210,6 +256,7 @@
callResultPack = ChPyNetSendPack.tagMCHelpBattleCallResult()
callResultPack.ObjID = objID
callResultPack.PlayerID = calledPlayerID
+ callResultPack.Job = job
NetPackCommon.SendFakePack(curPlayer, callResultPack)
# 召唤满后
@@ -268,8 +315,8 @@
costMoneyList = []
calledPlayerIDDict = {} # 已经召唤的玩家ID字典 {playerID:[是否付费召唤, 职业], ...}
+ refreshCount = gameFB.GetPlayerGameFBDictByKey(playerID, ChConfig.FBPD_HelpBattleRefreshCount)
if isClientRefresh:
- refreshCount = gameFB.GetPlayerGameFBDictByKey(playerID, ChConfig.FBPD_HelpBattleRefreshCount)
freeRefreshCount = IpyGameDataPY.GetFuncCfg("HelpBattleRefresh", 1)
goldRefreshCount = IpyGameDataPY.GetFuncCfg("HelpBattleRefresh", 2)
if refreshCount >= (freeRefreshCount + goldRefreshCount):
@@ -296,7 +343,8 @@
# 非客户端刷新的视为重新开始,重置刷新次数
else:
- gameFB.SetPlayerGameFBDict(playerID, ChConfig.FBPD_HelpBattleRefreshCount, 0)
+ 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()))
@@ -350,8 +398,84 @@
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 = msgList
+ ## 助战记录同步
+ cmd, helpRecordList, isLogin = msgList
playerID = curPlayer.GetPlayerID()
GameWorld.DebugLog("__OnHelpBattleRecord %s,helpRecordList=%s" % (cmd, helpRecordList), playerID)
@@ -359,6 +483,7 @@
addXianyuanCoinTotalTotay = 0 # 累计需要增加的今日仙缘币
drList = []
+ totalHelpCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HelpBattleTotalCount)
recordPack = ChPyNetSendPack.tagMCHelpBattleRecordList()
recordPack.RecordList = []
for recordInfo in helpRecordList:
@@ -382,28 +507,56 @@
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" % (addXianyuanCoinTotal, addXianyuanCoinTotalTotay), playerID)
+ 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 DoSingleFBAddXianyuanCoin(curPlayer, mapID, lineID):
- ## 挑战单人副本增加仙缘币,仅适用于召唤镜像助战挑战的副本
+def DoFBAddXianyuanCoin(curPlayer, mapID, lineID, isHelp=False):
+ '''真人挑战副本增加仙缘币,包含过关或助战(不含镜像助战)
+ @param isHelp: 是否助战的
+ @return: 获得的仙缘币, 无法获得仙缘币原因(1-达到助战次数上限,2-达到每日获得仙缘币上限)
+ '''
playerID = curPlayer.GetPlayerID()
fbFuncIpyData = IpyGameDataPY.GetIpyGameData("FBFunc", mapID)
- fbHelpIpyData = IpyGameDataPY.GetIpyGameData("FBHelpBattle", mapID, lineID)
- if not fbFuncIpyData or not fbHelpIpyData:
- return
+ if not fbFuncIpyData:
+ return 0, 0
+ reason = 0
addCoinRate = 10000 # 基础倍率
- baseFBPoint = fbFuncIpyData.GetFBPoint() # 过关 - 基础仙缘币
+ 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) # 今日已获得仙缘币
@@ -412,33 +565,156 @@
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
+ #达到上限也需要记录,所以这里暂不限制
+ #if todayXianyuanCoin >= playerXianyuanCoinUpper:
+ # GameWorld.DebugLog("玩家今日仙缘币已达上限!todayXianyuanCoin=%s,playerXianyuanCoinUpper=%s"
+ # % (todayXianyuanCoin, playerXianyuanCoinUpper), playerID)
+ # return
- relationAdd = 0
- helpBattlePlayerDict = PyGameData.g_fbHelpBattlePlayerDict.get(playerID, {})
- for helpPlayerInfoDict in helpBattlePlayerDict.values():
- relation = helpPlayerInfoDict.get("Relation", 0)
- if not relation:
- continue
- relationAddList = relationCoinAddDict.get(str(relation), [])
- relationAdd += relationAddList[1] if len(relationAddList) == 2 else 0
-
- coinAdd = int((baseFBPoint + relationAdd) * addCoinRate / 10000.0)
+ 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
- GameWorld.DebugLog("挑战单人副本增加仙缘币: coinAdd=%s,canAddMax=%s,coinAddReal=%s" % (coinAdd, canAddMax, coinAddReal), playerID)
- addDataDict = {"MapID":mapID, "FuncLineID":lineID}
- PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_XianyuanCoin, coinAddReal, addDataDict=addDataDict)
- PlayerControl.AddTodayXianyuanCoin(curPlayer, coinAddReal)
+ 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 DoTeamFBAddXianyuanCoin(curPlayer, mapID, lineID, callPlayerID, callPlayerName, relation):
- ## 挑战组队副本增加仙缘币
- return
-
-
+def GetTeamFBMemRelationInfo(playerID):
+ if playerID not in PyGameData.g_teamFBMemRelationAddDict:
+ return 0, 0
+ return PyGameData.g_teamFBMemRelationAddDict[playerID][:2]
--
Gitblit v1.8.0