using System.Collections; using System.Collections.Generic; using UnityEngine; using vnxbqy.UI; using System; using System.Text.RegularExpressions; using LitJson; using System.Text; public class ClientCrossServerOneVsOne { public const int mapId = 1000; public const uint OPPONENT_PLAYERID = 999999; public static bool isClientCrossServerOneVsOne { get; private set; } public static FightResultSupplement resultSupplement; public static int myPlace { get; private set; } //我的位置,1-左;2-右 public static string opponentName { get; private set; } static FightObstacle[] m_Obstacles; public static FightObstacle[] obstacles { get { if (m_Obstacles == null) { var configString = FuncConfigConfig.Get("CrossRealmPKFB").Numerical2; var matches = Regex.Matches(configString, "\\[[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3},[0-9]{1,3}\\]"); m_Obstacles = new FightObstacle[matches.Count]; for (var i = 0; i < matches.Count; i++) { var subMatches = Regex.Matches(matches[i].Value, "[0-9]{1,3}"); m_Obstacles[i] = new FightObstacle() { aPosX = subMatches.Count > 0 ? int.Parse(subMatches[0].Value) : 0, aPosY = subMatches.Count > 1 ? int.Parse(subMatches[1].Value) : 0, bPosX = subMatches.Count > 2 ? int.Parse(subMatches[2].Value) : 0, bPosY = subMatches.Count > 3 ? int.Parse(subMatches[3].Value) : 0, angle = subMatches.Count > 4 ? int.Parse(subMatches[4].Value) : 0, }; } } return m_Obstacles; } } public static bool TryClientCrossServerOneVsOne(int myClass) { var config = CrossServerArenaConfig.Get(myClass); if (config == null) { return false; } if (config.robotProbability <= 0) { return false; } var random = UnityEngine.Random.Range(0, 100); return random < config.robotProbability; } public static string GetRandomOpponentName(int job) { var serverName = string.Empty; while (string.IsNullOrEmpty(serverName)) { try { var groupRandom = UnityEngine.Random.Range(0, ServerListCenter.Instance.serverInfoCommon.common.Length); var serverRandom = UnityEngine.Random.Range(0, ServerListCenter.Instance.serverInfoCommon.common[groupRandom].group_list.Length); var serverData = ServerListCenter.Instance.serverInfoCommon.common[groupRandom].group_list[serverRandom]; if (serverData.running_status == (int)ServerState.Normal || serverData.running_status == (int)ServerState.Busy || serverData.running_status == (int)ServerState.Hot) { serverName = serverData.name; } } catch (System.Exception ex) { Debug.LogError(ex); } } var playerName = StringUtility.Contact(RandomNameConfig.GetFirstName(job), RandomNameConfig.GetSecondName(job)); return string.Concat("[", serverName.Replace("@gm", ""), "]", playerName); } public static GA_PlayerClient.PlayerInfo GetRandomOpponentPlayerInfo(int scoreClass, int job, string playerName, int level, ulong maxHp) { var config = CrossServerOneVsOneRobotConfig.GetRandomRobotConfig(scoreClass); var jsonData = JsonMapper.ToObject(config.equips); var equipItems = new List(); if (jsonData.Keys.Contains(job.ToString())) { var equipJson = jsonData[job.ToString()]; for (var i = 0; i < equipJson.Count; i++) { equipItems.Add((int)equipJson[i]); } } var equipInfos = new GA_PlayerClient.CEquipInfo[equipItems.Count]; for (int i = 0; i < equipInfos.Length; i++) { var equipInfo = new GA_PlayerClient.CEquipInfo(); var itemConfig = ItemConfig.Get(equipItems[i]); equipInfo.id = itemConfig.ID; equipInfo.place = itemConfig.EquipPlace; equipInfos[i] = equipInfo; } var playerInfo = new GA_PlayerClient.PlayerInfo() { maxHp = maxHp, hp = maxHp, level = (ushort)level, job = (byte)job, face = AvatarHelper.GetAvatarDefaultID(job), facePic = AvatarHelper.GetAvatarFrameDefaultID(job), pos = Vector3.zero, name = playerName, itemDatas = equipInfos, }; return playerInfo; } public static void JiaMatchOk() { var teamModel = ModelCenter.Instance.GetModel(); if (teamModel.isMatching) { teamModel.RequestCancelAutoMatchTeam(); } var package = new HC001_tagGCCrossRealmPKMatchOK(); package.RoomID = 1000; var serverName = ServerListCenter.Instance.currentServer.name; var playerName = PlayerDatas.Instance.baseData.PlayerName; package.PlayerName = StringUtility.Contact("[", serverName.Replace("@gm", ""), "]", playerName); package.Number = (byte)UnityEngine.Random.Range(1, 3); var opponent = new HC001_tagGCCrossRealmPKMatchOK.tagGCCrossRealmPKMatchPlayer(); opponent.Job = (byte)UnityEngine.Random.Range(1, 3); opponent.PlayerName = GetRandomOpponentName(opponent.Job); opponent.PlayerID = OPPONENT_PLAYERID; var exceptedLevel = PlayerDatas.Instance.baseData.LV - UnityEngine.Random.Range(1, 5); opponent.LV = (ushort)(Mathf.Clamp(exceptedLevel, FuncOpenLVConfig.Get(157).LimitLV, 999)); opponent.MaxProDef = 100; var maxHP = (ulong)(PlayerDatas.Instance.extersion.MaxHP * UnityEngine.Random.Range(0.7f, 0.95f)); opponent.MaxHP = (uint)(maxHP % Constants.ExpPointValue); opponent.MaxHPEx = (uint)(maxHP / Constants.ExpPointValue); package.MatchPlayer = new HC001_tagGCCrossRealmPKMatchOK.tagGCCrossRealmPKMatchPlayer[] { opponent }; myPlace = package.Number; opponentName = opponent.PlayerName; CrossServerLogin.Instance.UpdateCrossServerOneVsOneData(package, true); WindowCenter.Instance.Open(); ModelCenter.Instance.GetModel().IsMatching = false; } public static void StartClientCrossServerOneVsOne() { isClientCrossServerOneVsOne = true; LoadingWin.isCrossServerOneVsOne = true; WindowCenter.Instance.Open(); MapTransferUtility.Instance.Clear(); ClientDungeonStageUtility.SetClientDungeon(true, mapId); var sendInfo = new CA231_tagCMClientStartCustomScene(); GameNetSystem.Instance.SendInfo(sendInfo); CrossServerLogin.Instance.SetWaitForLoginCrossServerState(false); StageLoad.Instance.PushSceneLoadCommand(new StageLoad.StageLoadCommand() { toMapId = mapId, toLineId = 0, needEmpty = true, needLoadResource = true, serverType = ServerType.Main, isClientLoadMap = true }); PlayerDatas.Instance.baseData.mainServerMapIdRecord = PlayerDatas.Instance.baseData.MapID; PlayerDatas.Instance.baseData.MapID = mapId; } public static void JiaWaitFight(int waitSeconds) { var jiaBarrier = new HA713_tagMCDynamicBarrierState(); jiaBarrier.State = 1; jiaBarrier.BarrierList = new HA713_tagMCDynamicBarrierState.tagMCDynamicBarrier[obstacles.Length]; jiaBarrier.Count = (byte)obstacles.Length; for (var i = 0; i < jiaBarrier.BarrierList.Length; i++) { var obstacle = obstacles[i]; jiaBarrier.BarrierList[i] = new HA713_tagMCDynamicBarrierState.tagMCDynamicBarrier() { APosX = (ushort)obstacle.aPosX, APosY = (ushort)obstacle.aPosY, BPosX = (ushort)obstacle.bPosX, BPosY = (ushort)obstacle.bPosY, Angle = (ushort)obstacle.angle, }; } GameNetSystem.Instance.PushPackage(jiaBarrier, ServerType.Main); var timeTick = new H0431_tagTimeTick(); timeTick.Type = (int)DungeonCoolDownType.WaitStart; timeTick.Tick = (uint)waitSeconds * 1000; GameNetSystem.Instance.PushPackage(timeTick, ServerType.Main); } public static void JiaFightBegin() { var jiaBarrier = new HA713_tagMCDynamicBarrierState(); jiaBarrier.State = 0; jiaBarrier.BarrierList = new HA713_tagMCDynamicBarrierState.tagMCDynamicBarrier[obstacles.Length]; jiaBarrier.Count = (byte)obstacles.Length; for (var i = 0; i < jiaBarrier.BarrierList.Length; i++) { var obstacle = obstacles[i]; jiaBarrier.BarrierList[i] = new HA713_tagMCDynamicBarrierState.tagMCDynamicBarrier() { APosX = (ushort)obstacle.aPosX, APosY = (ushort)obstacle.aPosY, BPosX = (ushort)obstacle.bPosX, BPosY = (ushort)obstacle.bPosY, Angle = (ushort)obstacle.angle, }; } GameNetSystem.Instance.PushPackage(jiaBarrier, ServerType.Main); } public static void JiaRoundBegin(int round, uint[] winnerIds) { var waitStartTimeTick = new H0431_tagTimeTick(); waitStartTimeTick.Type = (int)DungeonCoolDownType.FightStart; waitStartTimeTick.Tick = 60 * 1000; GameNetSystem.Instance.PushPackage(waitStartTimeTick, ServerType.Main); var roundWinnerIds = new int[winnerIds.Length]; for (var i = 0; i < roundWinnerIds.Length; i++) { roundWinnerIds[i] = (int)winnerIds[i]; } var missionData = new DungeonMissionData() { roundNum = round, roundWinerIDList = roundWinnerIds, isStart = 1, }; var dungeonModel = ModelCenter.Instance.GetModel(); dungeonModel.UpdateJiaDungeonMission(mapId, missionData); } public static void JiaRoundEnd(bool isOver, int round, uint[] winnerIds) { var roundWinnerIds = new int[winnerIds.Length]; for (var i = 0; i < roundWinnerIds.Length; i++) { roundWinnerIds[i] = (int)winnerIds[i]; } var missionData = new DungeonMissionData() { roundNum = round, roundWinerIDList = roundWinnerIds, prepareTime = isOver ? 0 : 3000, isStart = 0, }; var dungeonModel = ModelCenter.Instance.GetModel(); dungeonModel.UpdateJiaDungeonMission(mapId, missionData); } public static void JiaDungeonExit(int seconds) { var exitDungeon = new H0431_tagTimeTick(); exitDungeon.Type = (int)DungeonCoolDownType.LeaveMap; exitDungeon.Tick = (uint)seconds * 1000; GameNetSystem.Instance.PushPackage(exitDungeon, ServerType.Main); } public static void ReportDungeonResult(FightResultSupplement resultSupplement) { ClientCrossServerOneVsOne.resultSupplement = resultSupplement; var sendInfo = new CC108_tagCMCrossRealmPKRobotOver(); sendInfo.IsWin = (byte)(resultSupplement.winPlayerId == PlayerDatas.Instance.baseData.PlayerID ? 1 : 0); GameNetSystem.Instance.SendInfo(sendInfo); } public static void StopClientCrossServerOneVsOne() { isClientCrossServerOneVsOne = false; ClientDungeonStageUtility.SetClientDungeon(false, 0); PlayerDatas.Instance.extersion.pkState = 0; ModelCenter.Instance.GetModel().ResetBufData(); PersonalEnemy.ReleaseAll(); PlayerDatas.Instance.baseData.MapID = PlayerDatas.Instance.baseData.mainServerMapIdRecord; StageLoad.Instance.PushSceneLoadCommand(new StageLoad.StageLoadCommand() { toMapId = PlayerDatas.Instance.baseData.MapID, toLineId = 0, needEmpty = true, needLoadResource = true, serverType = ServerType.CrossSever, isClientLoadMap = true, refreshPlayerDatas = true }); } public struct FightResultSupplement { public DateTime endTime; public int overType; public int winPlayerId; public int roundCount; public uint[] roundWinnerId; public string opponentName; } public struct FightObstacle { public int aPosX; public int aPosY; public int bPosX; public int bPosY; public int angle; } }