#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package Player.PlayerPreset
|
#
|
# @todo:Á÷ÅÉÔ¤Éè
|
# @author hxp
|
# @date 2026-01-16
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: Á÷ÅÉÔ¤Éè
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2026-01-16 20:00"""
|
#-------------------------------------------------------------------------------
|
|
import DBDataMgr
|
import ShareDefine
|
import PlayerControl
|
import IpyGameDataPY
|
import ChPyNetSendPack
|
import IPY_GameWorld
|
import NetPackCommon
|
import PlayerOnline
|
import GameWorld
|
import ChConfig
|
|
PresetKey_Name = "Name" # Ô¤ÉèÃüÃûÐÅÏ¢ {"funcPresetType":{"presetID":Ãû×Ö, ...}, ...}
|
|
def GetPresetRecDict(playerID, isAddNew=False):
|
## »ñȡԤÉè¼Ç¼´æ´¢µÄ×Öµä
|
gameRecMgr = DBDataMgr.GetGameRecMgr()
|
preSetRecMgr = gameRecMgr.GetRecTypeIDMgr(ShareDefine.Def_GameRecType_BatPreset, playerID)
|
recData = preSetRecMgr.GetOneRecData(isAddNew)
|
if not recData:
|
return {}
|
return recData.GetUserDict()
|
|
def OnPlayerLogin(curPlayer):
|
# ¼ì²éÔ¤ÉèĬÈϽâËø
|
Sync_FuncPresetInfo(curPlayer)
|
Sync_FuncPresetSwitchInfo(curPlayer)
|
Sync_BatPresetSwitchInfo(curPlayer)
|
return
|
|
def GetFuncPresetIDState(curPlayer, presetID, funcPresetType=ShareDefine.FuncPreset_Battle):
|
## »ñÈ¡¹¦ÄÜÔ¤ÉèIDÊÇ·ñ¿ÉÓÃ
|
# @param presetID: Ô¤ÉèID
|
# @param funcPresetType: Ô¤ÉèÀàÐÍ
|
presetState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PresetState % funcPresetType)
|
if presetState & pow(2, presetID):
|
return True
|
|
ipyDataList = IpyGameDataPY.GetIpyGameDataList("PresetUnlock", funcPresetType)
|
if not ipyDataList:
|
return
|
if presetID > len(ipyDataList):
|
return
|
ipyData = ipyDataList[presetID - 1]
|
if ipyData.GetUnlockType():
|
# ·ÇĬÈϽâËøµÄ
|
return
|
presetState |= pow(2, presetID)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PresetState % funcPresetType, presetState)
|
return True
|
|
#// B2 60 ¹¦ÄÜÔ¤Éè½âËø #tagCSFuncPresetUnlock
|
#
|
#struct tagCSFuncPresetUnlock
|
#{
|
# tagHead Head;
|
# BYTE FuncPresetType; //Ô¤ÉèÀàÐÍ£¬1-È«¾Ö£»2-ÕóÈÝ£»3-Ãü¸ñ£»
|
# BYTE PresetID; //Ô¤ÉèID
|
#};
|
def OnFuncPresetUnlock(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
funcPresetType = clientData.FuncPresetType
|
presetID = clientData.PresetID
|
|
if GetFuncPresetIDState(curPlayer, presetID, funcPresetType):
|
GameWorld.DebugLog("¸ÃÔ¤ÉèÒѽâËø! funcPresetType=%s,presetID=%s" % (funcPresetType, presetID))
|
return
|
|
ipyDataList = IpyGameDataPY.GetIpyGameDataList("PresetUnlock", funcPresetType)
|
if not ipyDataList:
|
return
|
if presetID > len(ipyDataList):
|
GameWorld.DebugLog("¸ÃÔ¤Éè²»´æÔÚ! funcPresetType=%s,presetID=%s" % (funcPresetType, presetID))
|
return
|
ipyData = ipyDataList[presetID - 1]
|
|
unlockType = ipyData.GetUnlockType()
|
unlockValue = ipyData.GetUnlockValue()
|
|
# Ôª±¦½âËø
|
if unlockType == 1:
|
needGold = unlockValue
|
infoDict = {"funcPresetType":funcPresetType, "presetID":presetID}
|
if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, needGold, "FuncPresetUnlock", infoDict):
|
return
|
else:
|
return
|
|
presetState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PresetState % funcPresetType)
|
presetState |= pow(2, presetID)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PresetState % funcPresetType, presetState)
|
GameWorld.DebugLog("¹¦ÄÜÔ¤Éè½âËø: funcPresetType=%s,presetID=%s,presetState=%s" % (funcPresetType, presetID, presetState))
|
Sync_FuncPresetInfo(curPlayer, funcPresetType, presetID)
|
|
# È«¾ÖÔ¤Éèпª·½°¸£¬³õʼ»¯Ô¤ÉèĬÈÏ£¬Ö±½ÓʹÓÃÖ÷ÏßÔ¤É追±´
|
# ×Ó¹¦Äܵķ½°¸½âËøÔݲ»´¦Àí£¬ÓÉÍæ¼ÒÊÖ¶¯±à¼
|
if funcPresetType == ShareDefine.FuncPreset_Battle:
|
mainBatPresetID = GetBatPresetID(curPlayer, ShareDefine.BatPreset_Main)
|
GameWorld.DebugLog("ÐÂÔöÈ«¾ÖÔ¤ÉèÖ±½ÓʹÓÃÖ÷ÏßÔ¤É追±´×Ó¹¦ÄÜÔ¤Éè! mainBatPresetID=%s" % mainBatPresetID)
|
for funcPresetType in ShareDefine.FuncPresetList:
|
if funcPresetType == ShareDefine.FuncPreset_Battle:
|
continue
|
funcPresetID = GetFuncPresetID(curPlayer, mainBatPresetID, funcPresetType)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PresetFuncID % (presetID, funcPresetType), funcPresetID)
|
GameWorld.DebugLog(" funcPresetType=%s,funcPresetID=%s" % (funcPresetType, funcPresetID))
|
Sync_FuncPresetSwitchInfo(curPlayer, presetID)
|
|
return
|
|
#// B2 61 ¹¦ÄÜÔ¤Éè¸ÄÃû #tagCSFuncPresetUpdName
|
#
|
#struct tagCSFuncPresetUpdName
|
#{
|
# tagHead Head;
|
# BYTE FuncPresetType; //Ô¤ÉèÀàÐÍ£¬1-È«¾Ö£»2-ÕóÈÝ£»3-Ãü¸ñ£»
|
# BYTE PresetID; //Ô¤ÉèID
|
# BYTE NameLen;
|
# char PresetName[NameLen]; //Ô¤ÉèÃû³Æ
|
#};
|
def OnFuncPresetUpdName(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
funcPresetType = clientData.FuncPresetType
|
presetID = clientData.PresetID
|
presetName = clientData.PresetName
|
|
if not GetFuncPresetIDState(curPlayer, presetID, funcPresetType):
|
return
|
|
# ¸üÐÂÃû³Æ {"funcPresetType":{"presetID":Ãû×Ö, ...}, ...}
|
userDict = GetPresetRecDict(playerID, True)
|
if PresetKey_Name not in userDict:
|
userDict[PresetKey_Name] = {}
|
presetNameDict = userDict[PresetKey_Name]
|
if str(funcPresetType) not in presetNameDict:
|
presetNameDict[str(funcPresetType)] = {}
|
funcPresetNameDict = presetNameDict[str(funcPresetType)]
|
funcPresetNameDict[str(presetID)] = presetName
|
|
Sync_FuncPresetInfo(curPlayer, funcPresetType, presetID)
|
return
|
|
#// B2 62 ¹¦ÄÜÔ¤ÉèÇл» #tagCSFuncPresetSwitch
|
#
|
#struct tagCSFuncPresetSwitch
|
#{
|
# tagHead Head;
|
# BYTE BatPresetID; //ËùÊôÕ½¶·Ô¤ÉèID
|
# BYTE FuncPresetType; //Ô¤ÉèÀàÐÍ£¬2-ÕóÈÝ£»3-Ãü¸ñ£»
|
# BYTE PresetID; //±¾¹¦ÄÜÇл»ÖÁÄ¿±êÔ¤ÉèID
|
#};
|
def OnFuncPresetSwitch(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
batPresetID = clientData.BatPresetID
|
funcPresetType = clientData.FuncPresetType
|
funcPresetID = clientData.PresetID
|
|
if funcPresetType == ShareDefine.FuncPreset_Battle:
|
GameWorld.DebugLog("È«¾ÖÕ½¶·Ô¤Éè²»ÔÚ´ËÐ޸ģ¬ÇëʹÓÃB263·â°üÐÞ¸ÄÈ«¾ÖÔ¤Éè·½°¸! funcPresetType=%s" % (funcPresetType))
|
return
|
|
if not GetFuncPresetIDState(curPlayer, batPresetID):
|
GameWorld.DebugLog("È«¾ÖÔ¤Éèδ½âËø! batPresetID=%s" % batPresetID)
|
return
|
|
if not GetFuncPresetIDState(curPlayer, funcPresetID, funcPresetType):
|
GameWorld.DebugLog("¹¦ÄÜÔ¤Éèδ½âËø! funcPresetID=%s,funcPresetType=%s" % (funcPresetID, funcPresetType))
|
return
|
|
if GetFuncPresetID(curPlayer, batPresetID, funcPresetType) == funcPresetID:
|
GameWorld.DebugLog("¹¦ÄÜÔ¤Éè²»±ä²»´¦Àí! batPresetID=%s,funcPresetType=%s,funcPresetID=%s" % (batPresetID, funcPresetType, funcPresetID))
|
return
|
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PresetFuncID % (batPresetID, funcPresetType), funcPresetID)
|
GameWorld.DebugLog("¹¦ÄÜÔ¤Éè·½°¸Çл»: batPresetID=%s,funcPresetType=%s,funcPresetID=%s" % (batPresetID, funcPresetType, funcPresetID))
|
|
# Ë¢ÊôÐÔ
|
PlayerOnline.GetOnlinePlayer(curPlayer).RefreshBatPreset(batPresetID)
|
|
Sync_FuncPresetSwitchInfo(curPlayer, batPresetID, funcPresetType)
|
return
|
|
#// B2 63 Õ½¶·Ô¤ÉèÇл» #tagCSBatPresetSwitch
|
#
|
#struct tagCSBatPresetSwitch
|
#{
|
# tagHead Head;
|
# BYTE BatPresetType; //Õ½¶·Ô¤ÉèÀàÐÍ£º1-Ö÷ÏßÕ½¶·£»2-ÑÝÎ䳡·ÀÊØ£»
|
# BYTE BatPresetID; //Çл»ÖÁÄ¿±êÕ½¶·Ô¤ÉèID
|
#};
|
def OnBatPresetSwitch(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
batPresetType = clientData.BatPresetType
|
batPresetID = clientData.BatPresetID
|
|
if batPresetType not in ShareDefine.BatPresetList:
|
return
|
|
if not GetFuncPresetIDState(curPlayer, batPresetID):
|
GameWorld.DebugLog("È«¾ÖÕ½¶·Ô¤Éèδ½âËø! batPresetID=%s" % batPresetID)
|
return
|
|
if GetBatPresetID(curPlayer, batPresetType) == batPresetID:
|
GameWorld.DebugLog("È«¾ÖÕ½¶·Ô¤Éè²»±ä²»´¦Àí! batPresetType=%s,batPresetID=%s" % (batPresetType, batPresetID))
|
return
|
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PresetBatID % batPresetType, batPresetID)
|
GameWorld.DebugLog("È«¾ÖÕ½¶·Ô¤Éè·½°¸Çл»: batPresetType=%s,batPresetID=%s" % (batPresetType, batPresetID))
|
|
# Ë¢ÊôÐÔ
|
PlayerOnline.GetOnlinePlayer(curPlayer).RefreshBatPreset(batPresetID)
|
|
Sync_BatPresetSwitchInfo(curPlayer, batPresetType)
|
return
|
|
def GetBatPresetID(curPlayer, batPresetType):
|
## »ñȡս¶·¹¦Äܵ±Ç°Ê¹ÓÃÖеÄÕ½¶·Ô¤Éè·½°¸£¬Ä¬ÈÏ1
|
return max(1, curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PresetBatID % batPresetType))
|
|
def GetFuncPresetID(curPlayer, batPresetID, funcPresetType):
|
## »ñȡij¸öÕ½¶·Ô¤Éè·½°¸ÏÂij¸ö¹¦ÄÜʹÓõÄÔ¤ÉèID£¬Ä¬ÈÏ1
|
return max(1, curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PresetFuncID % (batPresetID, funcPresetType)))
|
|
def Sync_FuncPresetInfo(curPlayer, funcPresetType=None, presetID=None):
|
|
if funcPresetType == None:
|
presetTypeList = ShareDefine.FuncPresetList
|
else:
|
presetTypeList = [funcPresetType]
|
|
funcPresetList = []
|
for presetType in presetTypeList:
|
funcPresetInfo = ChPyNetSendPack.tagSCFuncPresetInfo()
|
funcPresetInfo.FuncPresetType = presetType
|
|
presetIDList = []
|
if funcPresetType == None and presetID == None:
|
ipyDataList = IpyGameDataPY.GetIpyGameDataList("PresetUnlock", presetType)
|
presetIDList = range(1, 1 + len(ipyDataList)) if ipyDataList else []
|
elif presetID != None:
|
presetIDList = [presetID]
|
|
presetNameDict = {}
|
if presetIDList:
|
userDict = GetPresetRecDict(curPlayer.GetPlayerID())
|
presetNameDict = userDict.get(PresetKey_Name, {})
|
|
funcPresetInfo.PresetList = []
|
for psID in presetIDList:
|
if presetID == None and not GetFuncPresetIDState(curPlayer, psID, presetType):
|
continue
|
preset = ChPyNetSendPack.tagSCFuncPreset()
|
preset.PresetID = psID
|
preset.PresetName = presetNameDict.get(str(presetType), {}).get(str(psID), "")
|
preset.NameLen = len(preset.PresetName)
|
funcPresetInfo.PresetList.append(preset)
|
|
funcPresetInfo.PresetCnt = len(funcPresetInfo.PresetList)
|
funcPresetInfo.UnlockState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PresetState % presetType)
|
funcPresetList.append(funcPresetInfo)
|
|
if not funcPresetList:
|
return
|
|
clientPack = ChPyNetSendPack.tagSCFuncPresetInfoList()
|
clientPack.FuncPresetList = funcPresetList
|
clientPack.FuncCnt = len(clientPack.FuncPresetList)
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|
|
def Sync_FuncPresetSwitchInfo(curPlayer, batPresetID=None, funcPresetType=None):
|
if batPresetID == None:
|
ipyDataList = IpyGameDataPY.GetIpyGameDataList("PresetUnlock", ShareDefine.FuncPreset_Battle)
|
batPresetIDList = range(1, 1 + len(ipyDataList)) if ipyDataList else []
|
else:
|
batPresetIDList = [batPresetID]
|
|
batPresetList = []
|
for batPresetID in batPresetIDList:
|
if not GetFuncPresetIDState(curPlayer, batPresetID):
|
continue
|
batPreset = ChPyNetSendPack.tagSCFuncPresetBat()
|
batPreset.BatPresetID = batPresetID
|
|
batPreset.FuncPresetList = []
|
for funcType in ShareDefine.FuncPresetList:
|
if funcType == ShareDefine.FuncPreset_Battle:
|
continue
|
if funcPresetType and funcPresetType != funcType:
|
continue
|
funcPreset = ChPyNetSendPack.tagSCFuncPresetFunc()
|
funcPreset.FuncPresetType = funcType
|
funcPreset.FuncPresetID = GetFuncPresetID(curPlayer, batPresetID, funcType)
|
batPreset.FuncPresetList.append(funcPreset)
|
batPreset.FuncCnt = len(batPreset.FuncPresetList)
|
batPresetList.append(batPreset)
|
|
if not batPresetList:
|
return
|
|
clientPack = ChPyNetSendPack.tagSCFuncPresetSwitchInfo()
|
clientPack.BatPresetList = batPresetList
|
clientPack.BatPresetCnt = len(clientPack.BatPresetList)
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|
|
def Sync_BatPresetSwitchInfo(curPlayer, batPresetType=None):
|
|
if not batPresetType:
|
batPresetTypeList = ShareDefine.BatPresetList
|
else:
|
batPresetTypeList = [batPresetType]
|
|
batPresetList = []
|
for batPresetType in batPresetTypeList:
|
batPreset = ChPyNetSendPack.tagSCBatPresetSwitch()
|
batPreset.BatPresetType = batPresetType
|
batPreset.BatPresetID = GetBatPresetID(curPlayer, batPresetType)
|
batPresetList.append(batPreset)
|
|
if not batPresetList:
|
return
|
|
clientPack = ChPyNetSendPack.tagSCBatPresetSwitchInfo()
|
clientPack.BatPresetList = batPresetList
|
clientPack.BatFuncCnt = len(clientPack.BatPresetList)
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|