#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package Player.PlayerActBuyOne
|
#
|
# @todo:ÂòÒ»ËͶà»î¶¯
|
# @author hxp
|
# @date 2023-08-01
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ÂòÒ»ËͶà»î¶¯
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2023-08-01 16:00"""
|
#-------------------------------------------------------------------------------
|
|
import PyGameData
|
import ShareDefine
|
import PlayerControl
|
import IpyGameDataPY
|
import ChPyNetSendPack
|
import DataRecordPack
|
import NetPackCommon
|
import ItemControler
|
import IPY_GameWorld
|
import PlayerCoin
|
import GameWorld
|
import ChConfig
|
|
RecordIndexMax = 10 # ÿ¸öÄ£°å×î´óÖ§³Ö³äÖµIDÊý
|
|
def OnPlayerLogin(curPlayer):
|
|
for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_BuyOne, {}).values():
|
actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0)
|
isReset = __CheckPlayerBuyOneAction(curPlayer, actNum)
|
# »î¶¯ÖÐͬ²½»î¶¯ÐÅÏ¢
|
if not isReset and actInfo.get(ShareDefine.ActKey_State):
|
Sync_BuyOneActionInfo(curPlayer, actNum)
|
Sync_BuyOnePlayerInfo(curPlayer, actNum)
|
|
return
|
|
def RefreshBuyOneActionInfo(actNum):
|
## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢
|
playerManager = GameWorld.GetPlayerManager()
|
for index in xrange(playerManager.GetPlayerCount()):
|
curPlayer = playerManager.GetPlayerByIndex(index)
|
if curPlayer.GetID() == 0:
|
continue
|
__CheckPlayerBuyOneAction(curPlayer, actNum)
|
return
|
|
|
def __CheckPlayerBuyOneAction(curPlayer, actNum):
|
## ¼ì²éÍæ»î¶¯Êý¾ÝÐÅÏ¢
|
|
playerID = curPlayer.GetPlayerID()
|
|
actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_BuyOne, actNum)
|
actID = actInfo.get(ShareDefine.ActKey_ID, 0)
|
state = actInfo.get(ShareDefine.ActKey_State, 0)
|
#cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0)
|
#dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0)
|
|
playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BuyOneID % actNum) # Íæ¼ÒÉíÉϵĻID
|
|
# »î¶¯ID ÏàͬµÄ»°²»´¦Àí
|
if actID == playerActID:
|
GameWorld.DebugLog("ÂòÒ»ËͶà»î¶¯ID²»±ä£¬²»´¦Àí£¡ actID=%s" % actID, curPlayer.GetPlayerID())
|
return
|
GameWorld.DebugLog("ÂòÒ»ËͶà»î¶¯ÖØÖÃ! actID=%s,playerActID=%s,state=%s" % (actID, playerActID, state), playerID)
|
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BuyOneID % actNum, actID)
|
for i in range(RecordIndexMax):
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BuyOneFreeItemState % (actNum, i), 0)
|
|
if state:
|
# ÖØÖóäÖµID³äÖµ¼Ç¼
|
__ResetCTGIDCount(curPlayer, actInfo)
|
|
Sync_BuyOneActionInfo(curPlayer, actNum)
|
Sync_BuyOnePlayerInfo(curPlayer, actNum)
|
|
return True
|
|
def __ResetCTGIDCount(curPlayer, actInfo):
|
cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
|
dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0)
|
ipyData = IpyGameDataPY.GetIpyGameData("ActBuyOne", cfgID)
|
if not ipyData:
|
return
|
templateID = GameWorld.GetTemplateID(ipyData, cfgID, dayIndex)
|
if not templateID:
|
return
|
tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBuyOneTemplate", templateID)
|
if not tempIpyDataList:
|
return
|
resetCTGIDList = []
|
for tempIpyData in tempIpyDataList:
|
resetCTGIDList.append(tempIpyData.GetNeedCTGID())
|
PlayerCoin.DoResetCTGCountByIDList(curPlayer, "ActBuyOne", resetCTGIDList)
|
return
|
|
def GetBuyOneFreeAward(curPlayer, awardIndex, actNum):
|
'''»î¶¯Ãâ·Ñ½±Àø
|
@param awardIndex: ½±ÀøË÷Òý = recordIndex*100 + freeIndex
|
@param actNum: »î¶¯±àºÅ£¬Èç11 »ò 12 ´ú±í²»Í¬µÄ»î¶¯
|
'''
|
playerID = curPlayer.GetPlayerID()
|
|
actNum = GameWorld.ToIntDef(actNum, 0)
|
if actNum <= 0:
|
GameWorld.Log("ûÓÐÖ¸¶¨ÁìÈ¡µÄ»î¶¯±àºÅ! actNum=%s" % actNum, playerID)
|
return
|
|
recordIndex = awardIndex / 100
|
freeIndex = awardIndex % 100
|
|
actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_BuyOne, actNum)
|
|
if not actInfo.get(ShareDefine.ActKey_State):
|
GameWorld.Log("ÂòÒ»ËÍÒ»·Ç»î¶¯ÖÐÎÞ·¨ÁìÈ¡½±Àø! actNum=%s" % actNum, playerID)
|
return
|
cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
|
dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0)
|
ipyData = IpyGameDataPY.GetIpyGameData("ActBuyOne", cfgID)
|
if not ipyData:
|
return
|
templateID = GameWorld.GetTemplateID(ipyData, cfgID, dayIndex)
|
if not templateID:
|
return
|
|
tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBuyOneTemplate", templateID)
|
if not tempIpyDataList:
|
return
|
|
needCTGID = 0
|
freeItemList = []
|
|
for tempIpyData in tempIpyDataList:
|
if recordIndex != tempIpyData.GetRecordIndex():
|
continue
|
needCTGID = tempIpyData.GetNeedCTGID()
|
freeItemInfo = tempIpyData.GetFreeItemInfo()
|
freeItemList = freeItemInfo.get(freeIndex, [])
|
break
|
|
if not needCTGID or not freeItemList:
|
GameWorld.ErrLog("ÂòÒ»ËÍÒ»»î¶¯Ã»Óиý±ÀøÐÅÏ¢! actNum=%s,cfgID=%s,templateID=%s,recordIndex=%s,freeIndex=%s"
|
% (actNum, cfgID, templateID, recordIndex, freeIndex), playerID)
|
return
|
|
totalBuyCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CTGGoodsBuyCount % needCTGID)
|
if not totalBuyCount:
|
GameWorld.Log("ÂòÒ»ËÍÒ»»î¶¯¸Ã½±ÀøÎ´³äÖµ£¬ÎÞ·¨Ãâ·ÑÁìÈ¡! actNum=%s,cfgID=%s,templateID=%s,recordIndex=%s,needCTGID=%s"
|
% (actNum, cfgID, templateID, recordIndex, needCTGID), playerID)
|
return
|
|
awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BuyOneFreeItemState % (actNum, recordIndex))
|
if awardRecord & pow(2, freeIndex):
|
GameWorld.Log("ÂòÒ»ËÍÒ»»î¶¯ÒѾÁìÈ¡¹ý¸ÃÃâ·Ñ½±Àø! actNum=%s,cfgID=%s,templateID=%s,recordIndex=%s,freeIndex=%s"
|
% (actNum, cfgID, templateID, recordIndex, freeIndex), playerID)
|
return
|
|
# ¼ì²é±³°ü
|
if not ItemControler.CheckPackSpaceEnough(curPlayer, freeItemList):
|
return
|
|
awardRecord |= pow(2, freeIndex)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_BuyOneFreeItemState % (actNum, recordIndex), awardRecord)
|
Sync_BuyOnePlayerInfo(curPlayer, actNum)
|
|
for itemID, itemCount, isAuctionItem in freeItemList:
|
ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem])
|
|
addDataDict = {"templateID":templateID, "cfgID":cfgID, "recordIndex":recordIndex, "freeIndex":freeIndex,
|
"freeItemList":str(freeItemList), "actNum":actNum}
|
DataRecordPack.DR_FuncGiveItem(curPlayer, "ActBuyOne", addDataDict)
|
GameWorld.Log("ÂòÒ»ËÍÒ»»î¶¯ÁìÈ¡Ãâ·Ñ½±Àø! actNum=%s,cfgID=%s,templateID=%s,recordIndex=%s,freeIndex=%s,freeItemList=%s"
|
% (actNum, cfgID, templateID, recordIndex, freeIndex, freeItemList), playerID)
|
return
|
|
def Sync_BuyOnePlayerInfo(curPlayer, actNum):
|
## Í¨ÖªÍæ¼ÒÊý¾ÝÐÅÏ¢
|
clientPack = ChPyNetSendPack.tagMCActBuyOnePlayerInfo()
|
clientPack.ActNum = actNum
|
clientPack.FreeRecordList = []
|
for i in range(RecordIndexMax):
|
awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BuyOneFreeItemState % (actNum, i))
|
clientPack.FreeRecordList.append(awardRecord)
|
clientPack.FreeRecordCount = len(clientPack.FreeRecordList)
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|
|
def Sync_BuyOneActionInfo(curPlayer, actNum):
|
## ֪ͨ»î¶¯ÐÅÏ¢
|
|
actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_BuyOne, actNum)
|
if not actInfo.get(ShareDefine.ActKey_State):
|
return
|
|
cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
|
dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0)
|
ipyData = IpyGameDataPY.GetIpyGameData("ActBuyOne", cfgID)
|
if not ipyData:
|
return
|
templateID = GameWorld.GetTemplateID(ipyData, cfgID, dayIndex)
|
if not templateID:
|
return
|
tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBuyOneTemplate", templateID)
|
if not tempIpyDataList:
|
return
|
|
startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData)
|
startDateSync = actInfo.get(ShareDefine.ActKey_StartDateSync, startDateStr)
|
actInfo = ChPyNetSendPack.tagMCActBuyOneInfo()
|
actInfo.ActNum = actNum
|
actInfo.StartDate = startDateSync
|
actInfo.EndtDate = endDateStr
|
actInfo.LimitLV = ipyData.GetLVLimit()
|
actInfo.IsDayReset = ipyData.GetIsDayReset()
|
actInfo.GiftbagList = []
|
|
for tempIpyData in tempIpyDataList:
|
giftbag = ChPyNetSendPack.tagMCActBuyOneInfoGiftbag()
|
giftbag.CTGID = tempIpyData.GetNeedCTGID()
|
giftbag.RecordIndex = tempIpyData.GetRecordIndex()
|
giftbag.FreeGiftList = []
|
|
freeItemInfo = tempIpyData.GetFreeItemInfo()
|
freeIndexList = freeItemInfo.keys()
|
freeIndexList.sort()
|
for freeIndex in freeIndexList:
|
freeGift = ChPyNetSendPack.tagMCActBuyOneInfoFreeGift()
|
freeGift.FreeIndex = freeIndex
|
freeGift.FreeItemList = []
|
freeItemList = freeItemInfo[freeIndex]
|
for itemID, itemCount, isAuctionItem in freeItemList:
|
freeItem = ChPyNetSendPack.tagMCActBuyOneInfoFreeItem()
|
freeItem.ItemID = itemID
|
freeItem.ItemCount = itemCount
|
freeItem.IsBind = isAuctionItem
|
freeGift.FreeItemList.append(freeItem)
|
freeGift.FreeItemCount = len(freeGift.FreeItemList)
|
giftbag.FreeGiftList.append(freeGift)
|
|
giftbag.FreeGiftCount = len(giftbag.FreeGiftList)
|
|
actInfo.GiftbagList.append(giftbag)
|
|
actInfo.GiftbagCount = len(actInfo.GiftbagList)
|
NetPackCommon.SendFakePack(curPlayer, actInfo)
|
return
|