#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package Player.PlayerActFamilyGCZ
|
#
|
# @todo:ÏÉÃ˹¥³ÇÕ½
|
# @author hxp
|
# @date 2025-04-09
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ÏÉÃ˹¥³ÇÕ½
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2025-04-09 16:00"""
|
#-------------------------------------------------------------------------------
|
|
import ChConfig
|
import GameWorld
|
import ShareDefine
|
import IpyGameDataPY
|
import NetPackCommon
|
import CrossRealmPlayer
|
import ChPyNetSendPack
|
import IPY_GameWorld
|
import PlayerControl
|
import ItemControler
|
import ItemCommon
|
|
import time
|
|
## 1-¹«Ê¾ÆÚ£»99-Áì½±ÆÚ£»ÂÖ´Î״̬=ÂÖ´Î*10+Âִν׶Σ»Âִν׶Σº1-·Ö×éÕ½±¸£»2-Õ½¶·£»3-ÐÝÕ½
|
FamilyGCZState_Publicity = 1 # ¹«Ê¾ÆÚ
|
FamilyGCZState_Award = 99 # ½áÊøÁì½±ÆÚ
|
|
# ÂÖ´Î״̬ÐÅÏ¢
|
FamilyGCZRoundState_Group = 1 # ·Ö×é+Õ½±¸
|
FamilyGCZRoundState_Fight = 2 # Õ½¶·
|
FamilyGCZRoundState_Over = 3 # ÐÝÕ½½áËã
|
|
# ¹¥»÷ÀàÐÍ
|
(
|
AtkType_Normal, # ÆÕͨµ¥¹¥ 1
|
AtkType_SkillSingle, # ¼¼Äܵ¥¹¥ 2
|
AtkType_SkillArea, # ¼¼ÄÜȺ¹¥ 3
|
) = range(1, 1 + 3)
|
|
# ʥȪ¹ý¹Ø±ê¼ÇÎïÆ·ID
|
SQPass_ItemID = 2000000000
|
|
def GetRoundState(state):
|
## »ñÈ¡ÂִΡ¢×´Ì¬ÐÅÏ¢
|
if state < 10 or state == FamilyGCZState_Award:
|
return 0, state
|
return state / 10, state % 10
|
|
def SendToGameServer_FamilyGCZ(curPlayer, msgType, dataMsg=""):
|
playerID = curPlayer.GetPlayerID()
|
msgList = str([msgType, dataMsg])
|
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "FamilyGCZ", msgList, len(msgList))
|
GameWorld.DebugLog("ÏÉÃ˹¥³ÇÕ½·¢ËÍGameServer: %s, %s" % (msgType, dataMsg), playerID)
|
return
|
|
def GameServer_FamilyGCZ(curPlayer, msgData, tick):
|
## ÊÕµ½GameServer¹¥³ÇÕ½ÐÅÏ¢
|
curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_FamilyGCZ, 0)
|
|
msgType, dataMsg, ret = msgData
|
|
if not ret:
|
return
|
|
if msgType == "FamilyGCZPlayerActInfo":
|
__CheckPlayerFamilyGCZByCrossGameServer(curPlayer, dataMsg)
|
|
elif msgType == "FamilyGCZAtkResult":
|
__OnFamilyGCZAtkResult(curPlayer, dataMsg)
|
|
elif msgType == "FamilyGCZAward":
|
__OnFamilyGCZAward(curPlayer, dataMsg)
|
|
return
|
|
def OnPlayerLogin(curPlayer):
|
__CheckPlayerFamilyGCZByMapServer(curPlayer)
|
return
|
|
def RefreshActFamilyGCZInfo():
|
## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢
|
playerManager = GameWorld.GetPlayerManager()
|
for index in xrange(playerManager.GetPlayerCount()):
|
curPlayer = playerManager.GetPlayerByIndex(index)
|
if not GameWorld.IsNormalPlayer(curPlayer):
|
continue
|
|
__CheckPlayerFamilyGCZByMapServer(curPlayer)
|
|
return
|
|
def __CheckPlayerFamilyGCZByMapServer(curPlayer):
|
## ±¾·þµØÍ¼½ö¼ì²é½áÊøÖØÖü´¿É
|
|
playerID = curPlayer.GetPlayerID()
|
playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZID)
|
playerZoneID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZZoneID)
|
playerRoundNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZRoundNum)
|
|
actInfo = CrossRealmPlayer.GetCrossActInfoByZoneID(ShareDefine.CrossActName_FamilyGCZ, playerZoneID)
|
actID = actInfo.get(ShareDefine.ActKey_ID, 0)
|
state = actInfo.get(ShareDefine.ActKey_State, 0)
|
if not playerActID and not playerZoneID:
|
GameWorld.DebugLog("ÏÉÃ˹¥³ÇÕ½»î¶¯Íæ¼ÒûÓлÊý¾Ý²»ÐèÒªÖØÖÃ! playerZoneID=%s,playerActID=%s" % (playerZoneID, playerActID), playerID)
|
return
|
|
ipyDataDict = actInfo.get(ShareDefine.ActKey_IpyDataInfo, {})
|
zoneID = ipyDataDict.get("ZoneID", 0)
|
|
if state and playerActID == actID and playerZoneID == zoneID:
|
GameWorld.DebugLog("ÏÉÃ˹¥³ÇÕ½»î¶¯Íæ¼ÒÕý³£»î¶¯Öв»ÐèÒªÖØÖÃ! playerZoneID=%s,playerActID=%s,state=%s" % (playerZoneID, playerActID, state), playerID)
|
roundNum, _ = GetRoundState(state)
|
if roundNum and roundNum != playerRoundNum:
|
__doPlayerRoundChange(curPlayer, playerRoundNum, roundNum)
|
return
|
GameWorld.DebugLog("ÏÉÃ˹¥³ÇÕ½»î¶¯Íæ¼ÒÖØÖÃEnd! zoneID=%s,actID=%s,playerZoneID=%s,playerActID=%s,state=%s"
|
% (zoneID, actID, playerZoneID, playerActID, state), playerID)
|
|
__doPlayerFamilyGCZReset(curPlayer)
|
return
|
|
def __CheckPlayerFamilyGCZByCrossGameServer(curPlayer, joinInfo):
|
'''¼ì²éÍæ¼Ò²ÎÓëµÄ»î¶¯ÐÅÏ¢£¬ÒÔËø¶¨ÃËΪ׼µÄ»î¶¯Í³Ò»¸ù¾Ý¿ç·þGameServerͬ²½µÄ²ÎÓëÐÅÏ¢´¦Àí
|
Ëø¶¨Ãûµ¥ÐÅÏ¢¶¼ÔÚ¿ç·þGameServer£¬ËùÒÔ¿ç·þGameServerͳһ¹ÜÀí
|
×¢£º½áÊøÖØÖõÄÔÚ±¾·þµØÍ¼Ö±½Ó´¦Àí¼´¿É
|
'''
|
|
playerID = curPlayer.GetPlayerID()
|
zoneID, familyID = joinInfo
|
|
actInfo = CrossRealmPlayer.GetCrossActInfoByZoneID(ShareDefine.CrossActName_FamilyGCZ, zoneID)
|
actID = actInfo.get(ShareDefine.ActKey_ID, 0)
|
state = actInfo.get(ShareDefine.ActKey_State, 0)
|
|
playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZID)
|
playerZoneID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZZoneID)
|
if playerActID == actID and playerZoneID == zoneID:
|
GameWorld.DebugLog("ÏÉÃ˹¥³ÇÕ½»î¶¯ID²»±ä£¬²»´¦Àí! zoneID=%s,actID=%s,state=%s,familyID=%s" % (zoneID, actID, state, familyID), playerID)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZFamilyID, familyID)
|
if state:
|
Sync_FamilyGCZPlayerInfo(curPlayer)
|
Sync_FamilyGCZSQInfo(curPlayer)
|
return
|
|
GameWorld.DebugLog("ÏÉÃ˹¥³ÇÕ½»î¶¯Íæ¼ÒÖØÖÃ! zoneID=%s,actID=%s,playerZoneID=%s,playerActID=%s"
|
% (zoneID, actID, playerZoneID, playerActID), playerID)
|
__doPlayerFamilyGCZReset(curPlayer, state, actID, zoneID, familyID)
|
return
|
|
def __doPlayerRoundChange(curPlayer, playerRoundNum, roundNum):
|
## Âִαä¸ü
|
playerID = curPlayer.GetPlayerID()
|
GameWorld.DebugLog(" ÏÉÃ˹¥³ÇÕ½»î¶¯Íæ¼ÒÂִαä¸ü! playerRoundNum=%s,roundNum=%s" % (playerRoundNum, roundNum), playerID)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZRoundNum, roundNum)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZContributionCnt, 0)
|
addEnergy = IpyGameDataPY.GetFuncCfg("FamilyGCZEnergy", 3)
|
if addEnergy > 0:
|
SetEnergy(curPlayer, curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZEnergy) + addEnergy, False)
|
Sync_FamilyGCZPlayerInfo(curPlayer)
|
return
|
|
def __doPlayerFamilyGCZReset(curPlayer, state=0, actID=0, zoneID=0, familyID=0):
|
## »î¶¯±ä¸üÖØÖÃ
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZID, actID)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZZoneID, zoneID)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZFamilyID, familyID)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZRoundNum, 0)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZContributionCnt, 0)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZEnergy, 0)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZEnergyTime, 0)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZAwardState, 0)
|
|
# ÖØÖÃʥȪ
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQLayer, 0)
|
gridCntMax = 0
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for index in range(ipyDataMgr.GetCrossActFamilyGCZSQCount()):
|
ipyData = ipyDataMgr.GetCrossActFamilyGCZSQByIndex(index)
|
gridCntMax = max(0, ipyData.GetGridCnt())
|
for gridNum in range(1, gridCntMax + 1):
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQGridItemID % gridNum, 0)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQGridItemCnt % gridNum, 0)
|
|
# »ØÊÕµÀ¾ß
|
for itemID in IpyGameDataPY.GetFuncEvalCfg("FamilyGCZItem", 2):
|
ItemControler.RecycleItem(curPlayer, itemID, "FamilyGCZRecycleItem")
|
|
if state:
|
maxEnergy = IpyGameDataPY.GetFuncCfg("FamilyGCZEnergy", 1)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZEnergy, maxEnergy)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQLayer, 1)
|
Sync_FamilyGCZPlayerInfo(curPlayer)
|
Sync_FamilyGCZSQInfo(curPlayer)
|
|
return True
|
|
def OnProcess(curPlayer):
|
if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZID):
|
return
|
curEnergy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZEnergy)
|
maxEnergy = IpyGameDataPY.GetFuncCfg("FamilyGCZEnergy", 1)
|
if curEnergy >= maxEnergy:
|
#GameWorld.DebugLog("ÏÉÃ˹¥³ÇÕ½ÌåÁ¦ÒÑÂú£¬ÎÞÐè»Ö¸´! curEnergy=%s >= %s" % (curEnergy, maxEnergy), curPlayer.GetPlayerID())
|
return
|
needSeconds = IpyGameDataPY.GetFuncCfg("FamilyGCZEnergy", 2) * 60
|
if not needSeconds:
|
return
|
curTime = int(time.time())
|
lastTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZEnergyTime)
|
if not lastTime:
|
lastTime = curTime
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZEnergyTime, lastTime)
|
return
|
passTime = curTime - lastTime
|
addEnergy = passTime / needSeconds
|
if addEnergy <= 0:
|
return
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZEnergyTime, curTime)
|
updEnergy = SetEnergy(curPlayer, min(curEnergy + addEnergy, maxEnergy))
|
GameWorld.DebugLog("ʱ¼ä»Ö¸´ÏÉÃ˹¥³ÇÕ½ÌåÁ¦: passTime=%s(%s-%s),addEnergy=%s,updEnergy=%s"
|
% (passTime, curTime, lastTime, addEnergy, updEnergy), curPlayer.GetPlayerID())
|
return
|
|
def SetEnergy(curPlayer, setEnergy, isNotify=True):
|
## ÉèÖÃÌåÁ¦
|
maxEnergy = IpyGameDataPY.GetFuncCfg("FamilyGCZEnergy", 1)
|
curEnergy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZEnergy)
|
updEnergy = min(maxEnergy, max(setEnergy, 0))
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZEnergy, updEnergy)
|
|
if updEnergy >= maxEnergy:
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZEnergyTime, 0)
|
elif curEnergy >= maxEnergy and updEnergy < maxEnergy:
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZEnergyTime, int(time.time()))
|
|
if isNotify:
|
Sync_FamilyGCZPlayerInfo(curPlayer)
|
return updEnergy
|
|
#// C1 24 ÏÉÃ˹¥³ÇÕ½¾èÏ× #tagCMFamilyGCZContribution
|
#
|
#struct tagCMFamilyGCZContribution
|
#{
|
# tagHead Head;
|
# BYTE ContributionType; //¾èÏ×ÀàÐÍ£º 0-µÍ¼¶£»1-¸ß¼¶
|
# DWORD UseCount; //ÎïÆ·¾èÏ×ʱʹÓøöÊý
|
#};
|
def OnFamilyGCZContribution(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
contributionType = clientData.ContributionType
|
useCount = clientData.UseCount
|
|
# ´ó±¾Óª±»´Ý»ÙÎÞ·¨ÔÙ¾èÏ×£¬Ç°¶Ë×Ô¼ºÅжϣ¬ºó¶Ë²»ÏÞÖÆ
|
|
if contributionType == 1:
|
__doContiributionHigh(curPlayer, useCount)
|
else:
|
__doContiributionLow(curPlayer)
|
return
|
|
def __doContiributionLow(curPlayer):
|
## µÍ¼¶¾èÏ× - »õ±Ò
|
playerID = curPlayer.GetPlayerID()
|
moneyType = IpyGameDataPY.GetFuncCfg("FamilyGCZContributionLow", 1)
|
costMoneyList = IpyGameDataPY.GetFuncEvalCfg("FamilyGCZContributionLow", 2)
|
if not moneyType or not costMoneyList:
|
return
|
maxCnt = len(costMoneyList)
|
contriCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZContributionCnt)
|
if contriCnt >= maxCnt:
|
GameWorld.DebugLog("ÏÉÃ˹¥³ÇÕ½ÒÑ´ï±¾ÂÖ×î´óµÍ¼¶¾èÏ×´ÎÊý! contriCnt=%s >= %s" % (contriCnt, maxCnt), playerID)
|
return
|
costMoney = costMoneyList[contriCnt]
|
if not costMoney or not PlayerControl.PayMoney(curPlayer, moneyType, costMoney, "FamilyGCZ"):
|
return
|
contriCnt += 1
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZContributionCnt, contriCnt)
|
Sync_FamilyGCZPlayerInfo(curPlayer)
|
|
addCampExp = IpyGameDataPY.GetFuncCfg("FamilyGCZContributionLow", 3)
|
randItemWeightList = IpyGameDataPY.GetFuncEvalCfg("FamilyGCZContributionLow", 4)
|
randItemInfo = GameWorld.GetResultByWeightList(randItemWeightList)
|
if randItemInfo and len(randItemInfo) >= 2:
|
ItemControler.GivePlayerItemOrMail(curPlayer, [randItemInfo], event=["FamilyGCZContiribution", False, {}])
|
|
GameWorld.DebugLog("ÏÉÃ˹¥³ÇÕ½µÍ¼¶¾èÏ×! contriCnt=%s,moneyType=%s,costMoney=%s,addCampExp=%s,randItemInfo=%s"
|
% (contriCnt, moneyType, costMoney, addCampExp, randItemInfo), playerID)
|
dataMsg = {"ActMsgType":"AddCampExp", "playerID":playerID, "addCampExp":addCampExp}
|
GameWorld.SendMsgToCrossServer(ShareDefine.ClientServerMsg_FamilyGCZ, dataMsg)
|
return
|
|
def __doContiributionHigh(curPlayer, useCount):
|
## ¸ß¼¶¾èÏ× - ÎïÆ·
|
playerID = curPlayer.GetPlayerID()
|
costItemID = IpyGameDataPY.GetFuncCfg("FamilyGCZContributionHigh", 1)
|
|
costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID, useCount)
|
lackCnt = useCount - bindCnt - unBindCnt
|
if lackCnt > 0:
|
GameWorld.DebugLog("ÏÉÃ˹¥³ÇÕ½¸ß¼¶¾èÏ×ÏûºÄµÀ¾ß²»×ã! costItemID=%s,useCount=%s,bindCnt=%s,unBindCnt=%s,lackCnt=%s"
|
% (costItemID, useCount, bindCnt, unBindCnt, lackCnt))
|
return
|
# ¿Û³ýÏûºÄ
|
ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, useCount, "FamilyGCZContiribution")
|
|
addCampExp = IpyGameDataPY.GetFuncCfg("FamilyGCZContributionHigh", 2) * useCount
|
randItemWeightList = IpyGameDataPY.GetFuncEvalCfg("FamilyGCZContributionHigh", 3)
|
awardItemList = []
|
for _ in range(useCount):
|
randItemInfo = GameWorld.GetResultByWeightList(randItemWeightList)
|
if randItemInfo and len(randItemInfo) >= 2:
|
awardItemList.append(randItemInfo)
|
if awardItemList:
|
ItemControler.GivePlayerItemOrMail(curPlayer, GameWorld.MergeItemList(awardItemList), event=["FamilyGCZContiribution", False, {}])
|
|
GameWorld.DebugLog("ÏÉÃ˹¥³ÇÕ½¸ß¼¶¾èÏ×! costItemID=%s,useCount=%s,addCampExp=%s,awardItemList=%s"
|
% (costItemID, useCount, addCampExp, awardItemList), playerID)
|
dataMsg = {"ActMsgType":"AddCampExp", "playerID":playerID, "addCampExp":addCampExp}
|
GameWorld.SendMsgToCrossServer(ShareDefine.ClientServerMsg_FamilyGCZ, dataMsg)
|
return
|
|
#// C1 25 ÏÉÃ˹¥³ÇÕ½¹¥»÷ #tagCMFamilyGCZAtk
|
#
|
#struct tagCMFamilyGCZAtk
|
#{
|
# tagHead Head;
|
# BYTE AtkType; //¹¥»÷ÀàÐÍ£º 1-ÆÕͨµ¥¹¥£»2-¼¼Äܵ¥¹¥£»3-¼¼ÄÜȺ¹¥£»
|
# DWORD TagCityID; //Ä¿±ê³Ç³ØID£¬Ò»°ãÊÇÏÉÃËID»òÕßÌØÊâ³Ç³ØIDÈçÐÞÂ޳dzdzأ¬ÆÕ¹¥µ¥¹¥ÐèÖ¸¶¨Ä¿±ê£¬Èº¹¥¼¼ÄÜ·¢0
|
# DWORD TagGuardID; //Ä¿±êÊØÎÀID£¬Ò»°ãÊÇÍæ¼ÒID»òÕßÌØÊâÊØÎÀIDÈçÐÞÂÞ³ÇÊØÎÀ£¬ÆÕ¹¥µ¥¹¥ÐèÖ¸¶¨Ä¿±ê£¬¼¼Äܹ¥»÷·¢0
|
#};
|
def OnFamilyGCZAtk(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
atkType = clientData.AtkType
|
tagCityID = clientData.TagCityID
|
tagGuardID = clientData.TagGuardID
|
|
playerID = curPlayer.GetPlayerID()
|
|
zoneID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZZoneID)
|
actInfo = CrossRealmPlayer.GetCrossActInfoByZoneID(ShareDefine.CrossActName_FamilyGCZ, zoneID)
|
if not actInfo:
|
return
|
state = actInfo.get(ShareDefine.ActKey_State, 0)
|
roundNum, roundState = GetRoundState(state)
|
if not roundNum or roundState != FamilyGCZRoundState_Fight:
|
GameWorld.ErrLog("ÏÉÃ˹¥³ÇÕ½·Ç¹¥»÷½×¶Î: state=%s,roundNum=%s,roundState=%s" % (state, roundNum, roundState), playerID)
|
return
|
|
hurtFamilyCnt = 1
|
useItemID = 0
|
# ÆÕ¹¥
|
if atkType == AtkType_Normal:
|
curEnergy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZEnergy)
|
if not curEnergy:
|
useItemID = IpyGameDataPY.GetFuncCfg("FamilyGCZAtk", 2)
|
if not useItemID:
|
return
|
if not ItemCommon.FindItemInPackByItemID(curPlayer, useItemID, IPY_GameWorld.rptItem):
|
GameWorld.DebugLog("ÏÉÃ˹¥³ÇÕ½ÆÕ¹¥µÀ¾ß²»×ã! useItemID=%s" % useItemID, playerID)
|
return
|
hurtMulti = IpyGameDataPY.GetFuncCfg("FamilyGCZAtk", 1)
|
|
# ¼¼ÄÜ
|
else:
|
useItemID = IpyGameDataPY.GetFuncCfg("FamilyGCZAtk", 4)
|
if not useItemID:
|
return
|
if not ItemCommon.FindItemInPackByItemID(curPlayer, useItemID, IPY_GameWorld.rptItem):
|
GameWorld.DebugLog("ÏÉÃ˹¥³ÇÕ½¼¼ÄܵÀ¾ß²»×ã! useItemID=%s" % useItemID, playerID)
|
return
|
hurtMulti = IpyGameDataPY.GetFuncCfg("FamilyGCZAtk", 3)
|
|
# Ⱥ¹¥
|
if atkType == AtkType_SkillArea:
|
hurtFamilyCnt = IpyGameDataPY.GetFuncCfg("FamilyGCZAtk", 5)
|
|
tick = GameWorld.GetGameWorld().GetTick()
|
if not GameWorld.SetPlayerTickTime(curPlayer, ChConfig.TYPE_Player_Tick_FamilyGCZ, tick):
|
GameWorld.DebugLog("¹¥³ÇÕ½ÇëÇóCDÖÐ...", playerID)
|
PlayerControl.NotifyCode(curPlayer, "RequestLater")
|
return
|
|
dataMsg = {"ActMsgType":"GCZAtk", "zoneID":zoneID, "playerID":playerID, "atkType":atkType,
|
"tagCityID":tagCityID, "tagGuardID":tagGuardID, "hurtMulti":hurtMulti,
|
"useItemID":useItemID, "hurtFamilyCnt":hurtFamilyCnt}
|
GameWorld.SendMsgToCrossServer(ShareDefine.ClientServerMsg_FamilyGCZ, dataMsg)
|
return
|
|
def __OnFamilyGCZAtkResult(curPlayer, retInfo):
|
## ¿ç·þͬ²½»ØÀ´µÄ¹¥»÷½á¹û
|
#"atkRet":atkRet, "errMsg":errMsg, "reqMsg":msgData, "hurtDict":hurtDict, "killCntTotal":killCntTotal
|
|
playerID = curPlayer.GetPlayerID()
|
atkRet = retInfo["atkRet"]
|
errMsg = retInfo["errMsg"]
|
hurtDict = retInfo["hurtDict"]
|
killCntTotal = retInfo["killCntTotal"]
|
reqMsg = retInfo["reqMsg"]
|
|
atkType = reqMsg["atkType"]
|
useItemID = reqMsg["useItemID"]
|
|
GameWorld.DebugLog("ÏÉÃ˹¥³ÇÕ½¹¥»÷½á¹û! atkType=%s,takRet=%s:%s" % (atkType, atkRet, errMsg), playerID)
|
if atkRet != 0 or errMsg != "OK":
|
# ¹¥»÷ʧ°Ü¿ÉÔÝʱ²»´¦Àí
|
return
|
|
# ¹¥»÷³É¹¦´¦Àí
|
|
# ¿Û³ýÎïÆ·
|
if useItemID:
|
delCount = 1
|
if not ItemControler.DelPlayerItemByPacks(curPlayer, useItemID, delCount, "FamilyGCZAtk"):
|
return
|
GameWorld.DebugLog(" ¿Û³ýµÀ¾ß: useItemID=%s" % (useItemID), playerID)
|
|
fixAwardItemList = [] # ¹Ì¶¨½±Àø
|
# ÆÕͨ¹¥»÷
|
if atkType == AtkType_Normal:
|
if useItemID:
|
fixAwardItemList = IpyGameDataPY.GetFuncEvalCfg("FamilyGCZAtkAward", 2)
|
else:
|
fixAwardItemList = IpyGameDataPY.GetFuncEvalCfg("FamilyGCZAtkAward", 1)
|
# ·ÇµÀ¾ßÆÕ¹¥£¬¿ÛÌåÁ¦
|
curEnergy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZEnergy)
|
updEnergy = SetEnergy(curPlayer, curEnergy - 1)
|
GameWorld.DebugLog(" ¿Û³ýÌåÁ¦: curEnergy=%s,updEnergy=%s" % (curEnergy, updEnergy), playerID)
|
|
# ¼¼Äܹ¥»÷
|
elif atkType in [AtkType_SkillSingle, AtkType_SkillArea]:
|
fixAwardItemList = IpyGameDataPY.GetFuncEvalCfg("FamilyGCZAtkAward", 3)
|
|
killAwardItemList = []
|
killAwardRandCnt = IpyGameDataPY.GetFuncCfg("FamilyGCZAtkAward", 5) * killCntTotal
|
killAwardWeightList = IpyGameDataPY.GetFuncEvalCfg("FamilyGCZAtkAward", 4)
|
for _ in range(killAwardRandCnt):
|
randItem = GameWorld.GetResultByWeightList(killAwardWeightList)
|
if randItem and isinstance(randItem, list) and len(randItem) == 3:
|
killAwardItemList.append(randItem)
|
|
hurtCnt = len(hurtDict)
|
hurtValueTotal = sum(hurtDict.values())
|
GameWorld.DebugLog(" hurtCnt=%s,hurtValueTotal=%s,killCntTotal=%s" % (hurtCnt, hurtValueTotal, killCntTotal), playerID)
|
|
notifyDataEx = {"atkType":atkType, "killCntTotal":killCntTotal, "hurtCnt":hurtCnt, "hurtValueTotal":hurtValueTotal}
|
giveAwardItemList = GameWorld.MergeItemList(fixAwardItemList + killAwardItemList)
|
GameWorld.DebugLog(" giveAwardItemList=%s,fixAwardItemList=%s,killAwardItemList=%s" % (giveAwardItemList, fixAwardItemList, killAwardItemList), playerID)
|
ItemControler.GivePlayerItemOrMail(curPlayer, giveAwardItemList, event=["FamilyGCZAtk", False, {}], notifyDataEx=notifyDataEx)
|
return
|
|
#// C1 26 ÏÉÃ˹¥³ÇÕ½¾º²Â #tagCMFamilyGCZGuess
|
#
|
#struct tagCMFamilyGCZGuess
|
#{
|
# tagHead Head;
|
# BYTE SelectCnt;
|
# DWORD SelectFamilyIDList[SelectCnt]; // ¾º²ÂÑ¡ÔñµÄÏÉÃËIDÅÅÃû˳Ðò
|
#};
|
def OnFamilyGCZGuess(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
selectFamilyIDList = clientData.SelectFamilyIDList
|
playerID = curPlayer.GetPlayerID()
|
zoneID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZZoneID)
|
dataMsg = {"ActMsgType":"Guess", "zoneID":zoneID, "playerID":playerID, "selectFamilyIDList":selectFamilyIDList}
|
GameWorld.SendMsgToCrossServer(ShareDefine.ClientServerMsg_FamilyGCZ, dataMsg)
|
return
|
|
def GetFamilyGCZAward(curPlayer, awardType, tick):
|
## Áì½± 0-¾º²Â½±Àø£»1-¸öÈËÅÅÐн±Àø£»2-ÏÉÃËÅÅÃû½±Àø£»3-µãÔÞ
|
playerID = curPlayer.GetPlayerID()
|
awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZAwardState)
|
if awardState&pow(2, awardType):
|
GameWorld.DebugLog("ÏÉÃ˹¥³ÇÕ½ÒÑÁìÈ¡¸Ã½±Àø! awardType=%s,awardState=%s" % (awardType, awardState), playerID)
|
return
|
|
zoneID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZZoneID)
|
actInfo = CrossRealmPlayer.GetCrossActInfoByZoneID(ShareDefine.CrossActName_FamilyGCZ, zoneID)
|
if not actInfo:
|
return
|
state = actInfo.get(ShareDefine.ActKey_State, 0)
|
if state != FamilyGCZState_Award:
|
GameWorld.ErrLog("ÏÉÃ˹¥³ÇÕ½·ÇÁì½±½×¶Î: state=%s" % state, playerID)
|
return
|
|
if not GameWorld.SetPlayerTickTime(curPlayer, ChConfig.TYPE_Player_Tick_FamilyGCZ, tick):
|
GameWorld.DebugLog("¹¥³ÇÕ½ÇëÇóCDÖÐ...", playerID)
|
PlayerControl.NotifyCode(curPlayer, "RequestLater")
|
return
|
|
dataMsg = {"ActMsgType":"GetAward", "zoneID":zoneID, "playerID":playerID, "awardType":awardType}
|
GameWorld.SendMsgToCrossServer(ShareDefine.ClientServerMsg_FamilyGCZ, dataMsg)
|
return
|
|
def __OnFamilyGCZAward(curPlayer, dataMsg):
|
## ¿ç·þͬ²½»ØÀ´µÄÁì½±½á¹û
|
#"zoneID":zoneID, "playerID":playerID, "actID":actID, "awardType":awardType, "awardItemList":awardItemList
|
zoneID = dataMsg["zoneID"]
|
playerID = dataMsg["playerID"]
|
actID = dataMsg["actID"]
|
awardType = dataMsg["awardType"]
|
awardItemList = dataMsg["awardItemList"]
|
awardValue = dataMsg.get("awardValue", 0)
|
fmLV = dataMsg.get("fmLV", 0)
|
playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZID)
|
awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZAwardState)
|
if awardState&pow(2, awardType):
|
GameWorld.Log("ÏÉÃ˹¥³ÇÕ½·¢·Å½±ÀøÊ±ÒÑÁìÈ¡¸Ã½±Àø! awardType=%s,awardState=%s,zoneID=%s,actID=%s"
|
% (awardType, awardState, zoneID, actID), playerID)
|
return
|
|
GameWorld.DebugLog("ÏÉÃ˹¥³ÇÕ½·¢·Å½±Àø! awardType=%s,awardValue=%s,fmLV=%s,awardItemList=%s,awardState=%s"
|
% (awardType, awardValue, fmLV, awardItemList, awardState), playerID)
|
|
# ͬһ¸ö»î¶¯£¬¸üÐÂÁì½±¼Ç¼
|
if playerActID == actID:
|
updAwardState = awardState|pow(2, awardType)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZAwardState, updAwardState)
|
GameWorld.DebugLog(" ¸üÐÂÁì½±¼Ç¼! awardType=%s,awardState=%s,updAwardState=%s" % (awardType, awardState, updAwardState), playerID)
|
Sync_FamilyGCZPlayerInfo(curPlayer)
|
|
drDict = {"zoneID":zoneID, "actID":actID, "awardType":awardType, "awardValue":awardValue, "fmLV":fmLV}
|
ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["FamilyGCZAward", True, drDict])
|
return
|
|
|
#// C1 27 ÏÉÃ˹¥³ÇսʥȪ³é½± #tagCMFamilyGCZSQ
|
#
|
#struct tagCMFamilyGCZSQ
|
#{
|
# tagHead Head;
|
# BYTE GridNum; // Ñ¡Öиñ×Ó±àºÅ£¬1~n
|
#};
|
def OnFamilyGCZSQ(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
gridNum = clientData.GridNum
|
playerID = curPlayer.GetPlayerID()
|
|
layerNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZSQLayer)
|
if not layerNum:
|
layerNum = 1
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQLayer, 1)
|
|
ipyData = IpyGameDataPY.GetIpyGameData("CrossActFamilyGCZSQ", layerNum)
|
if not ipyData:
|
return
|
gridCnt = ipyData.GetGridCnt()
|
if gridNum < 1 or gridNum > gridCnt:
|
GameWorld.DebugLog("ʥȪ³é½±²»´æÔڸøñ×Ó±àºÅ! layerNum=%s, gridNum=%s" % (layerNum, gridNum), playerID)
|
return
|
|
if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZSQGridItemID % gridNum):
|
Sync_FamilyGCZSQInfo(curPlayer, gridNum)
|
return
|
|
costItemID = IpyGameDataPY.GetFuncCfg("FamilyGCZItem", 1)
|
costItemCount = ipyData.GetCostItemCnt()
|
if not costItemID or not costItemCount:
|
return
|
|
itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
hasEnough, itemIndexList = ItemCommon.GetItem_FromPack_ByID(costItemID, itemPack, costItemCount)
|
if not hasEnough:
|
GameWorld.DebugLog("ʥȪ³é½±µÀ¾ß²»×ã! costItemID=%s, costItemCount=%s" % (costItemID, costItemCount), playerID)
|
return
|
|
emptyCnt = 0
|
for gNum in range(1, gridCnt + 1):
|
if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZSQGridItemID % gNum):
|
continue
|
emptyCnt += 1
|
if emptyCnt > 1:
|
break
|
|
if emptyCnt > 1:
|
isPass = GameWorld.CanHappen(ipyData.GetPassRate())
|
else:
|
isPass = 1
|
GameWorld.DebugLog("ÏÉÃ˹¥³ÇսʥȪ³é½±×îºóÒ»¸ñ±Ø¹ý¹Ø! layerNum=%s" % layerNum, playerID)
|
|
if not isPass:
|
randItem = GameWorld.GetResultByWeightList(ipyData.GetGridWeightItemList())
|
GameWorld.DebugLog("ÏÉÃ˹¥³ÇսʥȪ³é½±Î´¹ý¹Ø! layerNum=%s,gridNum=%s,randItem=%s" % (layerNum, gridNum, randItem), playerID)
|
if not randItem:
|
return
|
itemID, itemCount = randItem
|
if not itemID or not itemCount:
|
return
|
|
ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, costItemCount, True, "FamilyGCZSQ")
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQGridItemID % gridNum, itemID)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQGridItemCnt % gridNum, itemCount)
|
ItemControler.GivePlayerItemOrMail(curPlayer, [[itemID, itemCount]], event=["FamilyGCZSQGrid", False, {}])
|
Sync_FamilyGCZSQInfo(curPlayer, gridNum)
|
return
|
|
# ¹ý¹Ø
|
ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, costItemCount, True, "FamilyGCZSQ")
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQGridItemID % gridNum, SQPass_ItemID)
|
passAwardItemList = ipyData.GetLayerAwardItemList() # ¹ý¹Ø½±Àø
|
ItemControler.GivePlayerItemOrMail(curPlayer, passAwardItemList, event=["FamilyGCZSQPass", False, {}])
|
Sync_FamilyGCZSQInfo(curPlayer, gridNum)
|
GameWorld.DebugLog("ÏÉÃ˹¥³ÇսʥȪ³é½±¹ý¹Ø! layerNum=%s,gridNum=%s,passAwardItemList=%s"
|
% (layerNum, gridNum, passAwardItemList), playerID)
|
|
#ÖØÖøñ×ӼǼ
|
for gridNum in range(1, ipyData.GetGridCnt() + 1):
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQGridItemID % gridNum, 0)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQGridItemCnt % gridNum, 0)
|
|
nextLayerNum = layerNum + 1
|
#ÏÂÒ»²ã
|
if IpyGameDataPY.GetIpyGameDataNotLog("CrossActFamilyGCZSQ", nextLayerNum):
|
GameWorld.DebugLog(" ÏÂÒ»²ã! nextLayerNum=%s" % (nextLayerNum), playerID)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQLayer, nextLayerNum)
|
Sync_FamilyGCZSQInfo(curPlayer)
|
return
|
|
#ͨ¹Ø£¬´ÓÍ·¿ªÊ¼
|
weightItemList = ipyData.GetLayerWeightItemList() # ͨ¹ØËæ»ú½±Àø
|
awardItemEx = GameWorld.GetResultByWeightList(weightItemList)
|
if awardItemEx and len(awardItemEx) == 2:
|
itemID, itemCount = awardItemEx
|
ItemControler.GivePlayerItemOrMail(curPlayer, [[itemID, itemCount]], event=["FamilyGCZSQPassAll", False, {}])
|
|
GameWorld.DebugLog(" ûÓÐÏÂÒ»²ãÁË£¬´ÓÍ·¿ªÊ¼! awardItemEx=%s" % str(awardItemEx), playerID)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyGCZSQLayer, 1)
|
Sync_FamilyGCZSQInfo(curPlayer)
|
return
|
|
def Sync_FamilyGCZPlayerInfo(curPlayer):
|
clientPack = ChPyNetSendPack.tagMCFamilyGCZPlayerInfo()
|
clientPack.ContributionCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZContributionCnt)
|
clientPack.Energy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZEnergy)
|
clientPack.EnergyTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZEnergyTime)
|
clientPack.AwardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZAwardState)
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|
|
def Sync_FamilyGCZSQInfo(curPlayer, gridNum=0):
|
layerNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZSQLayer)
|
ipyData = IpyGameDataPY.GetIpyGameData("CrossActFamilyGCZSQ", layerNum)
|
if not ipyData:
|
return
|
clientPack = ChPyNetSendPack.tagMCFamilyGCZSQInfo()
|
clientPack.SQLayer = layerNum
|
if gridNum:
|
syncGridList = [gridNum]
|
else:
|
syncGridList = range(1, ipyData.GetGridCnt() + 1)
|
clientPack.SQGridList = []
|
for gNum in syncGridList:
|
grid = ChPyNetSendPack.tagMCFamilyGCZSQGrid()
|
grid.GridNum = gNum
|
grid.ItemID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZSQGridItemID % gNum)
|
grid.ItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyGCZSQGridItemCnt % gNum)
|
clientPack.SQGridList.append(grid)
|
clientPack.SQGirdCnt = len(clientPack.SQGridList)
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|
|