#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#---------------------------------------------------------------------
|
#
|
#---------------------------------------------------------------------
|
##@package FunctionNPCCommon
|
# @todo: ¹¦ÄÜNPC¹ÜÀíÆ÷
|
#
|
# @author: panwei
|
# @date 2010-4-26
|
# @version 4.4
|
#
|
# @note:
|
#---------------------------------------------------------------------
|
# @change: "2013-04-18 17:00" wdb ÎïÆ·ÑÕɫʹÓÃÐÞ¸Ä
|
# @change: "2013-04-26 16:00" wdb npcÉ̵êÐÞ¸Ä
|
# @change: "2013-05-03 17:00" wdb npcÉ̵êÅä±í·½Ê½ÐÞ¸Ä
|
# @change: "2013-05-20 15:00" wdb ×°±¸¸½¼ÓÊôÐÔ½Ó¿ÚÐÞ¸Ä
|
# @change: "2013-05-30 10:30" wdb ×°±¸±¦Ê¯ÏâǶµ÷Õû
|
# @change: "2013-07-19 20:00" Alee Ìí¼Ó»Ø¹º
|
# @change: "2013-07-22 17:00" Alee ÎïÆ·¿É°´ÊýÁ¿¹ºÂò
|
# @change: "2013-10-12 21:10" Alee ϵͳÌáʾ
|
# @change: "2013-10-22 11:10" Alee ÎïÆ·¼¼ÄÜÔöǿЧ¹û,ͳһº¯ÊýEquipAddAdditionEx
|
# @change: "2013-11-08 22:30" Alee É̳ÇÌí¼Ó´ò¿×
|
# @change: "2013-11-19 11:00" hxp Ð޸ijöÊÛÎïÆ·ÅжϽðÇ®ÉÏÏÞÂß¼
|
# @change: "2014-01-16 13:54" xmnathan Õ½ÃËÉ̳ǹºÂò
|
# @change: "2014-01-28 00:55" Alee ¶ñħÉ̵êĬÈÏ׿ԽºÍÌ××°
|
# @change: "2014-02-12 14:00" Alee È¡ÏûºìÃû¹ºÂò³Í·£
|
# @change: "2014-04-07 11:30" Alee ·â°üDWORDµ¼Ö½ӿÚint±¨´í£¬·À·¶·¶Î§¹ý´ó
|
# @change: "2014-05-05 15:00" xmnathan Ìæ»»ÏµÍ³Ìáʾ
|
# @change: "2014-05-21 17:25" xcc Ôö¼Óħ·½Ñ°±¦»ý·Ö¶Ò»»ÎïÆ·¹¦ÄÜ
|
# @change: "2014-06-05 15:30" hxp É̵êNPCÎïÆ·¹ºÂòÔö¼ÓÿÈտɹºÂò´ÎÊýÉÏÏÞÖ§³Ö
|
# @change: "2014-08-04 16:00" Alee Ì××°ÎïÆ·É̵êÐÞ¸Ä
|
# @change: "2014-08-07 20:40" Alee ±¦²Ø»ý·Ö¶Ò»»×¿Ô½ÊôÐÔ×°±¸¹Ì¶¨2ÌõÊôÐÔ
|
# @change: "2014-10-20 16:20" Alee ¶Ò»»Ì××°3׿Խ
|
# @change: "2014-11-05 15:00" Alee É̵깺Âò°ó¶¨ÐÞ¸Ä
|
# @change: "2014-12-11 16:30" hxp É̵ê¶Ò»»×°±¸Ôö¼ÓÖ§³ÖÅäÖÃ×°±¸¶ÔӦ׿ԽÌõÊý
|
# @change: "2015-01-14 00:30" hxp Ôö¼ÓÎïÆ·±ä¸üʼþ»ã±¨
|
# @change: "2015-01-14 16:40" ljd Ôö¼ÓÎïÆ·¶Ò»»É̵ê
|
# @change: "2015-01-27 10:50" ljd Ôö¼Ó×°±¸ÎïÆ·À´Ô´±ê¼Ç
|
# @change: "2015-04-03 18:00" hxp ·À·¶»ØÊÕÕ¾Òì³£Çé¿öÎïÆ·Ïûʧ¶øÃ»ÓÐÖØÖñê¼Çλµ¼ÖÂÊýÖµÔ½½ç
|
# @change: "2015-04-16 19:10" ljd É̵긶Ǯʱ´«ÈëÖ§¸¶ÀàÐÍ
|
# @change: "2015-04-27 22:00" hxp Ôö¼ÓBuyItemÁ÷Ïò
|
# @change: "2016-07-20 14:30" hxp »õ±ÒÖ§¸¶Á÷ÏòÕûºÏ
|
# @change: "2016-08-04 18:00" hxp ³öÊۻعº¼Û¸ñÐÞ¸Ä
|
#---------------------------------------------------------------------
|
#"""Version = 2016-08-04 18:00"""
|
#---------------------------------------------------------------------
|
import ChPyNetSendPack
|
import NetPackCommon
|
import GameWorld
|
import EventShell
|
import IPY_GameWorld
|
import ItemControler
|
import ChConfig
|
import PlayerControl
|
import ItemCommon
|
import ShareDefine
|
import PlayerFlashSale
|
#import EventSrc
|
import ChItem
|
import IpyGameDataPY
|
import PlayerRune
|
import GameFuncComm
|
import PlayerFairyCeremony
|
import PlayerNewFairyCeremony
|
import PlayerSpringSale
|
import PyGameData
|
|
import random
|
import math
|
import time
|
|
# É̵êÀàÐͶ¨Òå
|
ShopType_FairyCeremony = 19 # ÏɽçÊ¢µäÑÌ»¨
|
|
g_mysticalShopDict = {} #ÉñÃØÉ̵ê{µÈ¼¶·¶Î§:[µÈ¼¶¶Î,{½ðÇ®ÀàÐÍ:¿â}]}
|
#---------------------------------------------------------------------
|
##¿ªÊ¼½»Ò×
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param tick ʱ¼ä´Á
|
# @return ·µ»ØÖµÕæ, Âß¼ÔËÐгɹ¦
|
# @remarks ¿ªÊ¼½»Ò×
|
def StartTrade(curPlayer, tick):
|
|
curActionObj = curPlayer.GetActionObj()
|
if curActionObj == None:
|
return
|
|
if curActionObj.GetGameObjType() != IPY_GameWorld.gotNPC:
|
return
|
|
curActionNPC = GameWorld.GetNPCManager().GetNPCByIndex(curActionObj.GetIndex())
|
curActionNPCID = curActionNPC.GetNPCID()
|
|
# ÉèÖõ±Ç°É̵êµÄnpcid
|
curPlayer.SetDict(ChConfig.Def_PlayerKey_TradeTagNPC, curActionNPCID)
|
|
#É趨Ϊ½ûÖ¹ÕûÀí±³°ü
|
curPlayer.SetForbiddenResetItem(1)
|
curPlayer.BeginSpecialEvent(ShareDefine.TYPE_Event_Shop)
|
return True
|
|
#------------------------------------------------------------------------------
|
## »ñȡԶ³ÌÉ̵êµÄnpc
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @return Ô¶³ÌÉ̵êµÄnpc
|
def GetDirectNpcID():
|
return 0
|
|
#---------------------------------------------------------------------
|
##½áÊøÊ¼þ
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param tick ʱ¼ä´Á
|
# @return ·µ»ØÖµÕæ, Âß¼ÔËÐгɹ¦
|
# @remarks ½áÊøÊ¼þ
|
def ExitEvent(curPlayer, tick):
|
|
EventShell.DoExitEvent(curPlayer)
|
return True
|
|
#---------------------------------------------------------------------
|
##ÇëÇóÉ̵êÎïÆ·Áбí
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param tick ʱ¼ä´Á
|
# @return ·µ»ØÖµÕæ, Âß¼ÔËÐгɹ¦
|
def QueryNPCShopItem(playerIndex, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
|
|
#ʱ¼ä¼ä¸ôδµ½
|
if tick - curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_QueryFuncData) \
|
< ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_QueryFuncData]:
|
return
|
|
curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_QueryFuncData, tick)
|
|
#Ö±½Ó²éѯ£¬´æÔÚ¸ÃNPCID¾Í·¢°ü
|
tradeTagNPC = clientData.NPCShopID
|
GameWorld.GetGameData().FilterShopItemByShopType(tradeTagNPC)
|
shopItemCount = GameWorld.GetGameData().GetFilterShopItemCount()
|
if shopItemCount <= 0:
|
return
|
|
# # É̵ênpcidÓ뵱ǰ¶Ô»°npc¶ÔÓ¦,0ΪԶ³ÌÉ̵ê
|
# tradeTagNPC = clientData.NPCShopID
|
# if tradeTagNPC != 0 and not CheckTradeTagNPC(curPlayer, tradeTagNPC):
|
# return
|
|
# ·¢ËÍÉÌÆ·½ñÈÕÒѹºÂò´ÎÊý
|
#SyncShopItemTodayBuyCount(curPlayer)
|
|
# ·¢ËÍÉ̵êÎïÆ·Áбí
|
curPlayer.BeginShopEx(tradeTagNPC)
|
return
|
|
##ͬ²½É̵êNPCÎïÆ·½ñÈÕ¹ºÂò´ÎÊý
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param npcID
|
# @param itemIndex -1ʱͬ²½¸ÃNPCËùÓÐÎïÆ·
|
# @return
|
def SyncShopItemTodayBuyCount(curPlayer, itemIndexList=[], isReset=False):
|
dayBuyCntInfo = ChPyNetSendPack.tagMCShopItemDayBuyCntInfo()
|
dayBuyCntInfo.DayBuyCntList = []
|
if itemIndexList:
|
for itemIndex in itemIndexList:
|
__AppendShopItemDayBuyCntInfo(curPlayer, itemIndex, dayBuyCntInfo.DayBuyCntList, isReset)
|
else:
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for i in xrange(ipyDataMgr.GetStoreCount()):
|
shopItem = ipyDataMgr.GetStoreByIndex(i)
|
if not shopItem.GetLimitCnt():
|
continue
|
dayBuyCntKey = ChConfig.Def_PDict_ShopItemDayBuyCnt % shopItem.GetID()
|
curDayBuyCnt = curPlayer.NomalDictGetProperty(dayBuyCntKey)
|
if curDayBuyCnt <= 0:
|
continue
|
__AppendShopItemDayBuyCntInfo(curPlayer, shopItem.GetID(), dayBuyCntInfo.DayBuyCntList, isReset)
|
|
dayBuyCntInfo.Count = len(dayBuyCntInfo.DayBuyCntList)
|
NetPackCommon.SendFakePack(curPlayer, dayBuyCntInfo)
|
return
|
|
##Ôö¼ÓÉ̵êÎïÆ·½ñÈÕ¹ºÂò´ÎÊýÐÅÏ¢
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param npcID
|
# @param itemIndex
|
# @return
|
def __AppendShopItemDayBuyCntInfo(curPlayer, itemIndex, dayBuyCntList, isReset):
|
itemDayBuyCnt = ChPyNetSendPack.tagMCShopItemDayBuyCnt()
|
itemDayBuyCnt.ItemIndex = itemIndex
|
dayBuyCntKey = ChConfig.Def_PDict_ShopItemDayBuyCnt % itemIndex
|
curDayBuyCnt = curPlayer.NomalDictGetProperty(dayBuyCntKey)
|
itemDayBuyCnt.BuyCnt = curDayBuyCnt
|
itemDayBuyCnt.IsReset = int(isReset)
|
dayBuyCntList.append(itemDayBuyCnt)
|
return
|
|
## 怬
|
def ShopItemOnLogin(curPlayer):
|
SyncMysticalLimitShopInfo(curPlayer)
|
SyncShopItemTodayBuyCount(curPlayer)
|
if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopGoods % 0):
|
__DoMysticalShopRefresh(curPlayer, True, GameWorld.GetGameWorld().GetTick())
|
SyncMysticalShopInfo(curPlayer)
|
return
|
|
##É̵êÎïÆ·OnDay
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @return
|
def ShopItemOnDay(curPlayer, onEventType):
|
if onEventType == ShareDefine.Def_OnEventType:
|
OSSaleOpenMail(curPlayer)
|
refreshType = [3]
|
#ÉñÃØÉ̵êˢдÎÊýÖØÖÃ
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MysticalShopRefreshCnt, 0)
|
SyncMysticalShopInfo(curPlayer)
|
|
elif onEventType == ShareDefine.Def_OnEventTypeEx:
|
refreshType = [4]
|
openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)
|
isMixServer = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_IsMixServer)
|
if isMixServer:
|
mixServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_MixServerDay)
|
if mixServerDay % 3 == 0:
|
refreshType.append(7)
|
elif openServerDay % 3 == 0:
|
refreshType.append(7)
|
else:
|
return
|
ResetShopItemBuyCount(curPlayer, refreshType)
|
return
|
|
##É̵êÎïÆ·OnWeek
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @return
|
def ShopItemOnWeek(curPlayer, onEventType):
|
if onEventType == ShareDefine.Def_OnEventType:
|
refreshType = [1]
|
elif onEventType == ShareDefine.Def_OnEventTypeEx:
|
refreshType = [2]
|
else:
|
return
|
ResetShopItemBuyCount(curPlayer, refreshType)
|
return
|
|
##É̵êÎïÆ·OnMonth
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @return
|
def ShopItemOnMonth(curPlayer, onEventType):
|
if onEventType == ShareDefine.Def_OnEventType:
|
refreshType = 5
|
elif onEventType == ShareDefine.Def_OnEventTypeEx:
|
refreshType = 6
|
else:
|
return
|
ResetShopItemBuyCount(curPlayer, [refreshType])
|
return
|
|
def ShopItemOnCrossPKSeasonChange(curPlayer):
|
## °´¿ç·þPKÈü¼¾ÖØÖÃ
|
refreshType = 8
|
ResetShopItemBuyCount(curPlayer, [refreshType])
|
return
|
|
def ResetShopItemBuyCount(curPlayer, resetTypeList):
|
#@param resetTypeList: ÐèÒªÖØÖõÄÀàÐÍÁбí
|
#ÖØÖÃÉ̵êÎïÆ·¹ºÂò´ÎÊý 1£ºÖÜÒ»0µãˢР2£ºÖÜÒ»5µãˢР3£ºÃ¿ÈÕ0µãˢР4£ºÃ¿ÈÕ5µãˢР5ÿÔÂ0µã 6ÿÔÂ5µã 7ÿ3Ìì5µã 8ÿÈü¼¾
|
if not resetTypeList:
|
# Ôݶ¨±ØÐëÖ¸¶¨ÀàÐÍÁÐ±í£¬·ÀÖ¹ÖÕÉíÏÞ¹ºµÄÎó±»ÖØÖÃ
|
return
|
|
syncIndexList = []
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for i in xrange(ipyDataMgr.GetStoreCount()):
|
shopItem = ipyDataMgr.GetStoreByIndex(i)
|
if not shopItem.GetLimitCnt():
|
continue
|
if shopItem.GetRefreshLimit():
|
continue
|
if shopItem.GetRefreshType() not in resetTypeList:
|
continue
|
dayBuyCntKey = ChConfig.Def_PDict_ShopItemDayBuyCnt % shopItem.GetID()
|
curDayBuyCnt = curPlayer.NomalDictGetProperty(dayBuyCntKey)
|
if curDayBuyCnt <= 0:
|
continue
|
PlayerControl.NomalDictSetProperty(curPlayer, dayBuyCntKey, 0)
|
syncIndexList.append(shopItem.GetID())
|
if syncIndexList:
|
SyncShopItemTodayBuyCount(curPlayer, syncIndexList, True)
|
return
|
|
def ResetShopItemBuyCountByShopType(curPlayer, shopTypeList):
|
##¸ù¾ÝÉ̵êÀàÐÍÖØÖÃÉ̵êÏÞ¹ºÎïÆ·´ÎÊý
|
if not shopTypeList:
|
return
|
syncIndexList = []
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for i in xrange(ipyDataMgr.GetStoreCount()):
|
shopItem = ipyDataMgr.GetStoreByIndex(i)
|
if not shopItem.GetLimitCnt():
|
continue
|
if shopItem.GetRefreshLimit():
|
continue
|
if shopItem.GetShopType() not in shopTypeList:
|
continue
|
dayBuyCntKey = ChConfig.Def_PDict_ShopItemDayBuyCnt % shopItem.GetID()
|
curDayBuyCnt = curPlayer.NomalDictGetProperty(dayBuyCntKey)
|
if curDayBuyCnt <= 0:
|
continue
|
PlayerControl.NomalDictSetProperty(curPlayer, dayBuyCntKey, 0)
|
syncIndexList.append(shopItem.GetID())
|
if syncIndexList:
|
SyncShopItemTodayBuyCount(curPlayer, syncIndexList, True)
|
return
|
|
def MysticalLimitShopOpen(curPlayer, befLV, aftLV):
|
##ÉñÃØÏÞ¹º¿ªÆô
|
ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('Store', {'ShopType':16}, True)
|
if not ipyDataList:
|
return
|
curTime = int(time.time())
|
syncGoodsList = []
|
for ipyData in ipyDataList:
|
limitLV = ipyData.GetLimitLV()
|
if befLV < limitLV and aftLV >= limitLV:
|
goodsID = ipyData.GetID()
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShopItemStartTime % goodsID, curTime)
|
syncGoodsList.append(goodsID)
|
GameWorld.DebugLog('ÉñÃØÏÞ¹ºÉÌÆ·%s ¿ªÂô'%goodsID, curPlayer.GetID())
|
if syncGoodsList:
|
SyncMysticalLimitShopInfo(curPlayer)
|
return
|
|
def SyncMysticalLimitShopInfo(curPlayer):
|
##ÉñÃØÏÞ¹ºÍ¨Öª
|
packData = ChPyNetSendPack.tagMCMysticalShopTimeInfo()
|
packData.ShopTimeList = []
|
ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('Store', {'ShopType':16}, True)
|
curTime = int(time.time())
|
for ipyData in ipyDataList:
|
goodsID = ipyData.GetID()
|
startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopItemStartTime % goodsID)
|
if not startTime:
|
continue
|
if curTime - startTime >= ipyData.GetLimitValue():
|
#³¬Ê±µÄÖØÖÃ
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShopItemStartTime % goodsID, 0)
|
else:
|
goodsTime = ChPyNetSendPack.tagMCMysticalShopTime()
|
goodsTime.GoodsID = goodsID
|
goodsTime.StartTime = startTime
|
packData.ShopTimeList.append(goodsTime)
|
if not packData.ShopTimeList:
|
return
|
packData.Count = len(packData.ShopTimeList)
|
NetPackCommon.SendFakePack(curPlayer, packData)
|
return
|
|
def CheckMysticalShopRefresh(curPlayer, tick):
|
##ÉñÃØÉ̵êË¢ÐÂ
|
createRoleTime = curPlayer.GetCreateRoleTime()
|
if not createRoleTime:
|
return
|
diffTime = GameWorld.GetCurrentTime() - GameWorld.GetDateTimeByStr(createRoleTime, ChConfig.TYPE_Time_Format)
|
pastSeconds = diffTime.days*24*60*60 + diffTime.seconds
|
refreshTime = IpyGameDataPY.GetFuncCfg('MysteryShopRefresh', 4)
|
if refreshTime and pastSeconds % refreshTime == 0:
|
__DoMysticalShopRefresh(curPlayer, True, tick)
|
return
|
|
#// A2 32 ÉñÃØÉ̵êˢР#tagCMRefreshMysticalShop
|
#struct tagCMRefreshMysticalShop
|
#{
|
# tagHead Head;
|
#};
|
def OnMysticalShopRefresh(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
__DoMysticalShopRefresh(curPlayer, False, tick)
|
return
|
|
def __DoMysticalShopRefresh(curPlayer, isFree, tick):
|
global g_mysticalShopDict #{µÈ¼¶·¶Î§:[µÈ¼¶¶Î,{½ðÇ®ÀàÐÍ:¿â}]}
|
refreshTime = IpyGameDataPY.GetFuncCfg('MysteryShopRefresh', 4)
|
if not refreshTime:
|
return
|
|
lastTime = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MysticalShopLastTime)
|
if lastTime and tick - lastTime < 1000:
|
#GameWorld.DebugLog('ÉñÃØÉ̵êˢУ¬¹ýÓÚÆµ·±£¡')
|
return
|
curPlayer.SetDict(ChConfig.Def_PlayerKey_MysticalShopLastTime, tick)
|
if not g_mysticalShopDict:
|
ipyMgr= IpyGameDataPY.IPY_Data()
|
for i in xrange(ipyMgr.GetMysteryShopCount()):
|
ipyData = ipyMgr.GetMysteryShopByIndex(i)
|
lvRange = ipyData.GetLVRange()
|
goodsID = ipyData.GetGoodsID()
|
goodsIpyData = IpyGameDataPY.GetIpyGameData('Store', goodsID)
|
if not goodsIpyData:
|
continue
|
moneyType = goodsIpyData.GetMoneyType()
|
weight = goodsIpyData.GetLimitValue()
|
lvkey = tuple(lvRange)
|
if lvkey not in g_mysticalShopDict:
|
g_mysticalShopDict[lvkey] = [lvkey[0], {}]
|
weightDict = {}
|
if moneyType not in g_mysticalShopDict[lvkey][1]:
|
g_mysticalShopDict[lvkey][1][moneyType] = []
|
weightDict[moneyType] = weightDict.get(moneyType, 0) + weight
|
g_mysticalShopDict[lvkey][1][moneyType].append([weightDict[moneyType], goodsID])
|
if not g_mysticalShopDict:
|
return
|
playerLV = curPlayer.GetLV()
|
curLVDan, shopDict = GameWorld.GetDictValueByRangeKey(g_mysticalShopDict, playerLV)
|
if not shopDict:
|
return
|
maxCnt = IpyGameDataPY.GetFuncCfg('MysteryShopGoods', 1)
|
goldGoodsCnt =GameWorld.GetResultByRandomList(IpyGameDataPY.GetFuncEvalCfg('MysteryShopGoods', 2))
|
if not goldGoodsCnt:
|
return
|
specialGoodsID = 0 #±Ø³öµÄÉÌÆ·ID
|
if not isFree:
|
#ÓÅÏȵÀ¾ß£¬ÔÙÏÉÓñ
|
itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
costItemID = IpyGameDataPY.GetFuncCfg('MysteryShopRefresh', 1)
|
costItemCntDict = IpyGameDataPY.GetFuncEvalCfg('MysteryShopRefresh', 2)
|
curRefreshCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopRefreshCnt)
|
cntList = [int(cnt) for cnt in costItemCntDict.keys()]
|
cntList.sort()
|
costItemCnt = costItemCntDict[str(cntList[-1])]
|
for cnt in cntList:
|
if curRefreshCnt < cnt:
|
costItemCnt = costItemCntDict[str(cnt)]
|
break
|
enough, indexList, hasBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(costItemID, itemPack, costItemCnt)
|
costGold = 0
|
if not enough:
|
costGold = lackCnt * IpyGameDataPY.GetFuncCfg('MysteryShopRefresh', 3)
|
if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costGold, ChConfig.Def_Cost_MysteryShopRefresh):
|
return
|
ItemCommon.ReduceItem(curPlayer, itemPack, indexList, costItemCnt, False, "MysteryShopRefresh")
|
curLVRefreshData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopLVRefreshCnt)
|
curLVRefreshCnt, lvDan = curLVRefreshData / 10000, curLVRefreshData % 10000
|
updLVRefreshCnt = 1 if curLVDan != lvDan else curLVRefreshCnt + 1 #µÈ¼¶¶Î±ä¸ü£¬ÖØÖøõȼ¶¶ÎµÄˢдÎÊý
|
updLVRefreshData = min(updLVRefreshCnt * 10000+curLVDan, ChConfig.Def_UpperLimit_DWord)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MysticalShopLVRefreshCnt, updLVRefreshData)
|
specialRefreshCfg = IpyGameDataPY.GetFuncEvalCfg('MysteryShopRefresh', 5)
|
if curLVDan in specialRefreshCfg and updLVRefreshCnt == specialRefreshCfg[curLVDan][0]:
|
specialGoodsID = specialRefreshCfg[curLVDan][1]
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MysticalShopRefreshCnt, curRefreshCnt+1)
|
|
goldGoodsCnt = min(goldGoodsCnt, maxCnt)
|
sliverGoodsCnt = maxCnt - goldGoodsCnt
|
goodsResultList = []
|
if goldGoodsCnt:
|
goodsResultList += GameWorld.GetResultByRandomListEx(shopDict.get(IPY_GameWorld.TYPE_Price_Gold_Money, []), goldGoodsCnt, [])
|
if sliverGoodsCnt:
|
goodsResultList += GameWorld.GetResultByRandomListEx(shopDict.get(IPY_GameWorld.TYPE_Price_Silver_Money, []), sliverGoodsCnt, [])
|
if specialGoodsID and specialGoodsID not in goodsResultList:
|
goodsResultList[0] = specialGoodsID
|
GameWorld.DebugLog('ÉñÃØÉ̵êË¢ÐÂÌØÊâ¹æÔò£¬µÈ¼¶¶Î£º%s,updLVRefreshCnt=%s,specialGoodsID=%s'%(curLVDan, updLVRefreshCnt, specialGoodsID))
|
|
GameWorld.DebugLog('ÉñÃØÉ̵êË¢ÐÂisFree=%s,goldGoodsCnt=%s,sliverGoodsCnt=%s,goodsResultList=%s'%(isFree, goldGoodsCnt, sliverGoodsCnt, goodsResultList))
|
syncIndexList = []
|
for i in xrange(maxCnt):
|
goodsID = goodsResultList[i] if i < len(goodsResultList) else 0
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MysticalShopGoods % i, goodsID)
|
|
dayBuyCntKey = ChConfig.Def_PDict_ShopItemDayBuyCnt % goodsID
|
curDayBuyCnt = curPlayer.NomalDictGetProperty(dayBuyCntKey)
|
if curDayBuyCnt:
|
PlayerControl.NomalDictSetProperty(curPlayer, dayBuyCntKey, 0)
|
syncIndexList.append(goodsID)
|
if syncIndexList:
|
SyncShopItemTodayBuyCount(curPlayer, syncIndexList, True)
|
#֪ͨ
|
SyncMysticalShopInfo(curPlayer)
|
return
|
|
def SyncMysticalShopInfo(curPlayer):
|
##ÉñÃØÉ̵ê֪ͨ
|
packData = ChPyNetSendPack.tagMCMysticalShopInfo()
|
packData.RefreshCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopRefreshCnt)
|
packData.GoodsList = []
|
maxCnt = IpyGameDataPY.GetFuncCfg('MysteryShopGoods', 1)
|
for i in xrange(maxCnt):
|
goodsID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopGoods % i)
|
goodsInfo = ChPyNetSendPack.tagMCMysticalShopGoods()
|
goodsInfo.GoodsID = goodsID
|
packData.GoodsList.append(goodsInfo)
|
packData.Count = len(packData.GoodsList)
|
NetPackCommon.SendFakePack(curPlayer, packData)
|
return
|
|
## »Ø¹ºÎïÆ·
|
# @param None
|
# @return None
|
def BuyItemBack(curPlayer, clientPack, tick):
|
index = clientPack.Index
|
|
backPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptRecycle)
|
if index >= backPack.GetCount():
|
#¼Ù°üÍ˳ö
|
return
|
|
curItem = backPack.GetAt(index)
|
if not curItem or curItem.IsEmpty():
|
#ûÓÐÎïÆ·Í˳ö
|
return
|
|
realPutCount = curItem.GetCount()
|
itemControl = ItemControler.PlayerItemControler(curPlayer)
|
if not itemControl.CanPutInItem(IPY_GameWorld.rptItem,
|
curItem.GetItemTypeID(),
|
realPutCount,
|
curItem.GetIsBind()):
|
#ÎïÆ·²»ÄÜ·ÅÈëÍ˳ö
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [IPY_GameWorld.rptItem])
|
return
|
|
itemPrice, priceType = __GetItemSellPrice(curPlayer, curItem)
|
itemPrice = int(itemPrice) * realPutCount
|
if not priceType or not itemPrice:
|
return
|
|
#¸¶Ç®
|
infoDict = {ChConfig.Def_Cost_Reason_SonKey:curItem.GetItemTypeID()}
|
if not PlayerControl.PayMoney(curPlayer, priceType, itemPrice, ChConfig.Def_Cost_BuyItemBack, infoDict):
|
return
|
|
itemControl.PutInItem(IPY_GameWorld.rptItem, curItem, event=["BuyItemBack", False, {}])
|
|
itemIndexs = str(curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_DelPackIndex))
|
itemIndexs = itemIndexs.replace(str(index + 1), '')
|
if itemIndexs == '':
|
#ûÓÐÎïÆ·±£Áô 0
|
itemIndexs = '0'
|
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_DelPackIndex, int(itemIndexs))
|
return
|
|
def PayAutoBuyItem(curPlayer, lackItemDict, priceType, costType=ChConfig.Def_Cost_Unknown, infoDict={}, isCheck=False, shopItemIndexDict=None):
|
''' Ö§¸¶×Ô¶¯¹ºÂòÎïÆ·ÏûºÄ£¬´ÓÉ̳ÇÖйºÂò£¬Ö±½Ó¿ÛÇ®£¬²»²úÉúÎïÆ·
|
Ò»°ãÓÃÓÚ»ù´¡É̵ê×Ô¶¯¹ºÂòÎïÆ·£¬²»¿¼ÂǸ´ÔÓµÄÏÞ¹ºÂß¼
|
@param isCheck: ÊÇ·ñÖ»ÊǼì²é£¬²»Ö´ÐÐʵ¼ÊÏûºÄÂß¼
|
@param shopItemIndexDict: Ö¸¶¨¹ºÂòµÄÉÌÆ·¶ÔÓ¦É̳DZíÉÌÆ·IDË÷Òý×ֵ䣬Èç¹ûûÓÐÖ¸¶¨ÉÌÆ·Ë÷Òý£¬Ôò°´ÏûºÄµÄ¼Û¸ñÀàÐÍ×Ô¶¯ËÑË÷É̳DZí
|
'''
|
|
addLimitCountInfo = {}
|
totalMoney = 0
|
# ¼ÆËã×Ô¶¯¹ºÂòÏûºÄ
|
for itemID, lackCnt in lackItemDict.items():
|
if lackCnt <= 0:
|
continue
|
|
curItem = GameWorld.GetGameData().GetItemByTypeID(itemID)
|
if not curItem:
|
return
|
|
if shopItemIndexDict and itemID in shopItemIndexDict:
|
itemIndex = shopItemIndexDict[itemID]
|
ipyData = IpyGameDataPY.GetIpyGameData("Store", itemIndex)
|
else:
|
ipyData = ItemCommon.GetShopItemPriceIpyData(itemID, priceType)
|
if not ipyData:
|
return
|
|
itemIndex = ipyData.GetID()
|
shopType = ipyData.GetShopType()
|
priceType = ipyData.GetMoneyType()
|
itemMoney = ipyData.GetMoneyNum()
|
limitCntList = ipyData.GetLimitCnt()
|
if limitCntList:
|
limitBuyCnt = limitCntList[0]
|
curDayBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopItemDayBuyCnt % itemIndex)
|
canBuyCnt = max(0, limitBuyCnt - curDayBuyCnt)
|
if canBuyCnt < lackCnt:
|
GameWorld.Log("×Ô¶¯¹ºÂò´ÎÊý²»×㣡shopType=%s,itemIndex=%s,itemID=%s,limitBuyCnt=%s,curDayBuyCnt=%s,canBuyCnt=%s < %s"
|
% (shopType, itemIndex, itemID, limitBuyCnt, curDayBuyCnt, canBuyCnt, lackCnt), curPlayer.GetPlayerID())
|
return
|
addLimitCountInfo[itemIndex] = lackCnt
|
|
totalMoney += (lackCnt * itemMoney)
|
|
if totalMoney <= 0:
|
return
|
|
if isCheck:
|
return PlayerControl.HaveMoney(curPlayer, priceType, totalMoney)
|
|
GameWorld.DebugLog("¿Û³ý×Ô¶¯¹ºÂòÏûºÄ: lackItemDict=%s,priceType=%s,totalMoney=%s,costType=%s,addLimitCountInfo=%s"
|
% (lackItemDict, priceType, totalMoney, costType, addLimitCountInfo), curPlayer.GetPlayerID())
|
|
if not PlayerControl.PayMoney(curPlayer, priceType, totalMoney, costType, infoDict):
|
return
|
|
if addLimitCountInfo:
|
syncIndexList = []
|
for itemIndex, lackCnt in addLimitCountInfo.items():
|
curDayBuyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopItemDayBuyCnt % itemIndex)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShopItemDayBuyCnt % itemIndex, curDayBuyCnt + lackCnt)
|
syncIndexList.append(itemIndex)
|
SyncShopItemTodayBuyCount(curPlayer, syncIndexList)
|
|
return True
|
|
##¹ºÂòÎïÆ·
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param tick ʱ¼ä´Á
|
# @return ·µ»ØÖµÕæ, Âß¼ÔËÐгɹ¦
|
def BuyItem(curPlayer, tick):
|
|
if GameWorld.IsCrossServer():
|
return
|
|
buyItemList = IPY_GameWorld.IPY_CBuyItemList()
|
itemIndex = buyItemList.GetBuyItemIndex()
|
if itemIndex < 0:
|
return
|
|
clientBuyCount = buyItemList.GetBuyCount()
|
if not clientBuyCount:
|
return
|
|
ipyData = IpyGameDataPY.GetIpyGameData("Store", itemIndex)
|
if not ipyData:
|
return
|
shopType = ipyData.GetShopType()
|
operationActionShopType = ipyData.GetOperationActionShop()
|
if operationActionShopType == 1:
|
if not PlayerSpringSale.IsSpringSaleShopType(shopType):
|
return
|
elif operationActionShopType == 2:
|
if not PlayerFlashSale.IsFlashSaleShopType(shopType):
|
return
|
|
# ÎïÆ·ÐÅÏ¢
|
limitLV = ipyData.GetLimitLV()
|
if limitLV and curPlayer.GetLV() < limitLV:
|
return
|
LimitVIPLVList = ipyData.GetLimitVIPLV()
|
LimitCntList = ipyData.GetLimitCnt()
|
limitBuyCnt = 0
|
if LimitVIPLVList or LimitCntList:
|
if not LimitVIPLVList:
|
LimitVIPLVList = [0]
|
if not LimitCntList:
|
LimitCntList = [0]
|
|
if len(LimitVIPLVList) != len(LimitCntList):
|
GameWorld.Log(" ¹ºÂòÎïÆ·LimitVIPLV LimitCnt ³¤¶È²»Í¬")
|
return
|
curVIPlv = curPlayer.GetVIPLv()
|
limitBuyCnt = -1
|
for i, viplv in enumerate(LimitVIPLVList):
|
if curVIPlv < viplv:
|
break
|
limitBuyCnt = LimitCntList[i]
|
if limitBuyCnt == -1:
|
GameWorld.DebugLog(" vip%s²ÅÄܹºÂò"%viplv)
|
return
|
|
curDayBuyCnt = 0
|
dayBuyCntKey = ChConfig.Def_PDict_ShopItemDayBuyCnt % itemIndex
|
if limitBuyCnt > 0:
|
curDayBuyCnt = curPlayer.NomalDictGetProperty(dayBuyCntKey)
|
canBuyCnt = max(0, limitBuyCnt - curDayBuyCnt)
|
if canBuyCnt <= 0:
|
GameWorld.DebugLog("BuyShopItem ½ñÈÕ¹ºÂò´ÎÊýÒÑÂú£¡shopType=%s,itemIndex=%s" % (shopType, itemIndex))
|
return
|
if clientBuyCount > canBuyCnt:
|
GameWorld.DebugLog("BuyShopItem ÐÞÕý¹ºÂò´ÎÊý£¡shopType=%s,itemIndex=%s,clientBuyCount=%s,canBuyCnt=%s"
|
% (shopType, itemIndex, clientBuyCount, canBuyCnt))
|
clientBuyCount = canBuyCnt
|
serverLimitCnt = ipyData.GetServerLimitCnt()
|
if serverLimitCnt > 0:
|
clientBuyCount = min(serverLimitCnt, clientBuyCount)
|
|
itemID, itemCount, isBind = ipyData.GetItemID(), ipyData.GetItemCnt(), ipyData.GetIsBind()
|
itemListEx = ipyData.GetItemListEx()
|
priceType, itemPrice = ipyData.GetMoneyType(), ipyData.GetMoneyNum()
|
|
itemPrice *= clientBuyCount
|
job = curPlayer.GetJob()
|
jobItemList = ipyData.GetJobItem()
|
totalItemList = []
|
if itemID:
|
jobItemID = GetShopJobItem(job, itemID, jobItemList)
|
totalItemList.append([jobItemID, itemCount * clientBuyCount, isBind])
|
for itemIDEx, itemCountEx, isBindEx in itemListEx:
|
jobItemID = GetShopJobItem(job, itemIDEx, jobItemList)
|
totalItemList.append([jobItemID, itemCountEx * clientBuyCount, isBindEx])
|
#ÔÊÐí¼ÛÇ®ÅäÖÃ0£¬ÓÃÀ´Ãâ·Ñ¹ºÂò
|
if not totalItemList:
|
GameWorld.ErrLog("Store shop item error! shopType=%s,totalItemList=%s,itemPrice=%s" % (shopType, totalItemList, itemPrice))
|
return
|
|
mainItemID = 0
|
needPackSpaceDict = {}
|
for i, itemInfo in enumerate(totalItemList):
|
itemID = itemInfo[0]
|
itemCnt = itemInfo[1]
|
curItem = GameWorld.GetGameData().GetItemByTypeID(itemID)
|
if not curItem:
|
GameWorld.ErrLog("Store shop item error! shopType=%s,itemID=%s" % (shopType, itemID))
|
return
|
packType = ChConfig.GetItemPackType(curItem)
|
needSpace = ItemControler.GetItemNeedPackCount(packType, curItem, itemCnt)
|
needPackSpaceDict[packType] = needPackSpaceDict.get(packType, 0) + needSpace
|
|
if i == 0:
|
mainItemID = itemID
|
|
if not mainItemID:
|
return
|
|
GameWorld.DebugLog("¹ºÂòÎïÆ·: shopType=%s,itemIndex=%s,clientBuyCount=%s,totalItemList=%s,mainItemID=%s,needPackSpaceDict=%s"
|
% (shopType, itemIndex, clientBuyCount, totalItemList, mainItemID, needPackSpaceDict), curPlayer.GetPlayerID())
|
mailKey = ipyData.GetMailKey()
|
isLackPack = False #ÊÇ·ñ±³°ü²»×ã
|
for packType, needSpace in needPackSpaceDict.items():
|
if needSpace > ItemCommon.GetItemPackSpace(curPlayer, packType, needSpace):
|
isLackPack = True
|
if mailKey:
|
break
|
else:
|
curPlayer.ShopResult(itemIndex, IPY_GameWorld.tsrNoPlace)
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [packType])
|
return
|
sendMailKey = mailKey if isLackPack and mailKey else '' #±³°ü²»×ãÇÒÅäÖÃÁËmailKeyµÄ²Å·¢Óʼþ
|
|
# ¹ºÂòÏÞÖÆÌõ¼þÀ©Õ¹
|
if CheckBuyItemLimitEx(curPlayer, shopType, itemIndex, mainItemID, ipyData.GetLimitValue(), clientBuyCount):
|
GameWorld.Log("Store shop item buy limit! shopType=%s,itemIndex=%s,limitValue=%s"
|
% (shopType, itemIndex, ipyData.GetLimitValue()), curPlayer.GetPlayerID())
|
return
|
if not PlayerControl.HaveMoney(curPlayer, priceType, itemPrice):
|
curPlayer.ShopResult(itemIndex, IPY_GameWorld.tsrNoMoney)
|
return
|
|
if serverLimitCnt > 0: #È«·þÏÞ¹ºÅжϷŵ½×îºóÃæ£¬GameServerÖ±½Ó¼Ó´ÎÊý
|
if curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_StoreQueryState) == 1:
|
#ÒѾÔÚ²éѯÖÐ, ²»Öظ´²éѯ
|
GameWorld.DebugLog("È«·þ¹ºÂò´ÎÊýÒѾÔÚ²éѯÖÐ, ²»Öظ´²éѯ itemIndex=%s" % itemIndex)
|
return
|
cmdStr = '%s' % ([itemIndex, serverLimitCnt, clientBuyCount, totalItemList, mainItemID, limitBuyCnt, sendMailKey])
|
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0,
|
"GetStoreServerBuyCnt", cmdStr, len(cmdStr))
|
#ÉèÖÃ״̬²éѯÖÐ
|
curPlayer.SetDict(ChConfig.Def_PlayerKey_StoreQueryState, 1)
|
return
|
#-------------------------¿ªÊ¼¹ºÂòÎïÆ·-----------------------------
|
DoBuyStoreItem(curPlayer, itemIndex, clientBuyCount, totalItemList, mainItemID, limitBuyCnt, sendMailKey, ipyData)
|
|
return
|
|
def DoBuyStoreItem(curPlayer, itemIndex, clientBuyCount, totalItemList, mainItemID, limitBuyCnt, sendMailKey, ipyData=None):
|
if not ipyData:
|
ipyData = IpyGameDataPY.GetIpyGameData("Store", itemIndex)
|
priceType, itemPrice = ipyData.GetMoneyType(), ipyData.GetMoneyNum()
|
itemPrice *= clientBuyCount
|
shopType = ipyData.GetShopType()
|
|
beforeMoney = PlayerControl.GetMoney(curPlayer, priceType)
|
infoDict = {"TotalItemList":totalItemList, "ClientBuyCount":clientBuyCount, "ShopType":shopType,
|
"ShopItemIndex":itemIndex, ChConfig.Def_Cost_Reason_SonKey:mainItemID}
|
if not PlayerControl.PayMoney(curPlayer, priceType, itemPrice, ChConfig.Def_Cost_BuyStoreItem, infoDict, clientBuyCount):
|
GameWorld.ErrLog("¹ºÂòÉ̳ÇÎïÆ·Êµ¼Ê¿Û³ý»õ±Òʱʧ°Ü: itemIndex=%s,clientBuyCount=%s,priceType=%s,itemPrice=%s"
|
% (itemIndex, clientBuyCount, priceType, itemPrice))
|
return
|
|
afterMoney = PlayerControl.GetMoney(curPlayer, priceType)
|
|
# ½ñÈÕ¹ºÂò´ÎÊý+1
|
if limitBuyCnt > 0:
|
dayBuyCntKey = ChConfig.Def_PDict_ShopItemDayBuyCnt % itemIndex
|
curDayBuyCnt = curPlayer.NomalDictGetProperty(dayBuyCntKey)
|
PlayerControl.NomalDictSetProperty(curPlayer, dayBuyCntKey, curDayBuyCnt + clientBuyCount)
|
SyncShopItemTodayBuyCount(curPlayer, [itemIndex])
|
|
dataDict = {"ShopType":shopType, "ShopItemIndex":itemIndex, "ClientBuyCount":clientBuyCount,
|
"ItemPrice":itemPrice, "MoneyType":priceType,
|
"BeforeMoney":beforeMoney, "AfterMoney":afterMoney}
|
isForceEvent = priceType not in [IPY_GameWorld.TYPE_Price_Silver_Money]
|
|
itemControl = ItemControler.PlayerItemControler(curPlayer)
|
for itemID, itemCount, isBind in totalItemList:
|
curItemObj = ItemControler.GetOutPutItemObj(itemID, itemCount, False, curPlayer=curPlayer)
|
if not curItemObj:
|
continue
|
userData = curItemObj.GetUserData()
|
if not sendMailKey:
|
packType = ChConfig.GetItemPackType(curItemObj)
|
if not itemControl.PutInItem(packType, curItemObj, event=[ChConfig.ItemGive_BuyItem, isForceEvent, dataDict]):
|
curItemObj.Clear()
|
continue
|
else:
|
curItemObj.Clear()
|
EventShell.EventRespons_BuyItem(curPlayer, itemID, itemCount)
|
|
if ipyData.GetNotifyMark() and itemID == mainItemID:
|
PlayerControl.WorldNotify(0, ipyData.GetNotifyMark(), [curPlayer.GetName(), mainItemID, userData])
|
|
# ¹ºÂòÓÀ¾ÃÊØ»¤Ê±É¾³ýÏÞÊ±ÊØ»¤
|
if itemID == 4101:
|
delGuardItem = ItemCommon.FindItemInPackByItemID(curPlayer, 4105, IPY_GameWorld.rptItem)
|
if delGuardItem:
|
ItemCommon.DelItem(curPlayer, delGuardItem, 1)
|
|
if sendMailKey:
|
PlayerControl.SendMailByKey(sendMailKey, [curPlayer.GetID()], totalItemList, detail=dataDict)
|
else:
|
ItemControler.NotifyGiveAwardInfo(curPlayer, totalItemList, ChConfig.ItemGive_BuyItem, dataEx=shopType)
|
#´¥·¢ÈÎÎñ¹ºÂòÎïÆ·
|
EventShell.EventRespons_ShopBuy(curPlayer, shopType)
|
#curPlayer.ShopResult(itemIndex, IPY_GameWorld.tsrShopOK)
|
SyncShoppingResult(curPlayer, itemIndex, clientBuyCount)
|
|
if shopType == ShopType_FairyCeremony:
|
PlayerFairyCeremony.OnBuyFireworks(curPlayer, itemIndex, clientBuyCount)
|
# if itemIndex in IpyGameDataPY.GetFuncEvalCfg('NewCeremonyFireParty', 1, {}).values():
|
# PlayerNewFairyCeremony.AddFCPartyActionCnt(curPlayer, ChConfig.Def_PPAct_Fireworks, clientBuyCount)
|
return
|
|
def GetShopJobItem(job, itemID, jobItemList):
|
## »ñÈ¡É̳ÇÎïÆ·¶ÔÓ¦µÄÖ°ÒµÎïÆ·£¬ Ö°Òµ´Ó1¿ªÊ¼
|
for jobItemIDList in jobItemList:
|
if type(jobItemIDList) not in [list, tuple]:
|
GameWorld.ErrLog("É̳ÇÖ°ÒµÎïÆ·×é¸ñʽ´íÎó!shopItemID=%s,jobItemList=%s" % (itemID, jobItemList))
|
return itemID
|
if itemID in jobItemIDList:
|
if job <= 0 or job > len(jobItemIDList):
|
GameWorld.ErrLog("É̳ÇÖ°ÒµÎïÆ·ÅäÖôíÎó,ûÓиÃÖ°Òµ¶ÔÓ¦ÎïÆ·ID!shopItemID=%s,job=%s" % (itemID, job))
|
return itemID
|
return jobItemIDList[job - 1]
|
return itemID
|
|
def SyncShoppingResult(curPlayer, itemIndex, itemCnt):
|
#֪ͨ¹ºÂò½á¹û
|
resultInfo = ChPyNetSendPack.tagMCShoppingResult()
|
resultInfo.ItemIndex = itemIndex
|
resultInfo.ItemCnt = itemCnt
|
NetPackCommon.SendFakePack(curPlayer, resultInfo)
|
return
|
|
## É̵깺ÂòÎïÆ·ÏÞÖÆÌõ¼þÀ©Õ¹
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @return
|
def CheckBuyItemLimitEx(curPlayer, shopNPCID, itemIndex, curItemID, limitValue, clientBuyCount):
|
if shopNPCID == 7: #·ûÓ¡É̵ê
|
return not PlayerRune.GetIsOpenByRuneID(curPlayer, curItemID)
|
if shopNPCID in [8, 9, 10]: #ÏÉÃËÉ̵ê
|
if curPlayer.GetFamilyID() == 0:
|
#ÎÞ¼Ò×å
|
return True
|
curFamilyLV = curPlayer.GetFamilyLV()
|
if curFamilyLV <= 0:
|
curFamilyLV = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyLV)
|
return curFamilyLV < limitValue
|
if shopNPCID in [15]: # ¿ª·þÌØ»ÝÉ̵ê
|
#playerCreateRoleDays = GameWorld.GetCreateRoleDays(curPlayer)
|
openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)+1
|
return openServerDay != limitValue
|
|
#ÏɽçÊ¢µä - ÑÌ»¨¿ñ»¶
|
if shopNPCID == ShopType_FairyCeremony:
|
return not PlayerFairyCeremony.IsCanBuyFireworks(curPlayer, itemIndex, clientBuyCount)
|
|
#ÁíÒ»¸öÏɽçÊ¢µä¿ÉÓÃÆäËûÉ̵êNPCID£¬ÕâÀïÏÈ×¢ÊÍ£¬Ö®ºóÔÙ¸Ä
|
# if itemIndex in IpyGameDataPY.GetFuncEvalCfg('NewCeremonyFireParty', 1, {}).values():
|
# return not PlayerNewFairyCeremony.IsCanBuyFireworks(curPlayer, itemIndex)
|
|
if shopNPCID == 16:#ÉñÃØÏÞ¹º
|
startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShopItemStartTime % itemIndex)
|
curTime = int(time.time())
|
return not startTime or curTime - startTime >= limitValue
|
|
#
|
# limitPlusDict = {shopItem.GetLimitPlusType1():shopItem.GetLimitPlusValue1(),
|
# shopItem.GetLimitPlusType2():shopItem.GetLimitPlusValue2(),
|
# shopItem.GetLimitPlusType3():shopItem.GetLimitPlusValue3(),
|
# }
|
#
|
# for limitType, limitValue in limitPlusDict.items():
|
# if limitType <= 0:
|
# continue
|
#
|
# # ÓÅÏÈÅжÏNPC¶ÀÓеÄ
|
# callFunc = GameWorld.GetExecFunc(EventSrc, "FunctionNPCShopBuyCheck.CheckByNPC_%s_%s"
|
# % (shopNPCID, limitType))
|
#
|
# if callFunc:
|
# return callFunc(curPlayer, shopItem.GetItemID(), limitValue)
|
#
|
# # ¹«¹²ÏÞÖÆÌõ¼þÅжÏ
|
# callFunc = GameWorld.GetExecFunc(EventSrc, "FunctionNPCShopBuyCheck.CheckPublic_%s" % limitType)
|
#
|
# if callFunc:
|
# return callFunc(curPlayer, shopItem.GetItemID(), limitValue)
|
|
# ĬÈϲ»ÏÞÖÆ
|
return False
|
|
def OSSaleOpenMail(curPlayer):
|
#¿ª·þÌØ»Ý¿ªÆôÓʼþ
|
if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_OSSail):
|
return
|
openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay)+1
|
if openServerDay not in IpyGameDataPY.GetFuncEvalCfg('OSSaleOpenMail'):
|
return
|
addItemList = IpyGameDataPY.GetFuncEvalCfg('OSSaleOpenMail', 2)
|
PlayerControl.SendMailByKey('SellMail1', [curPlayer.GetID()], addItemList)
|
return
|
|
|
## É̵ênpcid
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @return
|
def GetCurTradeTagNPC(curPlayer):
|
curActionNPCID = -1
|
|
# µ±Ç°É̵êµÄnpcid
|
tradeTagNPC = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_TradeTagNPC)
|
# Ô¶³ÌÉ̵ê
|
if not tradeTagNPC:
|
return GetDirectNpcID()
|
|
# É̵ênpcidÓ뵱ǰ¶Ô»°npc¶ÔÓ¦
|
elif CheckTradeTagNPC(curPlayer, tradeTagNPC):
|
return tradeTagNPC
|
|
else:
|
GameWorld.ErrLog("GetCurStoreItemList:trade tag NPC not match:%s"%tradeTagNPC,
|
curPlayer.GetPlayerID())
|
|
return curActionNPCID
|
|
## ÅжϼǼµÄÉ̵ênpcidÊÇ·ñÕýÈ·
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param tradeTagNPC
|
# @return
|
def CheckTradeTagNPC(curPlayer, tradeTagNPC):
|
|
curActionObj = curPlayer.GetActionObj()
|
if not curActionObj:
|
return False
|
|
if curActionObj.GetGameObjType() != IPY_GameWorld.gotNPC:
|
return False
|
|
curActionNPC = GameWorld.GetNPCManager().GetNPCByIndex(curActionObj.GetIndex())
|
if curActionNPC.GetNPCID() != tradeTagNPC:
|
return False
|
|
return True
|
|
#--------------------³öÊÛÎïÆ·
|
##³öÊÛÎïÆ·
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param tick ʱ¼ä´Á
|
# @return ·µ»ØÖµÕæ, Âß¼ÔËÐгɹ¦
|
# @remarks ³öÊÛÎïÆ·
|
def SellItem(curPlayer, tick):
|
#1¼ì²éʼþ·¢ÉúµÄ˳Ðò
|
sendData = IPY_GameWorld.IPY_CPlayerSellItem()
|
packType = sendData.GetPackType()
|
itemIndex = sendData.GetItemIndex()
|
shopType = ChConfig.Def_ShopType_NpcShop
|
|
return SellPackItem(curPlayer, packType, [itemIndex], shopType)
|
|
#// A3 11 ÅúÁ¿³öÊÛÎïÆ· #tagCMSellItem
|
#
|
#struct tagCMSellItem
|
#{
|
# tagHead Head;
|
# BYTE PackType; //±³°üÀàÐÍ
|
# BYTE Count; //Ë÷ÒýÊýÁ¿
|
# BYTE ItemIndex[Count]; //ÎïÆ·Ë÷Òý
|
#};
|
def OnSellManyItem(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
packType = clientData.PackType
|
ItemIndexList = clientData.ItemIndex
|
if not ItemIndexList:
|
return
|
shopType = ChConfig.Def_ShopType_NpcShop
|
isOk = SellPackItem(curPlayer, packType, ItemIndexList, shopType)
|
if isOk:
|
curPlayer.Sync_MakeItemAnswer(ShareDefine.Def_mitKeySell, 1)
|
|
return
|
#---------------------------------------------------------------------
|
##³öÊÛÖ¸¶¨±³°üÎïÆ·
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param packType ±³°üÀàÐÍ
|
# @param itemIndex ÎïÆ·Ë÷Òý
|
# @param shopType É̵êÀàÐÍ,1NPCÉ̵꣬2Ô¶³Ì··ÊÛ
|
# @return ·µ»ØÖµÕæ, ¼ì²éͨ¹ý
|
# @remarks ³öÊÛÖ¸¶¨±³°üÎïÆ·
|
def SellPackItem(curPlayer, packType, itemIndexList, shopType):
|
backPack = curPlayer.GetItemManager().GetPack(packType)
|
if backPack == None:
|
return False
|
|
totalSellPriceDict = {}
|
hasSellOK = False
|
notForceRecordEquipTypeList = range(ChConfig.Def_ItemType_retWeapon, ChConfig.Def_ItemType_retNeck)
|
for itemIndex in itemIndexList:
|
curItem = backPack.GetAt(itemIndex)
|
|
if not __CheckItemSell(curPlayer, curItem):
|
continue
|
hasSellOK = True
|
#µ±Ç°ÎïÆ·ÊýÁ¿
|
curItemCount = curItem.GetCount()
|
#itemName = curItem.GetName()
|
#»ñµÃµ¥¸öÎïÆ·ÏúÊÛ¼Û¸ñ
|
curItemSellPrice, curItemSellType = __GetItemSellPrice(curPlayer, curItem)
|
#»ñµÃÕû×éÏúÊÛ¼Û¸ñ
|
curAllItemSellPrice = int(curItemSellPrice) * curItemCount
|
totalSellPriceDict[curItemSellType] = totalSellPriceDict.get(curItemSellType, 0) + curAllItemSellPrice
|
#GameWorld.Log('curItemSellPrice=%s,curAllItemSellPrice=%s,curItemCount=%s'%(curItemSellPrice,curAllItemSellPrice,curItemCount))
|
|
#===========================================================================================
|
# #ÒòÈռǼǼ¹ý´ó, Ìí¼Ó¼Ç¼ɸѡÌõ¼þ
|
# if ItemControler.ItemNeedRecord(curItem):
|
# #Ïêϸ¼Ç¼װ±¸ÐÅÏ¢
|
# DataRecordPack.DR_GetMoneyBySellPackItem(curPlayer, curItemSellType, curAllItemSellPrice)
|
#===========================================================================================
|
|
isForceDR = curItem.GetType() not in notForceRecordEquipTypeList and not ItemControler.ItemNotNeedRecord(curItem)
|
#ÎïÆ·Ïûʧ
|
ItemCommon.DelItem(curPlayer, curItem, curItemCount, False, ChConfig.ItemDel_SellPackItem, isForceDR=isForceDR)
|
#PutItemInBuyBackPack(curPlayer, curItem)
|
if not hasSellOK:
|
return False
|
for priceType, priceMoney in totalSellPriceDict.items():
|
#Íæ¼ÒÇ®Ôö¼Ó
|
addDataDict = {}
|
PlayerControl.GiveMoney(curPlayer, priceType, priceMoney, ChConfig.Def_GiveMoney_SellPackItem, addDataDict, False)
|
PlayerControl.NotifyCode(curPlayer, "GetMoney01", [priceType, priceMoney])
|
return True
|
|
|
## ÊÛÂôÎïÆ·»Ø¹º±³°üµÄ´¦Àí, ·ÅÈë¿Õλ²»µþ¼Ó(±¾ÏîĿûÓлعº£¬ÏÈÆÁ±Î)
|
# @param None
|
# @return None
|
def PutItemInBuyBackPack(curPlayer, curItem):
|
return
|
itemIndexs = str(curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_DelPackIndex))
|
backPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptRecycle)
|
emptyIndex = ItemCommon.GetEmptyIndexInPack(curPlayer, IPY_GameWorld.rptRecycle)
|
if emptyIndex == -1:
|
#Çå³ý¾ÉÎïÆ·
|
emptyIndex = int(itemIndexs[0]) - 1
|
item = backPack.GetAt(emptyIndex)
|
item.Clear()
|
itemIndexs = itemIndexs[1:]
|
else:
|
# Çå¿Õ¿Õ¸ñλ·À·¶, ·ÀÖ¹Òì³£Çé¿öÎïÆ·Ïûʧ¶øÃ»ÓÐÖØÖñê¼Çλµ¼ÖÂÊýÖµÔ½½ç
|
itemIndexs = itemIndexs.replace(str(emptyIndex + 1), '')
|
item = backPack.GetAt(emptyIndex)
|
|
itemIndexs = "%s%s"%(itemIndexs, emptyIndex + 1)
|
|
#·ÅÈëÐÂÎïÆ·
|
item.PutIn(curItem)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_DelPackIndex, int(itemIndexs))
|
return
|
|
|
##¼ì²éÎïÆ·ÊÇ·ñ¿ÉÒÔ³öÊÛ
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param curItem ÎïÆ·ÊµÀý
|
# @return ·µ»ØÖµÕæ, ¼ì²éͨ¹ý
|
# @remarks ¼ì²éÎïÆ·ÊÇ·ñ¿ÉÒÔ³öÊÛ
|
def __CheckItemSell(curPlayer, curItem) :
|
if not ItemCommon.CheckItemCanUse(curItem) or ItemControler.GetIsAuctionItem(curItem):
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_644055")
|
return
|
|
#if ItemControler.IsEventItem(curItem):
|
# PlayerControl.NotifyCode(curPlayer, "itemuse_chenxin_31379")
|
# return
|
|
if curItem.GetCanSell() == 0:
|
#²»ÄܳöÊÛµÄÎïÆ·,ÎÞ·¨³öÊÛ
|
PlayerControl.NotifyCode(curPlayer, "GeRen_lhs_272921")
|
return
|
|
#»ñµÃµ¥¸öÎïÆ·ÏúÊÛ¼Û¸ñ
|
itemPrice , priceType = __GetItemSellPrice(curPlayer, curItem)
|
itemPrice = int(itemPrice) * curItem.GetCount()
|
|
if not itemPrice or not priceType:
|
PlayerControl.NotifyCode(curPlayer, "GeRen_lhs_272921")
|
return
|
|
if not PlayerControl.CanGiveMoney(curPlayer, priceType, itemPrice):
|
# ¶Ô²»Æð£¬ÄúЯ´øµÄ½ðÇ®ÒѾ´ïÉÏÏÞ,²Ù×÷ÎÞЧ
|
#PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_609765")
|
return
|
|
return True
|
|
#---------------------------------------------------------------------
|
##»ñµÃÎïÆ·µÄ³öÊÛ¼Û¸ñ
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param curItem ÎïÆ·ÊµÀý
|
# @return ·µ»ØÖµ, ÎïÆ·µÄ³öÊÛ¼Û¸ñ
|
# @remarks »ñµÃÎïÆ·µÄ³öÊÛ¼Û¸ñ
|
def __GetItemSellPrice(curPlayer, curItem):
|
#ΪÅäºÏ¿Í»§¶Ë,½øÐÐÒÔÏÂÂß¼(ÏòÉÏÈ¡Õû)
|
#2012-03-26 jiang Ä;ÃÕâÀï²»½øÐгýChConfig.Def_EndureRepairParameterµÄת»»¸ÃÓй«Ê½×Ô¼º¼ÆËã
|
#curItemEndure = curItem.GetCurDurg()
|
#curItemMaxEndure = curItem.GetMaxEndure()
|
|
# Ð޸Ĵ˺¯ÊýÇëͬʱÐÞ¸Ä ÍÑ»ú¹Ò³öÊÛ
|
#µ±Ç°ÎïÆ·¼Û¸ñ Ô¼Û³öÊÛ
|
priceType = curItem.GetGoldPaperPrice()
|
if not priceType:
|
priceType = IPY_GameWorld.TYPE_Price_Silver_Money
|
curItemPrice = curItem.GetSilverPrice()
|
return curItemPrice, priceType
|
|
##¼ì²éÍæ¼Ò¿É·ñ¿ªÊ¼NPCʼþ
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @return ·µ»ØÖµÕæ, ¼ì²éͨ¹ý
|
# @remarks ¼ì²éÍæ¼Ò¿É·ñ¿ªÊ¼NPCʼþ
|
def CheckPlayerCanStateEvent(curPlayer):
|
if curPlayer.GetPlayerAction() not in ChConfig.Def_Player_DoEvent_State :
|
#CannotDoing ¶Ô²»Æð£¬Äúµ±Ç°×´Ì¬ÎÞ·¨½øÐд˲Ù×÷£¬²Ù×÷ÎÞЧ
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_740826")
|
return False
|
|
return True
|
|
#---------------------------------------------------------------------
|
##¼ì²éÎïÆ·ÊÇ·ñ¿ÉÒÔ·ÅÈëºÏ³É±³°ü.
|
# @param curItem ÎïÆ·ÊµÀý
|
# @return ²¼¶ûÖµ
|
# @remarks ¼ì²éÎïÆ·ÊÇ·ñ¿ÉÒÔ·ÅÈëºÏ³É±³°ü
|
def __CheckItemCanPutInComposePack(curItem):
|
return curItem.GetType() in ChConfig.Def_Compose_Can_Put_List
|
|
#---------------------------------------------------------------------
|
##ͨÓñ³°ü·ÅÈë²Ù×÷
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param srcBackpack Æðµã±³°ü
|
# @param desBackPack Ä¿±ê±³°ü
|
# @param srcIndex ÆðµãË÷Òý
|
# @param destIndex Ä¿±êË÷Òý
|
# @param putItemCount ·ÅÈëÊýÁ¿
|
# @param tick ʱ¼ä´Á
|
# @return ·µ»ØÖµÎÞÒâÒå
|
# @remarks ͨÓñ³°ü·ÅÈë²Ù×÷
|
def BackpackOperate(curPlayer, srcBackpack, desBackPack, srcIndex, destIndex, putItemCount, tick):
|
#»ñµÃÐèÒª²Ù×÷µÄÎïÆ·µÄÎïÆ·
|
scrItem = __GetBackPackOperateItem(curPlayer, srcBackpack, desBackPack, srcIndex)
|
|
if scrItem == None:
|
return
|
|
itemControl = ItemControler.PlayerItemControler(curPlayer)
|
|
if not itemControl.CanPutInItem(desBackPack, scrItem.GetItemTypeID(), putItemCount, scrItem.GetIsBind()):
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [desBackPack])
|
return
|
|
#ÍÏ×§ÎïÆ·
|
ItemControler.DragItem(curPlayer, srcBackpack, srcIndex, desBackPack, destIndex, putItemCount)
|
return
|
#---------------------------------------------------------------------
|
##ͨÓñ³°ü²Ù×÷¼ì²é
|
# @param scrItem ·ÅÈëÎïÆ·
|
# @param desBackPack Ä¿±ê±³°ü
|
# @return ²¼¶ûÖµ
|
# @remarks ͨÓñ³°ü²Ù×÷¼ì²é
|
def __CheckBackPackOperate(scrItem, desBackPack):
|
#ÌØÊâ¼ì²é
|
if desBackPack in ChConfig.Def_ComposePack_List:
|
if not __CheckItemCanPutInComposePack(scrItem):
|
GameWorld.ErrLog('BackpackOperate ItemErr = %s, ItemType = %s'%(scrItem.GetItemTypeID(), scrItem.GetType()))
|
return False
|
|
return True
|
#---------------------------------------------------------------------
|
##»ñµÃ±³°üµ±Ç°²Ù×÷µÄÎïÆ·
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param srcBackpack Æðʼ±³°ü
|
# @param desBackPack Ä¿µÄ±³°ü
|
# @param srcIndex ÆðʼÎïÆ·Ë÷Òý
|
# @return ²Ù×÷ÎïÆ·ÊµÀý»òÕßNone
|
# @remarks »ñµÃ±³°üµ±Ç°²Ù×÷µÄÎïÆ·
|
def __GetBackPackOperateItem(curPlayer, srcBackpack, desBackPack, srcIndex):
|
#²Ù×÷±³°ü¼ì²é
|
if srcBackpack not in ChConfig.Def_BackpackOperate_List or desBackPack not in ChConfig.Def_BackpackOperate_List:
|
GameWorld.ErrLog('PackItemExchange packErr, srcBackpack = %s, \
|
desBackPack = %s'%(srcBackpack, desBackPack), curPlayer.GetID())
|
return
|
|
#»ñµÃ·ÅÈëµÄÎïÆ·
|
scrItem = curPlayer.GetItemManager().GetPack(srcBackpack).GetAt(srcIndex)
|
|
#---ÎïÆ·¼ì²é---
|
if not ItemCommon.CheckItemCanUse(scrItem):
|
return
|
|
#ÌØÊâ¼ì²é
|
if not __CheckBackPackOperate(scrItem, desBackPack):
|
return
|
|
return scrItem
|
#---------------------------------------------------------------------
|
##ͨÓñ³°ü½»»»²Ù×÷
|
# @param curPlayer Íæ¼ÒʵÀý
|
# @param srcBackpack Æðµã±³°ü
|
# @param destBackPack Ä¿±ê±³°ü
|
# @param srcIndex ÆðµãË÷Òý
|
# @param destIndex Ä¿±êË÷Òý
|
# @param tick ʱ¼ä´Á
|
# @return ·µ»ØÖµÎÞÒâÒå
|
# @remarks ͨÓñ³°ü½»»»²Ù×÷
|
def PackItemExchange(curPlayer, srcBackpack, destBackPack, srcIndex, destIndex, tick):
|
#»ñµÃÐèÒª²Ù×÷µÄÎïÆ·µÄÎïÆ·
|
scrItem = __GetBackPackOperateItem(curPlayer, srcBackpack, destBackPack, srcIndex)
|
|
if scrItem == None:
|
return
|
|
#---Ñé֤Ŀ±ê±³°ü¸ñ×Ó--
|
destItem = curPlayer.GetItemManager().GetPack(destBackPack).GetAt(destIndex)
|
#Ä¿±ê¸ñ×ÓÖ»ÑéÖ¤Ëø¶¨, ¿ÉÒÔÔÊÐí¿Õλ
|
if destItem == None or destItem.GetIsLocked():
|
return
|
|
ItemCommon.DoLogicSwitchItem(curPlayer, scrItem, destItem, destBackPack)
|
return
|
|
|
## »ñµÃ½ðÇ®¸¶·Ñ×Öµä
|
# @param moneyList ½ðÇ®Áбí [½ðÇ®ÀàÐÍ£¬ ½ðÇ®ÊýÁ¿£¬¡£¡£¡£]
|
# @param payMoneyDict ½ðÇ®ÀÛ¼Ó×Öµä
|
# @return ½ðÇ®ÀÛ¼Ó×Öµä
|
# @remarks »ñµÃ½ðÇ®¸¶·Ñ×Öµä
|
def GetPayMoneyDict(moneyList, payMoneyDict={}):
|
length = len(moneyList)
|
|
for index in range(0, length, 2):
|
moneyType = moneyList[index]
|
money = moneyList[index + 1]
|
|
payMoney = payMoneyDict.get(moneyType)
|
if payMoney == None:
|
payMoneyDict[moneyType] = money
|
else:
|
payMoneyDict[moneyType] += money
|
|
return payMoneyDict
|
|
|
## ¼ì²é½ðÇ®
|
# @param curPlayer Íæ¼Ò
|
# @param payMoneyDict ¸¶Ç®×Öµä
|
# @return BOOLÊÇ·ñ×ã¹»
|
# @remarks ¼ì²é½ðÇ®
|
def CheckPayMoney(curPlayer, payMoneyDict):
|
|
for moneyType, money in payMoneyDict.items():
|
|
#ÑéÖ¤ÊÖÐø·Ñ
|
if not PlayerControl.HaveMoney(curPlayer, moneyType, money):
|
return False
|
|
return True
|
|