#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package TurnAttack # # @todo:»ØºÏÖÆ¹¥»÷Âß¼­ # @author hxp # @date 2023-11-30 # @version 1.0 # # ÏêϸÃèÊö: »ØºÏÖÆ¹¥»÷Âß¼­£¬¾ùʹÓÃNPCʵÀý×÷Ϊս¶·Ö÷Ìå # #------------------------------------------------------------------------------- #"""Version = 2023-11-30 15:30""" #------------------------------------------------------------------------------- import ChConfig import ChPyNetSendPack import NetPackCommon import PlayerControl import GameWorld import GameObj import FBCommon import FBLogic # »ØºÏÕ½¶·Á÷³Ì״̬ ( FightState_Start, # 0 Æðʼ״̬£¬ÎÞÌØÊâÒâÒ壬½ö´ú±í¿ªÊ¼ÁË£¬ÓëOver¶ÔÓ¦ FightState_PrepareOK, # 1 ×¼±¸Íê±Ï£¬°üº¬¶ÔÕ½NPCÕÙ»½OK¡¢ÆäËûµÈ FightState_Fighting, # 2 Õ½¶·ÖÐ FightState_FightEnd, # 3 Õ½¶·½áÊø FightState_Award, # 4 ½áËã½±Àø FightState_Over, # 5 ½áÊø×´Ì¬£¬ÎÞÌØÊâÒâÒ壬½ö´ú±íËùÓд¦Àí½áÊøÁË£¬ÓëStart¶ÔÓ¦ ) = range(6) #// B4 10 »ØºÏÖÆÕ½¶· #tagCMTurnFight # #struct tagCMTurnFight #{ # tagHead Head; # DWORD MapID; // ×Ô¶¨ÒåµØÍ¼ID£¬¿ÉÓÃÓÚ°ó¶¨Õ½¶·³¡¾°¹¦ÄÜ£¨ÈçÒ°Íâ¹Ø¿¨£¬ÅÀËþ¹¦ÄÜ£¬¾º¼¼³¡µÈ£© # WORD FuncLineID; # BYTE TagType; // Õ½¶·Ä¿±êÀàÐÍ£¬0-NPC£¬1-Íæ¼Ò£¬2-¶ÓÎé # DWORD TagID; // Õ½¶·Ä¿±êÀàÐͶÔÓ¦µÄID # BYTE ValueCount; # DWORD ValueList[ValueCount]; // ¸½¼ÓÖµÁÐ±í£¬¿ÉÑ¡£¬¾ßÌ庬ÒåÓÉMapID¾ö¶¨ #}; def OnTurnFight(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) mapID = clientData.MapID funcLineID = clientData.FuncLineID tagType = clientData.TagType tagID = clientData.TagID valueList = clientData.ValueList playerID = curPlayer.GetPlayerID() if tagType == ChConfig.TurnBattle_TagType_Player: if tagID == playerID: GameWorld.DebugLog("²»ÄÜ´ò×Ô¼º!", playerID) return reqRet = FBLogic.OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList) if not reqRet: return # ÐèÒª·¢Ë͵½GameServerÑéÖ¤ if mapID in ChConfig.Def_TFMapID_SendToGameServer: SendToGameServer_TurnFight(curPlayer, "TurnFightRequest", [mapID, funcLineID, tagType, tagID, valueList]) return DoTurnFightProcess(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick) return def SendToGameServer_TurnFight(curPlayer, msgType, dataMsg=""): playerID = curPlayer.GetPlayerID() msgList = str([msgType, dataMsg]) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "TurnFight", msgList, len(msgList)) GameWorld.Log("»ØºÏÕ½¶··¢ËÍGameServer: %s, %s" % (msgType, dataMsg), playerID) return def GameServer_TurnFight_DoResult(curPlayer, msgData, tick): msgType, dataMsg, ret = msgData if not ret: return if msgType == "TurnFightRequest": mapID, funcLineID, tagType, tagID, valueList = dataMsg DoTurnFightProcess(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick) elif msgType == "TurnFightOver": mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList = dataMsg FBLogic.OnTurnFightOver_GameServerRet(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList, ret) elif msgType == "TurnFightTagPlayerInfo": mapID, funcLineID, tagType, tagID, valueList = dataMsg DoTrunFightVSPlayer(curPlayer, tagID, [mapID, funcLineID, valueList], ret) return def DoTurnFightProcess(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick): ## Ö´ÐлغÏÖÆÕ½¶·µÄÍêÕûÁ÷³Ì #if curPlayer.GetSightLevel() != curPlayer.GetID(): # PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID()) SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Start) tagPlayerInfo = {} if tagType == ChConfig.TurnBattle_TagType_Player and tagID >= 10000 : tagPlayer = GameWorld.GetMapCopyPlayerManager().FindPlayerByID(tagID) if tagPlayer: tagPlayerInfo = __GetPlayerInfo(tagPlayer) else: SendToGameServer_TurnFight(curPlayer, "TurnFightTagPlayerInfo", [mapID, funcLineID, tagType, tagID, valueList]) return DoTrunFight(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick, tagPlayerInfo) SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Over) return def __GetPlayerInfo(curPlayer): infoDict = { "Name":curPlayer.GetPlayerName(), "Job":curPlayer.GetJob(), "LV":curPlayer.GetLV(), "RealmLV":curPlayer.GetOfficialRank(), "MaxHP":GameObj.GetMaxHP(curPlayer), "FightPower":PlayerControl.GetFightPower(curPlayer), } return infoDict def DoTrunFightVSPlayer(curPlayer, tagPlayerID, callData, tagPlayerInfo): tagType = ChConfig.TurnBattle_TagType_Player tagID = tagPlayerID mapID, funcLineID, valueList = callData if tagPlayerInfo and curPlayer.GetPlayerID() != tagPlayerID: tick = GameWorld.GetGameWorld().GetTick() DoTrunFight(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick, tagPlayerInfo) SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Over) return def DoTrunFight(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick, tagInfo=None): if not tagID: return if not tagInfo: tagInfo = {} playerID = curPlayer.GetPlayerID() GameWorld.DebugLog("»ØºÏÕ½¶·: mapID=%s,funcLineID=%s,tagType=%s,tagID=%s,valueList=%s,tagInfo=%s" % (mapID, funcLineID, tagType, tagID, valueList, tagInfo), playerID) factionSyncInfoA = __GetPlayerInfo(curPlayer) factionSyncInfoB = tagInfo SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_PrepareOK, msg=[factionSyncInfoA, factionSyncInfoB]) turnNum, turnMax = 1, 15 curFightPower = PlayerControl.GetFightPower(curPlayer) tagFightPower = tagInfo.get("FightPower", 0) isWin = 1 if curFightPower >= tagFightPower else 0 GameWorld.DebugLog(" Õ½¶·½á¹û: isWin=%s,curFightPower=%s,tagFightPower=%s" % (isWin, curFightPower, tagFightPower), playerID) factionTotalHurtDict = {} playbackID = 0 # Õ½¶·»Ø·ÅID£¬¿É¸ù¾Ý¸ÃID²é¿´»Ø·Å # Õ½¶·½áÊøºó´¦Àí fightRet = [isWin, turnNum, turnMax, factionTotalHurtDict, playbackID] needSendGameServer, awardItemList, overInfoEx = False, [], {} overRet = FBLogic.OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet) if overRet != None: needSendGameServer, awardItemList, overInfoEx = overRet if needSendGameServer or mapID in ChConfig.Def_TFMapID_SendToGameServer: SendToGameServer_TurnFight(curPlayer, "TurnFightOver", [mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList]) overMsg = {"isWin":isWin, FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(awardItemList), "totalHurt":0} playbackID and overMsg.update({"playbackID":playbackID}) overInfoEx and overMsg.update(overInfoEx) SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Award, turnNum, turnMax, overMsg) return def SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, state, turnNum=0, turnMax=0, msg=""): if not curPlayer: return clientPack = ChPyNetSendPack.tagMCTurnFightState() clientPack.Clear() clientPack.MapID = mapID clientPack.FuncLineID = funcLineID clientPack.TagType = tagType clientPack.TagID = tagID clientPack.State = state clientPack.TurnNum = turnNum clientPack.TurnMax = turnMax clientPack.Msg = str(msg) clientPack.Len = len(clientPack.Msg) NetPackCommon.SendFakePack(curPlayer, clientPack) return