#!/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) if state: roundNum, _ = GetRoundState(state) if roundNum and roundNum != playerRoundNum: __doPlayerRoundChange(curPlayer, playerRoundNum, roundNum) 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) 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-ÏÉÃËÅÅÃû½±Àø£» 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