#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerSignDay # # @todo:Ç©µ½ # @author hxp # @date 2025-10-09 # @version 1.0 # # ÏêϸÃèÊö: Ç©µ½ # #------------------------------------------------------------------------------- #"""Version = 2025-10-09 16:30""" #------------------------------------------------------------------------------- import ObjPool import DBDataMgr import PlayerMail import ShareDefine import NetPackCommon import ItemControler import ChPyNetSendPack import PlayerControl import IpyGameDataPY import GameWorld import ChConfig SignInState_None = 0 SignInState_Sign = 1 # ÒÑÇ©µ½ SignInState_Supplement = 2 # ¿É²¹Ç© SignInState_Got = 3 # ÒÑÁìÈ¡ #//A5 09 Íæ¼ÒÇ©µ½Áì½± #tagCSDaySign # #struct tagCSDaySign #{ # tagHead Head; # BYTE Day; // µÚxÌ죬´Ó1¿ªÊ¼ #}; def OnSignDay(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) signDay = clientData.Day bit = signDay - 1 state = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_SignInState, bit, False) if state == SignInState_Got: GameWorld.DebugLog("¸ÃÌìÒÑÇ©µ½Áì½±¹ýÁË£¡ signDay=%s" % signDay) return ipyData = IpyGameDataPY.GetIpyGameData("SignIn", signDay) if not ipyData: return awardItemList = ipyData.GetAwardItemList() if not awardItemList: return moneyType, moneyValue = 0, 0 # ²¹Ç© if state == SignInState_Supplement: moneyType, moneyValue = IpyGameDataPY.GetFuncEvalCfg("SignInSet", 1) if not PlayerControl.HaveMoney(curPlayer, moneyType, moneyValue): return elif state != SignInState_Sign: GameWorld.DebugLog("µ±Ç°ÌìÇ©µ½×´Ì¬²»¿ÉÁìȡǩµ½½±Àø! signDay=%s,state=%s" % (signDay, state)) return if moneyType and moneyValue: PlayerControl.PayMoney(curPlayer, moneyType, moneyValue, ChConfig.Def_Cost_AddSignDay) befValue, updValue = GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_SignInState, bit, SignInState_Got, False) GameWorld.DebugLog("Ç©µ½Áì½±: signDay=%s,state=%s,befValue=%s,updValue=%s" % (signDay, state, befValue, updValue)) ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["SignDay", False, {}]) Sync_SignDayInfo(curPlayer) return ## Ç©µ½×ܽ±ÀøÌìÊý def GetSignAwardCountMax(): return IpyGameDataPY.IPY_Data().GetSignInCount() def SignDayOnLogin(curPlayer): __doAutoSingIn(curPlayer) return def SignDayOnDay(curPlayer): __doAutoSingIn(curPlayer) return def ResetDaySign(curPlayer): ## ÖØÖÃÇ©µ½ signInMax = GetSignAwardCountMax() GameWorld.DebugLog("ÖØÖÃÇ©µ½: signInMax=%s" % (signInMax), curPlayer.GetPlayerID()) #²¹·¢Î´ÁìÈ¡½±Àø mailItemDict = {} for day in range(1, 1 + signInMax): state = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_SignInState, day - 1, False) if state != SignInState_Sign: # ÒÑÇ©µ½Î´ÁìÈ¡µÄ continue ipyData = IpyGameDataPY.GetIpyGameData("SignIn", day) if not ipyData: break awardItemList = ipyData.GetAwardItemList() for itemInfo in awardItemList: itemID, itemCount = itemInfo[:2] mailItemDict[itemID] = mailItemDict.get(itemID, 0) + itemCount GameWorld.DebugLog("Ç©µ½Î´ÁìÈ¡½±Àø²¹·¢: day=%s,awardItemList=%s,%s" % (day, awardItemList, mailItemDict), curPlayer.GetPlayerID()) if mailItemDict: PlayerMail.SendMailByKey("SignDay", curPlayer.GetPlayerID(), mailItemDict) keyNumMax = signInMax / 9 + 1 # ÿ¸ö¿ÉÒԼǼ9ÌìµÄ״̬ for num in range(keyNumMax): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SignInState % num, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SignInLastDay, 0) __doAutoSingIn(curPlayer) return def __doAutoSingIn(curPlayer): ## Ö´ÐÐ×Ô¶¯Ç©µ½£¬½ö×öÇ©µ½±ê¼Ç£¬·ÇÁì½± signInMax = GetSignAwardCountMax() lastDay = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_SignInLastDay) isMixServer = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_IsMixServer) if isMixServer: serverDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_MixServerDay) + 1 else: serverDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay) + 1 if lastDay: signInRound = (serverDay - 1) / signInMax signInRoundLast = (lastDay - 1) / signInMax if signInRound != signInRoundLast: ResetDaySign(curPlayer) return canSignInMax = (serverDay - 1) % signInMax + 1 for day in range(1, 1 + canSignInMax): bit = day - 1 if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_SignInState, bit, False): continue state = SignInState_Sign if day == canSignInMax else SignInState_Supplement GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_SignInState, bit, state, False) GameWorld.DebugLog("¸üÐÂÇ©µ½×´Ì¬: day=%s/%s,state=%s,isMixServer=%s,serverDay=%s" % (day, signInMax, state, isMixServer, serverDay)) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SignInLastDay, serverDay) Sync_SignDayInfo(curPlayer) return True def Sync_SignDayInfo(curPlayer): signInMax = GetSignAwardCountMax() clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCDaySignInfo) clientPack.SignStateList = [] for bit in range(signInMax): state = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_SignInState, bit, False) clientPack.SignStateList.append(state) clientPack.Count = len(clientPack.SignStateList) NetPackCommon.SendFakePack(curPlayer, clientPack) return