6459 【后端】【2.0】缥缈仙域开发单(退出跨服副本,未拾取的物品发送邮件)
| | |
| | | import PlayerControl
|
| | | import IPY_GameServer
|
| | | import CrossRealmPlayer
|
| | | import PlayerCompensation
|
| | | import GameWorldBoss
|
| | | import CrossRealmPK
|
| | | import PlayerQuery
|
| | |
| | | elif msgType == ShareDefine.CrossServerMsg_EnterFBRet:
|
| | | PlayerFB.CrossServerMsg_EnterFBRet(msgData, tick)
|
| | |
|
| | | elif msgType == ShareDefine.CrossServerMsg_SendMail:
|
| | | PlayerCompensation.CrossServerMsg_SendMail(msgData)
|
| | | |
| | | # 需要发送到地图服务器处理的
|
| | | elif msgType in [ShareDefine.CrossServerMsg_RebornRet, ShareDefine.CrossServerMsg_CollectNPCOK, ShareDefine.CrossServerMsg_FBEnd,
|
| | | ShareDefine.CrossServerMsg_NPCAttackCount]:
|
| | |
| | | content = "<MailTemplate>%s</MailTemplate>%s" % (mailTypeKey, json.dumps(paramList, ensure_ascii=False))
|
| | | return SendPersonalItemMailEx(title, content, 30, playerIDList, addItemList, gold, goldPaper, silver, detail, moneySource)
|
| | |
|
| | | def CrossServerMsg_SendMail(msgData):
|
| | | ## 收到跨服服务器同步的发送邮件
|
| | | mailTypeKey = msgData["MailTypeKey"]
|
| | | playerIDList = msgData["Player"]
|
| | | addItemList = msgData.get("Item", [])
|
| | | paramList = msgData.get("Param", [])
|
| | | SendMailByKey(mailTypeKey, playerIDList, addItemList, paramList)
|
| | | return
|
| | |
|
| | | # 此处货币playerIDList发放统一,如根据玩家不同而变,则应需修改
|
| | | ## 功能发放物品补偿/奖励邮件
|
| | | # @param addItemList [(itemID, itemCnt, 是否拍品), {或物品信息字典}, ...]
|
| | |
| | | CrossServerMsg_EnterFBRet = "EnterFBRet" # 请求进入跨服副本返回信息
|
| | | CrossServerMsg_FBEnd = "FBEnd" # 完成跨服副本
|
| | | CrossServerMsg_NPCAttackCount = "NPCAttackCount" # 攻击NPC次数记录
|
| | | CrossServerMsg_SendMail = "SendMail" # 发送邮件
|
| | |
|
| | | # 子服发送跨服信息定义
|
| | | ClientServerMsg_ServerInitOK = "ServerInitOK" # 子服启动成功
|
| | |
| | | import PlayerSuccess
|
| | | import ReadChConfig
|
| | | import ShareDefine
|
| | | import PyGameData
|
| | | import FBCommon
|
| | | import GameMap
|
| | | import GameObj
|
| | |
| | | GameWorld.Log("玩家进入跨服副本动态分配的线路: fbZoneID=%s,playerZoneID=%s,fbFuncLineID=%s,playerFuncLineID=%s"
|
| | | % (fbZoneID, playerZoneID, fbFuncLineID, playerFuncLineID), curPlayerID)
|
| | |
|
| | | gameWorld = GameWorld.GetGameWorld()
|
| | | copyMapID = gameWorld.GetCopyMapID()
|
| | | if copyMapID not in PyGameData.g_crossPlayerServerGroupIDInfo:
|
| | | PyGameData.g_crossPlayerServerGroupIDInfo[copyMapID] = {}
|
| | | playerServerGroupIDDict = PyGameData.g_crossPlayerServerGroupIDInfo[copyMapID]
|
| | | playerServerGroupIDDict[curPlayerID] = PlayerControl.GetPlayerServerGroupID(curPlayer)
|
| | | |
| | | # 自伸缩副本根据玩家进入开启,主动调用一次,避免间隔调用时机未触发导致逻辑错乱
|
| | | GameWorldProcess.EnterOpenFB(tick)
|
| | |
|
| | |
| | | import EventShell
|
| | | import FBLogic
|
| | | import FBCommon
|
| | | import ShareDefine
|
| | | import EventReport
|
| | | import ItemCommon
|
| | | import PyGameData
|
| | |
| | | gameFBMgr.SetIsSafeClose(0)
|
| | |
|
| | | lineID = gameWorld.GetLineID()
|
| | | copyMapID = gameWorld.GetCopyMapID()
|
| | | GameWorld.Log("FB Close! lineID = %s, openState = %s"%(lineID, gameWorld.GetOpenState()))
|
| | |
|
| | | gameWorld.SetOpenState(IPY_GameWorld.fbosClosed)
|
| | |
| | |
|
| | | #发送未拾取的物品给玩家
|
| | | if mapID in ChConfig.Def_SendUnPickItemMailMapIDList and unPickItemDict:
|
| | | isCrossServer = GameWorld.IsCrossServer()
|
| | | playerServerGroupIDDict = PyGameData.g_crossPlayerServerGroupIDInfo.get(copyMapID, {})
|
| | | for ownerID, mailItemList in unPickItemDict.items():
|
| | | GameWorld.Log("发送未拾取的物品给玩家: %s" % mailItemList, ownerID)
|
| | | PlayerControl.SendMailByKey("ItemNoPickUp", [ownerID], mailItemList, [gameWorld.GetMapID()])
|
| | | if isCrossServer:
|
| | | serverGroupID = playerServerGroupIDDict.get(ownerID, 0)
|
| | | PlayerControl.SendCrossMail(serverGroupID, "ItemNoPickUp", [ownerID], mailItemList, [gameWorld.GetMapID()])
|
| | | else:
|
| | | PlayerControl.SendMailByKey("ItemNoPickUp", [ownerID], mailItemList, [gameWorld.GetMapID()])
|
| | |
|
| | | playerManager = gameWorld.GetMapCopyPlayerManager()
|
| | |
|
| | |
| | | GameServer_DynamicLineMapStateChange(gameWorld, IPY_GameWorld.fbosClosed)
|
| | |
|
| | | gameWorld.SetPropertyID(0)
|
| | | PyGameData.g_crossPlayerServerGroupIDInfo.pop(copyMapID, None)
|
| | | return
|
| | |
|
| | | def GameServer_DynamicLineMapStateChange(gameWorld, state):
|
| | |
| | | SendMail("", content, 30, playerIDList, addItemList, gold, goldPaper, silver, detail, moneySource)
|
| | | return
|
| | |
|
| | | def SendCrossMail(serverGroupID, mailTypeKey, playerIDList, addItemList, paramList=[]):
|
| | | ## 发送跨服邮件
|
| | | if not serverGroupID:
|
| | | return
|
| | | dataMsg = {"MailTypeKey":mailTypeKey, "Player":playerIDList}
|
| | | if addItemList:
|
| | | dataMsg["Item"] = CombineMailItem(addItemList)
|
| | | if paramList:
|
| | | dataMsg["Param"] = paramList
|
| | | GameWorld.SendMsgToClientServer(ShareDefine.CrossServerMsg_SendMail, dataMsg, [serverGroupID])
|
| | | return
|
| | |
|
| | | ## 功能发放物品补偿/奖励邮件
|
| | | # @param addItemList [(itemID, itemCnt, 是否拍品), {或物品信息字典}, ...]
|
| | | # @return
|
| | |
| | | if GameWorld.IsCrossServer():
|
| | | return
|
| | |
|
| | | combineItemList = CombineMailItem(addItemList)
|
| | | cmdList = [title, content, getDays, playerIDList, combineItemList, gold, goldPaper, silver, detail, moneySource]
|
| | | GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "SendMail", '%s' % (cmdList), len(str(cmdList)))
|
| | | return True
|
| | |
|
| | | def CombineMailItem(addItemList):
|
| | | ## 合并邮件物品
|
| | | itemCountDict = {}
|
| | | combineItemList = [] # 合并后的物品列表
|
| | | for mailItem in addItemList:
|
| | |
| | | for key, itemCnt in itemCountDict.items():
|
| | | itemID, isAuctionItem = key
|
| | | combineItemList.append((itemID, itemCnt, isAuctionItem))
|
| | | cmdList = [title, content, getDays, playerIDList, combineItemList, gold, goldPaper, silver, detail, moneySource]
|
| | | GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "SendMail", '%s' % (cmdList), len(str(cmdList)))
|
| | | return True
|
| | | return combineItemList
|
| | |
|
| | | ## 构建系统提示参数列表
|
| | | # @param msgParamList 信息参数列表
|
| | |
| | | g_customFBPrizeInfo = {} #自定义副本奖励 {playerID:[mapID, funcLineID, [奖励物品列表], ...}
|
| | |
|
| | | g_crossFuncLineDataCache = {} # 动态分配的跨服虚拟分线数据缓存 {(mapID, copyMapID):funcLineDataCache, ...}
|
| | | g_fbBuyBuffTimeDict = {} # 副本购买buff时间缓存{playerID:{moneyCnt:time}} |
| | | g_crossPlayerServerGroupIDInfo = {} #跨服玩家服务器组ID缓存,副本线路关闭时才释放,所以支持离线跨服玩家 {copyMapID:{playerID:serverGroupID, ...}, ...}
|
| | | g_fbBuyBuffTimeDict = {} # 副本购买buff时间缓存{playerID:{moneyCnt:time}}
|
| | |
| | | CrossServerMsg_EnterFBRet = "EnterFBRet" # 请求进入跨服副本返回信息
|
| | | CrossServerMsg_FBEnd = "FBEnd" # 完成跨服副本
|
| | | CrossServerMsg_NPCAttackCount = "NPCAttackCount" # 攻击NPC次数记录
|
| | | CrossServerMsg_SendMail = "SendMail" # 发送邮件
|
| | |
|
| | | # 子服发送跨服信息定义
|
| | | ClientServerMsg_ServerInitOK = "ServerInitOK" # 子服启动成功
|