#!/usr/bin/python
# -*- coding: GBK -*-
#
#
##@package PlayerCompensation.py
#
# @todo:Óʼþ¹ÜÀí£¨²¹³¥£©
# 1. È«·þÓʼþÒ»¸öGUIDÒ»·âÓʼþ£¬ÓÐʱ¼äÏÞÖÆ£¬½ÓÊÕÓʼþµÄ³ÖÐøÊ±¼äºÍÑÓ³Ùɾ³ýʱ¼äµã(¿É½ÓÊÕºóµÄXÌìɾ³ýÓʼþ)
# ±íʾÈç¹ûÈ«·þÓʼþÒѾ֪ͨ¹ýij¸öÍæ¼Ò£¬ÄÇô¶ÔÓÚ¸ÃÍæ¼Ò£¬¼´Ê¹Óʼþ¹ýÆÚÍæ¼ÒûÓÐÖ÷¶¯É¾³ýÓʼþ£¬Ò²Ó¦¸Ã֪ͨ¸ÃÍæ¼Ò
# 2. ¸öÈËÓʼþÒ»¸öGUID¿ÉÒÔÊǸöÈË»òÕß¶àÈËÓʼþ£¬µ«ÊǶàÈËÓʼþ²»Ö§³ÖÅäÖÿÉÁìÈ¡µÄ³ÖÐøÊ±¼ä£¬ÈôÒªÖ§³ÖÐèÐÞ¸ÄÁìÈ¡¼Ç¼Âß¼
# 3. ¸öÈËÓʼþ°´ÀàÐÍ·Ö²»Í¬µÄ¿É±£´æÊýÁ¿£¬Íæ¼Ò²»¸ÐÖª
# 4. ¹ØÓÚÓʼþ·¢¼þÈË ±êÌâ ºÍ ÕýÎÄ£¬Èç¹ûÊÇÄ£°å»òÕß×éºÏÐÅÏ¢À࣬¶¼Ó¦¸ÃÓÉǰ¶Ë×éÖ¯Íê³É£¬ºó¶Ëֻȡģ°å±êʶ
# 5. ¿ÉÁìÈ¡¼´ÒÑ֪ͨ¹ýÍæ¼Ò¸Ã·âÓʼþ£¬ÐèÒªÔÚÓʼþ·¢ÉúʱºÍÉÏÏßʱÉèÖÃ״̬
#
# @author alee
# @date 2017-08-11 20:00
# @version 1.1
# @note:
# @change: "2018-08-10 12:00" hxp È«·þÓʼþÔö¼ÓÉý¼¶ºóÊÇ·ñ¿ÉÁìȡѡÏîÉèÖã¬Ôö¼ÓÓʼþ²éѯ¡¢Í¨¹ýÉóºË¡¢É¾³ý¹¦ÄÜ£»
#------------------------------------------------------------------------------
#"""Version = 2018-08-10 12:00"""
#------------------------------------------------------------------------------
import GameWorld
import ChConfig
import ShareDefine
import IPY_GameServer
import ChGameToMapPyPack
import NetPackCommon
import CommFunc
import ChPyNetSendPack
import PyGameDataStruct
import CrossRealmMsg
import DataRecordPack
import ReadChConfig
import PlayerDBOper
import EventReport
import IpyGameDataPY
import PlayerControl
import PyDataManager
import PyGameData
import datetime
import uuid
import math
import json
#Áìȡ״̬ ¸öλÊý±êʶ £¨¿ÉÁìÈ¡¼´ÒÑ֪ͨ¹ýÍæ¼Ò¸Ã·âÓʼþ£¬ÐèÒªÔÚÓʼþ·¢ÉúʱºÍÉÏÏßʱÉèÖÃ״̬
#0 δ֪ͨ£¬1 ²»¿ÉÁìÈ¡£¬ 2 ¿ÉÁìÈ¡£¬ 3 ÒÑÁìÈ¡£¬4 ÒÑɾ³ý
(
Unknown_State,
Disable_State,
Enable_State,
Yet_State,
Del_State
) = range(5)
CheckState_OK = 0 # ÒÑÉóºË
CheckState_No = 1 # δÉóºË
LimitLVType_Not = 0 # Éý¼¶Âú×ãÁìÈ¡µÈ¼¶ºó²»¿ÉÁì
LimitLVType_Can = 1 # Éý¼¶Âú×ãÁìÈ¡µÈ¼¶ºó¿ÉÁì
#Áìȡ״̬ ʮλÊý±êʶ
(
Read_State_No, # Óʼþδ¶Á
Read_State_Yes # ÓʼþÒѶÁ
) = range(2)
#Áìȡ״̬
(
Entire_CompensationType, #È«·þ
Personal_CompensationType, #¸öÈË
Unknow_CompensationType #δ֪
) = range(3)
Def_RequestState = "CompensationRequestState"
#==================================================================================================
class CrossPersonalCompensationManager(object):
## ¿ç·þÓʼþ¹ÜÀí£¬×¢Òâ¸ÃÀàÖ»´¦ÀíÊý¾ÝÂß¼£¬¹¦ÄÜÏà¹ØÂß¼²»ÒªÐ´ÔÚ¸ÃÀ࣬²»È»ÖضÁ½Å±¾²»»áÉúЧ
def __init__(self):
self.playerMailDict = {} # Íæ¼Ò²¹³¥Áбí {playerID:{GUID:tagDBCrossPersonalCompensation, ...}, ...}
return
# ±£´æÊý¾Ý ´æÊý¾Ý¿âºÍrealtimebackup
def GetSaveData(self):
savaData = ""
cntData = ""
cnt = 0
for mailDict in self.playerMailDict.values():
for mailObj in mailDict.values():
cnt += 1
savaData += mailObj.getBuffer()
GameWorld.Log("Save DBCrossPersonalCompensation count :%s, len=%s" % (cnt, len(savaData)))
return CommFunc.WriteDWORD(cntData, cnt) + savaData
# ´ÓÊý¾Ý¿âÔØÈëÊý¾Ý
def LoadPyGameData(self, datas, pos, dataslen):
cnt, pos = CommFunc.ReadDWORD(datas, pos)
GameWorld.Log("Load DBCrossPersonalCompensation count :%s" % cnt)
for _ in xrange(cnt):
mailObj = PyGameDataStruct.tagDBCrossPersonalCompensation()
mailObj.clear()
pos += mailObj.readData(datas, pos, dataslen)
playerID = mailObj.PlayerID
guid = mailObj.GUID
if playerID not in self.playerMailDict:
self.playerMailDict[playerID] = {}
mailDict = self.playerMailDict[playerID]
mailDict[guid] = mailObj
return pos
def Sync_CrossMailPlayerIDToClientServer(serverGroupID=0):
''' ͬ²½Óпç·þÓʼþµÄÍæ¼ÒIDµ½×Ó·þ
@param serverGroupID: Ϊ0ʱͬ²½ËùÓÐ×Ó·þ
'''
crossMailMgr = PyDataManager.GetCrossPersonalCompensationManager()
addMailPlayerIDList = crossMailMgr.playerMailDict.keys()
if not addMailPlayerIDList:
return
# ͬ²½×Ó·þÎñÆ÷
serverGroupIDList = [serverGroupID] if serverGroupID else []
dataMsg = {"IDType":"Add", "PlayerIDList":addMailPlayerIDList}
CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_MailPlayerIDList, dataMsg, serverGroupIDList)
return
def CrossServerMsg_MailPlayerIDList(dataMsg):
## ÊÕµ½¿ç·þ·þÎñÆ÷ͬ²½Óпç·þÓʼþµÄÍæ¼ÒIDÁбí
idType = dataMsg["IDType"]
playerIDList = dataMsg["PlayerIDList"]
for playerID in playerIDList:
if idType == "Del":
if playerID in PyGameData.g_crossMailPlayerDict:
PyGameData.g_crossMailPlayerDict.pop(playerID)
continue
if idType == "Add":
if playerID in PyGameData.g_crossMailPlayerDict:
continue
PyGameData.g_crossMailPlayerDict[playerID] = 0
player = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
if not player or not player.GetInitOK():
continue
RequestToGetCrossMail(player)
return
def RequestToGetCrossMail(curPlayer):
## ÇëÇóͬ²½¿ç·þÓʼþÄÚÈÝ
playerID = curPlayer.GetPlayerID()
if playerID not in PyGameData.g_crossMailPlayerDict:
return
lastTick = PyGameData.g_crossMailPlayerDict[playerID]
tick = GameWorld.GetGameWorld().GetTick()
if tick - lastTick <= 30000:
return
PyGameData.g_crossMailPlayerDict[playerID] = tick
dataMsg = {"CMD":"Get", "PlayerID":playerID}
CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_MailContent, dataMsg)
return
def ClientServerMsg_MailContent(serverGroupID, msgData, tick):
## ÊÕµ½×Ó·þÍæ¼ÒÇëÇóͬ²½¿ç·þÓʼþ
GameWorld.Log("ÊÕµ½×Ó·þÍæ¼Òͬ²½¸öÈËÓʼþÃüÁî: serverGroupID=%s, %s" % (serverGroupID, msgData))
reqCMD = msgData["CMD"]
playerID = msgData["PlayerID"]
guidList = msgData.get("GuidList", [])
crossMailMgr = PyDataManager.GetCrossPersonalCompensationManager()
if playerID not in crossMailMgr.playerMailDict:
return
playerMailDict = crossMailMgr.playerMailDict[playerID]
if reqCMD == "Get":
SyncTickAttrKey = "SyncTick"
getMailList = []
for guid, mailObj in playerMailDict.items():
if hasattr(mailObj, SyncTickAttrKey):
getTick = getattr(mailObj, SyncTickAttrKey)
if tick - getTick <= 30000:
GameWorld.DebugLog("¶Ìʱ¼äÄÚÖØ¸´ÇëÇóÁìÈ¡µÄÓʼþ²»Í¬²½£¬·ÀÖ¹ÖØ¸´·¢·Å! GUID=%s" % guid)
continue
setattr(mailObj, SyncTickAttrKey, tick)
crossMailDict = {"PlayerID":mailObj.PlayerID, "GUID":mailObj.GUID, "LimitTime":mailObj.LimitTime,
"Text":mailObj.Text, "ItemInfo":mailObj.ItemInfo, "Detail":mailObj.Detail,
"Gold":mailObj.Gold, "GoldPaper":mailObj.GoldPaper, "Silver":mailObj.Silver,
"MoneySource":mailObj.MoneySource
}
getMailList.append(crossMailDict)
if getMailList:
CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_MailContent, getMailList, [serverGroupID])
elif reqCMD == "GetOK":
for guid in guidList:
playerMailDict.pop(guid, None)
DataRecordPack.DR_GiveCompensationSuccess(playerID, guid)
if not playerMailDict:
crossMailMgr.playerMailDict.pop(playerID, None)
dataMsg = {"IDType":"Del", "PlayerIDList":[playerID]}
CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_MailPlayerIDList, dataMsg, [serverGroupID])
return
def CrossServerMsg_MailContent(getMailList):
## ÊÕµ½¿ç·þ·þÎñÆ÷ͬ²½µÄ´ý·¢ËÍÓʼþÄÚÈÝ
playerGetGUIDInfo = {}
for mailDict in getMailList:
GUID = mailDict.get("GUID", "")
playerID = mailDict.get("PlayerID", 0)
if not GUID or not playerID:
continue
GameWorld.Log("ÊÕµ½¿ç·þ¸öÈËÓʼþÄÚÈÝ£º%s" % mailDict, playerID)
addItemDictList = eval(mailDict.get("ItemInfo", "[]"))
LimitTime = mailDict.get("LimitTime", "")
Text = mailDict.get("Text", "")
gold = GameWorld.ToIntDef(mailDict.get("Gold"))
goldPaper = GameWorld.ToIntDef(mailDict.get("GoldPaper"))
silver = GameWorld.ToIntDef(mailDict.get("Silver"))
moneySource = GameWorld.ToIntDef(mailDict.get("MoneySource"), ChConfig.Def_GiveMoney_Mail)
detail = mailDict.get("Detail", "")
AddPersonalItem(GUID, addItemDictList, [playerID], LimitTime, Text, gold, goldPaper, silver, detail, moneySource)
if playerID not in playerGetGUIDInfo:
playerGetGUIDInfo[playerID] = []
guidList = playerGetGUIDInfo[playerID]
guidList.append(GUID)
for playerID, guidList in playerGetGUIDInfo.items():
dataMsg = {"CMD":"GetOK", "PlayerID":playerID, "GuidList":guidList}
CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_MailContent, dataMsg)
return
def __AddPlayerCrossMail(addItemDictList, PlayerIDList, LimitTime, Text, gold, goldPaper, silver, detail, moneySource):
## Ìí¼Ó¿ç·þÍæ¼Ò¸öÈ˲¹³¥Óʼþ
addMailPlayerIDList = []
crossMailMgr = PyDataManager.GetCrossPersonalCompensationManager()
for playerID in PlayerIDList:
GUID = str(uuid.uuid1()) # ÓÉÓÚ¿ç·þÓʼþÓÉÿ¸öÍæ¼Ò¶À×Ôͬ²½¸öÈËÓʼþ£¬ËùÒÔ²åÈëʱÿ¸öÈ˵ÄÓʼþµ¥¶ÀGUID£¬·ÀÖ¹ÅúÁ¿·¢ËÍͬÄÚÈÝÓʼþÊ±ÖØ¸´²åÈë½±ÀøÎïÆ·
mailObj = PyGameDataStruct.tagDBCrossPersonalCompensation()
mailObj.PlayerID = playerID
mailObj.GUID = GUID
mailObj.LimitTime = LimitTime
mailObj.Text = Text
mailObj.TextLen = len(mailObj.Text)
mailObj.Gold = gold
mailObj.GoldPaper = goldPaper
mailObj.Silver = silver
mailObj.ItemInfo = json.dumps(addItemDictList, ensure_ascii=False)
mailObj.ItemLen = len(mailObj.ItemInfo)
mailObj.Detail = detail
mailObj.DetailLen = len(mailObj.Detail)
mailObj.MoneySource = moneySource
if playerID not in crossMailMgr.playerMailDict:
crossMailMgr.playerMailDict[playerID] = {}
addMailPlayerIDList.append(playerID)
playerMailDict = crossMailMgr.playerMailDict[playerID]
playerMailDict[GUID] = mailObj
#Ìí¼ÓÁ÷Ïò
addDict = {"LimitTime":LimitTime, "Text":Text, "Gold":gold, "GoldPaper":goldPaper, "Silver":silver,
"ItemListLen":len(addItemDictList), "Detail":detail, "MoneySource":moneySource, "CrossMail":True}
DataRecordPack.DR_AddPersonalCompensation(PlayerIDList, GUID, addItemDictList, addDict)
if addMailPlayerIDList:
dataMsg = {"IDType":"Add", "PlayerIDList":addMailPlayerIDList}
CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_MailPlayerIDList, dataMsg)
return
#==================================================================================================
## ¸ù¾ÝÎïÆ·ÐÅÏ¢×ֵ䣬Éú³É²¹³¥ÎïÆ·ÊµÀý£¬ÓÃÓÚGM¹¤¾ßÌí¼Ó²¹³¥
# @param curItemDict
# @return IpyCompensationItem
def MakeCompensationItem(curItemDict):
if not __checkMailItemDict(curItemDict):
return
curItemData = IPY_GameServer.IpyCompensationItem()
#curItemData.GUID = curItemDict['GUID']
curItemData.ItemID = curItemDict['ItemID']
curItemData.Count = curItemDict['Count']
#curItemData.IsBind = curItemDict.get('IsBind',0)
curItemData.IsBind = curItemDict.get('IsAuctionItem',0)
curItemData.UserData = curItemDict.get('UserData', '')
return curItemData
# ´Ë´¦»õ±ÒplayerIDList·¢·Åͳһ£¬Èç¸ù¾ÝÍæ¼Ò²»Í¬¶ø±ä£¬ÔòÓ¦ÐèÐÞ¸Ä
## ¹¦ÄÜ·¢·ÅÎïÆ·²¹³¥/½±ÀøÓʼþ
# @param addItemList [(itemID, itemCnt, ÊÇ·ñÅÄÆ·), {»òÎïÆ·ÐÅÏ¢×Öµä}, ...]
# @return GUID
def SendPersonalItemMailEx(title, content, getDays, playerIDList, addItemList, gold = 0, goldPaper = 0, silver = 0,
detail="", moneySource=ChConfig.Def_GiveMoney_Mail, crossMail=False):
limitTime = str(GameWorld.GetDatetimeByDiffDays(getDays))
limitTime = limitTime.split(".")[0]
return SendPersonalItemMail(title, content, limitTime, playerIDList, addItemList, gold, goldPaper, silver, detail, moneySource, crossMail)
def SendPersonalItemMailBatch(batchMailInfoList):
## ÅúÁ¿·¢ËÍÓʼþ
mailTypeKey, batchPlayerIDList, batchAddItemList, batchParamList, batchGold, batchGoldPaper, batchSilver, batchDetail, moneySource, crossMail = batchMailInfoList
lenPlayerID = len(batchPlayerIDList)
lenItem = len(batchAddItemList)
lenParam = len(batchParamList)
lenGold = len(batchGold)
lenGoldPaper = len(batchGoldPaper)
lenSilver = len(batchSilver)
lenDetail = len(batchDetail)
title = ""
getDays = 30
limitTime = str(GameWorld.GetDatetimeByDiffDays(getDays))
limitTime = limitTime.split(".")[0]
for i, playerIDList in enumerate(batchPlayerIDList):
if not playerIDList:
continue
addItemList = batchAddItemList[i] if lenItem == lenPlayerID else []
paramList = batchParamList[i] if lenParam == lenPlayerID else []
gold = batchGold[i] if lenGold == lenPlayerID else 0
goldPaper = batchGoldPaper[i] if lenGoldPaper == lenPlayerID else 0
silver = batchSilver[i] if lenSilver == lenPlayerID else 0
detail = batchDetail[i] if lenDetail == lenPlayerID else ""
content = "%s%s" % (mailTypeKey, str(paramList))
SendPersonalItemMail(title, content, limitTime, playerIDList, addItemList, gold, goldPaper, silver, detail=detail, moneySource=moneySource, crossMail=crossMail)
return
def SendMailByKey(mailTypeKey, playerIDList, addItemList, paramList=[], gold=0, goldPaper=0, silver=0,
detail="", moneySource=ChConfig.Def_GiveMoney_Mail, crossMail=False):
if not mailTypeKey:
mailTypeKey = ShareDefine.DefaultLackSpaceMailType
GameWorld.DebugLog("SendMailByKey %s, playerIDList=%s, addItemList=%s, paramList=%s, gold=%s, goldPaper=%s, silver=%s, moneySource=%s"
% (mailTypeKey, playerIDList, addItemList, paramList, gold, goldPaper, silver, moneySource))
title = ""
content = "%s%s" % (mailTypeKey, json.dumps(paramList, ensure_ascii=False))
return SendPersonalItemMailEx(title, content, 30, playerIDList, addItemList, gold, goldPaper, silver, detail, moneySource, crossMail)
def CrossServerMsg_SendMail(msgData):
## ÊÕµ½¿ç·þ·þÎñÆ÷ͬ²½µÄ·¢ËÍÓʼþ
mailTypeKey = msgData["MailTypeKey"]
playerIDList = msgData["Player"]
addItemList = msgData.get("Item", [])
paramList = msgData.get("Param", [])
SendMailByKey(mailTypeKey, playerIDList, addItemList, paramList)
return
def __checkMailItemIDCount(itemID, itemCount, isAuctionItem):
## ¼ì²éÊÇ·ñºÏ·¨µÄÓʼþÎïÆ·ID Count Êý¾Ý
if not (isinstance(itemID, int) or isinstance(itemID, long)):
return
if not (isinstance(itemCount, int) or isinstance(itemCount, long)):
return
if not (isinstance(isAuctionItem, int) or isinstance(isAuctionItem, long) or isinstance(isAuctionItem, bool)):
return
if itemID > ShareDefine.Def_UpperLimit_DWord or itemCount > ShareDefine.Def_UpperLimit_DWord or isAuctionItem > 255:
return
return True
def __checkMailItemDict(curItemDict):
## ¼ì²éÊÇ·ñºÏ·¨µÄÓʼþÎïÆ·dictÐÅÏ¢ {"ItemID":xxx, "Count":xxx, "IsAuctionItem":xxx}
if not isinstance(curItemDict, dict):
return
if "ItemID" not in curItemDict or "Count" not in curItemDict:
return
itemID = curItemDict["ItemID"]
itemCount = curItemDict["Count"]
isAuctionItem = curItemDict.get("IsAuctionItem", 0)
if not __checkMailItemIDCount(itemID, itemCount, isAuctionItem):
return
return curItemDict
def __checkMailItemList(addItemList):
## ¼ì²éÊÇ·ñºÏ·¨µÄÓʼþÎïÆ·Áбí
addItemDictList = []
for itemInfo in addItemList:
if isinstance(itemInfo, dict):
if not __checkMailItemDict(itemInfo):
return False, []
addItemDictList.append(itemInfo)
continue
if (isinstance(itemInfo, list) or isinstance(itemInfo, tuple)) and (len(itemInfo) == 3 or len(itemInfo) == 2):
itemID, itemCount = itemInfo[:2]
isAuctionItem = itemInfo[2] if len(itemInfo) > 2 else 0
if not __checkMailItemIDCount(itemID, itemCount, isAuctionItem):
return False, []
addItemDict = {}
addItemDict['ItemID'] = itemID
addItemDict['Count'] = itemCount
addItemDict['IsAuctionItem'] = isAuctionItem
addItemDictList.append(addItemDict)
else:
return False, []
return True, addItemDictList
# ´Ë´¦»õ±ÒplayerIDList·¢·Åͳһ£¬Èç¸ù¾ÝÍæ¼Ò²»Í¬¶ø±ä£¬ÔòÓ¦ÐèÐÞ¸Ä
## ¹¦ÄÜ·¢·ÅÎïÆ·²¹³¥/½±ÀøÓʼþ
# @param addItemList [(itemID, itemCnt, ÊÇ·ñÅÄÆ·), {»òÎïÆ·ÐÅÏ¢×Öµä}, ...]
# @return GUID
# @remarks addItemListÖ§³Öappend×Öµä
def SendPersonalItemMail(title, content, limitTime, playerIDList, addItemList, gold = 0, goldPaper = 0, silver = 0,
detail="", moneySource=ChConfig.Def_GiveMoney_Mail, crossMail=False, mailType=0):
if not playerIDList:
return ""
#if not addItemList:
# return ""
curServerTime = GameWorld.GetCurrentDataTimeStr()
# µ±Ç°Ê±¼äÒѾ³¬¹ýÁìȡʱ¼ä
if not curServerTime or curServerTime >= limitTime:
GameWorld.DebugLog("¹¦ÄÜ·¢·ÅÎïÆ·²¹³¥/½±ÀøÓʼþ£¬Áìȡʱ¼äÒѳ¬Ê±£¬Ä¬Èϲ»Ìí¼Ó£¡LimitTime=%s" % limitTime)
return ""
isOK, addItemDictList = __checkMailItemList(addItemList)
if not isOK:
GameWorld.ErrLog("·¢Ë͸öÈËÓʼþ´íÎó: title=%s,content=%s,playerIDList=%s,addItemList=%s,gold=%s,goldPaper=%s,silver=%s,detail=%s,moneySource=%s,crossMail=%s"
% (title, content, playerIDList, addItemList, gold, goldPaper, silver, detail, moneySource, crossMail))
return
gold = min(gold, ShareDefine.Def_UpperLimit_DWord)
goldPaper = min(goldPaper, ShareDefine.Def_UpperLimit_DWord)
silver = min(silver, ShareDefine.Def_UpperLimit_DWord)
perMailItemCnt = IpyGameDataPY.GetFuncCfg("MailMaxItemCnt")
mailCnt = max(1, int(math.ceil(len(addItemDictList)/float(perMailItemCnt)))) # Ò»·âÓʼþ×î¶à5¸öÎïÆ·
for i in xrange(mailCnt):
if i != 0:
gold, goldPaper, silver = 0, 0, 0 # ²ð·Öºó·ÇµÚÒ»·âµÄÓʼþ»õ±Ò¹éÁ㣬·ÀÖ¹ÖØ¸´¸ø»õ±Ò½±Àø
startIndex = i*perMailItemCnt
GUID = str(uuid.uuid1())
AddPersonalItem(GUID, addItemDictList[startIndex:startIndex + perMailItemCnt], playerIDList,
limitTime, GetMailText(title, content, mailType),
gold, goldPaper, silver, detail, moneySource, crossMail)
return GUID
## ·¢ËÍ´¿ÎÄ×Ö¸öÈ˲¹³¥
# @param limitTime ¿ÉÒÔ´«¿Õ
# @return None
def SendPersonalAsTextMail(PlayerID, title, content, limitTime, mailType=0):
if GameWorld.IsCrossServer():
return
GUID = str(uuid.uuid1())
PyAddPersonalCompensation(GUID, PlayerID, GameWorld.GetCurrentDataTimeStr(), limitTime,
GetMailText(title, content, mailType))
return
def GetMailText(title, content, mailType=0, sender=ChConfig.Def_Mail_SenderSys):
## »ñÈ¡Óʼþ×Ö¶Î Text ÄÚÈÝ
return "%s<$_$>%s<$_$>%s<$_$>%s" % (sender, title, content, mailType)
def GetEntireCompensationInfo(checkState, limitLVType, limitLV):
return checkState * 1000000 + limitLVType * 100000 + limitLV
def ParseEntireCompensationInfo(mailInfo):
limitLV = mailInfo % 100000
checkState = mailInfo / 1000000
limitLVType = (mailInfo - checkState * 1000000) / 100000
return checkState, limitLVType, limitLV
def QueryCompensationPersonalInfo(playerID):
'''¸öÈ˲¹³¥Óʼþ²éѯ
'''
retList = []
compensationMgr = GameWorld.GetCompensationMgr()
tempSign = ""
tempSignEnd = ""
curPersonalCount = compensationMgr.GetPersonalCompensationCount(playerID)
GameWorld.DebugLog("QueryCompensationPersonalInfo %s" % curPersonalCount)
for i in xrange(curPersonalCount):
compensation = compensationMgr.PersonalCompensationAt(playerID, i)
contentList = compensation.Text.split("<$_$>")
if len(contentList) < 3:
continue
sender, title, content = contentList[:3]
mailType = GameWorld.ToIntDef(contentList[3]) if len(contentList) > 3 else 0
if tempSign in content and tempSignEnd in content:
title = content[content.index(tempSign) + len(tempSign):content.index(tempSignEnd)]
content = ""
GUID = compensation.GUID
itemList = []
curGUIDItemCount = compensationMgr.FindItemCount(GUID)
for i in xrange(curGUIDItemCount):
curItem = compensationMgr.FindItemAt(GUID, i)
itemID = curItem.ItemID
if not itemID:
continue
itemList.append([itemID, curItem.Count, curItem.IsBind, curItem.UserData])
recState = compensationMgr.FindPlayerRecState(playerID, GUID)
infoDict = {"GUID":GUID, "Gold":compensation.Gold, "GoldPaper":compensation.GoldPaper, "Silver":compensation.Silver,
"Sender":sender, "Title":title, "Content":content, "RecState":recState, "MailType":mailType,
"CreateTime":compensation.CreateTime, "LimitTime":compensation.LimitTime, "ItemList":itemList}
retList.append(infoDict)
return retList
def QueryCompensationInfo(fromDate, toDate, guid, searchTitle, searchContent, searchState=None, maxCount=10):
'''È«·þ²¹³¥Óʼþ²éѯ
'''
compensationMgr = GameWorld.GetCompensationMgr()
retList = []
if guid:
infoDict = __GetQueryCompensationInfoDict(compensationMgr, compensationMgr.FindEntireCompensation(guid), "", "", searchTitle, searchContent, searchState)
if infoDict:
retList.append(infoDict)
return retList
if fromDate:
fromDate = "%s 00:00:00" % fromDate
if toDate:
toDate = "%s 23:59:59" % toDate
entireCnt = compensationMgr.GetEntireCompensationCount()
for i in xrange(entireCnt):
compensation = compensationMgr.AtEntireCompensation(i)
infoDict = __GetQueryCompensationInfoDict(compensationMgr, compensation, fromDate, toDate, searchTitle, searchContent, searchState)
if not infoDict:
continue
retList.append(infoDict)
if len(retList) >= maxCount:
break
return retList
def __GetQueryCompensationInfoDict(compensationMgr, compensation, fromDate, toDate, searchTitle, searchContent, searchState):
if not compensation or not compensation.GUID:
return
if fromDate and compensation.CreateTime < fromDate:
return
if toDate and compensation.CreateTime > toDate:
return
contentList = compensation.Text.split("<$_$>")
if len(contentList) < 3:
return
sender, title, content = contentList[:3]
mailType = GameWorld.ToIntDef(contentList[3]) if len(contentList) > 3 else 0
if searchTitle and searchTitle not in title:
return
if searchContent and searchContent not in content:
return
checkState, limitLVType, limitLV = ParseEntireCompensationInfo(compensation.PlayerLV)
if searchState != None and searchState != checkState:
return
GUID = compensation.GUID
itemList = []
curGUIDItemCount = compensationMgr.FindItemCount(GUID)
for i in xrange(curGUIDItemCount):
curItem = GameWorld.GetCompensationMgr().FindItemAt(GUID, i)
itemID = curItem.ItemID
if not itemID:
continue
itemList.append([itemID, curItem.Count, curItem.IsBind, curItem.UserData])
compensationDict = {"GUID":GUID, "CheckState":checkState, "LimitLVType":limitLVType, "LimitLV":limitLV, "MailType":mailType,
"Gold":compensation.Gold, "GoldPaper":compensation.GoldPaper, "Silver":compensation.Silver,
"PlayerJob":compensation.PlayerJob, "Sender":sender, "Title":title, "Content":content, "OnlyServerID":compensation.ServerID,
"CreateTime":compensation.CreateTime, "LimitTime":compensation.LimitTime, "ItemList":itemList}
return compensationDict
def EntireCompensationOper(operGUIDList, operation):
'''È«·þÓʼþ²Ù×÷¹ÜÀí
@param operGUIDList: ´ý²Ù×÷µÄÓʼþGUIDÁбí
@param operation: 1-ͨ¹ý£»2-ɾ³ý
'''
okGUIDList = []
successGUIDList = []
compensationMgr = GameWorld.GetCompensationMgr()
for GUID in operGUIDList:
compensation = compensationMgr.FindEntireCompensation(GUID)
if not compensation or compensation.GUID != GUID:
continue
# ɾ³ý
if operation == 2:
compensationMgr.DeleteEntireCompensation(GUID)
compensationMgr.DeleteCompensationItem(GUID)
compensationMgr.DeleteRecByGUID(GUID)
GameWorld.Log("ɾ³ýÈ«·þÓʼþ: GUID=%s" % GUID)
DataRecordPack.DR_EntireCompensation(GUID, "Delete")
# ͨ¹ý
elif operation == 1:
mailInfo = compensation.PlayerLV
checkState, limitLVType, limitLV = ParseEntireCompensationInfo(mailInfo)
updMailInfo = GetEntireCompensationInfo(CheckState_OK, limitLVType, limitLV)
compensationMgr.SetEntireCompensationPlayerLV(GUID, updMailInfo)
GameWorld.Log("È«·þÓʼþÉóºËͨ¹ý: GUID=%s,mailInfo=%s,checkState=%s,updMailInfo=%s"
% (GUID, mailInfo, checkState, updMailInfo))
if checkState != CheckState_OK:
okGUIDList.append(GUID)
DataRecordPack.DR_EntireCompensation(GUID, "CheckOK")
else:
continue
successGUIDList.append(GUID)
playerManager = GameWorld.GetPlayerManager()
for i in xrange(playerManager.GetActivePlayerCount()):
player = playerManager.GetActivePlayerAt(i)
if player == None or not player.GetInitOK() or PlayerControl.GetIsTJG(player):
continue
#¹ã²¥ÔÚÏßÍæ¼Ò
notifyList = []
for GUID in okGUIDList:
compensationType, curEntireRequire = CheckRequestCompensation(player, GUID, False)
if compensationType == Unknow_CompensationType:
continue
Text, gold, goldPaper, silver = curEntireRequire.Text, curEntireRequire.Gold, curEntireRequire.GoldPaper, curEntireRequire.Silver
createTime = curEntireRequire.CreateTime
notifyList.append((GUID, Text, createTime, gold, goldPaper, silver))
#GameWorld.DebugLog("¹ã²¥ÔÚÏßÍæ¼ÒÈ«·þÓʼþ: %s" % str(notifyList), player.GetPlayerID())
if notifyList:
SyncQueryCompensationResult(player, notifyList)
return successGUIDList
def SendEntireMail(mailTypeKey, getDays, limitLV, limitLVType, addItemList=[], paramList=[], \
gold=0, goldPaper=0, silver=0, detail="", moneySource=ChConfig.Def_GiveMoney_Mail, GUID="", mailType=0):
''' ·¢ËÍÈ«·þÓʼþ
@param mailTypeKey: ÓʼþÄ£°åkey
@param getDays: ÓÐЧÌìÊý
@param limitLV: ÁìÈ¡×îµÍµÈ¼¶ÏÞÖÆ
@param limitLVType: µÈ¼¶²»×ãµÄÉý¼¶ºóÊÇ·ñ¿ÉÁì 0-²»¿É£¬1-¿ÉÒÔ
'''
if not mailTypeKey or getDays <= 0:
return
isOK, addItemDictList = __checkMailItemList(addItemList)
if not isOK:
GameWorld.ErrLog("·¢ËÍÈ«·þÓʼþ´íÎó: mailTypeKey=%s,addItemList=%s,paramList=%s,gold=%s,goldPaper=%s,silver=%s,detail=%s,moneySource=%s"
% (mailTypeKey, addItemList, paramList, gold, goldPaper, silver, detail, moneySource))
return
gold = min(gold, ShareDefine.Def_UpperLimit_DWord)
goldPaper = min(goldPaper, ShareDefine.Def_UpperLimit_DWord)
silver = min(silver, ShareDefine.Def_UpperLimit_DWord)
if not GUID:
GUID = str(uuid.uuid1())
limitTime = str(GameWorld.GetDatetimeByDiffDays(getDays))
limitTime = limitTime.split(".")[0]
sender = ChConfig.Def_Mail_SenderSys
title = ""
content = "%s%s" % (mailTypeKey, json.dumps(paramList, ensure_ascii=False))
checkState = 0 # ÓʼþÉóºË״̬£¬Îª¼æÈÝÀÏÓʼþ£¬Ä¬ÈÏ0-ÒÑÉóºË£¬1-δÉóºË
mailInfo = GetEntireCompensationInfo(checkState, limitLVType, limitLV)
PlayerJob = 127 # ĬÈÏȫְҵ¿ÉÁì
serverID = 0 # ĬÈÏËùÓзþÎñÆ÷ID
AddEntireItem(GUID, addItemDictList, limitTime, mailInfo, PlayerJob, GetMailText(title, content, mailType, sender),
gold, goldPaper, silver, detail, serverID)
return
## Ìí¼ÓÈ«·þ²¹³¥
# @param addItemDictList, LimitTime, mailInfo, PlayerJob, Text
# @return None
def AddEntireItem(GUID, addItemDictList, LimitTime, mailInfo, PlayerJob, Text,
gold = 0, goldPaper = 0, silver = 0, detail="", serverID=0):
'''
@param mailInfo: GetEntireCompensationInfo µÄ·µ»ØÖµ, ĿǰÔÝ´æ×Ö¶Î PlayerLV ÖÐ
'''
if GameWorld.IsCrossServer():
return
#GameWorld.DebugLog("Compensation### AddEntireItem GUID:%s ItemDict:\n%s "%(GUID, addItemDictList))
#Ìí¼Ó²¹³¥°üµÄËùÓÐÎïÆ·
for addItemDict in addItemDictList:
curItemData = MakeCompensationItem(addItemDict)
if not curItemData:
return
GameWorld.GetCompensationMgr().AddCompensationItem(GUID, curItemData)
createTime = GameWorld.GetCurrentDataTimeStr()
#Ìí¼ÓÈ«·þÁìÈ¡²¹³¥Ìõ¼þ
gold = min(gold, ShareDefine.Def_UpperLimit_DWord)
goldPaper = min(goldPaper, ShareDefine.Def_UpperLimit_DWord)
silver = min(silver, ShareDefine.Def_UpperLimit_DWord)
GameWorld.GetCompensationMgr().AddEntireCompensationItem(GUID, createTime, LimitTime, mailInfo,
PlayerJob, Text, gold, goldPaper, silver, serverID)
checkState, limitLVType, limitLV = ParseEntireCompensationInfo(mailInfo)
addDict = {"LimitTime":LimitTime, "LimitLV":limitLV, "LimitLVType":limitLVType, "CheckState":checkState, "PlayerJob":PlayerJob, "Text":Text,
"Gold":gold, "GoldPaper":goldPaper, "Silver":silver, "ItemList":addItemDictList, "Detail":detail}
#Ìí¼ÓÁ÷Ïò
eventName = "Add" if checkState == CheckState_OK else "AddToCheck"
DataRecordPack.DR_EntireCompensation(GUID, eventName, addDict)
__WriteSendMailOKEvent(GUID, addItemDictList, LimitTime, Text, None, mailInfo, PlayerJob)
testAccIDList = ReadChConfig.GetEvalChConfig("TestAccID")
playerManager = GameWorld.GetPlayerManager()
for i in xrange(playerManager.GetActivePlayerCount()):
player = playerManager.GetActivePlayerAt(i)
if player == None or not player.GetInitOK() or PlayerControl.GetIsTJG(player):
continue
if checkState == CheckState_No:
playerAccID = GameWorld.GetPlatformAccID(player.GetAccID())
if playerAccID not in testAccIDList:
continue
#¹ã²¥ÔÚÏßÍæ¼Ò
compensationType, curEntireRequire = CheckRequestCompensation(player, GUID, False)
if compensationType == Unknow_CompensationType:
continue
Text, gold, goldPaper, silver = curEntireRequire.Text, curEntireRequire.Gold, curEntireRequire.GoldPaper, curEntireRequire.Silver
#GameWorld.Log("#¹ã²¥ÔÚÏßÍæ¼Ò%s"%player.GetPlayerID())
SyncQueryCompensationResult(player, [(GUID, Text, createTime, gold, goldPaper, silver)])
return
# ¼ì²éÓʼþÊÇ·ñÒÑ´ïµ½±£´æÉÏÏÞ£¬È糬¹ýÔòÏÈɾ³ý¾ÉÓʼþ
# @param LimitTime ²ÎÊý¿É´«¿Õ£¬¸öÈËÓʼþ²»ÏÞÖÆÁìÈ¡ÆÚÏÞ£¬Ö»ÏÞÖÆ±£´æÊýÁ¿£¬
def PyAddPersonalCompensation(GUID, PlayerID, CreateTime, LimitTime, Text, gold = 0, goldPaper = 0, silver = 0, moneySource=ChConfig.Def_GiveMoney_Mail):
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(PlayerID)
totalCount = GameWorld.GetCompensationMgr().GetPersonalCompensationCount(PlayerID)
#´ýÖ§³Öpy¶Á±í
maxMailCount = IpyGameDataPY.GetFuncCfg("MailDefaultCount")
delCount = totalCount - maxMailCount + 1
GameWorld.DebugLog("ÐÂÔö¸öÈËÓʼþ: totalCount=%s,maxMailCount=%s" % (totalCount, maxMailCount), PlayerID)
if delCount > 0:
GameWorld.Log("¸öÈËÓʼþ´ïµ½ÉÏÏÞ£¬ÐèҪɾ³ý£¡delCount=%s" % (delCount), PlayerID)
delGUIDList = GetPlayerDelMailGUIDList(PlayerID)
#ÏÈÈ¡µÃҪɾ³ýµÄGUID
delGUIDs = []
for _ in xrange(delCount):
if not delGUIDList:
break
delGUID = delGUIDList.pop(0)
curIpyPersonalData = GameWorld.GetCompensationMgr().FindPersonalCompensation(PlayerID, delGUID)
if curIpyPersonalData.GUID == delGUID:
delGUIDs.append(curIpyPersonalData.GUID)
for guid in delGUIDs:
ClearPersonalCompensation(PlayerID, guid, "MaxCountLimiit")
GameWorld.Log(" DeletePersonalCompensation GUID = %s" % guid, PlayerID)
if curPlayer:
NotifyCompensationResult(curPlayer, guid, 1)
#δ²¹Á÷Ïò
#´Ë´¦Ã»ÓÐÏ·¢Í¨Öª
mailType = moneySource - ChConfig.Def_GiveMoney_Unknown # typeÀàÐÍΪbyte£¬´æÖµÊ±ÐèÒª´¦ÀíÏÂ
gold = min(gold, ShareDefine.Def_UpperLimit_DWord)
goldPaper = min(goldPaper, ShareDefine.Def_UpperLimit_DWord)
silver = min(silver, ShareDefine.Def_UpperLimit_DWord)
GameWorld.GetCompensationMgr().AddPersonalCompensation(GUID, PlayerID, CreateTime,
LimitTime, Text, mailType, gold, goldPaper, silver)
if PlayerID in PyGameData.g_playerDelMailGUIDDict:
guidList = PyGameData.g_playerDelMailGUIDDict[PlayerID]
guidList.append(GUID)
return
def GetPlayerDelMailGUIDList(playerID):
## »ñÈ¡´ýɾ³ýµÄ¸öÈËÓʼþGUIDÁбí
if playerID not in PyGameData.g_playerDelMailGUIDDict:
timeGUIDList = []
curPersonalCount = GameWorld.GetCompensationMgr().GetPersonalCompensationCount(playerID)
for i in xrange(curPersonalCount):
curMail = GameWorld.GetCompensationMgr().PersonalCompensationAt(playerID, i)
timeGUIDList.append([curMail.CreateTime, curMail.GUID])
timeGUIDList.sort() # °´´´½¨Ê±¼äÉýÐòÅÅÐò
delGUIDList = []
for _, guid in timeGUIDList:
if guid not in delGUIDList:
delGUIDList.append(guid)
PyGameData.g_playerDelMailGUIDDict[playerID] = delGUIDList
return PyGameData.g_playerDelMailGUIDDict[playerID]
# ´Ë´¦»õ±ÒplayerIDList·¢·Åͳһ£¬Èç¸ù¾ÝÍæ¼Ò²»Í¬¶ø±ä£¬ÔòÓ¦ÐèÐÞ¸Ä
## Ìí¼Ó¸öÈ˲¹³¥
# @param addItemDict, PlayerIDList, LimitTime, Text
# @return None
def AddPersonalItem(GUID, addItemDictList, PlayerIDList, LimitTime, Text, gold = 0, goldPaper = 0, silver = 0,
detail="", moneySource=ChConfig.Def_GiveMoney_Mail, crossMail=False):
if GameWorld.IsCrossServer():
if crossMail:
__AddPlayerCrossMail(addItemDictList, PlayerIDList, LimitTime, Text, gold, goldPaper, silver, detail, moneySource)
return
GameWorld.DebugLog("Compensation### AddPersonalItem GUID:%s ItemDict:\n%s "%(GUID, addItemDictList))
#Ìí¼Ó²¹³¥°üµÄËùÓÐÎïÆ·
for addItemDict in addItemDictList:
curItemData = MakeCompensationItem(addItemDict)
if not curItemData:
return
GameWorld.GetCompensationMgr().AddCompensationItem(GUID, curItemData)
#offlinePlayerIDList = []
onlinePlayerInfo = {}
#ÅúÁ¿Ìí¼ÓÍæ¼Ò¸öÈ˲¹³¥ÁìÈ¡±í
createTime = GameWorld.GetCurrentDataTimeStr()
for PlayerID in PlayerIDList:
PyAddPersonalCompensation(GUID, PlayerID, createTime, LimitTime, Text, gold, goldPaper, silver, moneySource)
# Õë¶Ô¸öÈ˲¹³¥£¬Èç¹ûÊÇÔÚÏßÍæ¼Ò£¬ÔòÁ¢¼´ÍÆË͸ø¿Í»§¶Ë
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(PlayerID)
if curPlayer:
SyncQueryCompensationResult(curPlayer, [(GUID, Text, createTime, gold, goldPaper, silver)])
onlinePlayerInfo[curPlayer.GetAccID()] = [curPlayer.GetName(), curPlayer.GetLV()]
#===========================================================================
# else:
# offlinePlayerIDList.append(PlayerID)
#
# if offlinePlayerIDList:
# PlayerDBOper.FindDBOper(PlayerDBOper.Table_DBPlayer, {"PlayerID":{"$in":offlinePlayerIDList}},
# {"PlayerID":1, "AccID":1, "PlayerName":1, "LV":1, "_id":0},
# FindDBResult_SendMail, [GUID, addItemDictList, createTime, Text])
# if onlinePlayerInfo:
# __WriteSendMailOKEvent(GUID, addItemDictList, createTime, Text, onlinePlayerInfo)
#===========================================================================
#Ìí¼ÓÁ÷Ïò
addDict = {"LimitTime":LimitTime, "Text":Text, "Gold":gold, "GoldPaper":goldPaper, "Silver":silver,
"ItemListLen":len(addItemDictList), "Detail":detail, "MoneySource":moneySource}
DataRecordPack.DR_AddPersonalCompensation(PlayerIDList, GUID, addItemDictList, addDict)
return
def FindDBResult_SendMail(resultSetList, extendValueList):
if not resultSetList:
return
playerInfoDict = {}
GUID, addItemDictList, LimitTime, Text = extendValueList
GameWorld.Log("ÓʼþÀëÏßÍæ¼ÒDBÐÅÏ¢: GUID=%s, %s" % (GUID, str(resultSetList)))
for resultDict in resultSetList:
playerInfoDict[resultDict["AccID"]] = [resultDict["PlayerName"], resultDict["LV"]]
__WriteSendMailOKEvent(GUID, addItemDictList, LimitTime, Text, playerInfoDict)
return
## ֪ͨµØÍ¼Óʼþ·¢ËÍOK
def __WriteSendMailOKEvent(GUID, addItemDictList, LimitTime, Text, playerInfoDict={}, playerLV=0, playerJob=0):
#===============================================================================
# eventName = "SendMail"
# #%s<$_$>%s
# sender, title, content = Text.split("<$_$>")
#
# #Ä£°å±àºÅ[%s,%s]
# if "" in content:
# mailContentList = content.split("")
# mailTemplateNO = GameWorld.ToIntDef(mailContentList[0][14:], None)
# EventMailInfo = ReadChConfig.GetEvalChConfig("EventMailInfo")
# if mailTemplateNO not in EventMailInfo:
# return
# title, content = EventMailInfo[mailTemplateNO]
#
# mailParamStr = mailContentList[1]
# mailParamStr = mailParamStr.replace(" ", "")
# if mailParamStr.startswith("[") and mailParamStr.endswith("]") and len(mailParamStr) > 2:
# content = content % tuple(eval(mailParamStr))
#
# itemInfo = "ÎïÆ·:"
# for addItemDict in addItemDictList:
# itemName = "%s" % addItemDict['ItemID']
# if addItemDict.get('IsBind',0):
# itemName += "(°ó)"
# itemInfo += " %s*%s" % (itemName, addItemDict['Count'])
#
# # È«·þ
# if not playerInfoDict:
# comments = "%s: %s ÓÐЧÆÚ:%s, ÏÞÖÆµÈ¼¶:%s,Ö°Òµ:%s; %s; %s" % (title, GUID, LimitTime, playerLV, playerJob, itemInfo, content)
# customEvent = EventReport.custom_events()
# customEvent.account_id = "ServerAccount"
# customEvent.event_name = eventName
# customEvent.session_id = "ServerSession"
# customEvent.account_name = customEvent.account_id
# customEvent.comments = CommFunc.GetStrCutoff(comments, 255)
# EventReport.WriteEvent(customEvent)
# else:
# comments = "%s: %s ÓÐЧÆÚ:%s, %s; %s" % (title, GUID, LimitTime, itemInfo, content)
# comments = CommFunc.GetStrCutoff(comments, 255)
# for accID, playerInfo in playerInfoDict.items():
# playerName, playerLV = playerInfo
# customEvent = EventReport.custom_events()
# customEvent.SetEventAgentInfo(GameWorld.GetPlayerPlatform(accID))
# customEvent.account_id = GameWorld.GetPlatformAccID(accID)
# customEvent.event_name = eventName
# customEvent.session_id = "GameServerPlayerSession"
#
# customEvent.account_name = customEvent.account_id
# customEvent.chr_name = playerName
# customEvent.comments = comments
# EventReport.WriteEvent(customEvent)
#===============================================================================
return
##A9 A1 ²éÑ¯Íæ¼Ò²¹³¥#tagCGQueryCompensation
# @param index, clientData, tick
# @return None
def OnQueryPlayerCompensation(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
NotifyPlayerCompensation(curPlayer)
# ÌáÈ¡½ÓÊÕÓʼþÏ·¢
def NotifyPlayerCompensation(curPlayer):
RequestToGetCrossMail(curPlayer)
notifyList = SeekPlayerCompensation(curPlayer)
SyncQueryCompensationResult(curPlayer, notifyList)
return
# ɾ³ý¸öÈËÓʼþ±í ״̬±í£¬Í¬Ò»¸öGUID ¿ÉÒÔ¶àÈËÁìÈ¡£¬²»ÄÜͬʱɾ³ýÎïÆ·
def ClearPersonalCompensation(curPlayerID, curGUID, eventName=""):
GameWorld.GetCompensationMgr().DeletePersonalCompensation(curPlayerID, curGUID)
GameWorld.GetCompensationMgr().DeletePlayerCompensationRec(curPlayerID, curGUID)
#´æÔÚ¶àÈËÓʼþµÄÇé¿ö£¬¹Êɾ³ýÎïÆ·Ðè¼ì²éÊÇ·ñ×îºóÒ»¸öÁìÈ¡Õ߲ſÉɾ³ý
if GameWorld.GetCompensationMgr().GetPersonalCountByGUID(curGUID) == 0:
GameWorld.GetCompensationMgr().DeleteCompensationItem(curGUID)
if curPlayerID in PyGameData.g_playerDelMailGUIDDict:
guidList = PyGameData.g_playerDelMailGUIDDict[curPlayerID]
if curGUID in guidList:
guidList.remove(curGUID)
if eventName:
# ÓÐÌØÊâ²Ù×÷ɾ³ýµÄ²Å¼Ç¼£¬³£¹æÁìȡɾ³ýµÄĬÈÏÎÞeventName£¬²»¼Ç¼
DataRecordPack.DR_DelPersonalCompensation(curPlayerID, curGUID, eventName)
return
# ÉèÖÃÁìȡ״̬
def SetPrizeState(curPlayerID, GUID, prizeState, readState):
state = readState*10 + prizeState
GameWorld.GetCompensationMgr().AddPlayerRec(curPlayerID, GUID, state)
return
def GetPrizeGetState(curPlayerID, GUID):
## »ñÈ¡Áìȡ״̬
return GameWorld.GetCompensationMgr().FindPlayerRecState(curPlayerID, GUID) % 10
##²éÕÒÍæ¼Ò¿ÉÁìÈ¡µÄ²¹³¥Áбí
# @param curPlayer
# @return None
def SeekPlayerCompensation(curPlayer):
curPlayerID = curPlayer.GetID()
curTime = datetime.datetime.today()
allList = [] #²¹³¥ÎïÆ·±í [(GUID,TEXT),(GUID,TEXT),...]
#¸öÈ˲¹³¥
curPersonalCount = GameWorld.GetCompensationMgr().GetPersonalCompensationCount(curPlayerID)
for i in xrange(curPersonalCount):
curIpyPersonalData = GameWorld.GetCompensationMgr().PersonalCompensationAt(curPlayerID, i)
#¿ÉÒÔÓõĽ±Àø
allList.append((curIpyPersonalData.GUID, curIpyPersonalData.Text, curIpyPersonalData.CreateTime,
curIpyPersonalData.Gold, curIpyPersonalData.GoldPaper, curIpyPersonalData.Silver))
#È«·þ²¹³¥
curEntireCount = GameWorld.GetCompensationMgr().GetEntireCompensationCount()
curJob = curPlayer.GetJob()
curLV = curPlayer.GetLV()
isTestAccID = GameWorld.GetPlatformAccID(curPlayer.GetAccID()) in ReadChConfig.GetEvalChConfig("TestAccID")
for i in xrange(curEntireCount - 1, -1, -1):
curRequire = GameWorld.GetCompensationMgr().AtEntireCompensation(i)
checkState, limitLVType, limitLV = ParseEntireCompensationInfo(curRequire.PlayerLV)
if checkState == CheckState_No:
if not isTestAccID:
#δÉóºËµÄÓʼþ²»´¦Àí
continue
#»ñÈ¡¼Ç¼
states = GameWorld.GetCompensationMgr().FindPlayerRecState(curPlayerID, curRequire.GUID)
readState = states/10 # ¿É¶Á
curState = states%10 # Áìȡ״̬
if curState in (Disable_State, Del_State):
#²»¿ÉÁì »ò ÒÑÁì
#GameWorld.DebugLog("¸ÃÍæ¼Òµ±Ç°È«·þÓʼþ״̬²»Ï·¢: curState=%s,GUID=%s" % (curState, curRequire.GUID), curPlayerID)
continue
limitTime = datetime.datetime.strptime(curRequire.LimitTime, ChConfig.TYPE_Time_Format)
if limitTime < curTime and curState == Unknown_State:
#δ֪ͨ¹ýµÄÓʼþ³¬Ê±£¬²Å¿ÉÉèÖóɲ»¿ÉÁìÈ¡
SetPrizeState(curPlayerID, curRequire.GUID, Disable_State, readState)
continue
if limitLVType == LimitLVType_Not and curPlayer.GetCreateRoleTime() > curRequire.CreateTime:
#GameWorld.DebugLog("Éý¼¶ºó²»¿ÉÁìÈ¡µÄÓʼþ·¢ËÍʱ¼äºó´´½ÇµÄÍæ¼ÒĬÈϲ»¿ÉÁìÈ¡! CreateRoleTime=%s > %s" % (curPlayer.GetCreateRoleTime(), curRequire.CreateTime))
SetPrizeState(curPlayerID, curRequire.GUID, Disable_State, readState)
continue
if limitLV > curLV:
#µÈ¼¶²»×ã
if limitLVType == LimitLVType_Not:
SetPrizeState(curPlayerID, curRequire.GUID, Disable_State, readState)
continue
if curRequire.PlayerJob not in (-1, 127):
curJob = curPlayer.GetJob()
#ÓÐÖ°ÒµÏÞÖÆ
if (curRequire.PlayerJob&pow(2,curJob)) == 0:
SetPrizeState(curPlayerID, curRequire.GUID, Disable_State, readState)
continue
if curRequire.ServerID and curRequire.ServerID != GameWorld.GetPlayerServerID(curPlayer):
# Ö¸¶¨·þÎñÆ÷Óʼþ
SetPrizeState(curPlayerID, curRequire.GUID, Disable_State, readState)
continue
#¿ÉÒÔÓõĽ±Àø
if Enable_State != curState and curState != Yet_State:
SetPrizeState(curPlayerID, curRequire.GUID, Enable_State, readState)
allList.append((curRequire.GUID, curRequire.Text, curRequire.CreateTime,
curRequire.Gold, curRequire.GoldPaper, curRequire.Silver))
return allList
##·¢ËÍ¿ÉÁìÈ¡½±Àø²éѯ½á¹û
# @param curPlayer, notifyList
# @return None
def SyncQueryCompensationResult(curPlayer, notifyList):
sendPack = ChPyNetSendPack.tagGCQueryCompensationResult()
sendPack.Clear()
for GUID, Text, CreateTime, gold, goldPaper, silver in notifyList:
curGUIDItemCount = GameWorld.GetCompensationMgr().FindItemCount(GUID)
subPack = ChPyNetSendPack.tagGCCompensationPack()
subPack.GUID = GUID
subPack.CreateTime = CreateTime
subPack.Text = Text
subPack.TextLen = len(Text)
subPack.Gold = gold
subPack.GoldPaper = goldPaper
subPack.Silver = silver
resState = GameWorld.GetCompensationMgr().FindPlayerRecState(curPlayer.GetPlayerID(), GUID)
if resState % 10 == Yet_State:
subPack.IsRead = Yet_State # ÒÑÁìÈ¡
else:
subPack.IsRead = resState / 10 # ÊÇ·ñÒѶÁ
for index in xrange(curGUIDItemCount):
curItem = GameWorld.GetCompensationMgr().FindItemAt(GUID, index)
subPackItem = ChPyNetSendPack.tagGCCompensationItem()
subPackItem.ItemID = curItem.ItemID
subPackItem.Count = curItem.Count
subPackItem.IsBind = curItem.IsBind
subPackItem.UserData = curItem.UserData
subPackItem.UserDataLen = len(curItem.UserData)
subPack.Items.append(subPackItem)
subPack.Count = len(subPack.Items)
sendPack.PackList.append(subPack)
sendPack.Count = len(sendPack.PackList)
NetPackCommon.SendFakePack(curPlayer, sendPack)
return
def SyncQueryCompensationResultByGUID(curPlayer, notifyGUIDList):
curPlayerID = curPlayer.GetPlayerID()
notifyList = []
compensationMgr = GameWorld.GetCompensationMgr()
for GUID in notifyGUIDList:
findCompensation = compensationMgr.FindPersonalCompensation(curPlayerID, GUID)
if findCompensation.PlayerID != curPlayerID:
findCompensation = compensationMgr.FindEntireCompensation(GUID)
if findCompensation.GUID != GUID:
# ÕÒ²»µ½Óʼþ
continue
notifyList.append((findCompensation.GUID, findCompensation.Text, findCompensation.CreateTime,
findCompensation.Gold, findCompensation.GoldPaper, findCompensation.Silver))
if not notifyList:
return
SyncQueryCompensationResult(curPlayer, notifyList)
return
##03 03 Íæ¼ÒÇëÇóÁìÈ¡²¹³¥#tagMGRequestCompensation
# @param routeIndex, mapID, curPackData, tick
# @return None
def OnMGRequestCompensation(routeIndex, mapID, curPackData, tick):
global g_PlayerRequestStateDict
GameWorld.DebugLog("Compensation### OnMGRequestCompensation in")
myPlayerID = curPackData.PlayerID
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(myPlayerID)
if not curPlayer:
return
if curPlayer.GetDictByKey(Def_RequestState):#УÑéËø
GameWorld.DebugLog("Compensation### already request")
return
curPlayer.SetDict(Def_RequestState, 1)#¼ÓËø
GUID = curPackData.GUID
GameWorld.DebugLog("Compensation### OnMGRequestCompensation myPlayerID %s GUID %s"%(myPlayerID, GUID))
compensationType, curEntireRequire = CheckRequestCompensation(curPlayer, GUID)
if compensationType == Unknow_CompensationType or not curEntireRequire:
#Áìȡʧ°Ü
curPlayer.SetDict(Def_RequestState, 0)#½âËø
GameWorld.DebugLog("Compensation### OnMGRequestCompensation no found")
return
#УÑé±³°üÊ£Óà¿Õ¼äÊÇ·ñ×ã¹»
#===========================================================================
# curCUIDItemCount = GameWorld.GetCompensationMgr().FindItemCount(GUID)
# if curPackData.PackSpaceCount < curCUIDItemCount:
# curPlayer.SetDict(Def_RequestState, 0)#½âËø
# GameWorld.DebugLog("Compensation### OnMGRequestCompensation no enough space")
# return
#===========================================================================
#·¢Ë͵½MapServer¸øÓè½±Àø
SendGMRequestCompensationResult(routeIndex, mapID, curPlayer, GUID, compensationType, curEntireRequire)
GameWorld.DebugLog("Compensation### OnMGRequestCompensation out")
##ÇëÇóÁìÈ¡ÎïÆ·
# @param curPlayer, GUID
# @return CompensationType ²¹³¥ÀàÐÍ
def CheckRequestCompensation(curPlayer, GUID, isPersonnal = True):
curPlayerID = curPlayer.GetID()
states = GameWorld.GetCompensationMgr().FindPlayerRecState(curPlayerID, GUID)
readState = states/10 # ¿É¶Á
curState = states%10 # Áìȡ״̬
if curState in (Disable_State, Yet_State, Del_State):
#²»¿ÉÁì »ò ÒÑÁì
#GameWorld.DebugLog("µ±Ç°Óʼþ²»¿ÉÁìÈ¡»òÒÑÁì: states=%s,curState=%s,GUID=%s" % (states, curState, GUID), curPlayerID)
return Unknow_CompensationType, None
if isPersonnal:
#ÔÚ¸öÈ˲¹³¥ÖÐ
curPersonalCompensation = GameWorld.GetCompensationMgr().FindPersonalCompensation(curPlayerID, GUID)
if curPersonalCompensation.PlayerID == curPlayerID:
#·µ»Ø²¹³¥ÀàÐÍ
return Personal_CompensationType, curPersonalCompensation
#---------
#ÔÚÈ«·þ²¹³¥ÖÐ
curEntireRequire = GameWorld.GetCompensationMgr().FindEntireCompensation(GUID)
if curEntireRequire.GUID != GUID:
#²»ÔÙÈ«·þ²¹³¥ÖУ¬É¾³ý¼Ç¼
GameWorld.GetCompensationMgr().DeletePlayerCompensationRec(curPlayerID, GUID)
return Unknow_CompensationType, None
checkState, limitLVType, limitLV = ParseEntireCompensationInfo(curEntireRequire.PlayerLV)
if checkState == CheckState_No:
isTestAccID = GameWorld.GetPlatformAccID(curPlayer.GetAccID()) in ReadChConfig.GetEvalChConfig("TestAccID")
if not isTestAccID:
#δÉóºËµÄÓʼþ²»´¦Àí
return Unknow_CompensationType, None
#δ֪ͨ¹ý£¬ÇÒÒѳ¬Ê±
limitTime = datetime.datetime.strptime(curEntireRequire.LimitTime, ChConfig.TYPE_Time_Format)
curTime = datetime.datetime.today()
if limitTime < curTime and Unknown_State == curState:
#³¬Ê±£¬ÉèÖóɲ»¿ÉÁìÈ¡
SetPrizeState(curPlayerID, GUID, Disable_State, readState)
return Unknow_CompensationType, None
if Enable_State == curState:
#¿ÉÁìÈ¡ÇÒδ³¬Ê±£¬·µ»ØÎïÆ·ÐÅÏ¢
return Entire_CompensationType, curEntireRequire
curLV = curPlayer.GetLV()
if limitLV > curLV:
#µÈ¼¶²»×ã
if limitLVType == LimitLVType_Not:
SetPrizeState(curPlayerID, GUID, Disable_State, readState)
return Unknow_CompensationType, None
curJob = curPlayer.GetJob()
if curEntireRequire.PlayerJob not in (-1, 127):
#ÓÐÖ°ÒµÏÞÖÆ
if (curEntireRequire.PlayerJob&pow(2,curJob)) == 0:
SetPrizeState(curPlayerID, GUID, Disable_State, readState)
return Unknow_CompensationType, None
if curEntireRequire.ServerID and curEntireRequire.ServerID != GameWorld.GetPlayerServerID(curPlayer):
# Ö¸¶¨·þÎñÆ÷Óʼþ
SetPrizeState(curPlayerID, GUID, Disable_State, readState)
return Unknow_CompensationType, None
#¿ÉÒÔÓõĽ±Àø
SetPrizeState(curPlayerID, GUID, Enable_State, readState)
#·µ»ØÎïÆ·ÐÅÏ¢
return Entire_CompensationType, curEntireRequire
##·¢ËÍ·â°ü 03 02 Íæ¼ÒÁìÈ¡²¹³¥½á¹û#tagGMRequestCompensationResult
# @param routeIndex, mapID, curPlayer, curItem
# @return None
def SendGMRequestCompensationResult(routeIndex, mapID, curPlayer, GUID, compensationType, curEntireRequire):
Text, gold, goldPaper, silver, createTime = curEntireRequire.Text, curEntireRequire.Gold, \
curEntireRequire.GoldPaper, curEntireRequire.Silver, curEntireRequire.CreateTime
# È«·þÓʼþûÓÐ Type ×Ö¶Î
moneySource = curEntireRequire.Type if compensationType == Personal_CompensationType else 0
sendPack = ChGameToMapPyPack.tagGMRequestCompensationResult()
sendPack.PlayerID = curPlayer.GetID()
sendPack.CompensationType = compensationType
sendPack.GUID = GUID
sendPack.CreateTime = createTime
sendPack.Text = Text
sendPack.TextLen = len(Text)
sendPack.Gold = gold
sendPack.GoldPaper = goldPaper
sendPack.Silver = silver
sendPack.MoneySource = moneySource
curGUIDItemCount = GameWorld.GetCompensationMgr().FindItemCount(GUID)
for i in xrange(curGUIDItemCount):
curItem = GameWorld.GetCompensationMgr().FindItemAt(GUID, i)
subPackItem = ChGameToMapPyPack.tagGMCompensationItem()
subPackItem.ItemID = curItem.ItemID
subPackItem.Count = curItem.Count
subPackItem.IsBind = curItem.IsBind
subPackItem.UserData = curItem.UserData
subPackItem.UserDataLen = len(curItem.UserData)
sendPack.Items.append(subPackItem)
sendPack.Count = len(sendPack.Items)
NetPackCommon.SendPyPackToMapServer(routeIndex, mapID, sendPack)
return
##03 04 Íæ¼ÒÁìÈ¡²¹³¥ÎïÆ··¢·Å½á¹û#tagMGGiveCompensationResult
# @param routeIndex, mapID, curPackData, tick
# @return None
def OnMGGiveCompensationResult(routeIndex, mapID, curPackData, tick):
myPlayerID = curPackData.PlayerID
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(myPlayerID)
if not curPlayer:
return
GUID = curPackData.GUID
CompensationType = curPackData.CompensationType
curPlayer.SetDict(Def_RequestState, 0)#½âËø
if curPackData.Result:
GiveCompensationSuccess(curPlayer, GUID, CompensationType)
return
##Íæ¼ÒÁìÈ¡²¹³¥ÎïÆ··¢·Å³É¹¦
# @param curPlayer, GUID
# @return None
def GiveCompensationSuccess(curPlayer, GUID, CompensationType, isDel=False):
curPlayerID = curPlayer.GetID()
SetPrizeState(curPlayerID, GUID, Yet_State, Read_State_Yes) # ÉèÖÃΪÒÑÁìÈ¡
#Á÷Ïò¼Ç¼
DataRecordPack.DR_GiveCompensationSuccess(curPlayerID, GUID)
if not isDel:
SyncQueryCompensationResultByGUID(curPlayer, [GUID])
return
NotifyCompensationResult(curPlayer, GUID, 1)
#È«·þ½±ÀøÁìÈ¡¼Ç¼±ä¸üΪÒÑÁìÈ¡
if CompensationType == Entire_CompensationType:
SetPrizeState(curPlayerID, GUID, Del_State, Read_State_Yes)
return
#¸öÈ˽±ÀøÁìÈ¡ÌõĿִÐÐɾ³ý
if CompensationType == Personal_CompensationType:
ClearPersonalCompensation(curPlayerID, GUID)
return
return
##ÇåÀí³¬Ê±È«·þ²¹³¥, È«·þÓʼþ·ÖÁ½²¿´¦Àí£º1. Óʼþ½ÓÊÕµÄÓÐЧʱ¼ä£¬ºǫ́ÉèÖã¬2. Óʼþɾ³ýʱ¼äΪ½ÓÊÕÓÐЧʱ¼äÔÙÑÓ³¤30Ìì
# @param None
# @return None
def ClearUpEntireCompensation():
#УÑé¹ýÆÚ²¹³¥
curTime = datetime.datetime.today()
needClearGUIDList = []
entireCnt = GameWorld.GetCompensationMgr().GetEntireCompensationCount()
for i in xrange(entireCnt):
curEntireRequire = GameWorld.GetCompensationMgr().AtEntireCompensation(i)
# ³¬¹ý½ÓÊÕÓʼþ30ÌìÔòÍêȫɾ³ý´ËÓʼþ
limitTime = datetime.datetime.strptime(curEntireRequire.LimitTime, ChConfig.TYPE_Time_Format) + datetime.timedelta(days = 30)
if limitTime < curTime:
needClearGUIDList.append(curEntireRequire.GUID)
#ɾ³ý¹ýÆÚ²¹³¥ÐÅÏ¢£¬ ûÓÐÖ÷¶¯Í¨ÖªÔÚÏßÍæ¼Ò
for GUID in needClearGUIDList:
#ɾ³ýÁìÈ¡Ìõ¼þ
GameWorld.GetCompensationMgr().DeleteEntireCompensation(GUID)
#ɾ³ý¹ýÆÚÎïÆ·
GameWorld.GetCompensationMgr().DeleteCompensationItem(GUID)
#Çå³ýÁìȡ״̬¼Ç¼¾Í
GameWorld.GetCompensationMgr().DeleteRecByGUID(GUID)
return
##ÇåÀí³¬Ê±30ÌìµÄ¸öÈËÓʼþ, ·ñÔòÁ÷Ê§Íæ¼ÒÔÚ²»¶ÏºÏ·þÇé¿öÏÂÊý¾Ý»áÀÛ»ý
# ¸öÈËÓʼþÔÝÎÞ¹ýÆÚʱ¼äÉ趨£¬Ö»ÓÐ30ÌìÇåÀíÂß¼,ÒÔ´´½¨Ê±¼äΪ׼
# @param None
# @return None
def ClearUpPersonalCompensation():
#УÑé¹ýÆÚ²¹³¥
tempSign = ""
tempSignEnd = ""
curTime = datetime.datetime.today()
needClearGUIDList = []
allCnt = GameWorld.GetCompensationMgr().GetAllPersonalCompensationCount()
for i in xrange(allCnt):
curMail = GameWorld.GetCompensationMgr().AtAllPersonalCompensation(i)
mailText = curMail.Text
# ֪ͨÀàÄ£°åÓʼþ£¬¹ýÌì¿ÉÖ±½Óɾ³ý
if tempSign in mailText and tempSignEnd in mailText and CheckCanDelCompensation(curMail, curMail.GUID, curMail.PlayerID):
tempKey = mailText[mailText.index(tempSign) + len(tempSign):mailText.index(tempSignEnd)]
notClearMailKeyList = IpyGameDataPY.GetFuncEvalCfg("MailSet", 1)
if tempKey not in notClearMailKeyList:
#GameWorld.DebugLog("¹ýÌìɾ³ýÎÞ¸½¼þ֪ͨÀàÓʼþÄ£°å! tempKey=%s %s, %s" % (tempKey, curMail.PlayerID, curMail.GUID))
needClearGUIDList.append([curMail.PlayerID, curMail.GUID])
player = GameWorld.GetPlayerManager().FindPlayerByID(curMail.PlayerID)
if player and player.GetInitOK():
NotifyCompensationResult(player, curMail.GUID, 1)
continue
# ³¬¹ý½ÓÊÕÓʼþ30ÌìÔòÍêȫɾ³ý´ËÓʼþ
limitTime = datetime.datetime.strptime(curMail.CreateTime, ChConfig.TYPE_Time_Format) + datetime.timedelta(days = 30)
if limitTime < curTime:
needClearGUIDList.append([curMail.PlayerID, curMail.GUID])
GameWorld.Log("ClearUpPersonalCompensation count=%s"%len(needClearGUIDList))
#ɾ³ý¹ýÆÚ²¹³¥ÐÅÏ¢£¬ ûÓÐÖ÷¶¯Í¨ÖªÔÚÏßÍæ¼Ò
for playerID, GUID in needClearGUIDList:
ClearPersonalCompensation(playerID, GUID, "Timeout")
return
## ÇåÀí³¬Ê±²¹³¥, ¸öÈËÓʼþÔÚ³¬¹ýÉÏÏÞºó²Å»á×Ô¶¯É¾³ý
# @param None
# @return None
def ClearUpTimeOutCompensation():
ClearUpPersonalCompensation()
ClearUpEntireCompensation()
return
#===============================================================================
# //A9 A6 ÉèÖÃÓʼþ£¨²¹³¥£©ÒѶÁ״̬ #tagCGReadCompensation
#
# struct tagCGReadCompensation
# {
# tagHead Head;
# char GUID[40];
# BYTE IsRead; //ÉèÖÃÓʼþ£¨²¹³¥£©ÊÇ·ñÒѶÁ 1¶ÁÈ¡
# };
#===============================================================================
def OnReadCompensation(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
GUID = clientData.GUID
curPlayerID = curPlayer.GetID()
#ÔÚ¸öÈ˲¹³¥ÖÐ
curPersonalCompensation = GameWorld.GetCompensationMgr().FindPersonalCompensation(curPlayerID, GUID)
if curPersonalCompensation.PlayerID != curPlayerID:
curEntireRequire = GameWorld.GetCompensationMgr().FindEntireCompensation(GUID)
if curEntireRequire.GUID != GUID:
#GameWorld.DebugLog("ÕÒ²»µ½ÓʼþGUID:%s"%GUID)
# ÕÒ²»µ½Óʼþ
return
curState = GameWorld.GetCompensationMgr().FindPlayerRecState(curPlayerID, GUID)
if curState/10 >= Read_State_Yes:
# ÒѶÁ
#GameWorld.DebugLog("ÒѶÁGUID:%s"%GUID)
return
curState = Read_State_Yes*10 + curState%10
GameWorld.GetCompensationMgr().AddPlayerRec(curPlayerID, GUID, curState)
#GameWorld.DebugLog("ÒѶÁcurState:%s"%curState)
return
#===============================================================================
# //A9 A7 ɾ³ýÓʼþ£¨²¹³¥£© #tagCGDelCompensation
#
# struct tagCGDelCompensation
# {
# tagHead Head;
# char GUID[40];
# };
#===============================================================================
def OnDelCompensation(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
GUID = clientData.GUID
curPlayerID = curPlayer.GetID()
#ÔÚ¸öÈ˲¹³¥ÖÐ
curPersonalCompensation = GameWorld.GetCompensationMgr().FindPersonalCompensation(curPlayerID, GUID)
if curPersonalCompensation.PlayerID == curPlayerID:
if not CheckCanDelCompensation(curPersonalCompensation, GUID, curPlayerID):
#Óи½¼þ²»¿Éɾ³ý
GameWorld.DebugLog("¸Ã¸öÈËÓʼþ²»¿Éɾ³ý: %s" % GUID, curPlayerID)
NotifyCompensationResult(curPlayer, GUID, 0)
return
ClearPersonalCompensation(curPlayerID, GUID, "ClientDel")
NotifyCompensationResult(curPlayer, GUID, 1)
#GameWorld.DebugLog("¸öÈ˲¹³¥ÖÐOnDelCompensation:%s"%GUID)
return
curEntireRequire = GameWorld.GetCompensationMgr().FindEntireCompensation(GUID)
if curEntireRequire.GUID != GUID:
# ÕÒ²»µ½Óʼþ
NotifyCompensationResult(curPlayer, GUID, 0)
#GameWorld.DebugLog("ÕÒ²»µ½ÓʼþOnDelCompensation:%s"%GUID)
return
#È«·þÓʼþ
curEntireRequire = GameWorld.GetCompensationMgr().FindEntireCompensation(GUID)
if curEntireRequire.GUID == GUID:
if not CheckCanDelCompensation(curEntireRequire, GUID, curPlayerID):
#Óи½¼þ²»¿Éɾ³ý
GameWorld.DebugLog("¸ÃÈ«·þÓʼþ²»¿Éɾ³ý: %s" % GUID, curPlayerID)
NotifyCompensationResult(curPlayer, GUID, 0)
return
SetPrizeState(curPlayerID, GUID, Del_State, GameWorld.GetCompensationMgr().FindPlayerRecState(curPlayerID, GUID)/10)
NotifyCompensationResult(curPlayer, GUID, 1)
#GameWorld.DebugLog("È«·þÓʼþOnDelCompensation:%s"%GUID)
return
NotifyCompensationResult(curPlayer, GUID, 0)
# Óи½¼þµÄÇé¿öÍæ¼Ò²»¿ÉÖ÷¶¯É¾³ýÓʼþ£¬±ÜÃâÎó²Ù×÷£»ÏµÍ³¿Éɾ³ý²»Óõ÷Óô˽ӿÚ
def CheckCanDelCompensation(mailObj, GUID, playerID=0):
if playerID:
if GetPrizeGetState(playerID, GUID) == Yet_State:
#GameWorld.DebugLog("ÒÑÁìÈ¡µÄÓʼþ¿Éɾ³ý: %s" % GUID, playerID)
return True
if mailObj.Gold or mailObj.GoldPaper or mailObj.Silver:
# Óи½¼Ó»õ±Ò²»¿Éɾ³ý
return False
if GameWorld.GetCompensationMgr().FindItemCount(GUID):
# Óи½¼þÎïÆ·²»¿Éɾ³ý
return False
return True
# Óʼþɾ³ýÇé¿ö
def NotifyCompensationResult(curPlayer, GUID, result):
sendMCPack = ChPyNetSendPack.tagGCDelCompensationResult()
sendMCPack.GUID = GUID
sendMCPack.Result = result
NetPackCommon.SendFakePack(curPlayer, sendMCPack)