#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
#-------------------------------------------------------------------------------
|
#
|
##@package Player.PlayerLuckyTreasure
|
#
|
# @todo:ÐÒÔ˼ø±¦
|
# @author xdh
|
# @date 2019-2-12 19:50
|
# @version 1.0
|
#
|
#
|
# ÏêϸÃèÊö: ÐÒÔ˼ø±¦
|
#
|
#---------------------------------------------------------------------
|
"""Version = 2019-2-12 19:50"""
|
#---------------------------------------------------------------------
|
|
import IPY_GameWorld
|
import GameWorld
|
import ChConfig
|
import IpyGameDataPY
|
import PlayerControl
|
import ChPyNetSendPack
|
import NetPackCommon
|
import ShareDefine
|
import PyGameData
|
import ItemControler
|
import ItemCommon
|
|
|
|
def OnLogin(curPlayer):
|
isReset = __CheckPlayerLuckyTreasureAction(curPlayer)
|
if not isReset:
|
actCostRebateInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_LuckyTreasure, {})
|
# »î¶¯ÖÐͬ²½»î¶¯ÐÅÏ¢
|
if actCostRebateInfo.get(ShareDefine.ActKey_State):
|
SyncLuckyTreasureInfo(curPlayer)
|
SyncLuckyTreasureResultInfo(curPlayer)
|
|
return
|
|
def RefreshLuckyTreasureAction():
|
__InitLuckyTreasureRateList()
|
playerManager = GameWorld.GetPlayerManager()
|
for i in xrange(playerManager.GetPlayerCount()):
|
curPlayer = playerManager.GetPlayerByIndex(i)
|
if curPlayer == None or not curPlayer.GetInitOK():
|
continue
|
__CheckPlayerLuckyTreasureAction(curPlayer)
|
return
|
|
def __CheckPlayerLuckyTreasureAction(curPlayer):
|
## ¼ì²éÍæ¼ÒÐÒÔ˼ø±¦»î¶¯Êý¾ÝÐÅÏ¢
|
global g_randomWellDict
|
|
playerID = curPlayer.GetPlayerID()
|
|
actLuckyTreasureInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_LuckyTreasure, {})
|
LuckyTreasureID = actLuckyTreasureInfo.get(ShareDefine.ActKey_ID, 0)
|
state = actLuckyTreasureInfo.get(ShareDefine.ActKey_State, 0)
|
#cfgID = actLuckyTreasureInfo.get(ShareDefine.ActKey_CfgID, 0)
|
worldLV = actLuckyTreasureInfo.get(ShareDefine.ActKey_WorldLV, 0)
|
playerLuckyTreasureID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LuckyTreasureID) # Íæ¼ÒÉíÉϵĻID
|
|
# »î¶¯ID ÏàͬµÄ»°²»´¦Àí
|
if LuckyTreasureID == playerLuckyTreasureID:
|
#GameWorld.DebugLog("ÐÒÔ˼ø±¦»î¶¯ID²»±ä£¬²»´¦Àí£¡", curPlayer.GetPlayerID())
|
return
|
msgStr = str([ShareDefine.Def_UniversalGameRecType_LuckyTreasure, 2])
|
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'DelUniversalGameRec', msgStr, len(msgStr))
|
GameWorld.DebugLog("ÐÒÔ˼ø±¦ÖØÖÃ! LuckyTreasureID=%s,playerLuckyTreasureID=%s,state=%s,worldLv=%s"
|
% (LuckyTreasureID, playerLuckyTreasureID, state, worldLV), playerID)
|
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LuckyTreasureID, LuckyTreasureID)
|
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LuckyTreasureFree, 0)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LuckyTreasurePoint, 0)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LuckyTreasureCnt, 0)
|
|
|
SyncLuckyTreasureInfo(curPlayer)
|
SyncLuckyTreasureResultInfo(curPlayer)
|
return True
|
|
def __InitLuckyTreasureRateList():
|
global g_itemRateList
|
actLuckyTreasureInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_LuckyTreasure, {})
|
state = actLuckyTreasureInfo.get(ShareDefine.ActKey_State, 0)
|
cfgID = actLuckyTreasureInfo.get(ShareDefine.ActKey_CfgID, 0)
|
worldLV = actLuckyTreasureInfo.get(ShareDefine.ActKey_WorldLV, 0)
|
if not cfgID or not worldLV or not state:
|
return
|
actIpyData = IpyGameDataPY.GetIpyGameData("ActLuckyTreasure", cfgID)
|
if not actIpyData:
|
return
|
templateID = actIpyData.GetTemplateID()
|
ipyDataList = IpyGameDataPY.GetIpyGameDataList('LuckyTreasureTemplate', templateID)
|
if not ipyDataList:
|
return
|
tWeight = 0
|
g_itemRateList = []
|
for ipyData in ipyDataList:
|
worldLVLimit = ipyData.GetWorldLVLimit()
|
if worldLV < worldLVLimit[0] or worldLV > worldLVLimit[1]:
|
continue
|
itemID = ipyData.GetItemID()
|
itemCnt = ipyData.GetItemCnt()
|
isBind = ipyData.GetIsBind()
|
weight = ipyData.GetWeight()
|
tWeight += weight
|
g_itemRateList.append([tWeight, [itemID, itemCnt, isBind]])
|
return
|
|
def __GetRandomRateList():
|
if not g_itemRateList:
|
__InitLuckyTreasureRateList()
|
return g_itemRateList
|
|
|
#// AA 08 ¿ªÊ¼ÐÒÔ˼ø±¦ #tagCMStartLuckyTreasure
|
#struct tagCMStartLuckyTreasure
|
#{
|
# tagHead Head;
|
#};
|
def OnStartLuckyTreasure(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
actBossRebornInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_LuckyTreasure, {})
|
state = actBossRebornInfo.get(ShareDefine.ActKey_State, 0)
|
cfgID = actBossRebornInfo.get(ShareDefine.ActKey_CfgID, 0)
|
if not state or not cfgID:
|
return
|
actIpyData = IpyGameDataPY.GetIpyGameData("ActLuckyTreasure", cfgID)
|
if not actIpyData:
|
return
|
|
hasFree = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LuckyTreasureFree)
|
if hasFree:
|
costMoney = IpyGameDataPY.GetFuncCfg('LuckyAppraisal')
|
if not PlayerControl.HaveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costMoney):
|
return
|
# ¼ì²é±³°ü
|
needSpace = 1
|
packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)
|
if needSpace > packSpace:
|
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")
|
return
|
|
randomRateList = __GetRandomRateList()
|
if not randomRateList:
|
return
|
greatItem = randomRateList[-1][1]
|
|
curLuckyPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LuckyTreasurePoint)
|
curLuckyCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LuckyTreasureCnt)
|
|
maxLuckyPoint = actIpyData.GetLuckyPoint()
|
singlePoint = IpyGameDataPY.GetFuncCfg('LuckyAppraisal', 2)
|
if curLuckyPoint + singlePoint >= maxLuckyPoint:
|
giveItem = greatItem
|
newLuckyPoint = 0
|
else:
|
if curLuckyCnt < IpyGameDataPY.GetFuncCfg('LuckyAppraisal', 3):
|
#ǰX´Î¼ø±¦²»Äܳö´ó½±
|
randomResultList = GameWorld.GetResultByRandomListEx(randomRateList[:-1], 1, [])
|
else:
|
randomResultList = GameWorld.GetResultByRandomListEx(randomRateList, 1, [])
|
if len(randomResultList) != 1:
|
GameWorld.DebugLog(' ¿ªÊ¼ÐÒÔ˼ø±¦ Ëæ»ú¿â½á¹û »ñÈ¡´íÎó £¡')
|
return
|
giveItem = randomResultList[0]
|
if giveItem == greatItem:
|
newLuckyPoint = 0
|
playerName = curPlayer.GetName()
|
PlayerControl.WorldNotify(0, 'LuckyAppraisal_1', [playerName, greatItem[0]])
|
msgStr = str([ShareDefine.Def_UniversalGameRecType_LuckyTreasure, [], [curPlayer.GetName()], 2, 0])
|
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'AddUniversalGameRec', msgStr, len(msgStr))
|
|
else:
|
newLuckyPoint = curLuckyPoint + singlePoint
|
if hasFree:
|
PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costMoney, ChConfig.Def_Cost_LuckyTreasure)
|
else:
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LuckyTreasureFree, 1)
|
#¸üÐÂÐÒÔËÖµ
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LuckyTreasurePoint, newLuckyPoint)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LuckyTreasureCnt, curLuckyCnt + 1)
|
|
for itemID, itemCount, isBind in [giveItem]:
|
ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, 0, [IPY_GameWorld.rptItem], event=[ChConfig.ItemGive_LuckyTreasure, False, {"isFree":not hasFree}])
|
|
SyncLuckyTreasureResultInfo(curPlayer, giveItem)
|
return
|
|
|
def SyncLuckyTreasureInfo(curPlayer):
|
##ͬ²½ÐÒÔ˼ø±¦»î¶¯ÐÅÏ¢
|
actBossRebornInfo = PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_LuckyTreasure, {})
|
state = actBossRebornInfo.get(ShareDefine.ActKey_State, 0)
|
cfgID = actBossRebornInfo.get(ShareDefine.ActKey_CfgID, 0)
|
if not state or not cfgID:
|
return
|
actIpyData = IpyGameDataPY.GetIpyGameData("ActLuckyTreasure", cfgID)
|
if not actIpyData:
|
return
|
openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) + 1
|
actInfo = ChPyNetSendPack.tagMCLuckyTreasureInfo()
|
actInfo.Clear()
|
actInfo.StartDate = GameWorld.GetOperationActionDateStr(actIpyData.GetStartDate(), openServerDay)
|
actInfo.EndtDate = GameWorld.GetOperationActionDateStr(actIpyData.GetEndDate(), openServerDay)
|
actInfo.ResetType = actIpyData.GetResetType()
|
actInfo.LimitLV = actIpyData.GetLVLimit()
|
actInfo.LuckyPoint = actIpyData.GetLuckyPoint()
|
actInfo.ItemList = []
|
randomItemList = __GetRandomRateList()
|
for itemInfo in randomItemList:
|
itemID, itemCnt, isBind = itemInfo[1]
|
wellItemInfo = ChPyNetSendPack.tagMCLuckyTreasureItem()
|
wellItemInfo.ItemID = itemID
|
wellItemInfo.ItemCnt = itemCnt
|
wellItemInfo.IsBind = isBind
|
actInfo.ItemList.append(wellItemInfo)
|
actInfo.Count = len(actInfo.ItemList)
|
NetPackCommon.SendFakePack(curPlayer, actInfo)
|
return
|
|
|
def SyncLuckyTreasureResultInfo(curPlayer, itemInfo=[]):
|
##ͬ²½ÐÒÔ˼ø±¦Íæ¼ÒÐÅÏ¢
|
packInfo = ChPyNetSendPack.tagMCLuckyTreasureResultInfo()
|
packInfo.Clear()
|
packInfo.LuckyPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LuckyTreasurePoint)
|
packInfo.HasFree = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LuckyTreasureFree)
|
if itemInfo:
|
packInfo.ItemID = itemInfo[0]
|
packInfo.ItemCnt = itemInfo[1]
|
packInfo.IsBind = itemInfo[2]
|
NetPackCommon.SendFakePack(curPlayer, packInfo)
|
return
|