#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#
|
#
|
##@package PlayerBourse.py
|
#
|
# @todo:Íæ¼Ò½»Ò×Ëù¹ÜÀíÆ÷
|
#
|
# @author xmnathan
|
# @date 2010-01-01 21:30
|
# @version 1.5
|
# @note:
|
# @change: "2014-05-17 11:30" xmnathan Ôö¼Ó¿ª¹Ø
|
# @change: "2014-05-20 10:40" xmnathan Íæ¼Ò½»Ò×Ëù
|
# @change: "2014-05-21 20:00" xmnathan ÐÞÕý²éѯÊýÁ¿´íÎóµ¼Öµı¨´í
|
# @change: "2014-09-18 15:00" xmnathan Ôö¼Ó½»Ò×Á÷Ïò
|
# @change: "2014-10-20 18:00" xmnathan Ôö¼ÓÎïÆ·ÊÛ³ö²¹³¥ÓʼþÌáÐÑ
|
#------------------------------------------------------------------------------
|
"""Version = 2014-10-20 18:00"""
|
#------------------------------------------------------------------------------
|
import GameWorld
|
import IPY_GameServer
|
import ChGameToMapPyPack
|
import NetPackCommon
|
import datetime
|
import PlayerDBGSEvent
|
import CommFunc
|
import PlayerControl
|
import DataRecordPack
|
import IpyGameDataPY
|
import PyGameDataStruct
|
import PyDataManager
|
import ChPyNetSendPack
|
import PyGameData
|
|
import time
|
import json
|
|
|
g_lastSortTimeForQueryTypeDict = {} #¼Ç¼¶ÔÓ¦²éѯÀàÐÍÉϴθüÐÂ×ÓË÷ÒýÁбíʱ¼ä
|
g_dict_Of_QueryTypeIndexList = {} #´¢´æ¶ÔÓ¦²éѯÀàÐ͵ÄÅÅÐòÁбíµÄ×Öµä
|
|
Def_Bourse_Buy = 0 # ¹ºÂò
|
Def_Bourse_Sell = 1 # Âô³ö
|
|
#------------------------------------------------------------------------------
|
#½»Ò×Ëù״̬¿ª¹Ø
|
def GetOpenState():
|
BourseDefState = IpyGameDataPY.GetFuncCfg('BourseDefState')
|
return PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_BourseState, BourseDefState)
|
|
def SetOpenState(value):
|
PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_BourseState, value > 0)
|
return
|
#------------------------------------------------------------------------------
|
|
##»ñȡָ¶¨²éѯÀàÐͶ¨ÒåÅäÖÃ
|
# @param queryType
|
# @return None
|
def GetBourseQueryTypeDefineDict(queryType):
|
BourseQueryTypeDict = IpyGameDataPY.GetConfigEx("BourseQueryTypeDict")
|
if BourseQueryTypeDict and queryType in BourseQueryTypeDict:
|
return BourseQueryTypeDict[queryType]
|
if not BourseQueryTypeDict:
|
BourseQueryTypeDict = {}
|
|
ipyData = IpyGameDataPY.GetIpyGameData('MarketQuery', queryType)
|
if not ipyData:
|
return {}
|
LimitInfo = ipyData.GetLimitInfo()
|
BourseQueryTypeDict[queryType] = LimitInfo
|
|
IpyGameDataPY.SetConfigEx("BourseQueryTypeDict", BourseQueryTypeDict)
|
return LimitInfo
|
|
#------------------------------------------------------------------------------
|
##1B 01 ²éÑ¯Íæ¼Ò½»Ò×ËùÎïÆ· tagCGQueryPlayerBourseItem
|
# @param index
|
# @param tick
|
# @return None
|
def OnQueryPlayerBourseItem(index, tick):
|
if not GetOpenState():
|
return
|
GameWorld.GetPsycoFunc(__Func_QueryPlayerBourseItem)(index, tick)
|
return
|
|
##1B 01 ²éÑ¯Íæ¼Ò½»Ò×ËùÎïÆ· tagCGQueryPlayerBourseItem
|
# @param index
|
# @param tick
|
# @return None
|
def __Func_QueryPlayerBourseItem(index, tick):
|
GameWorld.DebugLog("Bourse### QueryPlayerBourseItem in")
|
playerManager = GameWorld.GetPlayerManager()
|
curPlayer = playerManager.GetPlayerByIndex(index)
|
SyncPlayerBourseItem(curPlayer)
|
GameWorld.DebugLog("Bourse### QueryPlayerBourseItem out")
|
|
##²éÑ¯Íæ¼Ò½»Ò×ËùÎïÆ·
|
# @param curPlayer
|
# @return None
|
def SyncPlayerBourseItem(curPlayer):
|
if not GetOpenState():
|
return
|
|
#֪ͨ¿Í»§¶ËÍæ¼Ò×Ô¼º¹Òµ¥ÎïÆ·Áбí
|
curPlayer.Sync_PlayerBourseItem()
|
return
|
|
def CheckPlayerEarnings(curPlayer):
|
##Íæ¼ÒÂô³öÎïÆ·ÊÕÒæ·¢·Å
|
curPlayerID = curPlayer.GetID()
|
bourseManager = GameWorld.GetBourseManager()
|
curPlayerItemCount = bourseManager.GetPlayerBourseItemCount(curPlayerID)
|
DelItemList = []
|
for i in xrange(curPlayerItemCount):
|
curBourseItemData = bourseManager.GetPlayerBourseItemByIndex(curPlayerID, i)
|
if not curBourseItemData:
|
continue
|
if curBourseItemData.GetIsSoldOut() and curBourseItemData.GetCustomerPlayerID() != 0 and \
|
curBourseItemData.GetCustomerPlayerID() != curBourseItemData.GetPlayerID():
|
if __GivePlayerBourseGains(curBourseItemData):
|
DelItemList.append(curBourseItemData.GetItemGUID())
|
|
for itemGUID in DelItemList:
|
bourseManager.DeleteByGUID(itemGUID)
|
return
|
|
## Íæ¼ÒµÇ¼
|
def OnPlayerLogin(curPlayer):
|
#֪ͨ½»Ò׼Ǽ
|
PyDataManager.GetBourseRecordManager().SyncBourseRecord(curPlayer, True)
|
#ÉÏÏß¼ì²éÂô³öµÄÎïÆ·¸øÂô¼ÒÊÕÒæ
|
CheckPlayerEarnings(curPlayer)
|
SyncPlayerBourseItem(curPlayer)
|
return
|
#------------------------------------------------------------------------------
|
##1B 05 ½»Ò×Ëù²éѯÉϼÜÎïÆ·#tagCGQueryBourseItemOnSale
|
# @param index
|
# @param tick
|
# @return None
|
def OnQueryBourseItemOnSale(index, tick):
|
if not GetOpenState():
|
return
|
GameWorld.GetPsycoFunc(__Func_QueryBourseItemOnSale)(index, tick)
|
return
|
|
##1B 05 ½»Ò×Ëù²éѯÉϼÜÎïÆ·#tagCGQueryBourseItemOnSale
|
# @param index
|
# @param tick
|
# @return None
|
def __Func_QueryBourseItemOnSale(index, tick):
|
return
|
|
#// B5 01 ½»Ò×Ëù²éѯÉϼÜÎïÆ·#tagCGPYQueryBourseItemOnSale
|
#
|
#struct tagCGPYQueryBourseItemOnSale
|
#{
|
# tagHead Head;
|
# DWORD QueryType; //²éѯµÄ·ÖÀà±êʶ
|
# char ItemName[33]; //ÎïÆ·Ãû£¨Ä£ºý²éѯ)
|
# DWORD ItemID; //ÎïÆ·ID
|
#};
|
def OnPYQueryBourseItemOnSale(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
queryType = clientData.QueryType
|
itemName = clientData.ItemName
|
itemID = clientData.ItemID
|
if itemName or itemID:
|
bourseManager = GameWorld.GetBourseManager()
|
bourseItemCount = bourseManager.Count()
|
|
#µ¹Ðò²éѯ,(×ܱí¸ù¾Ý²åÈëʱ¼äÅÅÐò£¬Ô½ÔçµÄÅÅÔÚÔ½Ç°Ãæ)
|
bourseItemDataList = []
|
for i in xrange(bourseItemCount - 1, -1, -1):
|
curBourseItemData = bourseManager.At(i)
|
if CheckBourseItemDataSaleState(curBourseItemData):
|
continue
|
#GameWorld.Log("itemName=%s,curBourseItemData.GetItemName()=%s"%(itemName,curBourseItemData.GetItemName()))
|
if itemName and itemName in curBourseItemData.GetItemName():
|
bourseItemDataList.append(curBourseItemData)
|
continue
|
if itemID and itemID == curBourseItemData.GetItemTypeID():
|
bourseItemDataList.append(curBourseItemData)
|
continue
|
|
queryCount = len(bourseItemDataList)
|
curPlayer.Begin_AddBourseItemOnSale(queryType, 0, queryCount, queryCount)
|
for bourseItemData in bourseItemDataList:
|
curPlayer.Add_BourseItemOnSale(bourseItemData)
|
curPlayer.Sync_BourseItemOnSale()
|
if itemID: #Èç¹ûÊDzéѯIDµÄ£¬Í¬Ê±Í¨Öª¸ÃÎïÆ·µÄ×îгɽ»¼Û
|
PyDataManager.GetBourseItemLastPriceManager().SyncBourseItemPrice(curPlayer, itemID)
|
|
else:
|
#¸ù¾Ý²éѯÀàÐÍ»ñÈ¡ÏàÓ¦»õÆ·Áбí
|
queryTypeList = GetTypeList(queryType, tick)
|
queryTypeCount = len(queryTypeList) #²éѯµ½µÄÎïÆ·×ÜÊý
|
GameWorld.DebugLog("Bourse### QueryBourseItemOnSale queryTypeCount=%s, queryType=%s" % (queryTypeCount, queryType))
|
curPlayer.Begin_AddBourseItemOnSale(queryType, 0, queryTypeCount, queryTypeCount)
|
for i in xrange(queryTypeCount):
|
curPlayer.Add_BourseItemOnSale(queryTypeList[i])
|
|
curPlayer.Sync_BourseItemOnSale()
|
|
GameWorld.DebugLog("Bourse### QueryBourseItemOnSale out")
|
return
|
|
|
##»ñµÃÖ¸¶¨²éѯÀàÐ͵ĻõÆ·Áбí
|
# @param queryType
|
# @return queryTypeList
|
def GetTypeList(queryType, tick):
|
global g_lastSortTimeForQueryTypeDict
|
global g_dict_Of_QueryTypeIndexList
|
|
lastSortTick = g_lastSortTimeForQueryTypeDict.get(queryType, 0)
|
|
queryTypeList = g_dict_Of_QueryTypeIndexList.get(queryType, None)
|
Def_Sort_IndexList_Interval = IpyGameDataPY.GetFuncCfg('BourseUpdataCD') #Îå·ÖÖÓ¸üÐÂÒ»´Î×ÓË÷ÒýÁбí
|
if queryTypeList == None or tick - lastSortTick > Def_Sort_IndexList_Interval:
|
SortIndexList(queryType)#ÖØÐÂÅÅÐòÖ¸¶¨ÀàÐÍ
|
lastSortTick = tick
|
g_lastSortTimeForQueryTypeDict[queryType] = tick
|
|
return g_dict_Of_QueryTypeIndexList.get(queryType, [])
|
|
##¶ÔÖ¸¶¨ÀàÐ͵ÄË÷ÒýÁÐ±í½øÐÐɸѡÅÅÐò
|
# @param queryType
|
# @return queryTypeList
|
def SortIndexList(queryType):
|
global g_dict_Of_QueryTypeIndexList
|
curQueryTypeList = []
|
bourseManager = GameWorld.GetBourseManager()
|
bourseItemCount = bourseManager.Count()
|
#µ¹Ðò²éѯ,(×ܱí¸ù¾Ý²åÈëʱ¼äÅÅÐò£¬Ô½ÔçµÄÅÅÔÚÔ½Ç°Ãæ)
|
for index in xrange(bourseItemCount - 1, -1, -1):
|
curBourseItemData = bourseManager.At(index)
|
if CheckBourseItemDataSaleState(curBourseItemData):
|
continue
|
#¸ù¾ÝÌõ¼þɸѡÎïÆ·
|
if CheckQueryTypeItem(curBourseItemData, queryType):
|
curQueryTypeList.append(curBourseItemData)
|
|
g_dict_Of_QueryTypeIndexList[queryType] = curQueryTypeList
|
return
|
|
|
##¼ì²éÎïÆ·ÊÇ·ñ·ûºÏµ±Ç°ÀàÐÍɸѡÌõ¼þ
|
# @param curBourseItemData: ÎïÆ·ÊµÀý
|
# @return IsSoldOut
|
def CheckQueryTypeItem(curBourseItemData, queryType):
|
curDefineDict = GetBourseQueryTypeDefineDict(queryType)
|
if curDefineDict == {}:
|
return False
|
#Ö¸¶¨ÎïÆ·ID
|
SpecialItemIDList = curDefineDict.get("SpecialItemID", [])
|
if SpecialItemIDList:
|
if curBourseItemData.GetItemTypeID() not in SpecialItemIDList:
|
return False
|
#Ö¸¶¨ÎïÆ·ÀàÐÍ
|
ItemTypeList = curDefineDict.get("ItemType", [])
|
if ItemTypeList:
|
if curBourseItemData.GetType() not in ItemTypeList:
|
return False
|
#Ö¸¶¨×°±¸×°±¸Î»ÖÃ
|
EquipPlaceList = curDefineDict.get("EquipPlace", [])
|
if EquipPlaceList:
|
if curBourseItemData.GetEquipPlace() not in EquipPlaceList:
|
return False
|
#Ö¸¶¨Ê¹ÓÃÖ°Òµ
|
JobList = curDefineDict.get("Job", [])
|
if JobList:
|
JobLimit = curBourseItemData.GetJobLimit()
|
if JobLimit not in JobList:
|
return False
|
|
#Ö¸¶¨µÈ¼¶
|
LimitUseLV = curDefineDict.get("LimitUseLV", [])
|
if LimitUseLV:
|
if curBourseItemData.GetUseLV() not in LimitUseLV:
|
return False
|
|
#׿ԽÎïÆ·
|
ItemQuality = curDefineDict.get("ItemQuality", [])
|
if ItemQuality:
|
if curBourseItemData.GetItemQuality() not in ItemQuality:
|
return False
|
|
#Ì××°ÎïÆ·
|
# IsSuite = curDefineDict.get("IsSuite", [])
|
# if IsSuite:
|
# if curBourseItemData.GetIsSuite() not in IsSuite:
|
# return False
|
return True
|
|
|
#------------------------------------------------------------------------------
|
##¼ì²é¹Òµ¥ÎïÆ·ÊÇ·ñ³¬Ê±
|
# @param curBourseItemData: ÎïÆ·ÊµÀý
|
# @return IsSoldOut
|
def CheckBourseItemDataSaleState(curBourseItemData):
|
if curBourseItemData.GetIsSoldOut():
|
return True
|
|
return False
|
|
|
##»ñµÃÓëÏÖʵʱ¼ä²î¾àµÄ·ÖÖÓÊý
|
# @param compareTimeStr ±È½Ïʱ¼ä×Ö·û Èç"2010-05-26 11:21:25"
|
# @return ·µ»ØÖµ, Ïà²îµÄ·ÖÖÓÊý
|
# @remarks »ñµÃÓëÏÖʵʱ¼ä²î¾àµÄ·ÖÖÓÊý
|
def GetPastMinute(compareTimeStr):
|
curDataTime = datetime.datetime.today()
|
compareDataTime = GameWorld.GetDateTimeByStr(compareTimeStr)
|
if curDataTime == None or compareDataTime == None:
|
return 0
|
pastTimeDelta = curDataTime - compareDataTime
|
#ÌìÊý * 24Сʱ * 60 ·ÖÖÓ + Ãë / 60
|
return pastTimeDelta.days * 24 * 60 + pastTimeDelta.seconds / 60
|
#------------------------------------------------------------------------------
|
#//02 01 ѯÎÊÊÇ·ñ¿ÉÒÔÌí¼ÓÍæ¼Ò½»Ò×ËùÎïÆ·#tagMGCheckAddPlayerBourseItem
|
#{
|
#tagHead Head;
|
#DWORD PlayerID;
|
#BYTE ItemIndex; //ÎïÆ·ÔÚ±³°üÖÐË÷Òý
|
#WORD Count; //³öÊÛÊýÁ¿
|
#BYTE PriceType; //³öÊÛ¼Û¸ñÀàÐÍ
|
#DWORD PriceCount;//³öÊÛ¼Û¸ñ
|
#char Pwd[8]; //½»Ò×ÃÜÂë
|
#};
|
##//02 01 ѯÎÊÊÇ·ñ¿ÉÒÔÌí¼ÓÍæ¼Ò½»Ò×ËùÎïÆ·#tagMGCheckAddPlayerBourseItem
|
# @param routeIndex, mapID, curPackData, tick
|
# @return None
|
def OnMGCheckAddPlayerBourseItem(routeIndex, mapID, curPackData, tick):
|
GameWorld.DebugLog("Bourse### MGCheckAddPlayerBourseItem in,PlayerID %s" % curPackData.PlayerID)
|
if not GetOpenState():
|
return
|
GameWorld.DebugLog("Bourse### MGCheckAddPlayerBourseItem PlayerID=%s ItemIndex=%s Count=%s PriceType=%s PriceCount=%s" % (curPackData.PlayerID,
|
curPackData.ItemIndex, curPackData.Count, curPackData.PriceType, curPackData.PriceCount))
|
curPlayerID = curPackData.PlayerID
|
bourseManager = GameWorld.GetBourseManager()
|
count = bourseManager.GetPlayerBourseItemCount(curPlayerID)
|
GameWorld.DebugLog("Bourse### MGCheckAddPlayerBourseItem now count %s" % count)
|
BourseCountLimit = IpyGameDataPY.GetFuncCfg('BourseSaleLimit')
|
|
#//02 01 ²éÑ¯Íæ¼ÒÊÇ·ñ¿ÉÒÔÌí¼Ó½»Ò×ËùÎïÆ·½á¹û#tagGMCheckAddPlayerBourseItemResult
|
sendPack = ChGameToMapPyPack.tagGMCheckAddPlayerBourseItemResult()
|
sendPack.PlayerID = curPlayerID
|
sendPack.ItemIndex = curPackData.ItemIndex
|
sendPack.Count = curPackData.Count
|
sendPack.PriceType = curPackData.PriceType
|
sendPack.PriceCount = curPackData.PriceCount
|
sendPack.Pwd = curPackData.Pwd
|
sendPack.Result = (count < BourseCountLimit) #·µ»Ø¿É·ñ¼ÌÐøÌí¼Ó
|
NetPackCommon.SendPyPackToMapServer(routeIndex, mapID, sendPack)
|
GameWorld.DebugLog("Bourse### MGCheckAddPlayerBourseItem out Result %s" % sendPack.Result)
|
return
|
|
##//02 02 Íæ¼Ò½»Ò×ËùÌí¼Ó³öÊÛµÄÎïÆ·#tagMGAddPlayerSellBourseItem
|
# @param routeIndex, mapID, curPackData, tick
|
# @return None
|
def OnMGAddPlayerSellBourseItem(routeIndex, mapID, curPackData, tick):
|
GameWorld.DebugLog("Bourse### MGAddPlayerSellBourseItem in")
|
if not GetOpenState():
|
return
|
GameWorld.DebugLog("Bourse### MGAddPlayerSellBourseItem PlayerID %s" % (curPackData.PlayerID))
|
curPlayerID = curPackData.PlayerID
|
bourseManager = GameWorld.GetBourseManager()
|
|
curBourseRoleItem = IPY_GameServer.IpyBourseRoleItem()
|
curBourseRoleItem.Count = curPackData.Count
|
curBourseRoleItem.ItemID = curPackData.ItemTypeID
|
curBourseRoleItem.UserData = curPackData.UserData
|
|
#GameWorld.DebugLog("Bourse### OnMGAddPlayerSellBourseItem UserData Src =¡¾%s¡¿ Des=¡¾%s¡¿"%(curPackData.UserData, curBourseRoleItem.UserData))
|
|
curBourseItem = bourseManager.AddItem(curPlayerID, curPackData.PlayerName, curBourseRoleItem)
|
|
#ÉèÖóöÊÛ¼Û¸ñ
|
curBourseItem.SetPriceType(curPackData.PriceType)
|
curBourseItem.SetPriceCount(curPackData.PriceCount)
|
#´¢´æÐèÒªÓõ½µÄϵͳ±íÊý¾Ý
|
curBourseItem.SetType(curPackData.Type)
|
curBourseItem.SetEquipPlace(curPackData.EquipPlace)
|
curBourseItem.SetLV(curPackData.LV)
|
curBourseItem.SetUseLV(curPackData.UseLV)
|
curBourseItem.SetJobLimit(curPackData.JobLimit)
|
curBourseItem.SetItemQuality(curPackData.ItemQuality)
|
curBourseItem.SetItemColor(curPackData.ItemColor)
|
curBourseItem.SetItemTypeID(curPackData.ItemTypeID)
|
curBourseItem.SetItemName(curPackData.ItemName.strip())
|
curBourseItem.SetPwd(curPackData.Pwd.strip())
|
curBourseItem.SetEquipGS(curPackData.EquipGS)
|
curBourseItem.SetOperateInfo(curPackData.OperateInfo)
|
#ÉèÖóöÊÛʱ¼ä
|
curBourseItem.SetOnSaleTime(GameWorld.GetCurrentDataTimeStr())
|
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(curPlayerID)
|
if curPlayer:
|
#֪ͨ¿Í»§¶Ë Íæ¼Ò×Ô¼ºµÄ½»Òׯ·
|
SyncPlayerBourseItem(curPlayer)
|
#Á÷Ïò¼Ç¼
|
DataRecordPack.DR_BourseAddItem(curPlayerID, curBourseItem)
|
GameWorld.DebugLog("Bourse### MGAddPlayerSellBourseItem out")
|
return
|
#------------------------------------------------------------------------------
|
##//02 03 Íæ¼ÒѯÎʹºÂò½»Ò×ËùÎïÆ·#tagMGCheckBuyBourseItem
|
# @param routeIndex, mapID, curPackData, tick
|
# @return None
|
def OnMGCheckBuyBourseItem(routeIndex, mapID, curPackData, tick):
|
GameWorld.DebugLog("Bourse### MGCheckBuyBourseItem in, PlayerID %s" % curPackData.PlayerID)
|
if not GetOpenState():
|
return
|
bourseManager = GameWorld.GetBourseManager()
|
curBourseItem = bourseManager.FindByGUID(curPackData.ItemGUID)
|
if not curBourseItem:
|
#ÎïÆ·²»´æÔÚ
|
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(curPackData.PlayerID)
|
if curPlayer:
|
PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_403656")
|
GameWorld.DebugLog("Bourse### MGCheckBuyBourseItem ItemGUID %s No Found" % (curPackData.ItemGUID))
|
return
|
|
if curBourseItem.GetPlayerID() == curPackData.PlayerID:
|
#ÊÇ×Ô¼ºµÄ¶«Î÷ ²»ÄÜÂò
|
GameWorld.DebugLog("Bourse### MGCheckBuyBourseItem ItemGUID %s is SelfItem" % (curPackData.ItemGUID))
|
return
|
if curBourseItem.GetIsSoldOut():
|
#ÎïÆ·ÒÑÊÛ³ö
|
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(curPackData.PlayerID)
|
if curPlayer:
|
PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_403656")
|
GameWorld.DebugLog("Bourse### MGCheckBuyBourseItem ItemGUID %s is SoldOut" % (curPackData.ItemGUID))
|
return
|
#¼ì²é½»Ò×ÃÜÂë
|
if curBourseItem.GetPwd().strip() != curPackData.Pwd.strip():
|
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(curPackData.PlayerID)
|
if curPlayer:
|
PlayerControl.NotifyCode(curPlayer, "BoursePasswordError")
|
GameWorld.DebugLog("Bourse### MGCheckBuyBourseItem ItemGUID %s pwd is error! %s != %s" % (curPackData.ItemGUID, curBourseItem.GetPwd(), curPackData.Pwd))
|
return
|
#ÎïÆ·½»Ò×Ëø¶¨×´Ì¬ÅжÏ
|
curTime = int(time.time())
|
if curPackData.ItemGUID in PyGameData.g_bourseItemTradingTimeDict:
|
if curTime - PyGameData.g_bourseItemTradingTimeDict.get(curPackData.ItemGUID, 0) < 10:
|
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(curPackData.PlayerID)
|
if curPlayer:
|
PlayerControl.NotifyCode(curPlayer, "MarketNoPutaway5")
|
return
|
PyGameData.g_bourseItemTradingTimeDict[curPackData.ItemGUID] = curTime
|
|
#//02 02 Íæ¼Ò¹ºÂò½»Ò×ËùÎïÆ·²éѯ½á¹û#tagGMCheckBuyBourseItemResult
|
sendPack = ChGameToMapPyPack.tagGMCheckBuyBourseItemResult()
|
sendPack.PlayerID = curPackData.PlayerID
|
sendPack.ItemGUID = curPackData.ItemGUID
|
sendPack.PriceType = curBourseItem.GetPriceType()
|
sendPack.PriceCount = curBourseItem.GetPriceCount()
|
sendPack.ItemName = curBourseItem.GetItemName()
|
|
NetPackCommon.SendPyPackToMapServer(routeIndex, mapID, sendPack)
|
GameWorld.DebugLog("Bourse### MGCheckBuyBourseItem out")
|
return
|
|
|
##//02 04 Íæ¼ÒÈ·ÈϹºÂò½»Ò×ËùÎïÆ·#tagMGBuyBourseItemSure
|
# @param routeIndex, mapID, curPackData, tick
|
# @return None
|
def OnMGBuyBourseItemSure(routeIndex, mapID, curPackData, tick):
|
GameWorld.DebugLog("Bourse### MGBuyBourseItemSure in, PlayerID %s" % curPackData.PlayerID)
|
if not GetOpenState():
|
return
|
curPlayerID = curPackData.PlayerID
|
bourseManager = GameWorld.GetBourseManager()
|
curBourseItem = bourseManager.FindByGUID(curPackData.ItemGUID)
|
if not curBourseItem:
|
#ÎïÆ·²»´æÔÚ
|
GameWorld.Log("Íæ¼ÒÈ·ÈϹºÂò½»Ò×ËùÎïÆ· ÒѸ¶Ç®£¡£¬Bourse### MGBuyBourseItemSure ItemGUID %s No Found" % (curPackData.ItemGUID), curPlayerID)
|
return
|
|
if CheckBourseItemDataSaleState(curBourseItem):
|
GameWorld.Log("Íæ¼ÒÈ·ÈϹºÂò½»Ò×ËùÎïÆ· Bourse### MGBuyBourseItemSure ItemGUID %s SoldOut" % (curPackData.ItemGUID), curPlayerID)
|
return
|
if not curPackData.PlayerName: #Ϊ¿Õʱ´ú±íµØÍ¼ÅжϹºÂòʧ°Ü
|
PyGameData.g_bourseItemTradingTimeDict.pop(curPackData.ItemGUID, 0)
|
return
|
|
#¸øÎïÆ·//02 03 Íæ¼Ò»ñÈ¡½»Ò×ËùÎïÆ·½á¹û#tagGMGiveBourseItem
|
sendPack = GetGMGiveBourseItemPack(curPlayerID, curBourseItem)
|
NetPackCommon.SendPyPackToMapServer(routeIndex, mapID, sendPack)
|
#ÉèÖý»Òׯ·ÎªÒÑÊÛ³ö״̬
|
curBourseItem.SetIsSoldOut(True)
|
curBourseItem.SetCustomerPlayerID(curPlayerID)
|
curBourseItem.SetCustomerPlayerName(curPackData.PlayerName)
|
soldOutTime = int(time.time())
|
curBourseItem.SetSoldOutTime(str(soldOutTime))
|
PyGameData.g_bourseItemTradingTimeDict.pop(curPackData.ItemGUID, 0)
|
#֪ͨ¹Ë¿Í¹ºÂòÎïÆ·×´Ì¬±ä¸ü
|
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(curPlayerID)
|
if curPlayer:
|
curPlayer.Begin_AddBourseItemOnSale(255, 0, 1, 1)
|
curPlayer.Add_BourseItemOnSale(curBourseItem)
|
curPlayer.Sync_BourseItemOnSale()
|
|
|
#¸üÐÂ×îгɽ»µ¥¼Û
|
unitPrice = curBourseItem.GetPriceCount() * 1.0 / curBourseItem.GetBourseRoleItem().Count
|
unitPrice = 200000000 if unitPrice < 1 else int(unitPrice) #200000000ÓÃÀ´´ú±í<1
|
PyDataManager.GetBourseItemLastPriceManager().UpdateBourseItemPrice(curBourseItem.GetItemTypeID(), unitPrice)
|
bourseRecordMgr = PyDataManager.GetBourseRecordManager()
|
curRoleItemData = curBourseItem.GetBourseRoleItem()
|
itemInfo = {"itemID":curRoleItemData.ItemID, "userData":curRoleItemData.UserData, "equipGS":curBourseItem.GetEquipGS(), "count":curRoleItemData.Count}
|
bourseRecordMgr.AddBourseRecord(curPlayerID, Def_Bourse_Buy, soldOutTime, itemInfo, 0, curBourseItem.GetPriceCount())
|
sellPlayerID = curBourseItem.GetPlayerID()
|
|
##Á÷Ïò¼Ç¼
|
DataRecordPack.DR_BourseBuyItem(curPlayerID, curBourseItem.GetPlayerID(), curBourseItem)
|
if __GivePlayerBourseGains(curBourseItem):
|
bourseManager.DeleteByGUID(curBourseItem.GetItemGUID())
|
|
curSellPlayer = GameWorld.GetPlayerManager().FindPlayerByID(sellPlayerID)
|
if curSellPlayer:
|
#Íæ¼ÒÔÚÏß Ë¢ÐÂÍæ¼Ò½»Ò×ËùÎïÆ·
|
SyncPlayerBourseItem(curSellPlayer)
|
|
GameWorld.DebugLog("Bourse### MGBuyBourseItemSure out ItemGUID %s" % (curPackData.ItemGUID))
|
return
|
|
def __GivePlayerBourseGains(curBourseItem):
|
##¶«Î÷Âô³ö£¬·¢ÖÁmapServer¸øÊÕÒæ
|
curPlayerID = curBourseItem.GetPlayerID()
|
curSellPlayer = GameWorld.GetPlayerManager().FindPlayerByID(curPlayerID)
|
if not curSellPlayer:
|
return
|
#¸øÇ®
|
curRoleItemData = curBourseItem.GetBourseRoleItem()
|
itemInfo = {"itemID":curRoleItemData.ItemID, "userData":curRoleItemData.UserData, "equipGS":curBourseItem.GetEquipGS(), "count":curRoleItemData.Count}
|
priceCount = curBourseItem.GetPriceCount()
|
priceType = curBourseItem.GetPriceType()
|
itemName = curBourseItem.GetItemName()
|
soldOutTime = GameWorld.ToIntDef(curBourseItem.GetSoldOutTime(), 0)
|
result = str([priceType, priceCount, itemName, soldOutTime, itemInfo])
|
curSellPlayer.MapServer_QueryPlayerResult(0, 0, "GivePlayerBourseGains", result, len(result))
|
|
#Í¨ÖªÍæ¼Ò½»Ò×ËùÎïÆ·±ä¸ü
|
#SyncPlayerBourseItem(curSellPlayer)
|
return True
|
|
def OnGivePlayerBourseGainsResult(curPlayer, resultInfo):
|
#±£´æ½»Ò׼Ǽ
|
soldOutTime, taxMoney, giveMoney, itemInfo = resultInfo
|
bourseRecordMgr = PyDataManager.GetBourseRecordManager()
|
bourseRecordMgr.AddBourseRecord(curPlayer.GetID(), Def_Bourse_Sell, soldOutTime, itemInfo, taxMoney, giveMoney)
|
|
DataRecordPack.DR_BourseGiveGains(curPlayer.GetID(), itemInfo, giveMoney, taxMoney)
|
return
|
|
#------------------------------------------------------------------------------
|
##//02 05 ½»Ò×ËùÍæ¼ÒÈ¡ÏÂÕýÔÚ³öÊÛµÄÎïÆ·»ò³öÊÛÊÕÒæ#tagMGPlayerRecaptureBourseItem
|
# @param routeIndex, mapID, curPackData, tick
|
# @return None
|
def OnMGPlayerRecaptureBourseItem(routeIndex, mapID, curPackData, tick):
|
GameWorld.DebugLog("Bourse### MGPlayerRecaptureBourseItem in PlayerID %s ItemGUID %s" % (curPackData.PlayerID, curPackData.ItemGUID))
|
if not GetOpenState():
|
return
|
curPlayerID = curPackData.PlayerID
|
bourseManager = GameWorld.GetBourseManager()
|
|
curBourseItem = bourseManager.FindByGUID(curPackData.ItemGUID)
|
if not curBourseItem:
|
#ÎïÆ·²»´æÔÚ
|
GameWorld.DebugLog("Bourse### MGPlayerRecaptureBourseItem ItemGUID %s No Found" % (curPackData.ItemGUID))
|
return
|
|
if curBourseItem.GetPlayerID() != curPlayerID:
|
#²»ÊÇ×Ô¼ºµÄ¶«Î÷ ²»ÄÜÈ¡»Ø
|
GameWorld.DebugLog("Bourse### MGPlayerRecaptureBourseItem ItemGUID %s not belong to Player %s" % (curPackData.ItemGUID, curPlayerID))
|
return
|
if curBourseItem.GetIsSoldOut() and curBourseItem.GetCustomerPlayerID() != 0 and \
|
curBourseItem.GetCustomerPlayerID() != curBourseItem.GetPlayerID():
|
|
#¸øÇ®//02 04 Íæ¼Ò»ñµÃ½»Ò×ËùÊÕÒæ#tagGMGivePlayerBourseGains
|
# sendPack = ChGameToMapPyPack.tagGMGivePlayerBourseGains()
|
# sendPack.PlayerID = curPlayerID
|
# sendPack.MoneyType = curBourseItem.GetPriceType()
|
# sendPack.MoneyCount = curBourseItem.GetPriceCount()
|
# NetPackCommon.SendPyPackToMapServer(routeIndex, mapID, sendPack)
|
# ##Á÷Ïò¼Ç¼
|
# DataRecordPack.DR_BourseGiveGains(curPlayerID, curBourseItem)
|
GameWorld.DebugLog("Bourse### MGPlayerRecaptureBourseItem ItemGUID %s GivePlayerBourseGains" % (curPackData.ItemGUID))
|
else:
|
if curPackData.PackSpaceCount <= 0:
|
#Íæ¼Ò±³°ü¿Õ¼ä²»×ã ²»ÄܸøÎïÆ·
|
GameWorld.DebugLog("Bourse### MGPlayerRecaptureBourseItem PlayerID %s noSpaceCount" % curPlayerID)
|
return
|
#¸øÎïÆ·//02 03 Íæ¼Ò»ñÈ¡½»Ò×ËùÎïÆ·½á¹û#tagGMGiveBourseItem
|
sendPack = GetGMGiveBourseItemPack(curPlayerID, curBourseItem)
|
NetPackCommon.SendPyPackToMapServer(routeIndex, mapID, sendPack)
|
##Á÷Ïò¼Ç¼
|
DataRecordPack.DR_BourseCancelItem(curPlayerID, curBourseItem)
|
GameWorld.DebugLog("Bourse### MGPlayerRecaptureBourseItem ItemGUID %s GiveBourseItem" % (curPackData.ItemGUID))
|
|
#ɾ³ý½»Òׯ·
|
bourseManager.DeleteByGUID(curPackData.ItemGUID)
|
|
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(curPlayerID)
|
if curPlayer:
|
#Í¨ÖªÍæ¼Ò½»Ò×ËùÎïÆ·±ä¸ü
|
SyncPlayerBourseItem(curPlayer)
|
GameWorld.DebugLog("Bourse### MGPlayerRecaptureBourseItem out")
|
return
|
|
##¸ù¾Ý½»Ò×ËùÎïÆ·»ñÈ¡¸øÎïÆ··â°ü//02 03 Íæ¼Ò»ñÈ¡½»Ò×ËùÎïÆ·½á¹û#tagGMGiveBourseItem
|
# @param curPlayerID, curBourseItem
|
# @return sendPack
|
def GetGMGiveBourseItemPack(curPlayerID, curBourseItem):
|
#//02 03 Íæ¼Ò»ñÈ¡½»Ò×ËùÎïÆ·½á¹û#tagGMGiveBourseItem
|
sendPack = ChGameToMapPyPack.tagGMGiveBourseItem()
|
sendPack.PlayerID = curPlayerID
|
sendPack.ItemGUID = curBourseItem.GetItemGUID()
|
sendPack.PriceType = curBourseItem.GetPriceType()
|
sendPack.PriceCount = curBourseItem.GetPriceCount()
|
if curPlayerID == curBourseItem.GetPlayerID():
|
sendPack.PriceType = 0
|
sendPack.PriceCount = 0 #×Ô¼ºµÄ¶«Î÷ ²»Óø¶Ç®
|
curRoleItemData = curBourseItem.GetBourseRoleItem()
|
sendPack.ItemID = curRoleItemData.ItemID
|
sendPack.Count = curRoleItemData.Count
|
sendPack.UserData = curRoleItemData.UserData
|
sendPack.UserDataLen = len(curRoleItemData.UserData)
|
sendPack.EquipGS = curBourseItem.GetEquipGS()
|
return sendPack
|
|
#------------------------------------------------------------------------------
|
##УÑé¹ýÆÚ¹ý¾ÃÎïÆ·´¦Àí
|
# @param None
|
# @return None
|
def OverTimeItemsDeal():
|
BourseSaleTimeMinute = IpyGameDataPY.GetFuncCfg('BourseSaleLimit', 2)
|
|
DelItemDict = {}
|
bourseManager = GameWorld.GetBourseManager()
|
bourseItemCount = bourseManager.Count()
|
#µ¹Ðò²éѯ,(×ܱí¸ù¾Ý²åÈëʱ¼äÅÅÐò£¬Ô½ÔçµÄÅÅÔÚÔ½Ç°Ãæ)
|
for index in xrange(bourseItemCount - 1, -1, -1):
|
curBourseItemData = bourseManager.At(index)
|
if CheckBourseItemDataSaleState(curBourseItemData):
|
#ÎïÆ·ÒѳöÊÛ״̬
|
continue
|
# if curBourseItemData.GetPlayerID() != curBourseItemData.GetCustomerPlayerID():
|
# #¹ºÂòÕßΪ³öÊÛÕß×Ô¼º
|
# continue
|
#УÑéÊÇ·ñ³¬Ê±
|
pastMinute = GetPastMinute(curBourseItemData.GetOnSaleTime())
|
if pastMinute < BourseSaleTimeMinute:
|
continue
|
#ÕÒµ½³¬Ê±ÒѾõÄÎïÆ·£¬É¾³ýÎïÆ·£¬·¢Ë͵½ÓʼþÖÐ
|
sellPlayerID = curBourseItemData.GetPlayerID()
|
bourseRoleItem = curBourseItemData.GetBourseRoleItem()
|
addItemList = []
|
curItemDict = {}
|
curItemDict['ItemID'] = curBourseItemData.GetItemTypeID()
|
curItemDict['Count'] = bourseRoleItem.Count
|
curItemDict['UserData'] = bourseRoleItem.UserData
|
|
addItemList.append(curItemDict)
|
GUID = curBourseItemData.GetItemGUID()
|
if sellPlayerID in DelItemDict:
|
DelItemDict[sellPlayerID].append(GUID)
|
else:
|
DelItemDict[sellPlayerID] = [GUID]
|
#Á÷Ïò¼Ç¼
|
DataRecordPack.DR_BourseDeleteOverTimeLongItem(sellPlayerID, GUID, curBourseItemData)
|
|
#½«ÎïÆ··¢Ë͵½²¹³¥ÓʼþÖÐ
|
SendOverTimeItemMail(sellPlayerID, GUID, addItemList)
|
|
#ÒÆ³ý¸Ã½»Ò×ËùÎïÆ·
|
for sellPlayerID, itemGUIDList in DelItemDict.items():
|
for itemGUID in itemGUIDList:
|
bourseManager.DeleteByGUID(itemGUID)
|
curSellPlayer = GameWorld.GetPlayerManager().FindPlayerByID(sellPlayerID)
|
if curSellPlayer:
|
#Íæ¼ÒÔÚÏß Ë¢ÐÂÍæ¼Ò½»Ò×ËùÎïÆ·
|
SyncPlayerBourseItem(curSellPlayer)
|
return
|
|
|
|
##·¢Ë͹ýÆÚ¹ý¾ÃÎïÆ·µ½Óʼþ
|
# @param sellPlayerID, addItemList
|
# @return None
|
def SendOverTimeItemMail(sellPlayerID, GUID, addItemList):
|
import PlayerCompensation
|
|
PlayerCompensation.SendMailByKey('BourseTimeOut', [sellPlayerID], addItemList, [])
|
return
|
|
|
|
# ½»Ò×Ëù¼Ç¼¹ÜÀí
|
class BourseRecordManager(object):
|
|
maxRecord = IpyGameDataPY.GetFuncCfg("BourseMaxRecord") # ÿÈ˼Ǽ×î´óÊýÁ¿
|
|
def __init__(self):
|
self.BourseRecord = {} # {playerID:[record,..], ...} PyGameDataStruct.tagDBPyBourseRecord
|
return
|
|
def AddBourseRecord(self, playerID, tradeType, soldOutTime, itemInfo, taxMoney, giveMoney):
|
if not self.maxRecord:
|
return
|
|
recordList = self.BourseRecord.get(playerID, [])
|
if len(recordList) == self.maxRecord:
|
del recordList[0] #ɾ³ýµÚÒ»Ìõ¼Ç¼
|
|
|
userData = json.dumps(itemInfo, ensure_ascii=False)
|
|
record = PyGameDataStruct.tagDBPyBourseRecord()
|
record.clear()
|
record.PlayerID = playerID
|
record.Type = tradeType
|
record.Timestamp = soldOutTime#int(time.time())
|
record.TradeTax = taxMoney
|
record.TradeMoney = giveMoney
|
record.UserData = userData
|
record.UserDataLen = len(record.UserData)
|
recordList.append(record)
|
|
self.BourseRecord[playerID] = recordList
|
GameWorld.DebugLog("AddBourseRecord playerID=%s,tradeType=%s,userData=%s"
|
% (playerID, tradeType, userData), playerID)
|
|
# ͬ²½¿Í»§¶Ë
|
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
|
if curPlayer:
|
self.SyncBourseRecord(curPlayer)
|
return True
|
|
|
def SyncBourseRecord(self, curPlayer, isAll=False):
|
'''
|
@param isAll: ÊÇ·ñÈ«²¿
|
'''
|
playerID = curPlayer.GetPlayerID()
|
recordList = self.BourseRecord.get(playerID, [])
|
syncList = recordList if isAll else [recordList[-1]]
|
if not syncList:
|
return
|
|
recordInfo = ChPyNetSendPack.tagGCBourseRecordInfo()
|
recordInfo.Clear()
|
recordInfo.RecordList = []
|
for syncRecord in syncList:
|
record = ChPyNetSendPack.tagGCBourseRecord()
|
record.Clear()
|
record.Type = syncRecord.Type
|
record.Timestamp = syncRecord.Timestamp
|
record.TradeTax = syncRecord.TradeTax
|
record.TradeMoney = syncRecord.TradeMoney
|
record.ItemData = syncRecord.UserData
|
record.ItemDataLen = len(record.ItemData)
|
recordInfo.RecordList.append(record)
|
recordInfo.Count = len(recordInfo.RecordList)
|
NetPackCommon.SendFakePack(curPlayer, recordInfo)
|
return
|
|
# ±£´æÊý¾Ý ´æÊý¾Ý¿âºÍrealtimebackup
|
def GetSaveData(self):
|
savaData = ""
|
cntData = ""
|
cnt = 0
|
for recordList in self.BourseRecord.values():
|
for record in recordList:
|
cnt += 1
|
savaData += record.getBuffer()
|
|
GameWorld.Log("SaveBourseRecord cnt :%s len=%s" % (cnt, len(savaData)))
|
return CommFunc.WriteDWORD(cntData, cnt) + savaData
|
|
# ´ÓÊý¾Ý¿âÔØÈëºÃÓÑÊý¾Ý
|
def LoadPyGameData(self, datas, pos, dataslen):
|
cnt, pos = CommFunc.ReadDWORD(datas, pos)
|
GameWorld.Log("LoadBourseRecord cnt :%s" % cnt)
|
|
self.BourseRecord = {}
|
|
for _ in xrange(cnt):
|
record = PyGameDataStruct.tagDBPyBourseRecord()
|
record.clear()
|
pos += record.readData(datas, pos, dataslen)
|
|
playerID = record.PlayerID
|
recordList = self.BourseRecord.get(playerID, [])
|
recordList.append(record)
|
self.BourseRecord[playerID] = recordList
|
|
return pos
|
|
# ½»Ò×ËùÎïÆ·×î½ü³É½»µ¥¼Û¹ÜÀí
|
class BourseItemLastPriceManager(object):
|
|
def __init__(self):
|
self.ItemLastPriceDict = {} # {itemid:price, ...} PyGameDataStruct.tagDBPyBourseItemLastPrice
|
return
|
|
def UpdateBourseItemPrice(self, itemid, price):
|
itemLastPrice = PyGameDataStruct.tagDBPyBourseItemLastPrice()
|
itemLastPrice.clear()
|
itemLastPrice.ItemID = itemid
|
itemLastPrice.LastPrice = price
|
self.ItemLastPriceDict[itemid] = itemLastPrice
|
|
GameWorld.DebugLog("¸üн»Ò×ËùÎïÆ·×îгɽ»µ¥¼Û itemid=%s,price=%s" % (itemid, price))
|
return
|
|
|
def SyncBourseItemPrice(self, curPlayer, itemID):
|
priceData = self.ItemLastPriceDict.get(itemID, None)
|
if not priceData:
|
return
|
|
priceInfo = ChPyNetSendPack.tagGCBourseItemPrice()
|
priceInfo.Clear()
|
priceInfo.ItemID = priceData.ItemID
|
priceInfo.Price = priceData.LastPrice
|
NetPackCommon.SendFakePack(curPlayer, priceInfo)
|
return
|
|
# ±£´æÊý¾Ý ´æÊý¾Ý¿âºÍrealtimebackup
|
def GetSaveData(self):
|
savaData = ""
|
cntData = ""
|
cnt = 0
|
for itemLastPrice in self.ItemLastPriceDict.values():
|
cnt += 1
|
savaData += itemLastPrice.getBuffer()
|
|
GameWorld.Log("SaveBourseItemLastPrice cnt :%s len=%s" % (cnt, len(savaData)))
|
return CommFunc.WriteDWORD(cntData, cnt) + savaData
|
|
# ´ÓÊý¾Ý¿âÔØÈëºÃÓÑÊý¾Ý
|
def LoadPyGameData(self, datas, pos, dataslen):
|
cnt, pos = CommFunc.ReadDWORD(datas, pos)
|
GameWorld.Log("LoadBourseItemLastPrice cnt :%s" % cnt)
|
|
self.ItemLastPriceDict = {}
|
|
for _ in xrange(cnt):
|
data = PyGameDataStruct.tagDBPyBourseItemLastPrice()
|
data.clear()
|
pos += data.readData(datas, pos, dataslen)
|
itemid = data.ItemID
|
self.ItemLastPriceDict[itemid] = data
|
|
return pos
|