#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package Player.PlayerFlashGiftbag
|
#
|
# @todo:ÏÞʱÀñ°ü
|
# @author hxp
|
# @date 2018-7-20
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ÏÞʱÀñ°ü
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2018-7-20 17:30"""
|
#-------------------------------------------------------------------------------
|
|
import PyGameData
|
import ShareDefine
|
import PlayerControl
|
import IpyGameDataPY
|
import NetPackCommon
|
import ChPyNetSendPack
|
import DataRecordPack
|
import ItemControler
|
import IPY_GameWorld
|
import ItemCommon
|
import GameWorld
|
import ChConfig
|
|
|
def GetGiftbagTypeList(cfgID, dayIndex):
|
if cfgID == None or dayIndex == None:
|
return []
|
ipyData = IpyGameDataPY.GetIpyGameData("ActFlashGiftbag", cfgID)
|
if not ipyData:
|
return []
|
giftbagTypeList = ipyData.GetGiftbagTypeList()
|
todayGiftbag = giftbagTypeList[-1] if dayIndex >= len(giftbagTypeList) else giftbagTypeList[dayIndex]
|
return todayGiftbag
|
|
def OnPlayerLogin(curPlayer):
|
__CheckPlayerFlashGiftbagAction(curPlayer)
|
return
|
|
def RefreshFlashGiftbagActionInfo():
|
## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢
|
playerManager = GameWorld.GetPlayerManager()
|
for index in xrange(playerManager.GetPlayerCount()):
|
curPlayer = playerManager.GetPlayerByIndex(index)
|
if curPlayer.GetID() == 0:
|
continue
|
__CheckPlayerFlashGiftbagAction(curPlayer)
|
return
|
|
def __CheckPlayerFlashGiftbagAction(curPlayer):
|
## ¼ì²éÍæ¼ÒÏÔʾÀñ°ü»î¶¯Êý¾ÝÐÅÏ¢
|
|
playerID = curPlayer.GetPlayerID()
|
|
actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {})
|
actID = actInfo.get(ShareDefine.ActKey_ID, 0)
|
state = actInfo.get(ShareDefine.ActKey_State, 0)
|
cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)
|
|
playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagID) # Íæ¼ÒÉíÉϵĻID
|
giftbagTypeList = [] if not cfgID else GetGiftbagTypeList(cfgID, actInfo.get(ShareDefine.ActKey_DayIndex, 0))
|
isReset = False
|
if actID != playerActID:
|
isReset = True
|
__ResetGiftbagItemBuyCount(curPlayer, giftbagTypeList)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagID, actID)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagMailState, 0)
|
GameWorld.DebugLog("ÏÞʱÀñ°üÖØÖÃ! actID=%s,playerActID=%s,state=%s,giftbagTypeList=%s" % (actID, playerActID, state, giftbagTypeList), playerID)
|
Sync_FlashGiftbagActionInfo(curPlayer)
|
else:
|
GameWorld.DebugLog("ÏÞʱÀñ°ü»î¶¯ID²»±ä£¬²»´¦Àí£¡", curPlayer.GetPlayerID())
|
|
playerMailState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagMailState) # Íæ¼ÒÉíÉϵĻÌáÐÑÓʼþ״̬
|
if actID and state and state != playerMailState:
|
flashGiftbagIpyData = IpyGameDataPY.GetIpyGameData("ActFlashGiftbag", cfgID)
|
if flashGiftbagIpyData and flashGiftbagIpyData.GetMailKey() and curPlayer.GetLV() >= flashGiftbagIpyData.GetLVLimit():
|
PlayerControl.SendMailByKey(flashGiftbagIpyData.GetMailKey(), [playerID], flashGiftbagIpyData.GetMailItemPrize())
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagMailState, state)
|
GameWorld.DebugLog(" ·¢ËÍÐÂÏÞʱÀñ°üÓʼþÌáÐÑ! state=%s,playerMailState=%s" % (state, playerMailState), playerID)
|
|
if not isReset and cfgID:
|
if giftbagTypeList:
|
SyncFlashGiftbagBuyCount(curPlayer, giftbagTypeList=giftbagTypeList)
|
Sync_FlashGiftbagActionInfo(curPlayer)
|
return isReset
|
|
def __ResetGiftbagItemBuyCount(curPlayer, giftbagTypeList):
|
##ÖØÖÃÏÞʱÀñ°üÏÞ¹ºÎïÆ·´ÎÊý
|
syncIDList = []
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for i in xrange(ipyDataMgr.GetFlashGiftbagCount()):
|
giftbag = ipyDataMgr.GetFlashGiftbagByIndex(i)
|
if not giftbag.GetBuyCountLimit():
|
continue
|
if giftbag.GetGiftbagType() not in giftbagTypeList:
|
continue
|
buyCntKey = ChConfig.Def_PDict_FlashGiftbagBuyCount % giftbag.GetGiftbagID()
|
if curPlayer.NomalDictGetProperty(buyCntKey) <= 0:
|
continue
|
PlayerControl.NomalDictSetProperty(curPlayer, buyCntKey, 0)
|
syncIDList.append(giftbag.GetGiftbagID())
|
if syncIDList:
|
SyncFlashGiftbagBuyCount(curPlayer, syncIDList)
|
return
|
|
def OnPlayerOrderGiftbag(curPlayer, giftbagIDList, addDRDict):
|
## Íæ¼Ò¶©¹ºÏÞʱÀñ°ü
|
actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {})
|
if not actInfo:
|
DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag action info is null!", addDRDict)
|
return
|
|
actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {})
|
state = actInfo.get(ShareDefine.ActKey_State, 0)
|
if not state:
|
DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag state is 0!", addDRDict)
|
return
|
|
giftbagTypeList = GetGiftbagTypeList(actInfo.get(ShareDefine.ActKey_CfgID, 0), actInfo.get(ShareDefine.ActKey_DayIndex, 0))
|
if not giftbagTypeList:
|
DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag GiftbagTypeList is null!", addDRDict)
|
return
|
actGiftbagType = giftbagTypeList[-1] if state > len(giftbagTypeList) else giftbagTypeList[state - 1]
|
giftbagIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("FlashGiftbag", {"GiftbagType":actGiftbagType}, True, True)
|
actGiftbagIDList = []
|
giftbagIpyData = None
|
for ipyData in giftbagIpyDataList:
|
actGiftbagIDList.append(ipyData.GetGiftbagID())
|
if ipyData.GetGiftbagID() in giftbagIDList:
|
giftbagIpyData = ipyData
|
break
|
|
if not giftbagIpyData:
|
DataRecordPack.DR_CTGError(curPlayer, "OrderInfo giftbagIDList=%s can not found actGiftbagID in actGiftbagIDList=%s,actGiftbagType=%s"
|
% (giftbagIDList, actGiftbagIDList, actGiftbagType), addDRDict)
|
return
|
|
giftbagID = giftbagIpyData.GetGiftbagID()
|
giftItemList = giftbagIpyData.GetGiftItemList()
|
addDRDict.update({"giftbagID":giftbagID, "giftItemList":giftItemList})
|
buyCountLimit = giftbagIpyData.GetBuyCountLimit()
|
buyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % giftbagID)
|
if buyCountLimit:
|
addDRDict.update({"buyCountLimit":buyCountLimit, "buyCount":buyCount})
|
if buyCount >= buyCountLimit:
|
DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag Pay count limit !buyCount=%s,buyCountLimit=%s"
|
% (buyCount, buyCountLimit), addDRDict)
|
return
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagBuyCount % giftbagID, buyCount + 1)
|
|
if giftItemList:
|
needSpace = len(giftItemList)
|
emptySpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)
|
if emptySpace < needSpace:
|
PlayerControl.SendMailByKey("", [curPlayer.GetPlayerID()], giftItemList)
|
else:
|
for itemID, itemCount, isBind in giftItemList:
|
ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isBind, [IPY_GameWorld.rptItem],
|
event=[ChConfig.ItemGive_CTG, True, addDRDict])
|
|
# È¡Íæ¼ÒAPPID£¬»ì·þʹÓÃ
|
appID = GameWorld.GetPlayerPlatform(curPlayer)
|
notifyKey = giftbagIpyData.GetNotifyKey()
|
if notifyKey:
|
orderIpyData = GetFlashGiftbagIDOrderInfoIpyData(giftbagID, appID)
|
rmb = 0 if not orderIpyData else int(orderIpyData.GetPayRMBNum())
|
PlayerControl.WorldNotify(0, notifyKey, [curPlayer.GetPlayerName(), rmb, giftbagIpyData.GetMainItemID()])
|
|
SyncFlashGiftbagBuyCount(curPlayer, [giftbagID])
|
return True
|
|
def SyncFlashGiftbagBuyCount(curPlayer, syncIDList=[], giftbagTypeList=[]):
|
## ֪ͨÏÞʱÀñ°üÍæ¼Ò»î¶¯ÐÅÏ¢
|
giftbagBuyInfo = ChPyNetSendPack.tagMCFlashGiftbagPlayerInfo()
|
giftbagBuyInfo.BuyCountList = []
|
if syncIDList:
|
for giftID in syncIDList:
|
buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % giftID)
|
buyCountInfo = ChPyNetSendPack.tagMCFlashGiftbagBuyCount()
|
buyCountInfo.GiftbagID = giftID
|
buyCountInfo.BuyCount = buyCnt
|
giftbagBuyInfo.BuyCountList.append(buyCountInfo)
|
else:
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for i in xrange(ipyDataMgr.GetFlashGiftbagCount()):
|
giftbag = ipyDataMgr.GetFlashGiftbagByIndex(i)
|
if not giftbag.GetBuyCountLimit():
|
continue
|
if giftbagTypeList and giftbag.GetGiftbagType() not in giftbagTypeList:
|
continue
|
giftID = giftbag.GetGiftbagID()
|
buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % giftID)
|
if buyCnt <= 0:
|
continue
|
buyCountInfo = ChPyNetSendPack.tagMCFlashGiftbagBuyCount()
|
buyCountInfo.GiftbagID = giftID
|
buyCountInfo.BuyCount = buyCnt
|
giftbagBuyInfo.BuyCountList.append(buyCountInfo)
|
giftbagBuyInfo.Count = len(giftbagBuyInfo.BuyCountList)
|
NetPackCommon.SendFakePack(curPlayer, giftbagBuyInfo)
|
return
|
|
def Sync_FlashGiftbagActionInfo(curPlayer):
|
## ֪ͨÏÞʱÀñ°ü»î¶¯ÐÅÏ¢
|
actInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {})
|
if not actInfo:
|
return
|
|
#ÐèÒªÌáǰ֪ͨ£¬ËùÒÔÈ¥µô´ËÏÞÖÆ
|
#if not actInfo.get(ShareDefine.ActKey_State):
|
# return
|
|
cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)
|
if not cfgID:
|
return
|
giftbagTypeList = GetGiftbagTypeList(cfgID, actInfo.get(ShareDefine.ActKey_DayIndex, 0))
|
|
if not giftbagTypeList:
|
return
|
|
flashGiftbagIpyData = IpyGameDataPY.GetIpyGameData("ActFlashGiftbag", cfgID)
|
if not flashGiftbagIpyData:
|
return
|
|
startTimeList = flashGiftbagIpyData.GetStartTimeList()
|
endTimeList = flashGiftbagIpyData.GetEndTimeList()
|
if len(startTimeList) != len(endTimeList):
|
GameWorld.ErrLog("ÏÞʱÀñ°ü¿ª¹ØÊ±¼äʱ·ÖÅäÖôíÎó!cfgID=%s" % cfgID)
|
return
|
|
# È¡Íæ¼ÒAPPID£¬»ì·þʹÓÃ
|
appID = GameWorld.GetPlayerPlatform(curPlayer)
|
|
openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
|
packInfo = ChPyNetSendPack.tagMCFlashGiftbagInfo()
|
packInfo.StartDate = GameWorld.GetOperationActionDateStr(flashGiftbagIpyData.GetStartDate(), openServerDay)
|
packInfo.EndtDate = GameWorld.GetOperationActionDateStr(flashGiftbagIpyData.GetEndDate(), openServerDay)
|
packInfo.AdvanceMinutes = flashGiftbagIpyData.GetAdvanceMinutes()
|
packInfo.ActivityTime = []
|
for i, startTime in enumerate(startTimeList):
|
timeInfo = ChPyNetSendPack.tagMCFlashGiftbagTime()
|
timeInfo.StartTime = startTime
|
timeInfo.EndtTime = endTimeList[i]
|
packInfo.ActivityTime.append(timeInfo)
|
packInfo.ActivityTimeCount = len(packInfo.ActivityTime)
|
packInfo.IsDayReset = flashGiftbagIpyData.GetIsDayReset()
|
packInfo.LimitLV = flashGiftbagIpyData.GetLVLimit()
|
packInfo.GiftbagTypeInfo = []
|
for giftbagType in giftbagTypeList:
|
|
giftbagIpyDataList = IpyGameDataPY.GetIpyGameDataByCondition("FlashGiftbag", {"GiftbagType":giftbagType}, True, True)
|
if not giftbagIpyDataList:
|
continue
|
|
giftType = ChPyNetSendPack.tagMCFlashGiftbagType()
|
giftType.GiftbagInfo = []
|
|
for giftIpyData in giftbagIpyDataList:
|
giftbagID = giftIpyData.GetGiftbagID()
|
orderIpyData = GetFlashGiftbagIDOrderInfoIpyData(giftbagID, appID)
|
giftBag = ChPyNetSendPack.tagMCFlashGiftbag()
|
giftBag.GiftID = giftbagID
|
giftBag.OrderInfo = "" if not orderIpyData else orderIpyData.GetOrderInfo()
|
giftBag.OrderInfoLen = len(giftBag.OrderInfo)
|
giftBag.BuyCountLimit = giftIpyData.GetBuyCountLimit()
|
giftBag.RMB = 0 if not orderIpyData else int(orderIpyData.GetPayRMBNum())
|
giftBag.RMBOriginal = giftIpyData.GetOriginalRMB()
|
giftBag.ItemInfo = []
|
for itemID, itemCount, isBind in giftIpyData.GetGiftItemList():
|
item = ChPyNetSendPack.tagMCFlashGiftbagItem()
|
item.ItemID = itemID
|
item.ItemCount = itemCount
|
item.IsBind = isBind
|
item.IsMainItem = int(itemID == giftIpyData.GetMainItemID())
|
giftBag.ItemInfo.append(item)
|
giftBag.GiftItemCount = len(giftBag.ItemInfo)
|
giftType.GiftbagInfo.append(giftBag)
|
|
giftType.GiftbagCount = len(giftType.GiftbagInfo)
|
packInfo.GiftbagTypeInfo.append(giftType)
|
|
packInfo.GiftbagTypeCount = len(packInfo.GiftbagTypeInfo)
|
NetPackCommon.SendFakePack(curPlayer, packInfo)
|
return
|
|
def GetFlashGiftbagIDOrderInfoIpyData(giftbagID, appID):
|
## »ñÈ¡Àñ°üID¶ÔӦʵ¼ÊÊÛ¼Û
|
key = "FlashGiftbagIDRMB"
|
FlashGiftbagIDRMBDict = IpyGameDataPY.GetConfigEx(key)
|
if not FlashGiftbagIDRMBDict:
|
FlashGiftbagIDRMBDict = {}
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for i in xrange(ipyDataMgr.GetOrderInfoCount()):
|
ipyData = ipyDataMgr.GetOrderInfoByIndex(i)
|
#if ipyData.GetAppID() != appID:
|
# continue
|
if not ipyData.GetGiftbagID():
|
continue
|
FlashGiftbagIDRMBDict[(ipyData.GetGiftbagID(), ipyData.GetAppID())] = ipyData
|
IpyGameDataPY.SetConfigEx(key, FlashGiftbagIDRMBDict)
|
return FlashGiftbagIDRMBDict.get((giftbagID, appID))
|
|