#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
#-------------------------------------------------------------------------------
|
#
|
##@package GameWorldShopItem
|
#
|
# @todo:×Ô¶¨ÒåÉ̵ê
|
# @author hxp
|
# @date 2014-06-21
|
# @version 1.3
|
#
|
# @change: "2015-02-04 14:30" hxp ÉñÃØÉ̵ê
|
# @change: "2015-02-09 18:00" ljd Ð޸ĵǽδÍê³ÉʱÊÕ²»µ½µ¹¼ÆÊ±Ë¢Ð°üÎÊÌâ
|
# @change: "2015-04-28 17:00" hxp ¶¨Ê±Ë¢ÐÂÉ̵꿪Æôʱ֪ͨÀ뿪ʱ¼ä
|
#
|
# ÏêϸÃèÊö: ×Ô¶¨ÒåÉ̵ê
|
#
|
#---------------------------------------------------------------------
|
"""Version = 2015-04-28 17:00"""
|
|
import GameWorld
|
import ChPyNetSendPack
|
import NetPackCommon
|
import ReadChConfig
|
import ShareDefine
|
import ChConfig
|
|
import time
|
|
## ³äÖµÉ̵êÈ«·þÏÞ¹ºÊý¾Ý
|
# @param shopID É̵êid
|
# @return
|
def DoShopItemClearBuyCnt(shopID):
|
|
recTypeListData = __GetShopItemRecData()
|
|
# ±éÀúÇå¿ÕÈ«·þÏÞ¹º´ÎÊý
|
for index in range(recTypeListData.Count()):
|
recData = recTypeListData.At(index)
|
curShopID = recData.GetValue1()
|
if curShopID == shopID:
|
recData.SetValue3(0)
|
|
resultName = "%s" % [ShareDefine.Def_ShopItem_ClearBuyCnt, shopID]
|
|
# ֪ͨȫ·þÍæ¼Ò
|
playerManager = GameWorld.GetPlayerManager()
|
for i in range(0, playerManager.GetPlayerCount()):
|
curPlayer = playerManager.GetPlayerByIndex(i)
|
if curPlayer == None or not curPlayer.GetInitOK():
|
continue
|
|
curPlayer.MapServer_QueryPlayerResult(0, 0, "ShopItem", resultName, len(resultName))
|
|
return
|
|
|
## ×Ô¶¨ÒåÉ̵êÎïÆ·²éѯ½á¹û
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param msgList ÐÅÏ¢Áбí
|
# @return [queryType, À©Õ¹Êý¾Ý]
|
def DoShopItemQueryResult(curPlayer, msgList):
|
queryType = msgList[0]
|
result = []
|
|
# ͬ²½¹ºÂò´ÎÊý[queryType, shopID, serverBuyLimitIndexList]
|
if queryType == ShareDefine.Def_ShopItem_QueryServerBuyCnt:
|
shopID = msgList[1]
|
limitIndexList = msgList[2]
|
buyCntDict = __GetShopItemServerBuyCntDict(shopID, limitIndexList)
|
result = [queryType, shopID, buyCntDict]
|
|
# ¹ºÂòÎïÆ·[queryType, shopID, itemShopIndex, buyCount, serverMaxBuyCnt]
|
elif queryType == ShareDefine.Def_ShopItem_BuyItem:
|
shopID = msgList[1]
|
itemShopIndex = msgList[2]
|
buyCount = msgList[3]
|
serverMaxBuyCnt = msgList[4]
|
buyCntDict = __GetShopItemServerBuyCntDict(shopID, [itemShopIndex])
|
serverBuyCnt = buyCntDict.get(itemShopIndex, 0)
|
# ÒѹºÂòµÄ + Òª¹ºÂòµÄ ²»³¬¹ý£¬ÔòÔÊÐí¹ºÂò
|
canBuy = 0 if (serverBuyCnt + buyCount) > serverMaxBuyCnt else 1
|
GameWorld.DebugLog("¹ºÂòÈ«·þÏÞ¹ºÎïÆ·£ºÈ«·þÒѹºÂò=%s,Óû¹ºÂò=%s,×î´ó¹ºÂò=%s,canBuy=%s"
|
% (serverBuyCnt, buyCount, serverMaxBuyCnt, canBuy))
|
if canBuy:
|
serverBuyCnt = __AddShopItemServerBuyCnt(shopID, itemShopIndex, buyCount)
|
|
# ֪ͨȫ·þÔÚÏßÍæ¼Ò¸ÃÎïÆ·ÏÞ¹º´ÎÊý±ä¸ü
|
syncInfo = "%s" % [ShareDefine.Def_ShopItem_SyncServerBuyCnt, shopID,
|
itemShopIndex, serverBuyCnt]
|
playerManager = GameWorld.GetPlayerManager()
|
for i in range(0, playerManager.GetPlayerCount()):
|
player = playerManager.GetPlayerByIndex(i)
|
# ×Ô¼ºÓÉMapServer¹ºÂòºóͬ²½
|
# ÒòΪÓпÉÄܸÄÎïÆ·Ò²ÓиöÈËÏÞ¹º£¬ÐèMapServer´¦ÀíÍêºóÔÙͬ²½
|
if player == None or not player.GetInitOK():
|
continue
|
|
if player.GetPlayerID() == curPlayer.GetPlayerID():
|
#GameWorld.DebugLog(" ×Ô¼ºÏȲ»Í¬²½")
|
continue
|
|
player.MapServer_QueryPlayerResult(0, 0, "ShopItem", syncInfo, len(syncInfo))
|
|
result = [queryType, shopID, itemShopIndex, buyCount, canBuy, serverBuyCnt]
|
|
|
return result
|
|
|
## Ôö¼ÓÏÞ¹ºÎïÆ·¹ºÂò´ÎÊý
|
# @param shopID É̵êid
|
# @param itemShopIndex ÎïÆ·Ë÷Òý
|
# @param addBuyCount Ôö¼Ó´ÎÊý
|
# @return ¸üкóµÄÒѹºÂò´ÎÊý
|
def __AddShopItemServerBuyCnt(shopID, itemShopIndex, addBuyCount):
|
recTypeListData = __GetShopItemRecData()
|
|
shopItemRec = None
|
for index in range(recTypeListData.Count()):
|
recData = recTypeListData.At(index)
|
curShopID = recData.GetValue1()
|
curItemShopIndex = recData.GetValue2()
|
if curShopID == shopID and curItemShopIndex == itemShopIndex:
|
shopItemRec = recData
|
|
if shopItemRec == None:
|
#»¹Î´¼Ç¼£¬ÔòÌí¼ÓÒ»¸ö¼Ç¼¶ÔÏó
|
shopItemRec = recTypeListData.AddRec()
|
shopItemRec.SetValue1(shopID)
|
shopItemRec.SetValue2(itemShopIndex)
|
shopItemRec.SetValue3(0)
|
|
buyCnt = shopItemRec.GetValue3()
|
buyCnt += addBuyCount
|
shopItemRec.SetValue3(buyCnt)
|
return buyCnt
|
|
|
## »ñÈ¡É̵êÈ«·þÏÞ¹ºÎïÆ·¶ÔÓ¦ÒѹºÂò¸öÊý
|
# @param shopID
|
# @param indexList
|
# @return {index:buyCnt, ...}
|
def __GetShopItemServerBuyCntDict(shopID, indexList):
|
findCnt = 0
|
buyCntDict = {}
|
recTypeListData = __GetShopItemRecData()
|
|
for index in range(recTypeListData.Count()):
|
recData = recTypeListData.At(index)
|
curShopID = recData.GetValue1()
|
itemShopIndex = recData.GetValue2()
|
buyCnt = recData.GetValue3()
|
if curShopID == shopID and itemShopIndex in indexList:
|
buyCntDict[itemShopIndex] = buyCnt
|
findCnt += 1
|
if findCnt >= len(indexList):
|
break
|
|
return buyCntDict
|
|
|
## »ñÈ¡É̵êRecÊý¾Ý
|
# @param None
|
# @return recTypeListData
|
def __GetShopItemRecData():
|
recType = ShareDefine.Def_UniversalGameRecType_ShopItem
|
universalRecMgr = GameWorld.GetUniversalRecMgr()
|
recTypeListData = universalRecMgr.GetTypeList(recType)
|
return recTypeListData
|
|
## µØÍ¼Æô¶¯Í¨Öª
|
# @param None
|
# @return
|
def OnMapServerInitOK():
|
|
TimeShopRefreshDict = ReadChConfig.GetEvalChConfig("TimeShopRefresh")
|
|
gameWorld = GameWorld.GetGameWorld()
|
|
for shopID in TimeShopRefreshDict.keys():
|
|
isOpen = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_ShopState % shopID)
|
|
if not isOpen:
|
continue
|
|
lastRefreshTime = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_TimeShopRefreshTime % shopID)
|
|
GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_ShopState % shopID, isOpen)
|
GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_TimeShopRefreshTime % shopID, lastRefreshTime)
|
|
return
|
|
## Íæ¼ÒµÇ¼
|
# @param curPlayer
|
# @return
|
def OnPlayerLogin(curPlayer):
|
Sync_TimeShopRefreshTime(curPlayer)
|
return
|
|
## É̵ê״̬±ä¸ü´¦Àí
|
# @param curPlayer
|
# @param isOpen
|
# @return
|
def OnShopStateChange(dictName, isOpen):
|
shopID = dictName[len(ShareDefine.Def_Notify_WorldKey_ShopState) - 2:]
|
try:
|
shopID = int(shopID)
|
except BaseException:
|
GameWorld.ErrLog("É̵êIDÅäÖÃkey´íÎó, key=%s" % dictName)
|
return
|
|
TimeShopRefreshDict = ReadChConfig.GetEvalChConfig("TimeShopRefresh")
|
|
if shopID in TimeShopRefreshDict:
|
__DoTimeShopStateChange(shopID, isOpen)
|
|
return
|
|
## Ö´ÐÐÉ̵ê״̬±ä¸ü´¦Àí
|
# @param shopID
|
# @param isOpen
|
# @return
|
def __DoTimeShopStateChange(shopID, isOpen):
|
|
if not isOpen:
|
return
|
|
curTime = int(time.time())
|
|
gameWorld = GameWorld.GetGameWorld()
|
gameWorld.SetDict(ShareDefine.Def_Notify_WorldKey_TimeShopRefreshTime % shopID, curTime)
|
GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_TimeShopRefreshTime % shopID, curTime)
|
Sync_TimeShopRefreshTime()
|
return
|
|
|
## ¶¨Ê±É̵êÎïÆ·Ë¢ÐÂ
|
# @param tick
|
# @return
|
def Dispose_ShopItemRefresh(tick):
|
|
if not GameWorld.SetWorldDictKey(ChConfig.TYPE_TimeShopProcessTick, tick):
|
return
|
|
TimeShopRefreshDict = ReadChConfig.GetEvalChConfig("TimeShopRefresh")
|
|
isNeedSyncTime = False
|
curTime = int(time.time())
|
gameWorld = GameWorld.GetGameWorld()
|
|
for shopID, refreshInterval in TimeShopRefreshDict.items():
|
|
isOpen = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_ShopState % shopID)
|
|
if not isOpen:
|
continue
|
|
lastRefreshTime = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_TimeShopRefreshTime % shopID)
|
|
if not lastRefreshTime:
|
continue
|
|
pastTime = max(0, curTime - lastRefreshTime)
|
|
if pastTime >= refreshInterval:
|
gameWorld.SetDict(ShareDefine.Def_Notify_WorldKey_TimeShopRefreshTime % shopID, curTime)
|
GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_TimeShopRefreshTime % shopID, curTime)
|
isNeedSyncTime = True
|
|
if isNeedSyncTime:
|
Sync_TimeShopRefreshTime()
|
|
return
|
|
|
## ͬ²½¶¨Ê±É̵êˢе¹¼ÆÊ±
|
# @param curPlayer
|
# @return
|
def Sync_TimeShopRefreshTime(curPlayer=None):
|
|
refreshTimeListPack = ChPyNetSendPack.tagGCShopRefreshTimeList()
|
|
refreshTimeListPack.Clear()
|
refreshTimeListPack.ShopTimeInfoList = []
|
|
TimeShopRefreshDict = ReadChConfig.GetEvalChConfig("TimeShopRefresh")
|
gameWorld = GameWorld.GetGameWorld()
|
curTime = int(time.time())
|
|
for shopID, refreshInterval in TimeShopRefreshDict.items():
|
|
isOpen = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_ShopState % shopID)
|
|
if not isOpen:
|
continue
|
|
lastRefreshTime = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_TimeShopRefreshTime % shopID)
|
|
if not lastRefreshTime:
|
continue
|
|
passTime = max(0, curTime - lastRefreshTime)
|
|
refreshShopTime = ChPyNetSendPack.tagGCShopRefreshTime()
|
refreshShopTime.Clear()
|
refreshShopTime.ShopID = shopID
|
refreshShopTime.RemainSecond = max(0, refreshInterval - passTime)
|
|
refreshTimeListPack.ShopTimeInfoList.append(refreshShopTime)
|
|
refreshTimeListPack.ShopCnt = len(refreshTimeListPack.ShopTimeInfoList)
|
|
if refreshTimeListPack.ShopCnt <= 0:
|
return
|
|
# ֪ͨ¿Í»§¶Ëͬ²½Ê±¼ä
|
if not curPlayer:
|
# È«·þ¹ã²¥ÔÚÏßÍæ¼Ò
|
playerManager = GameWorld.GetPlayerManager()
|
for i in range(0, playerManager.GetPlayerCount()):
|
curPlayer = playerManager.GetPlayerByIndex(i)
|
if curPlayer == None or curPlayer.GetPlayerID() <= 0:
|
continue
|
|
NetPackCommon.SendFakePack(curPlayer, refreshTimeListPack)
|
else:
|
NetPackCommon.SendFakePack(curPlayer, refreshTimeListPack)
|
return
|
|