hxp
4 天以前 67a84dc38db8f7d0f85b03e2b06ba728d95c1e82
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMail.py
@@ -15,6 +15,7 @@
#"""Version = 2025-05-14 12:00"""
#-------------------------------------------------------------------------------
import CrossMsg
import GameWorld
import ItemCommon
import PlayerControl
@@ -51,9 +52,10 @@
        if not mailObj:
            continue
        createTime = GameWorld.ChangeTimeStrToNum(mailObj.GetCreateTime())
        limitTime = createTime + (mailObj.GetLimitDays() + 7) * 3600 * 24
        if curTime < limitTime:
            #GameWorld.DebugLog("全服邮件未超时,不删除! %s,createTime=%s,limitTime=%s" % (guid, mailObj.GetCreateTime(), GameWorld.ChangeTimeNumToStr(limitTime)))
        passDays = GameWorld.GetDiff_Day(curTime, createTime) + 1 # 过期判断按0点算天数
        limitDays = mailObj.GetLimitDays()
        if passDays <= limitDays:
            #GameWorld.DebugLog("全服邮件未超时,不删除! %s,createTime=%s,passDays=%s <= limitDays=%s" % (guid, mailObj.GetCreateTime(), passDays, limitDays))
            continue
        
        DelServerMail(guid, "Timeout")
@@ -85,16 +87,17 @@
        notifyGUIDState = {}
        for guid, mailObj in mailDict.items():
            createTime = GameWorld.ChangeTimeStrToNum(mailObj.GetCreateTime())
            limitTime = createTime + (mailObj.GetLimitDays() + 0) * 3600 * 24
            if curTime < limitTime:
                #GameWorld.DebugLog("个人邮件未超时,不删除! %s,createTime=%s,limitTime=%s" % (guid, mailObj.GetCreateTime(), GameWorld.ChangeTimeNumToStr(limitTime)), playerID)
            passDays = GameWorld.GetDiff_Day(curTime, createTime) + 1 # 过期判断按0点算天数
            limitDays = mailObj.GetLimitDays()
            if passDays <= limitDays:
                #GameWorld.DebugLog("个人邮件未超时,不删除! %s,createTime=%s,passDays=%s <= limitDays=%s" % (guid, mailObj.GetCreateTime(), passDays, limitDays), playerID)
                continue
            
            mailState = mailObj.GetMailState()
            mailItemCount = mailMgr.GetMailItemCount(guid)
            if mailItemCount and mailState != ShareDefine.MailState_Got:
                #GameWorld.DebugLog("个人邮件有物品未领取不删除! %s" % guid, playerID)
                continue
            #mailState = mailObj.GetMailState()
            #mailItemCount = mailMgr.GetMailItemCount(guid)
            #if mailItemCount and mailState != ShareDefine.MailState_Got:
            #    #GameWorld.DebugLog("个人邮件有物品未领取不删除! %s" % guid, playerID)
            #    continue
            
            mailMgr.DelPersonalMail(playerID, guid)
            DataRecordPack.DR_MailDel(playerID, guid, "Timeout")
@@ -108,14 +111,34 @@
            Sync_PlayerMailState(curPlayer, notifyGUIDState)
    return
def SendMailByKey(mailTypeKey, playerID, itemList, paramList=[], limitDays=7):
def SendMailByKey(mailTypeKey, playerID, itemList, paramList=[], limitDays=7, toServerID=0):
    ## 发送个人邮件魔板
    # @param itemList: 元素支持字典{itemID:itemCount, ...} 或列表 [itemID, itemCount, 可选是否拍品, 物品UserData]
    # @param toServerID: 向其他服玩家发送邮件时需指定玩家所在服务器
    if toServerID > 0:
        if not GameWorld.IsCrossServer():
            GameWorld.ErrLog("非跨服服务器不能向其他服务器发送个人邮件! %s,playerID=%s" % (mailTypeKey, playerID))
            return
        dataMsg = {"mailTypeKey":mailTypeKey, "itemList":itemList, "paramList":paramList, "limitDays":limitDays}
        mainServerID = GameWorld.GetMainServerID(toServerID)
        CrossMsg.SendToClientServer(ShareDefine.C2S_SendPlayerMail, dataMsg, [mainServerID], playerID)
        return
    if not mailTypeKey:
        mailTypeKey = ShareDefine.DefaultLackSpaceMailType
    title = "<T>%s</T>" % mailTypeKey
    text = "%s" % json.dumps([str(p) for p in paramList], ensure_ascii=False) #参数全部转为字符串
    SendMail(playerID, title, text, itemList, limitDays)
    return
def C2S_SendPlayerMail(dataMsg, playerID):
    mailTypeKey = dataMsg["mailTypeKey"]
    itemList = dataMsg["itemList"]
    paramList = dataMsg["paramList"]
    limitDays = dataMsg["limitDays"]
    if not GameWorld.GetDBPlayerAccIDByID(playerID):
        return
    SendMailByKey(mailTypeKey, playerID, itemList, paramList, limitDays)
    return
def SendMail(playerID, title, text, itemList=None, limitDays=7, mailType=0):
@@ -197,7 +220,7 @@
    mailObj.SetCheckState(checkState)
    eventName = "Add" if not checkState else "AddToCheck"
    addDict = {"LimitDays":limitDays, "LimitLV":limitLV, "LimitLVType":limitLVType, "CheckState":checkState, 
               "title":title, "Text":text, "ItemList":itemList}
               "Title":title, "Text":text, "ItemList":itemList}
    DataRecordPack.DR_ServerMail(GUID, eventName, addDict)
    if not checkState:
        Sync_ServerMail(mailObj.GetGUID())
@@ -326,9 +349,14 @@
            itemCount = mailItem.GetCount()
            isBind = mailItem.GetIsBind()
            userData = mailItem.GetUserData()
            #setAttrDict = {} if not userData else eval(userData) 之后扩展有指定属性的,可参考砍树版本
            setAttrDict = None
            if userData:
                try:
                    setAttrDict = eval(userData)
                except:
                    setAttrDict = None
            if not ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isBind, [IPY_GameWorld.rptItem], 
                                                event=[ChConfig.ItemGive_Mail, False, {"MailGUID":guid}]):
                                                event=[ChConfig.ItemGive_Mail, False, {"MailGUID":guid}], setAttrDict=setAttrDict):
                continue
            
        DataRecordPack.DR_MailGiveSuccess(playerID, guid)