#!/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 PlayerWeekParty
|
import GameWorld
|
import ChConfig
|
import CommFunc
|
import PlayerCoin
|
|
|
def GetGiftbagTypeList(cfgID, dayIndex, woldLV):
|
if cfgID == None or dayIndex == None:
|
return []
|
ipyData = IpyGameDataPY.GetIpyGameData("ActFlashGiftbag", cfgID)
|
if not ipyData:
|
return []
|
giftbagTypeList = GameWorld.GetDictValueByRangeKey(ipyData.GetGiftbagTypeList(), woldLV, [])
|
todayGiftbag = giftbagTypeList[-1] if dayIndex >= len(giftbagTypeList) else giftbagTypeList[dayIndex]
|
return todayGiftbag
|
|
def OnPlayerLogin(curPlayer):
|
|
for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {}).values():
|
actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
|
isReset = __CheckPlayerFlashGiftbagAction(curPlayer, actNum)
|
if not isReset:
|
pass
|
|
return
|
|
def RefreshFlashGiftbagActionInfo(actNum):
|
## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢
|
playerManager = GameWorld.GetPlayerManager()
|
for index in xrange(playerManager.GetPlayerCount()):
|
curPlayer = playerManager.GetPlayerByIndex(index)
|
if curPlayer.GetID() == 0:
|
continue
|
__CheckPlayerFlashGiftbagAction(curPlayer, actNum)
|
return
|
|
def __CheckPlayerFlashGiftbagAction(curPlayer, actNum):
|
## ¼ì²éÍæ¼ÒÏÔʾÀñ°ü»î¶¯Êý¾ÝÐÅÏ¢
|
|
playerID = curPlayer.GetPlayerID()
|
|
actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_FlashGiftbag, actNum)
|
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 % actNum) # Íæ¼ÒÉíÉϵĻID
|
giftbagTypeList = [] if not cfgID else GetGiftbagTypeList(cfgID, actInfo.get(ShareDefine.ActKey_DayIndex, 0), actInfo.get(ShareDefine.ActKey_WorldLV, 0))
|
isReset = False
|
if actID != playerActID:
|
isReset = True
|
Sync_FlashGiftbagActionInfo(curPlayer, actNum)
|
__ResetGiftbagItemBuyCount(curPlayer, giftbagTypeList, actNum)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagID % actNum, actID)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagMailState % actNum, 0)
|
GameWorld.DebugLog("ÏÞʱÀñ°üÖØÖÃ! actNum=%s,actID=%s,playerActID=%s,state=%s,giftbagTypeList=%s"
|
% (actNum, actID, playerActID, state, giftbagTypeList), playerID)
|
else:
|
GameWorld.DebugLog("ÏÞʱÀñ°ü»î¶¯ID²»±ä£¬²»´¦Àí£¡actNum=%s,playerActID=%s" % (actNum, playerActID), curPlayer.GetPlayerID())
|
|
playerMailState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagMailState % actNum) # Íæ¼ÒÉíÉϵĻÌáÐÑÓʼþ״̬
|
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 % actNum, state)
|
GameWorld.DebugLog(" ·¢ËÍÐÂÏÞʱÀñ°üÓʼþÌáÐÑ! state=%s,playerMailState=%s" % (state, playerMailState), playerID)
|
|
if not isReset and cfgID:
|
Sync_FlashGiftbagActionInfo(curPlayer, actNum)
|
if giftbagTypeList:
|
SyncFlashGiftbagBuyCount(curPlayer, actNum, giftbagTypeList=giftbagTypeList)
|
return isReset
|
|
def __ResetGiftbagItemBuyCount(curPlayer, giftbagTypeList, actNum):
|
##ÖØÖÃÏÞʱÀñ°üÏÞ¹ºÎïÆ·´ÎÊý
|
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 % (actNum, giftbag.GetGiftbagID())
|
if curPlayer.NomalDictGetProperty(buyCntKey) <= 0:
|
continue
|
PlayerControl.NomalDictSetProperty(curPlayer, buyCntKey, 0)
|
syncIDList.append(giftbag.GetGiftbagID())
|
if syncIDList:
|
SyncFlashGiftbagBuyCount(curPlayer, actNum, syncIDList)
|
return
|
|
def OnPlayerOrderGiftbag(curPlayer, giftbagIDList, addDRDict):
|
## Íæ¼Ò¶©¹ºÏÞʱÀñ°ü
|
|
canBuy = False
|
for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_FlashGiftbag, {}).values():
|
actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
|
|
state = actInfo.get(ShareDefine.ActKey_State, 0)
|
if not state:
|
continue
|
|
cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)
|
giftbagTypeList = GetGiftbagTypeList(cfgID, actInfo.get(ShareDefine.ActKey_DayIndex, 0), actInfo.get(ShareDefine.ActKey_WorldLV, 0))
|
|
if not giftbagTypeList:
|
continue
|
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:
|
continue
|
|
flashGiftbagIpyData = IpyGameDataPY.GetIpyGameData("ActFlashGiftbag", cfgID)
|
if not flashGiftbagIpyData:
|
continue
|
isJueban = flashGiftbagIpyData.GetIsJueban()
|
if isJueban:
|
for ipyData in giftbagIpyDataList:
|
juebanGiftbagID = ipyData.GetGiftbagID()
|
juebanBuyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % (actNum, juebanGiftbagID))
|
if juebanGiftbagID not in giftbagIDList and juebanBuyCount > 0:
|
DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag JueBan pay limit! have already bought other giftbagID=%s" % juebanGiftbagID, addDRDict)
|
return
|
|
giftbagID = giftbagIpyData.GetGiftbagID()
|
giftItemList = __GetJobItemList(giftbagIpyData.GetGiftItemList(), curPlayer.GetJob())
|
addDRDict.update({"giftbagID":giftbagID, "giftItemList":giftItemList})
|
buyCountLimit = giftbagIpyData.GetBuyCountLimit()
|
buyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % (actNum, giftbagID))
|
if buyCountLimit:
|
addDRDict.update({"buyCountLimit":buyCountLimit, "buyCount":buyCount})
|
if buyCount >= buyCountLimit:
|
PlayerCoin.ExchangePayCoin(curPlayer, "FlashGiftbag Pay count limit !buyCount=%s,buyCountLimit=%s"
|
% (buyCount, buyCountLimit), addDRDict)
|
return
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FlashGiftbagBuyCount % (actNum, giftbagID), buyCount + 1)
|
|
if giftItemList:
|
ItemControler.GivePlayerItemOrMail(curPlayer, giftItemList, "", 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 str(orderIpyData.GetPayRMBNum()) # RMBÖ§³ÖСÊý£¬ÕâÀïÖ±½Óתstr¹ã²¥
|
PlayerControl.WorldNotify(0, notifyKey, [curPlayer.GetPlayerName(), rmb, giftbagIpyData.GetMainItemID()])
|
|
SyncFlashGiftbagBuyCount(curPlayer, actNum, [giftbagID])
|
PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_GiftBag, actGiftbagType, False)
|
|
canBuy = True
|
GameWorld.DebugLog(" ¹ºÂòÏÞʱÀñ°ü: actNum=%s,actGiftbagType=%s,giftbagID=%s,buyCount=%s,isJueban=%s"
|
% (actNum, actGiftbagType, giftbagID, buyCount + 1, isJueban))
|
break
|
|
if not canBuy:
|
DataRecordPack.DR_CTGError(curPlayer, "FlashGiftbag can not buy!", addDRDict)
|
return
|
|
return True
|
|
def __GetJobItemList(itemList, job):
|
jobItemList = []
|
for itemID, itemCnt, isBind in itemList:
|
if type(itemID) == int:
|
jobItemList.append([itemID, itemCnt, isBind])
|
elif job in itemID:
|
jobItemList.append([itemID[job], itemCnt, isBind])
|
return jobItemList
|
|
def SyncFlashGiftbagBuyCount(curPlayer, actNum, syncIDList=[], giftbagTypeList=[]):
|
## ֪ͨÏÞʱÀñ°üÍæ¼Ò»î¶¯ÐÅÏ¢
|
giftbagBuyInfo = ChPyNetSendPack.tagMCFlashGiftbagPlayerInfo()
|
giftbagBuyInfo.ActNum = actNum
|
giftbagBuyInfo.BuyCountList = []
|
if syncIDList:
|
for giftID in syncIDList:
|
buyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FlashGiftbagBuyCount % (actNum, 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 % (actNum, 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, actNum):
|
## ֪ͨÏÞʱÀñ°ü»î¶¯ÐÅÏ¢
|
actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_FlashGiftbag, actNum)
|
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), actInfo.get(ShareDefine.ActKey_WorldLV, 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)
|
|
startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(flashGiftbagIpyData)
|
packInfo = ChPyNetSendPack.tagMCFlashGiftbagInfo()
|
packInfo.ActNum = actNum
|
packInfo.StartDate = startDateStr
|
packInfo.EndtDate = endDateStr
|
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 CommFunc.RMBToCoin(orderIpyData.GetPayRMBNum())
|
giftBag.RMBOriginal = CommFunc.RMBToCoin(giftIpyData.GetOriginalRMB())
|
giftBag.ItemInfo = []
|
for itemID, itemCount, isBind in __GetJobItemList(giftIpyData.GetGiftItemList(), curPlayer.GetJob()):
|
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))
|
|