#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package Player.PlayerMineArea
|
#
|
# @todo:¿óÎ︣µØ
|
# @author hxp
|
# @date 2024-03-07
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ¿óÎ︣µØ
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2024-03-07 19:30"""
|
#-------------------------------------------------------------------------------
|
|
import ChConfig
|
import PlayerControl
|
import IpyGameDataPY
|
import IPY_GameWorld
|
import ChPyNetSendPack
|
import NetPackCommon
|
import ItemControler
|
import ItemCommon
|
import GameWorld
|
|
# ¾Û±¦ÅèĬÈÏ×î´ó½ø¶È
|
MineTreasureProgressMax = 100
|
|
def OnPlayerLogin(curPlayer):
|
SyncPlayerMineAreaInfo(curPlayer)
|
return
|
|
def PlayerOnDay(curPlayer):
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineHelpAwardCount, 0)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineWorkerEnergyUsed, 0)
|
for refreshType in [0, 1]:
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineRefreshCount % refreshType, 0)
|
SyncPlayerMineAreaInfo(curPlayer)
|
return
|
|
def GetWorkerTotal(curPlayer):
|
## »ñÈ¡Íæ¼Ò¹¤ÈË×ÜÊý
|
initCount = 0 # ÆðʼĬÈϹ¤ÈËÊý
|
employCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineWorkerCount)
|
return initCount + employCount
|
|
def GetWorkerState(curPlayer):
|
## »ñÈ¡¹¤ÈËÆ£ÀÍ״̬
|
workerStateEnergyList = IpyGameDataPY.GetFuncEvalCfg("MineAreaWorker", 1) # ¹¤ÈËÆ£ÀÍ״̬ÌåÁ¦Áбí [³äÅæÌåÁ¦, Õý³£, ÐéÈõ, ¿Ý½ß]£¬×ÜÌåÁ¦=ËùÓÐÌåÁ¦Ïà¼Ó
|
funcEnergy = 0 # ÆäËû¹¦ÄÜÔö¼ÓµÄÌåÁ¦
|
stateEnergy = 0
|
energyUsed = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineWorkerEnergyUsed)
|
for state, energy in enumerate(workerStateEnergyList):
|
if state == 0:
|
energy += funcEnergy
|
stateEnergy += energy
|
if energyUsed <= stateEnergy:
|
return state
|
return len(workerStateEnergyList) - 1 # ĬÈÏ×î´óÆ£ÀÍ
|
|
#// B0 30 ¸£µØÎïÆ·À #tagCMMineItemPull
|
#
|
#struct tagCMMineItemPull
|
#{
|
# tagHead Head;
|
# DWORD PlayerID; // ¸£µØËùÊôÍæ¼ÒID£¬0ĬÈÏ×Ô¼º
|
# BYTE ItemIndex; // ÎïÆ·ËùÔÚλÖÃË÷Òý0~n
|
# BYTE WorkerCount; // ÉϹ¤ÈËÈËÊý
|
# BYTE IsPreview; // ÊÇ·ñÔ¤ÀÀ£»0-Ö±½ÓÀ£¬1-Ô¤ÀÀ´ó¸Åʱ¼ä
|
#};
|
def OnMineItemPull(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
areaPlayerID = clientData.PlayerID
|
itemIndex = clientData.ItemIndex
|
workerCount = clientData.WorkerCount
|
isPreview = clientData.IsPreview
|
if not areaPlayerID:
|
areaPlayerID = curPlayer.GetPlayerID()
|
|
workerTotal = GetWorkerTotal(curPlayer)
|
workerState = GetWorkerState(curPlayer)
|
|
SendToGameServer_MineArea(curPlayer, "Pull", [areaPlayerID, itemIndex, workerCount, workerState, workerTotal, isPreview])
|
return
|
|
#// B0 31 ¸£µØÎïÆ·Ë¢Ð #tagCMMineItemRefresh
|
#
|
#struct tagCMMineItemRefresh
|
#
|
#{
|
# tagHead Head;
|
# BYTE IsSuper; // ÊÇ·ñ³¬¼¶Ë¢ÐÂ
|
#};
|
def OnMineItemRefresh(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
isSuper = clientData.IsSuper
|
|
refreshType = str(1 if isSuper else 0)
|
|
moneyDict = IpyGameDataPY.GetFuncEvalCfg("MineAreaRefresh", 1, {})
|
if refreshType not in moneyDict:
|
return
|
moneyType, moneyValue = moneyDict[refreshType]
|
if not PlayerControl.HaveMoney(curPlayer, moneyType, moneyValue):
|
return
|
|
refreshMaxDict = IpyGameDataPY.GetFuncEvalCfg("MineAreaRefresh", 2, {})
|
refreshCountMax = refreshMaxDict.get(refreshType, 0)
|
refreshCountNow = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineRefreshCount % refreshType)
|
if refreshCountMax and refreshCountNow >= refreshCountMax:
|
GameWorld.DebugLog("¸£µØÎïÆ·Ë¢Ð´ÎÊýÒÑ´ï½ñÈÕÉÏÏÞ! isSuper=%s,refreshCountNow=%s >= %s" % (isSuper, refreshCountNow, refreshCountMax), playerID)
|
return
|
|
PlayerControl.PayMoney(curPlayer, moneyType, moneyValue, "MineItemRefresh")
|
if refreshCountMax:
|
refreshCountUpd = refreshCountNow + 1
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineRefreshCount % refreshType, refreshCountUpd)
|
SyncPlayerMineAreaInfo(curPlayer)
|
|
SendToGameServer_MineArea(curPlayer, "MineItemRefresh", [playerID, isSuper])
|
return
|
|
#// B0 32 ¸£µØ¹¤È˹ÍÓ¶ #tagCMMineWorkerEmploy
|
#
|
#struct tagCMMineWorkerEmploy
|
#
|
#{
|
# tagHead Head;
|
#};
|
def OnMineWorkerEmploy(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
employCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineWorkerCount)
|
|
costItemCountList = IpyGameDataPY.GetFuncEvalCfg("MineAreaWorker", 3)
|
if employCount >= len(costItemCountList):
|
GameWorld.DebugLog("ÒÑ´ïµ½¸£µØ¹ÍÓ¶¹¤ÈËÊýÉÏÏÞ! employCount=%s" % employCount)
|
return
|
costItemCount = costItemCountList[employCount]
|
costItemID = IpyGameDataPY.GetFuncCfg("MineAreaWorker", 2)
|
if not costItemID:
|
return
|
|
# Ö§³ÖÅä0²»ÏûºÄ¸öÊý
|
if costItemCount > 0:
|
costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID, costItemCount)
|
lackCnt = costItemCount - bindCnt - unBindCnt
|
if lackCnt > 0:
|
GameWorld.DebugLog("¸£µØ¹ÍÓ¶¹¤È˵À¾ß²»×ã! costItemID=%s,costItemCount=%s,bindCnt=%s,unBindCnt=%s,lackCnt=%s,ÒѹÍÓ¶Êý=%s"
|
% (costItemID, costItemCount, bindCnt, unBindCnt, lackCnt, employCount))
|
return
|
delCnt = costItemCount
|
ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, delCnt, "MineWorkerEmploy")
|
|
updEmployCount = employCount + 1
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineWorkerCount, updEmployCount)
|
SyncPlayerMineAreaInfo(curPlayer)
|
GameWorld.DebugLog("¸£µØ¹ÍÓ¶¹¤ÈË! costItemID=%s,costItemCount=%s,updEmployCount=%s" % (costItemID, costItemCount, updEmployCount), playerID)
|
return
|
|
def SendToGameServer_MineArea(curPlayer, msgType, dataMsg=""):
|
playerID = curPlayer.GetPlayerID()
|
msgList = str([msgType, dataMsg])
|
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "MineArea", msgList, len(msgList))
|
GameWorld.Log("¸£µØ·¢ËÍGameServer: %s, %s" % (msgType, dataMsg), playerID)
|
return
|
|
def GameServer_MineArea_DoResult(curPlayer, msgData):
|
|
msgType, dataMsg, _ = msgData
|
|
## ½áËã½±Àø
|
if msgType == "MineAreaAwardGet":
|
awardInfoList = dataMsg[0]
|
__DoGiveMineAreaAward(curPlayer, awardInfoList)
|
|
return
|
|
def __DoGiveMineAreaAward(curPlayer, awardInfoList):
|
|
playerID = curPlayer.GetPlayerID()
|
energyUsed = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineWorkerEnergyUsed)
|
addEnergyUsed = 0
|
awardItemDict = {}
|
robCount = 0 # ÇÀ½ÙÊý
|
GUIDList = []
|
for awardInfo in awardInfoList:
|
GUID, awardTime, workerCount, areaPlayerID, mineID, itemLV, itemID, itemCount = awardInfo
|
isToday = GameWorld.CheckTimeIsSameServerDayEx(awardTime)
|
if isToday:
|
addEnergyUsed += workerCount
|
if playerID != areaPlayerID:
|
robCount += 1
|
awardItemDict[itemID] = awardItemDict.get(itemID, 0) + itemCount
|
GUIDList.append(GUID)
|
GameWorld.DebugLog("½áË㸣µØ½±Àø! areaPlayerID=%s,mineID=%s,itemLV=%s,itemID=%s,itemCount=%s,awardTime=%s,isToday=%s,workerCount=%s %s"
|
% (areaPlayerID, mineID, itemLV, itemID, itemCount, GameWorld.ChangeTimeNumToStr(awardTime), isToday, workerCount, GUID), playerID)
|
|
if addEnergyUsed:
|
energyUsed += addEnergyUsed
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineWorkerEnergyUsed, energyUsed)
|
GameWorld.DebugLog(" Ôö¼Ó¸£µØ¹¤ÈËÒÑÓþ«Á¦! addEnergyUsed=%s,updEnergyUsed=%s" % (addEnergyUsed, energyUsed), playerID)
|
|
if robCount:
|
OnAddMineTreasureProgress(curPlayer, robCount, False)
|
|
SyncPlayerMineAreaInfo(curPlayer)
|
|
awardItemList = [[itemID, itemCount, 0] for itemID, itemCount in awardItemDict.items()]
|
ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, None, ["MineAreaAward", False, {}])
|
|
SendToGameServer_MineArea(curPlayer, "MineAreaAwardGetOK", [GUIDList, awardItemList])
|
return
|
|
def OnMineTreasureByCTGID(curPlayer, ctgID):
|
## ³äÖµ¼¤»î¾Û±¦Åè
|
treasureCTGIDList = IpyGameDataPY.GetFuncEvalCfg("MineAreaTreasure", 1)
|
for treasureType, ctgIDList in enumerate(treasureCTGIDList):
|
if not ctgIDList or ctgID not in ctgIDList: # Åä¿ÕÁбíµÄĬÈϼ¤»î
|
continue
|
state = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineTreasureState)
|
if state&pow(2, treasureType):
|
break
|
updState = state|pow(2, treasureType)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineTreasureState, updState)
|
SyncPlayerMineAreaInfo(curPlayer)
|
GameWorld.Log("¼¤»î¸£µØ¾Û±¦Åè: treasureType=%s,updState=%s" % (treasureType, updState), curPlayer.GetPlayerID())
|
break
|
|
return
|
|
def OnAddMineTreasureProgress(curPlayer, robCount, isNotify=True):
|
## Ôö¼Ó¾Û±¦Åè½ø¶È
|
# @param robCount: ÇÀ¶áÎïÆ·Êý
|
if robCount <= 0:
|
return
|
|
playerID = curPlayer.GetPlayerID()
|
treasureCTGIDList = IpyGameDataPY.GetFuncEvalCfg("MineAreaTreasure", 1)
|
treasureAddProgressList = IpyGameDataPY.GetFuncEvalCfg("MineAreaTreasure", 2)
|
treasureState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineTreasureState)
|
for treasureType, addProgressSet in enumerate(treasureAddProgressList):
|
ctgIDList = treasureCTGIDList[treasureType]
|
isActivite = 1 if (not ctgIDList or treasureState&pow(2, treasureType)) else 0
|
if not isActivite:
|
continue
|
curProgress = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineTreasureProgess % treasureType)
|
if curProgress >= MineTreasureProgressMax:
|
continue
|
addProgress = addProgressSet * robCount
|
updProgress = min(curProgress + addProgress, MineTreasureProgressMax)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineTreasureProgess % treasureType, updProgress)
|
GameWorld.DebugLog(" Ôö¼Ó¸£µØ¾Û±¦Åè½ø¶È: robCount=%s,treasureType=%s,curProgress=%s,addProgress=%s,updProgress=%s"
|
% (robCount, treasureType, curProgress, addProgress, updProgress), playerID)
|
|
if isNotify:
|
SyncPlayerMineAreaInfo(curPlayer)
|
return
|
|
def GetMineTreasureAward(curPlayer, treasureType):
|
## ÁìÈ¡¾Û±¦Åè½±Àø
|
|
playerID = curPlayer.GetPlayerID()
|
|
treasureAward = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineTreasureAward)
|
if treasureAward&pow(2, treasureType):
|
GameWorld.DebugLog("¸£µØ¾Û±¦Åè½±ÀøÒÑÁìÈ¡¹ý! treasureType=%s,treasureAward=%s" % (treasureType, treasureAward), playerID)
|
return
|
|
curProgress = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineTreasureProgess % treasureType)
|
if curProgress < MineTreasureProgressMax:
|
GameWorld.DebugLog("¸£µØ¾Û±¦Åè½ø¶ÈδÂú£¬ÎÞ·¨Áì½±! treasureType=%s,curProgress=%s" % (treasureType, curProgress), playerID)
|
return
|
|
treasureAwardList = IpyGameDataPY.GetFuncEvalCfg("MineAreaTreasure", 3)
|
if treasureType >= len(treasureAwardList):
|
return
|
awardItemList = treasureAwardList[treasureType]
|
|
if not ItemControler.CheckPackSpaceEnough(curPlayer, awardItemList):
|
return
|
|
updAward = treasureAward|pow(2, treasureType)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MineTreasureAward, updAward)
|
SyncPlayerMineAreaInfo(curPlayer)
|
|
for itemID, itemCount, isAuctionItem in awardItemList:
|
ItemControler.GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, [IPY_GameWorld.rptItem])
|
|
GameWorld.DebugLog("¸£µØ¾Û±¦ÅèÁì½±! treasureType=%s,updAward=%s,awardItemList=%s" % (treasureType, updAward, awardItemList), playerID)
|
return
|
|
def SyncPlayerMineAreaInfo(curPlayer):
|
clientPack = ChPyNetSendPack.tagMCPlayerMineAreaInfo()
|
clientPack.WorkerCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineWorkerCount)
|
clientPack.EnergyUsed = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineWorkerEnergyUsed)
|
clientPack.HelpAwardCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineHelpAwardCount)
|
clientPack.RefreshCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineRefreshCount % 0)
|
clientPack.RefreshCountSuper = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineRefreshCount % 1)
|
|
treasureState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineTreasureState)
|
treasureAward = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineTreasureAward)
|
treasureCTGIDList = IpyGameDataPY.GetFuncEvalCfg("MineAreaTreasure", 1)
|
clientPack.TreasureCount = len(treasureCTGIDList)
|
clientPack.TreasureState = [0] * clientPack.TreasureCount
|
clientPack.TreasureAward = [0] * clientPack.TreasureCount
|
clientPack.TreasureProgress = [0] * clientPack.TreasureCount
|
for treasureType, ctgIDList in enumerate(treasureCTGIDList):
|
isActivite = 1 if (not ctgIDList or treasureState&pow(2, treasureType)) else 0
|
clientPack.TreasureState[treasureType] = isActivite
|
clientPack.TreasureAward[treasureType] = 1 if treasureAward&pow(2, treasureType) else 0
|
clientPack.TreasureProgress[treasureType] = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineTreasureProgess % treasureType)
|
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|