#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#  
 | 
#  
 | 
##@package PlayerSignDay  
 | 
#  
 | 
# @todo: Ã¿ÈÕÇ©µ½  
 | 
#  
 | 
# @author jiang  
 | 
# @date 2012-03-23  
 | 
# @version 1.8  
 | 
# @note:  
 | 
# @change: "2013-03-13 17:00" wdb É¾³ý·â°ü  
 | 
# @change: "2013-10-31 11:00" hxp ÐÞ¸ÄÿÈÕÇ©µ½Âß¼  
 | 
# @change: "2013-11-05 20:20" hxp Ôö¼Ó¹ýÌì֪ͨǩµ½¼Ç¼Çé¿ö  
 | 
# @change: "2014-04-03 22:00" xmnathan Ã¿ÈÕÇ©µ½Âß¼Ð޸ģ¬Ôö¼ÓVIP²¹Ç©  
 | 
# @change: "2015-06-16 15:40" ljd Ð޸ijÉÀàµÇ½½±Àø£¬²¹µÇ  
 | 
# @change: "2015-08-03 16:40" ljd ²¹Ç©´ÎÊý´ÓVIP Å²µ½ ¹ó×å  
 | 
# @change: "2015-08-24 14:40" zqx Ôö¼ÓÇ©µ½³É¾Í  
 | 
# @change: "2016-10-26 11:00" hxp Ç©µ½Âß¼ÐÞ¸Ä  
 | 
#-------------------------------------------------------------------------------  
 | 
#"""Version = 2016-10-26 11:00"""  
 | 
#-------------------------------------------------------------------------------  
 | 
  
 | 
import ShareDefine  
 | 
import NetPackCommon  
 | 
import IPY_GameWorld  
 | 
import ItemControler  
 | 
import DataRecordPack  
 | 
import ChPyNetSendPack  
 | 
import PlayerMagicWeapon  
 | 
import PlayerPet  
 | 
import PlayerSuccess  
 | 
import PlayerControl  
 | 
import GameWorld  
 | 
import ChConfig  
 | 
import GameFuncComm  
 | 
import IpyGameDataPY  
 | 
import ItemCommon  
 | 
  
 | 
import time  
 | 
#===============================================================================  
 | 
#//A5 09 Íæ¼ÒÇ©µ½ #tagCMDaySign  
 | 
# struct    tagCMDaySign  
 | 
#{  
 | 
#    tagHead        Head;  
 | 
#    BYTE        Day;    //ĬÈÏ0±íʾµ±ÈÕÇ©µ½£¬´Ó1±íʾ²¹Ç©¡£  
 | 
# };   
 | 
#===============================================================================  
 | 
## Íæ¼ÒÇ©µ½·â°üÈë¿Ú  
 | 
#  @param index: Íæ¼ÒË÷Òý  
 | 
#  @param clientData: ·â°ü½á¹¹Ìå  
 | 
#  @param tick: Ê±¼ä´Á  
 | 
#  @return: None  
 | 
def OnSignDay(index, clientData, tick):  
 | 
    # ¿ç·þ·þÎñÆ÷¹¦ÄÜÏÞÖÆ  
 | 
    if GameWorld.IsMergeServer():  
 | 
        return  
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)     
 | 
    #¹¦ÄÜ¿ªÆôÅÐ¶Ï  
 | 
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_SignDay):  
 | 
        GameWorld.DebugLog("Íæ¼ÒµÈ¼¶²»×㣬먦ÆôÇ©µ½¹¦ÄÜ PlayerLv=%s" % curPlayer.GetLV())  
 | 
        return    
 | 
      
 | 
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  
 | 
    signDay = clientData.Day # 0-Õý³£Ç©µ½£»1-²¹Ç©  
 | 
    isAddLogin = 1 if signDay else 0 # ÊÇ·ñ²¹Ç©  
 | 
      
 | 
    if not isAddLogin:  
 | 
        #ÊÇ·ñ½ñÌìÒѾǩµ½  
 | 
        signState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DayLoginSignState)  
 | 
        if signState:  
 | 
            GameWorld.DebugLog("½ñÈÕÒÑÇ©µ½¹ý£¡")  
 | 
            return  
 | 
        signCost = 0  
 | 
    else:  
 | 
        #±¾ÂÖÀۼƿɲ¹Ç©´ÎÊý  
 | 
        canAddSignNum = GetCanAddSignNum(curPlayer)  
 | 
        #ÊÇ·ñÓÐÊ£Óಹǩ´ÎÊý  
 | 
        if canAddSignNum <= 0:  
 | 
            GameWorld.DebugLog("ÒѾûÓв¹Ç©´ÎÊý£¬²¹Ç©Ê§°Ü£¡canAddSignNum=%s" % canAddSignNum)  
 | 
            return  
 | 
        #»ñÈ¡ÐèÒªÏûºÄÍæ¼ÒÏÉÓñ     
 | 
        signCost = IpyGameDataPY.GetFuncCfg("SignConsumption")  
 | 
        if not PlayerControl.HaveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, signCost, True):  
 | 
            GameWorld.DebugLog("²¹Ç©ËùÐè»õ±Ò²»×ã! signCost=%s" % signCost)  
 | 
            return  
 | 
            
 | 
    #»ñµÃÇ©µ½ÌìÊý  
 | 
    curSignNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DayLoginSignNum) + 1  
 | 
    totalSignNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalSignNum) + 1  
 | 
      
 | 
    #»ñµÃÇ©µ½Àۼƽ±Àø±íijÈÕÐÅÏ¢   
 | 
    awardInfo = IpyGameDataPY.GetIpyGameData("SignAward", curSignNum)  
 | 
    if not awardInfo:  
 | 
        GameWorld.DebugLog("ÕÒ²»µ½Ç©µ½½±Àø! Ç©µ½µÚ(%s)´Î" % curSignNum)  
 | 
        return  
 | 
         
 | 
    #»ñµÃÁÐÐÅÏ¢  
 | 
    itemIDList = awardInfo.GetItemID()  
 | 
    ordinaryNumList = awardInfo.GetOrdinaryNum()  
 | 
    isBind = awardInfo.GetIsBind()  
 | 
    vipLv = awardInfo.GetVipLv()  
 | 
    vipMultiple = awardInfo.GetVipMultiple()  
 | 
    #ÅжÏÊÇ·ñÊǵڶþÔÂÒÔºó  
 | 
    isMulti = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DayLoginSignIsMulti)  
 | 
    if not isMulti:  
 | 
        itemID = itemIDList[0]  
 | 
        ordinaryNum = ordinaryNumList[0]  
 | 
    else:  
 | 
        itemID = itemIDList[1]  
 | 
        ordinaryNum = ordinaryNumList[1]      
 | 
    #ÅжÏÊÇ·ñÐèÒªVip¶à±¶   
 | 
    curVipLV = curPlayer.GetVIPLv()  
 | 
    if curVipLV >= vipLv:  
 | 
        ordinaryNum *= vipMultiple  
 | 
       
 | 
    #¼Ç¼ǩµ½ÐÅÏ¢  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DayLoginSignNum, curSignNum)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalSignNum, totalSignNum)  
 | 
    if not isAddLogin:  
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DayLoginSignState, 1)  
 | 
       
 | 
    #Ö§¸¶ÏÉÓñ  
 | 
    if signCost > 0:  
 | 
        PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, signCost, ChConfig.Def_Cost_AddSignDay)  
 | 
        
 | 
    #Ç©µ½½±ÀøÐÅÏ¢  
 | 
    awardInfoList = [[itemID, ordinaryNum, isBind]]  
 | 
      
 | 
    #¸øÓèÇ©µ½½±ÀøÎïÆ·  
 | 
    __GivePlayerItemByItemInfoList(curPlayer, awardInfoList, "SignToPlayer")  
 | 
      
 | 
    #ÀÛ¼ÆÇ©µ½½±ÀøÐÅÏ¢  
 | 
    contineAwardInfoList = []  
 | 
      
 | 
    #»ñµÃÁ¬ÐøÇ©µ½½±Àø±íÐÅÏ¢  
 | 
    contineAwardInfo = IpyGameDataPY.GetIpyGameData("ContineSignAward", curSignNum)  
 | 
    if not contineAwardInfo:  
 | 
        GameWorld.DebugLog("ÕÒ²»µ½Á¬ÐøÇ©µ½½±Àø! Ç©µ½µÚ(%s)´Î" % curSignNum)  
 | 
    else:  
 | 
        jobItemList = contineAwardInfo.GetJobItemList()  
 | 
        itemIDList = contineAwardInfo.GetItemID()  
 | 
        itemNumList = contineAwardInfo.GetItemNum()  
 | 
        awardIndex = 1 if (len(itemIDList) > 1 and isMulti) else 0  
 | 
        itemID = itemIDList[awardIndex]  
 | 
        itemCount = itemNumList[awardIndex]  
 | 
        if itemID in jobItemList and curPlayer.GetJob() <= len(jobItemList):  
 | 
            itemID = jobItemList[curPlayer.GetJob() - 1]  
 | 
        contineAwardInfoList = [[itemID, itemCount, contineAwardInfo.GetIsBind()]]  
 | 
        #for index in xrange(len(itemIDList)):   
 | 
        #    contineAwardInfoList.append([itemIDList[index], itemNumList[index], itemIsBind])  
 | 
          
 | 
    #¸øÓèÀۼƽ±ÀøÎïÆ·    
 | 
    __GivePlayerItemByItemInfoList(curPlayer, contineAwardInfoList, "ContineSignToPlayer")  
 | 
    PlayerControl.NotifyCode(curPlayer, 'SignInText')  
 | 
    #ͬ²½¿Í»§¶Ë                  
 | 
    Sync_SignDayInfo(curPlayer)  
 | 
      
 | 
    addDataDict = {"signNum":curSignNum, "vipLV":curVipLV, "itemInfo":str(awardInfoList + contineAwardInfoList),  
 | 
                   "isAddSign":isAddLogin, "CostMoney":str([IPY_GameWorld.TYPE_Price_Gold_Money, signCost])}  
 | 
    DataRecordPack.DR_FuncGiveItem(curPlayer, "DayLoginSignAward", addDataDict)  
 | 
    GameWorld.DebugLog("%s: %s" % ("²¹Ç©" if isAddLogin else "Ç©µ½", addDataDict), curPlayer.GetPlayerID())  
 | 
      
 | 
    # Ë¢Ç©µ½¸½¼Ó¹¦ÄÜÊôÐÔ  
 | 
    PlayerMagicWeapon.CalcMagicWeaponAttr(curPlayer)  
 | 
    PlayerPet.CalcPetItemAddPlayerAttr(curPlayer)  
 | 
    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()  
 | 
      
 | 
    mwID = IpyGameDataPY.GetFuncCfg('MWSignDayAttr', 2)  
 | 
    if mwID:  
 | 
        effDict = IpyGameDataPY.GetFuncEvalCfg('MWSignDayAttr', 1, {})  
 | 
        if PlayerMagicWeapon.GetIsActiveMagicWeapon(curPlayer, mwID) and effDict:  
 | 
            PlayerControl.NotifyCode(curPlayer, "SignInText1", [mwID, effDict.keys()[0], effDict.values()[0]])  
 | 
              
 | 
      
 | 
    petLearnSkillList, petPassiveSkillList = PlayerPet.GetPetLearnSkill(curPlayer)  
 | 
    if ChConfig.Def_SkillID_PetSignDay in petPassiveSkillList:  
 | 
        signDayAttrSkill = GameWorld.GetGameData().GetSkillBySkillID(ChConfig.Def_SkillID_PetSignDay)  
 | 
        if signDayAttrSkill:  
 | 
            curEffect = signDayAttrSkill.GetEffect(0)  
 | 
            PlayerControl.NotifyCode(curPlayer, "SignInText2", [ChConfig.Def_SkillID_PetSignDay, curEffect.GetEffectID(), curEffect.GetEffectValue(0)])  
 | 
              
 | 
    return  
 | 
  
 | 
## Ç©µ½×ܽ±ÀøÌìÊý  
 | 
def GetSignAwardCountMax(): return IpyGameDataPY.IPY_Data().GetSignAwardCount()  
 | 
  
 | 
def DoSignDayOpen(curPlayer):  
 | 
    ResetDaySign(curPlayer)  
 | 
    return  
 | 
  
 | 
def SignDayOnLogin(curPlayer):  
 | 
    ''' Íæ¼ÒÉÏÏß '''  
 | 
    #¹¦ÄÜ¿ªÆôÅÐ¶Ï  
 | 
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_SignDay):  
 | 
        #GameWorld.DebugLog("Íæ¼Ò먦ÆôÇ©µ½¹¦ÄÜ PlayerLv=%s" % curPlayer.GetLV())  
 | 
        return         
 | 
    Sync_SignDayInfo(curPlayer)  
 | 
    return  
 | 
  
 | 
def SignDayOnDay(curPlayer):  
 | 
    ''' Íæ¼Ò¹ýÌì '''  
 | 
    #¹¦ÄÜ¿ªÆôÅÐ¶Ï  
 | 
    if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_SignDay):  
 | 
        GameWorld.DebugLog("Íæ¼Ò¹¥»÷²»×㣬먦ÆôÇ©µ½¹¦ÄÜ PlayerLv=%s" % curPlayer.GetLV())  
 | 
        return    
 | 
    curSignNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DayLoginSignNum)  
 | 
    #Ç©µ½ÌìÊýÒÑÂú×î´óÖµ£¬Ë¢Ð°ñµ¥  
 | 
    if curSignNum >= GetSignAwardCountMax():  
 | 
        GameWorld.DebugLog("ÀÛ¼ÆÇ©µ½ÌìÊýÂúÖØÖÃ! curSignNum=%s" % curSignNum)  
 | 
        ResetDaySign(curPlayer, 1)  
 | 
        return  
 | 
      
 | 
    #Ë¢ÐÂÊÇ·ñÇ©µ½¼Ç¼  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DayLoginSignState, 0)  
 | 
    Sync_SignDayInfo(curPlayer)  
 | 
    return  
 | 
  
 | 
def ResetDaySign(curPlayer, isMulti=0):  
 | 
    ''' ÖØÖÃÇ©µ½   
 | 
    @param isMulti: ÊÇ·ñ´ÎÔÂÆð  
 | 
    '''  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DayLoginSignIsMulti, isMulti)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DayLoginSignNum, 0)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DayLoginSignState, 0)  
 | 
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DayLoginSignStartTime, int(time.time()))  
 | 
    if isMulti:  
 | 
        Sync_SignDayInfo(curPlayer)  
 | 
    else:  
 | 
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalSignNum, 0)  
 | 
    return  
 | 
  
 | 
def GetCanAddSignNum(curPlayer):  
 | 
    ## »ñÈ¡¿É²¹Ç©ÌìÊý  
 | 
    curTime = int(time.time())  
 | 
    startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DayLoginSignStartTime) # ¿ªÊ¼Ê±¼ä  
 | 
    if not startTime:  
 | 
        return 0  
 | 
    if curTime < startTime:  
 | 
        return 0  
 | 
    signNumMax = GetSignAwardCountMax()  
 | 
    signNumMax = min(GameWorld.GetDiff_Day(curTime, startTime) + 1, signNumMax) # ×î´ó¿ÉÇ©µ½´ÎÊý  
 | 
    signState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DayLoginSignState) # ½ñÈÕÊÇ·ñÒÑÇ©µ½  
 | 
    signCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DayLoginSignNum) # ÒÑÇ©µ½´ÎÊý  
 | 
    signNumRemain = signNumMax - signCount # Ê£Óà¿ÉÇ©µ½´ÎÊý  
 | 
    if not signState:  
 | 
        signNumRemain -= 1  
 | 
    signNumRemain = max(0, signNumRemain)  
 | 
    #GameWorld.DebugLog("×î´ó¿ÉÇ©µ½´ÎÊý=%s,ÒÑÇ©µ½´ÎÊý=%s,½ñÌìÊÇ·ñÒÑÇ©µ½=%s,¿É²¹Ç©´ÎÊý=%s"   
 | 
    #                   % (signNumMax, signCount, signState, signNumRemain), curPlayer.GetPlayerID())  
 | 
    return signNumRemain  
 | 
  
 | 
## Í¨ÖªÇ©µ½´ÎÊý½±ÀøÁìÈ¡Çé¿ö  
 | 
#  @param curPlayer: Íæ¼ÒʵÀý  
 | 
#  @return: None  
 | 
def Sync_SignDayInfo(curPlayer):  
 | 
    signInfo = ChPyNetSendPack.tagMCDaySignInfo()  
 | 
    signInfo.Clear()  
 | 
    signInfo.DaySignCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DayLoginSignNum)  
 | 
    signInfo.ReplenishSignCount = GetCanAddSignNum(curPlayer)  
 | 
    signInfo.IsSign = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DayLoginSignState)  
 | 
    isFrist = 0 if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DayLoginSignIsMulti) else 1  
 | 
    signInfo.IsFrist = isFrist  
 | 
    signInfo.TotalSignCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalSignNum)  
 | 
    NetPackCommon.SendFakePack(curPlayer, signInfo)  
 | 
    return  
 | 
  
 | 
##¸øÓèÍæ¼ÒÎïÆ·  
 | 
def __GivePlayerItemByItemInfoList(curPlayer, awardInfoList, mailTypeKey):     
 | 
    signCount = len(awardInfoList)  
 | 
      
 | 
    packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, signCount)  
 | 
    if packSpace >= signCount:  
 | 
        for awardInfo in awardInfoList:  
 | 
            ItemControler.GivePlayerItem(curPlayer, awardInfo[0], awardInfo[1], awardInfo[2], [IPY_GameWorld.rptItem], True, showSysInfo=True)   
 | 
    else:         
 | 
        GameWorld.DebugLog("±³°üÒÑÂú Óʼþ·¢ËÍÎïÆ·")  
 | 
        PlayerControl.SendMailByKey(mailTypeKey, [curPlayer.GetPlayerID()], awardInfoList)  
 | 
    return  
 | 
  
 | 
  
 |