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<int>();
|
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<TeamModel>();
|
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<CrossServerOneVsOneEnterConfirmWin>();
|
ModelCenter.Instance.GetModel<CrossServerOneVsOneModel>().IsMatching = false;
|
}
|
|
public static void StartClientCrossServerOneVsOne()
|
{
|
isClientCrossServerOneVsOne = true;
|
LoadingWin.isCrossServerOneVsOne = true;
|
WindowCenter.Instance.Open<LoadingWin>();
|
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>();
|
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>();
|
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<DungeonModel>().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;
|
}
|
|
}
|