You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1687 lines
60 KiB

using DG.Tweening;
using IVDataFormat;
using IVServerFormat;
using Spine;
using Spine.Unity;
using System.Collections;
using System.Numerics;
using TMPro;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.U2D;
using UnityEngine.UI;
using Vector2 = UnityEngine.Vector2;
using Vector3 = UnityEngine.Vector3;
public class PvpMgr : MonoBehaviour
{
#region Const
private static PvpMgr curMgr = null;
#endregion Const
#region UI
[Header("UI")]
[SerializeField]
private TextMeshProUGUI txtMainT;
[SerializeField]
private Canvas canvasUI;
//private ButtonIV[] btnTabs;
private GameObject groupLobby, groupRanking;
private Image imgLobbyBg, imgLobbyTier, imgLobbyTierNum, imgLobbyChar;
private TextMeshProUGUI txtLv, txtName, txtRank, txtTier, txtRp;
private Toggle tglAuto;
private ButtonIV btnMatch;
private TextMeshProUGUI[] txtEffectTs;
private TextMeshProUGUI[] txtEffectValues;
private GameObject[] goEffects;
private GameObject goBadgeRew, goBadgeTier;
private EScrPvpRank myRankItem;
//private EScrPvpRank[] RankItems;
private GameObject[] goEfcRankTops;
private IVCharSimple[] charRankTops;
private Image[] imgRankTierTops, imgRankTierNumTops;
private TextMeshProUGUI[] txtRankPointTops, txtRankNameTops;
[SerializeField]
private EScrController escrRank, escrTierRew, escrTier;
GameObject dust;
#endregion UI
#region Popup
[Header("Popup")]
private Canvas canvasRew;
private ScrollRect svRew;
private TextMeshProUGUI txtRewCount;
private ButtonIV btnRewGet;
private PvpRewItem[] pvpRewItems;
private Canvas canvasTierRew;
private ButtonIV btnTierRewGet;
private Canvas canvasTier;
#endregion Popup
#region Join
[Header("Join")]
[SerializeField]
private GameObject goCanvasJoin;
private RectTransform rtrfJoinMy, rtrfJoinEnemy;
private Image imgJoinMyBg, imgJoinEnemyBg;
private Image imgJoinMyTier, imgJoinMyTierNum, imgJoinEnemyTier, imgJoinEnemyTierNum;
private TextMeshProUGUI txtJoinMyPoint, txtJoinEnemyPoint;
private TextMeshProUGUI txtJoinMyName, txtJoinEnemyName;
private IVCharSimple charJoinMy, charJoinEnemy;
private SkeletonAnimation skAnimJoin;
#endregion UI
#region Result
[Header("Result")]
[SerializeField]
private GameObject goCanvasResult;
private GameObject goResultRankUp;
private Image imgResultTop, imgResultBottom;
private Image imgResultTier, imgResultTierNum;
private Image imgResultWin, imgResultLose;
private TextMeshProUGUI txtResultTier, txtResultAdd, txtResultPoint;
private SkeletonAnimation skAnimResult, skAnimResultRankUp;
#endregion Result
#region Battle UI
[Header("Battle UI")]
[SerializeField]
private Transform trfBattle;
private Toggle tglBattleAuto;
private TextMeshProUGUI txtBattleMyName, txtBattleEnemyName;
#endregion Battle UI
#region Variables
private int iLoading = 1;
private bool bReLocalize = true;
private bool bInitNeed = true;
private bool bInitNeedBattleCos = true;
private bool bInitNeedRank = true;
private bool bInitNeedRankCos = true;
private bool bInitNeedRew = true;
private bool bInitNeedTierRew = true;
private bool bInitNeedTier = true;
private int iSelectedTab = -1;
private EnhancedUI.SmallList<int> tierList = null;
private AsyncOperationHandle<SpriteAtlas> handleAtlas;
public static SpriteAtlas pvpImgs = null;
private int iShineMode = -1;
private int iCosTopLoad = 0;
private int[] iWeaponRankTops, iIconRankTops;
private Texture2D[] tx2dClothRankTops;
private int iWeaponFriendly = -1;
private int iClothFriendly = -1;
private Texture2D tx2dClothFriendly;
private Texture2D tx2dClothEnemy;
private AsyncOperationHandle<SkeletonDataAsset> handleVs;
private AsyncOperationHandle<SkeletonDataAsset> handleWinLose;
private AsyncOperationHandle<SkeletonDataAsset> handleRankUp;
private bool bSpecUpdateJoin = false;
private int iEnemyUserId = -1;
private dPvpSpec specEnemy = null;
#endregion Variables
#region Base
public static void SLocalize(bool bmain)
{
if (curMgr != null)
curMgr.Localize(bmain);
}
private void Localize(bool bmain)
{
if (bmain)
{
txtMainT.text = LocalizationText.GetText("pvp_title");
}
else
{
bReLocalize = false;
Transform trfui = canvasUI.transform;
trfui.Find("txtT").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("pvp_title");
//btnTabs[0].transform.Find("txt").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("pvp_lobby");
//btnTabs[1].transform.Find("txt").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("all_ranking");
Transform trflobby = groupLobby.transform;
trflobby.Find("txtEfcT").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("pvp_effect");
goBadgeRew.transform.parent.GetChild(0).GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("pvp_reward");
goBadgeTier.transform.parent.GetChild(0).GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("pvp_tierreward");
btnMatch.transform.GetChild(0).GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("all_enter");
tglAuto.transform.parent.GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("auto_progress");
trflobby.Find("txtLobby").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("pvp_lobby");
Transform trfrank = groupRanking.transform;
trfrank.GetChild(0).Find("txtTip").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("pvp_rank_tip");
trfrank.GetChild(0).Find("txtRank").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("all_ranking");
Transform trfrew = canvasRew.transform;
trfrew.Find("txtT").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("pvp_reward");
trfrew.Find("txtDesc").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("pvp_reward_desc");
trfrew.Find("txtProgressT").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("pvp_reward_cond");
trfrew.Find("txtTip").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("reset_week_explain");
btnRewGet.transform.GetChild(0).GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("all_getall");
Transform trftierrew = canvasTierRew.transform;
trftierrew.Find("txtT").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("pvp_tierreward");
trftierrew.Find("txtDesc").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("pvp_tierreward_desc");
trftierrew.Find("txtHelp").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("pvp_tiereffect");
btnTierRewGet.transform.GetChild(0).GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("all_getall");
Transform trftier = canvasTier.transform;
trftier.Find("txtT").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("pvp_tiereffect");
trftier.Find("txtTip").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("pvp_tiereffect_tip");
Transform trfresult = goCanvasResult.transform;
trfresult.Find("txtaddt").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("all_pointadd");
trfresult.Find("txtpointt").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("all_pointcur");
imgResultWin = trfresult.Find("ImgWin").GetComponent<Image>();
imgResultLose = trfresult.Find("ImgLose").GetComponent<Image>();
tglBattleAuto.transform.parent.GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("auto_progress");
}
}
// 설정에서 언어 변경 시 처리.
public static void SReLocalize()
{
curMgr.Localize(true);
curMgr.bReLocalize = true;
curMgr.bInitNeedRew = true;
}
// 백버튼 처리.
public static bool SCloseMenu()
{
return curMgr.CloseMenu();
}
private bool CloseMenu()
{
// 게임 시작 후 열린적 없음.
if (bInitNeed)
return false;
// 매칭.
if (goCanvasJoin.activeSelf)
return true;
// 결과 팝업.
if (goCanvasResult.activeSelf)
{
CloseResult();
return true;
}
// 티어 정보 팝업.
if (canvasTier.enabled)
{
CloseTier();
return true;
}
// 티어 보상 팝업.
if (canvasTierRew.enabled)
{
CloseTierReward();
return true;
}
// 결투장 보상 팝업.
if (canvasRew.enabled)
{
CloseReward();
return true;
}
if (canvasUI.enabled)
{
ClosePvp();
return true;
}
return false;
}
private void Awake()
{
curMgr = this;
}
void Start()
{
iLoading--;
}
private void Init()
{
Transform trfui = canvasUI.transform;
//btnTabs = new ButtonIV[2];
//btnTabs[0] = trfui.Find("tabLobby").GetComponent<ButtonIV>();
//btnTabs[1] = trfui.Find("tabRanking").GetComponent<ButtonIV>();
Transform trflobby = trfui.Find("groupLobby");
groupLobby = trflobby.gameObject;
imgLobbyBg = trflobby.GetChild(0).GetComponent<Image>();
imgLobbyTier = trflobby.Find("imgTier").GetComponent<Image>();
imgLobbyTierNum = trflobby.Find("imgTierNum").GetComponent<Image>();
imgLobbyChar = trflobby.Find("imgChar").GetComponent<Image>();
txtLv = trflobby.Find("txtLv").GetComponent<TextMeshProUGUI>();
txtName = trflobby.Find("txtName").GetComponent<TextMeshProUGUI>();
txtRank = trflobby.Find("txtRank").GetComponent<TextMeshProUGUI>();
txtTier = trflobby.Find("txtTier").GetComponent<TextMeshProUGUI>();
txtRp = trflobby.Find("txtRp").GetComponent<TextMeshProUGUI>();
tglAuto = trflobby.Find("tglAutoTxt").GetChild(0).GetComponent<Toggle>();
tglAuto.SetIsOnWithoutNotify(false);
btnMatch = trflobby.Find("btnMatch").GetComponent<ButtonIV>();
goBadgeRew = trflobby.Find("btnRew").GetChild(1).gameObject;
goBadgeTier = trflobby.Find("btnTier").GetChild(1).gameObject;
Transform trfeffect = trflobby.Find("effects");
int ilen = trfeffect.childCount;
txtEffectTs = new TextMeshProUGUI[ilen];
txtEffectValues = new TextMeshProUGUI[ilen];
goEffects = new GameObject[ilen];
for (int i = 0; i < ilen; i++)
{
goEffects[i] = trfeffect.GetChild(i).gameObject;
txtEffectTs[i] = trfeffect.GetChild(i).GetChild(0).GetComponent<TextMeshProUGUI>();
txtEffectValues[i] = trfeffect.GetChild(i).GetChild(1).GetComponent<TextMeshProUGUI>();
}
Transform trfrank = trfui.Find("groupRanking");
groupRanking = trfrank.gameObject;
trfrank = trfrank.GetChild(0);
//myRankItem = trfrank.Find("PvpRankItem").GetComponent<EScrPvpRank>();
//myRankItem.InitCell();
//RankItems = new EScrPvpRank[3];
//for(int i = 0; i< RankItems.Length; i++)
//{
// RankItems[i] = new EScrPvpRank();
// RankItems[i] = trfrank.Find(FormatString.CombineAll("PvpRankItem",i+1)).GetComponent<EScrPvpRank>();
// RankItems[i].InitCell();
//}
goEfcRankTops = new GameObject[3];
charRankTops = new IVCharSimple[3];
imgRankTierTops = new Image[3];
imgRankTierNumTops = new Image[3];
txtRankPointTops = new TextMeshProUGUI[3];
txtRankNameTops = new TextMeshProUGUI[3];
for (int i = 0; i < 3; i++)
{
Transform trftop = trfrank.Find(FormatString.CombineAllString("RankChar", (i + 1).ToString()));
goEfcRankTops[i] = trftop.GetChild(0).gameObject;
charRankTops[i] = trftop.GetChild(1).GetComponent<IVCharSimple>();
charRankTops[i].transform.GetChild(0).localPosition = new Vector3(0f, 0f, -10000f);
imgRankTierTops[i] = trftop.Find("iconTier").GetComponent<Image>();
imgRankTierNumTops[i] = trftop.Find("iconTierNum").GetComponent<Image>();
imgRankTierTops[i].enabled = false;
imgRankTierNumTops[i].enabled = false;
txtRankPointTops[i] = trftop.Find("txtPoint").GetComponent<TextMeshProUGUI>();
txtRankNameTops[i] = trftop.Find("txtName").GetComponent<TextMeshProUGUI>();
}
Transform trfrew = trfui.Find("popupReward");
canvasRew = trfrew.GetComponent<Canvas>();
txtRewCount = trfrew.Find("txtProgressT").GetChild(0).GetComponent<TextMeshProUGUI>();
btnRewGet = trfrew.Find("btnGet").GetComponent<ButtonIV>();
svRew = trfrew.Find("SvRew").GetComponent<ScrollRect>();
pvpRewItems = svRew.transform.GetChild(0).GetComponentsInChildren<PvpRewItem>(true);
Transform trftierrew = trfui.Find("popupTierReward");
canvasTierRew = trftierrew.GetComponent<Canvas>();
btnTierRewGet = trftierrew.Find("btnGet").GetComponent<ButtonIV>();
Transform trftier = trfui.Find("popupTier");
canvasTier = trftier.GetComponent<Canvas>();
Transform trfjoin = goCanvasJoin.transform;
skAnimJoin = trfjoin.Find("skanimjoin").GetComponent<SkeletonAnimation>();
skAnimJoin.transform.localScale = new Vector3(0.01f, 0.01f, 0.01f);
rtrfJoinMy = trfjoin.Find("bgleft").GetComponent<RectTransform>();
imgJoinMyBg = rtrfJoinMy.GetComponent<Image>();
imgJoinMyTier = rtrfJoinMy.Find("imgMyPvp").GetComponent<Image>();
imgJoinMyTierNum = rtrfJoinMy.Find("imgMyPvpNum").GetComponent<Image>();
txtJoinMyPoint = rtrfJoinMy.Find("txtMyPoint").GetComponent<TextMeshProUGUI>();
txtJoinMyName = rtrfJoinMy.Find("txtMyName").GetComponent<TextMeshProUGUI>();
charJoinMy = rtrfJoinMy.Find("charMy").GetComponent<IVCharSimple>();
charJoinMy.Init();
rtrfJoinEnemy = trfjoin.Find("bgright").GetComponent<RectTransform>();
imgJoinEnemyBg = rtrfJoinEnemy.GetComponent<Image>();
imgJoinEnemyTier = rtrfJoinEnemy.Find("imgEnemyPvp").GetComponent<Image>();
imgJoinEnemyTierNum = rtrfJoinEnemy.Find("imgEnemyPvpNum").GetComponent<Image>();
txtJoinEnemyPoint = rtrfJoinEnemy.Find("txtEnemyPoint").GetComponent<TextMeshProUGUI>();
txtJoinEnemyName = rtrfJoinEnemy.Find("txtEnemyName").GetComponent<TextMeshProUGUI>();
charJoinEnemy = rtrfJoinEnemy.Find("charEnemy").GetComponent<IVCharSimple>();
charJoinEnemy.Init();
Transform trfresult = goCanvasResult.transform;
goResultRankUp = trfresult.Find("rankup").gameObject;
imgResultTop = trfresult.Find("linetop").GetComponent<Image>();
imgResultBottom = trfresult.Find("linebottom").GetComponent<Image>();
imgResultTier = trfresult.Find("imgPvp").GetComponent<Image>();
imgResultTierNum = trfresult.Find("imgPvpNum").GetComponent<Image>();
txtResultTier = trfresult.Find("txtTier").GetComponent<TextMeshProUGUI>();
txtResultAdd = trfresult.Find("txtAdd").GetComponent<TextMeshProUGUI>();
txtResultPoint = trfresult.Find("txtPoint").GetComponent<TextMeshProUGUI>();
skAnimResult = trfresult.Find("skanimResult").GetComponent<SkeletonAnimation>();
skAnimResult.transform.localScale = new Vector3(0.01f, 0.01f, 0.01f);
skAnimResultRankUp = trfresult.Find("skanimRank").GetComponent<SkeletonAnimation>();
skAnimResultRankUp.transform.localScale = new Vector3(0.01f, 0.01f, 0.01f);
tglBattleAuto = trfBattle.Find("tglAuto").GetChild(0).GetComponent<Toggle>();
txtBattleMyName = trfBattle.Find("txtMyName").GetComponent<TextMeshProUGUI>();
txtBattleEnemyName = trfBattle.Find("txtEnemyName").GetComponent<TextMeshProUGUI>();
dust = canvasUI.transform.Find("all_dust").gameObject;
DataHandler.UpdatePvpRank(new dPvpRank[0]);
}
#endregion Base
#region UI
public void OpenPvp()
{
// 해금 조건 미충족.
if (!DataHandler.IsClearStage(DataHandler.Const.pvpOpenStage))
{
GameUIMgr.SOpenToast(FormatString.TextOpenStageClear(DataHandler.Const.pvpOpenStage));
SoundMgr.PlaySfx(SoundName.BtnPress);
return;
}
// 결투장 닫혀 있음.
if (!DataHandler.sysPvp.isOpen)
{
GameUIMgr.SOpenPopup1Button(LocalizationText.GetText(Global.STR_Prepare));
return;
}
if (iLoading > 0)
return;
iLoading++;
if (bInitNeed)
{
bInitNeed = false;
Init();
// 처음 열때 유저 스펙 서버에 저장.
bSpecUpdateJoin = false;
dPvpSpec data = dPvpSpec.GetMyBestSpec(DataHandler.playPvp.usePreset, DataHandler.playPvp.usePetPreset, DataHandler.playPvp.useExtraPreset);
SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.PvpSpec), typeof(nIdCnt), ASpecSucc, ASpecFail, data, false);
}
if (bReLocalize)
Localize(false);
// 결투장 창 열때 아틀라스 불러오기. 아틀라스를 불러온 후에 결투장 창 열림.
CoverCamera.Hold();
Addressables.LoadAssetAsync<SpriteAtlas>("atlasPvp").Completed += ALoadAtlasComp;
SoundMgr.PlaySfx(SoundName.BtnPress);
iLoading--;
}
// 결투장 열기 처리.
private void OpenPvpComp()
{
SetMyInfo();
if (iSelectedTab < 0)
{
TabPvp();
if (DataHandler.PvpRankRefreshTime <= TimeUtils.Now())
{
SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.PvpRank), typeof(nPvpRank), ARankSucc, ARankFail, new nIdLv(), false);
}
SetImages();
groupRanking.SetActive(true);
}
btnMatch.interactable = DataHandler.playPvp.ticket > 0;
canvasUI.enabled = true;
GameUIMgr.SSetPvpTicket(DataHandler.playPvp.ticket);
GameUIMgr.SRightWindowClose();
GameUIMgr.SOpenUpPanel(true,pvp: true,addy:6);
GameUIMgr.SSetMainUiOn(false);
GameUIMgr.SCloseMenu();
BattleMgr.SSetBattleUiOn(false);
BattleMgr.SSetClearFailUiOn(false);
BattleMgr.SSetCameraOn(false);
}
// 결투장 닫기.
public void ClosePvp()
{
if (!canvasUI.enabled)
return;
if (iLoading > 0)
return;
iLoading++;
CoverCamera.Hold();
canvasUI.enabled = false;
GameUIMgr.SCloseUpPanel();
GameUIMgr.SSetMainUiOn(true);
BattleMgr.SSetBattleUiOn(true);
BattleMgr.SSetClearFailUiOn(true);
BattleMgr.SSetCameraOn(true);
BattleMgr.SRefreshCharCloth();
// 결투장 창 닫을때 리소스 해제.
imgLobbyBg.sprite = null;
imgLobbyTier.sprite = null;
imgLobbyTierNum.sprite = null;
imgJoinMyBg.sprite = null;
imgJoinEnemyBg.sprite = null;
imgJoinMyTier.sprite = null;
imgJoinMyTierNum.sprite = null;
imgJoinEnemyTier.sprite = null;
imgJoinEnemyTierNum.sprite = null;
imgResultTier.sprite = null;
imgResultTierNum.sprite = null;
if (!bInitNeedRank)
{
//ResetRankTop3();
//myRankItem.ReleaseResources();
escrRank.ReleaseResources();
}
if (!bInitNeedTierRew)
escrTierRew.ReleaseResources();
if (!bInitNeedTier)
escrTier.ReleaseResources();
pvpImgs = null;
if (handleAtlas.IsValid())
{
Addressables.Release(handleAtlas);
}
if (iWeaponFriendly > 0)
{
AddressableMgr.ReleaseWeaponSpine(iWeaponFriendly);
iWeaponFriendly = -1;
}
if (iClothFriendly > 0)
{
tx2dClothFriendly = null;
AddressableMgr.ReleaseClothSpine(iClothFriendly);
iClothFriendly = -1;
}
if (handleVs.IsValid())
{
skAnimJoin.transform.localScale = new Vector3(0.01f, 0.01f, 0.01f);
skAnimJoin.skeletonDataAsset.Clear();
skAnimJoin.ClearState();
skAnimJoin.skeletonDataAsset = null;
Addressables.Release(handleVs);
}
if (handleWinLose.IsValid())
{
skAnimResult.transform.localScale = new Vector3(0.01f, 0.01f, 0.01f);
skAnimResult.skeletonDataAsset.Clear();
skAnimResult.ClearState();
skAnimResult.skeletonDataAsset = null;
Addressables.Release(handleWinLose);
}
if (handleRankUp.IsValid())
{
skAnimResultRankUp.transform.localScale = new Vector3(0.01f, 0.01f, 0.01f);
skAnimResultRankUp.skeletonDataAsset.Clear();
skAnimResultRankUp.ClearState();
skAnimResultRankUp.skeletonDataAsset = null;
Addressables.Release(handleRankUp);
}
AddressableMgr.SAddUnload();
groupRanking.SetActive(false);
CoverCamera.Release();
SoundMgr.PlaySfx(SoundName.BtnPress);
dust.SetActive(false);
iLoading--;
}
// 통신 실패 - 스펙.
private void ASpecFail(SvError error, object request)
{
if (bSpecUpdateJoin)
{
bSpecUpdateJoin = false;
JoinPvpStart();
}
}
// 통신 성공 - 스펙.
private void ASpecSucc(object result, object request)
{
if (bSpecUpdateJoin)
{
bSpecUpdateJoin = false;
JoinPvpStart();
}
}
// 결투장 랭킹 이미지 가져오기
public static Sprite SGetRankImg(int rank)
{
if (rank > 3)
return null;
return pvpImgs.GetSprite(FormatString.CombineAll("rank", rank));
}
// 결투장 티어 이미지 가져오기
public static Sprite SGetTierImg(int itier)
{
if (pvpImgs == null)
return null;
itier = (itier - 1) / 3 + 1;
return pvpImgs.GetSprite(itier.ToString());
}
// 결투장 티어 번호 이미지 가져오기
public static Sprite SGetTierNumImg(int itier)
{
if (pvpImgs == null)
return null;
itier = (itier - 1) % 3;
return pvpImgs.GetSprite(FormatString.CombineAllString("n", itier.ToString()));
}
// 결투장 이미지 가져오기
public static Sprite SGetPvpImg(string strpath)
{
if (pvpImgs == null)
return null;
return pvpImgs.GetSprite(strpath);
}
// 어드레서블 결투장 이미지 불러왔을때 처리.
private void ALoadAtlasComp(AsyncOperationHandle<SpriteAtlas> obj)
{
pvpImgs = obj.Result;
handleAtlas = obj;
OpenPvpComp();
CoverCamera.Release();
}
#endregion UI
#region Pvp Info
// 내 정보 세팅.
private void SetMyInfo()
{
int irp = DataHandler.playPvp.point;
int itier = DataHandler.pvpMyRank.tier;
int irank = DataHandler.pvpMyRank.rank;
imgLobbyChar.sprite = AddressableMgr.GetPlayerIcon(DataHandler.PlayData.playerIcon);
imgLobbyTier.sprite = SGetTierImg(itier);
imgLobbyTierNum.sprite = SGetTierNumImg(itier);
setTierMyInfo(itier);
txtLv.text = FormatString.TextLv(DataHandler.PlayData.playerLv);
txtName.text = DataHandler.PlayData.playerName;
txtRank.text = FormatString.TextRank(irank);
txtTier.text = LocalizationText.GetText(FormatString.CombineAllString("tier", itier.ToString()));
txtRp.text = FormatString.TextRp(irp);
int iavailrew = DataHandler.playPvp.availWeeklyIndex < 0 ? 0 : DataHandler.GetPvpReward(DataHandler.playPvp.availWeeklyIndex).id;
goBadgeRew.SetActive(iavailrew > DataHandler.playPvp.rewardWeekly);
goBadgeTier.SetActive(DataHandler.pvpMyRank.tier > DataHandler.playPvp.rewardTier);
#region Effects
dPvpTier tier = DataHandler.GetPvpTier(itier);
if (tier.abilityType1 == eEffectType.None)
{
goEffects[0].SetActive(false);
}
else
{
txtEffectTs[0].text = FormatString.TextEffectTitle(tier.abilityType1);
txtEffectValues[0].text = FormatString.TextEffectValue(tier.abilityType1, tier.abilityValue1);
goEffects[0].SetActive(true);
}
if (tier.abilityType2 == eEffectType.None)
{
goEffects[1].SetActive(false);
}
else
{
txtEffectTs[1].text = FormatString.TextEffectTitle(tier.abilityType2);
txtEffectValues[1].text = FormatString.TextEffectValue(tier.abilityType2, tier.abilityValue2);
goEffects[1].SetActive(true);
}
if (tier.abilityType3 == eEffectType.None)
{
goEffects[2].SetActive(false);
}
else
{
txtEffectTs[2].text = FormatString.TextEffectTitle(tier.abilityType3);
txtEffectValues[2].text = FormatString.TextEffectValue(tier.abilityType3, tier.abilityValue3);
goEffects[2].SetActive(true);
}
if (tier.abilityType4 == eEffectType.None)
{
goEffects[3].SetActive(false);
}
else
{
txtEffectTs[3].text = FormatString.TextEffectTitle(tier.abilityType4);
txtEffectValues[3].text = FormatString.TextEffectValue(tier.abilityType4, tier.abilityValue4);
goEffects[3].SetActive(true);
}
#endregion Effects
}
// 탭 전환 시 이미지 세팅.
private void SetImages()
{
if (iSelectedTab == 0)
{
imgLobbyBg.sprite = SGetPvpImg("bglobby");
escrRank.ReleaseResources();
}
else
{
imgLobbyBg.sprite = null;
}
}
// 팝업 여닫을때 반짝이는 연출 재생.
private void ReloadShineEffect()
{
if (canvasRew.enabled)
{
iShineMode = 0;
StartCoroutine(nameof(CoShineEffect));
}
else if (canvasTierRew.enabled)
{
iShineMode = 1;
StartCoroutine(nameof(CoShineEffect));
}
else
{
iShineMode = -1;
StopCoroutine(nameof(CoShineEffect));
}
}
// 반짝이는 연출.
private IEnumerator CoShineEffect()
{
float fvalue = 1f;
// 주간 보상.
if (iShineMode == 0)
{
while (true)
{
for (int i = 0; i < pvpRewItems.Length; i++)
pvpRewItems[i].SetFloat(fvalue);
yield return YieldInstructionCache.WaitForSeconds(0.05f);
fvalue -= 0.08f;
if (fvalue < 0f)
{
fvalue = 1f;
yield return YieldInstructionCache.WaitForSeconds(3f);
}
}
}
// 티어 보상.
else
{
while (true)
{
escrTierRew.SetFloat(fvalue);
yield return YieldInstructionCache.WaitForSeconds(0.05f);
fvalue -= 0.08f;
if (fvalue < 0f)
{
fvalue = 1f;
yield return YieldInstructionCache.WaitForSeconds(3f);
}
}
}
}
#endregion Pvp Info
#region Tab
// 탭.
public void TabPvp()
{
SoundMgr.PlaySfx(SoundName.BtnPress);
groupLobby.SetActive(true);
groupRanking.SetActive(true);
if (bInitNeedRank)
{
for (int i = 0; i < 3; i++)
{
charRankTops[i].Init();
}
iWeaponRankTops = new int[3] { -1, -1, -1 };
iIconRankTops = new int[3] { -1, -1, -1 };
tx2dClothRankTops = new Texture2D[3];
EnhancedUI.SmallList<int> list = new EnhancedUI.SmallList<int>();
for (int i = 1; i <= 100; i++)
list.Add(i);
escrRank.LoadDatas(list);
SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.PvpRank), typeof(nPvpRank), ARankSucc, ARankFail, new nIdLv(), false);
}
else
{
// 랭킹 갱신 시간 체크해서 필요시 갱신.
if (DataHandler.PvpRankRefreshTime <= TimeUtils.Now())
{
SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.PvpRank), typeof(nPvpRank), ARankSucc, ARankFail, new nIdLv(), false);
}
}
SetImages();
}
#endregion Tab
#region Rank
// 탑3 캐릭터 코스튬 표시(코스튬 리소스 로드 완료시 호출).
private void UpdateRankTop3Costume()
{
if (iCosTopLoad > 0)
return;
CoverCamera.Hold();
StartCoroutine(nameof(CoUpdateRankTop3Costume));
}
private IEnumerator CoUpdateRankTop3Costume()
{
if (bInitNeedRankCos)
{
bInitNeedRankCos = false;
for (int i = 0; i < 3; i++)
{
if (!DataHandler.TryGetPvpRank(i + 1, out dPvpRank rank)) continue;
charRankTops[i].SetCostume(tx2dClothRankTops[i]);
}
}
yield return null;
for (int i = 0; i < 3; i++)
{
if (!DataHandler.TryGetPvpRank(i + 1, out dPvpRank rank))
{
charRankTops[i].gameObject.SetActive(false);
continue;
}
charRankTops[i].gameObject.SetActive(true);
charRankTops[i].SetCostume(tx2dClothRankTops[i]);
charRankTops[i].transform.GetChild(0).localPosition = Vector3.zero;
}
CoverCamera.Release();
}
private void ALoadClothComp1(Texture2D obj)
{
tx2dClothRankTops[0] = obj;
iCosTopLoad--;
UpdateRankTop3Costume();
CoverCamera.Release();
}
private void ALoadClothComp2(Texture2D obj)
{
tx2dClothRankTops[1] = obj;
iCosTopLoad--;
UpdateRankTop3Costume();
CoverCamera.Release();
}
private void ALoadClothComp3(Texture2D obj)
{
tx2dClothRankTops[2] = obj;
iCosTopLoad--;
UpdateRankTop3Costume();
CoverCamera.Release();
}
private void ALoadWeaponComp1(Skin obj)
{
charRankTops[0].SetWeapon(obj);
iCosTopLoad--;
UpdateRankTop3Costume();
CoverCamera.Release();
}
private void ALoadWeaponComp2(Skin obj)
{
charRankTops[1].SetWeapon(obj);
iCosTopLoad--;
UpdateRankTop3Costume();
CoverCamera.Release();
}
private void ALoadWeaponComp3(Skin obj)
{
charRankTops[2].SetWeapon(obj);
iCosTopLoad--;
UpdateRankTop3Costume();
CoverCamera.Release();
}
// 통신 실패 - 랭킹.
private void ARankFail(SvError error, object request)
{
}
// 통신 성공 - 랭킹.
private void ARankSucc(object result, object request)
{
nPvpRank data = result as nPvpRank;
if (data == null || data.myRank == null || data.topRank == null)
{
ARankFail(new SvError(eErrorCode.NULL_OR_EMPTY), request);
return;
}
DataHandler.UpdatePvpMyRank(data.myRank);
DataHandler.UpdatePvpRank(data.topRank);
bInitNeedRank = false;
SetMyInfo();
//SetRankTop3();
escrRank.scroller.RefreshActiveCellViews();
}
#endregion Rank
#region Popup Reward
// 주간 보상 팝업 열기.
public void OpenReward()
{
if (iLoading > 0)
return;
iLoading++;
canvasRew.enabled = true;
if (bInitNeedRew)
{
bInitNeedRew = false;
for (int i = 0; i < pvpRewItems.Length; i++)
{
pvpRewItems[i].InitCell();
pvpRewItems[i].SetData(i);
}
}
else
{
for (int i = 0; i < pvpRewItems.Length; i++)
{
pvpRewItems[i].SetData(i);
}
}
if (DataHandler.playPvp.availWeeklyIndex < 3)
svRew.horizontalNormalizedPosition = 0f;
else
svRew.horizontalNormalizedPosition = 1f;
txtRewCount.text = FormatString.TextInt(DataHandler.playPvp.weeklyTry);
btnRewGet.interactable = goBadgeRew.activeSelf;
ReloadShineEffect();
SoundMgr.PlaySfx(SoundName.BtnPress);
iLoading--;
}
// 주간 보상 팝업 닫기.
public void CloseReward()
{
if (iLoading > 0)
return;
iLoading++;
canvasRew.enabled = false;
ReloadShineEffect();
iLoading--;
}
public static void SGetReward()
{
curMgr.BtnGetReward();
}
// 주간 보상 받기.
public void BtnGetReward()
{
if (iLoading > 0)
return;
int iavailrew = DataHandler.playPvp.availWeeklyIndex < 0 ? 0 : DataHandler.GetPvpReward(DataHandler.playPvp.availWeeklyIndex).id;
if (iavailrew <= DataHandler.playPvp.rewardWeekly)
return;
iLoading++;
nIdLv data = new nIdLv(iavailrew);
SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.PvpRew), typeof(nPvpRewReturn), ARewSucc, ARewFail, data, true);
}
// 통신 실패 - 주간 보상.
private void ARewFail(SvError error, object request)
{
iLoading--;
}
// 통신 성공 - 주간 보상.
private void ARewSucc(object result, object request)
{
nPvpRewReturn data = result as nPvpRewReturn;
if (data == null || data.playCurrency == null || data.playPvp == null)
{
ARewFail(new SvError(eErrorCode.NULL_OR_EMPTY), request);
return;
}
DataHandler.AddGoods(data.result, data.playCurrency, true);
DataHandler.UpdatePvpPlay(data.playPvp);
for (int i = 0; i < pvpRewItems.Length; i++)
{
pvpRewItems[i].SetData(i);
}
int iavailrew = DataHandler.playPvp.availWeeklyIndex < 0 ? 0 : DataHandler.GetPvpReward(DataHandler.playPvp.availWeeklyIndex).id;
goBadgeRew.SetActive(iavailrew > DataHandler.playPvp.rewardWeekly);
btnRewGet.interactable = goBadgeRew.activeSelf;
GameUIMgr.SOpenPopupGoods(data.result);
iLoading--;
}
#endregion Popup Reward
#region Popup Tier Reward
// 티어 보상 팝업 열기.
public void OpenTierReward()
{
if (iLoading > 0)
return;
iLoading++;
canvasTierRew.enabled = true;
if (bInitNeedTierRew)
{
bInitNeedTierRew = false;
tierList = new EnhancedUI.SmallList<int>();
int ilen = DataHandler.GetPvpTiers().Length;
for (int i = 0; i < ilen; i++)
tierList.Add(i);
escrTierRew.LoadDatas(tierList);
}
else
{
escrTierRew.scroller.RefreshActiveCellViews();
}
float fpos = escrTierRew.scroller.GetScrollPositionForDataIndex(DataHandler.pvpMyRank.tier - 1, EnhancedUI.EnhancedScroller.EnhancedScroller.CellViewPositionEnum.Before);
escrTierRew.scroller.SetScrollPositionImmediately(fpos);
btnTierRewGet.interactable = goBadgeTier.activeSelf;
SoundMgr.PlaySfx(SoundName.BtnPress);
ReloadShineEffect();
iLoading--;
}
// 티어 보상 팝업 닫기.
public void CloseTierReward()
{
if (iLoading > 0)
return;
iLoading++;
canvasTierRew.enabled = false;
ReloadShineEffect();
iLoading--;
}
public static void SGetTierReward()
{
curMgr.BtnGetTierReward();
}
// 티어 보상 받기.
public void BtnGetTierReward()
{
if (iLoading > 0)
return;
if (DataHandler.pvpMyRank.tier <= DataHandler.playPvp.rewardTier)
return;
iLoading++;
nIdLv data = new nIdLv(DataHandler.pvpMyRank.tier);
SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.PvpTierRew), typeof(nPvpRewReturn), ATierRewSucc, ATierRewFail, data, true);
}
// 통신 실패 - 티어 보상.
private void ATierRewFail(SvError error, object request)
{
iLoading--;
}
// 통신 성공 - 티어 보상.
private void ATierRewSucc(object result, object request)
{
nPvpRewReturn data = result as nPvpRewReturn;
if (data == null || data.playCurrency == null || data.playPvp == null)
{
ATierRewFail(new SvError(eErrorCode.NULL_OR_EMPTY), request);
return;
}
DataHandler.AddGoods(data.result, data.playCurrency, true);
DataHandler.UpdatePvpPlay(data.playPvp);
escrTierRew.scroller.RefreshActiveCellViews();
goBadgeTier.SetActive(DataHandler.pvpMyRank.tier > DataHandler.playPvp.rewardTier);
btnTierRewGet.interactable = goBadgeTier.activeSelf;
GameUIMgr.SOpenPopupGoods(data.result);
iLoading--;
}
#endregion Popup Tier Reward
#region Popup Tier
// 티어 팝업 열기.
public void OpenTier()
{
if (iLoading > 0)
return;
iLoading++;
canvasTier.enabled = true;
if (bInitNeedTier)
{
bInitNeedTier = false;
escrTier.LoadDatas(tierList);
}
else
{
escrTier.scroller.RefreshActiveCellViews();
}
float fpos = escrTier.scroller.GetScrollPositionForDataIndex(DataHandler.pvpMyRank.tier - 1, EnhancedUI.EnhancedScroller.EnhancedScroller.CellViewPositionEnum.Before);
escrTier.scroller.SetScrollPositionImmediately(fpos);
iLoading--;
}
// 티어 팝업 닫기.
public void CloseTier()
{
if (iLoading > 0)
return;
iLoading++;
canvasTier.enabled = false;
iLoading--;
}
#endregion Popup Tier
#region Join
// 결투장 매칭 입장.
public void JoinPvp()
{
if (iLoading > 0)
return;
SoundMgr.PlaySfx(SoundName.BtnPress);
// 기존 프리셋 보존.
GameUIMgr.SPreservePreset(DataHandler.PlayData.usePreset, DataHandler.PlayData.usePetPreset, DataHandler.PlayAwaken.usePreset);
// 프리셋 선택.
GameUIMgr.SOpenPopupPreset(DataHandler.playPvp.usePreset, DataHandler.playPvp.usePetPreset, DataHandler.playPvp.useExtraPreset, APresetSelected);
}
// 결투장 매칭 입장.
private void APresetSelected()
{
int iskillpreset = GameUIMgr.SGetSkillPreset();
int ipetpreset = GameUIMgr.SGetPetPreset();
int iawakenpreset = GameUIMgr.SGetAwakenPreset();
// 프리셋이 다를 경우 유저 스펙 서버에 저장.
if (iskillpreset != DataHandler.playPvp.usePreset || ipetpreset != DataHandler.playPvp.usePetPreset || iawakenpreset != DataHandler.playPvp.useExtraPreset)
{
DataHandler.UpdatePvpPreset(iskillpreset, ipetpreset, iawakenpreset);
bSpecUpdateJoin = true;
dPvpSpec data = dPvpSpec.GetMyBestSpec(iskillpreset, ipetpreset, iawakenpreset);
SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.PvpSpec), typeof(nIdCnt), ASpecSucc, ASpecFail, data, false);
}
else
{
JoinPvpStart();
}
}
// 결투장 입장 통신 시작.
private void JoinPvpStart()
{
iLoading++;
CoverCamera.Hold();
SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.PvpJoin), typeof(nPvpJoinReturn), AJoinSucc, AJoinFail, new nIdCnt(), false);
}
// 통신 성공 - 입장.
private void AJoinSucc(object result, object request)
{
nPvpJoinReturn data = result as nPvpJoinReturn;
if (data == null || data.playPvp == null || data.vsBattleInfo == null)
{
AJoinFail(new SvError(eErrorCode.NULL_OR_EMPTY), request);
return;
}
iEnemyUserId = data.vsUserId;
specEnemy = data.vsBattleInfo;
DataHandler.UpdatePvpPlay(data.playPvp);
GameUIMgr.SSetPvpTicket(data.playPvp.ticket);
btnMatch.interactable = data.playPvp.ticket > 0;
imgJoinMyBg.sprite = SGetPvpImg("vsblue");
imgJoinEnemyBg.sprite = SGetPvpImg("vsred");
imgJoinMyTier.sprite = imgLobbyTier.sprite;
imgJoinMyTierNum.sprite = imgLobbyTierNum.sprite;
txtJoinMyPoint.text = txtRp.text;
txtJoinMyName.text = txtName.text;
imgJoinEnemyTier.sprite = SGetTierImg(data.vsRank.tier);
imgJoinEnemyTierNum.sprite = SGetTierNumImg(data.vsRank.tier);
setTierNum(DataHandler.pvpMyRank.tier);
setTierNum(data.vsRank.tier, true);
txtJoinEnemyPoint.text = FormatString.TextRp(data.vsRank.point);
txtJoinEnemyName.text = data.vsRank.playerName;
tglBattleAuto.SetIsOnWithoutNotify(tglAuto.isOn);
txtBattleMyName.text = txtJoinMyName.text;
txtBattleEnemyName.text = txtJoinEnemyName.text;
rtrfJoinMy.anchoredPosition = new Vector2(-820f, 0f);
rtrfJoinEnemy.anchoredPosition = new Vector2(820f, 0f);
skAnimJoin.transform.localScale = new Vector3(0.01f, 0.01f, 0.01f);
goCanvasJoin.SetActive(true);
// 내 코스튬 로드.
if (iClothFriendly != DataHandler.PlayEquipCostume.outfitId)
{
iCosTopLoad++;
iClothFriendly = DataHandler.PlayEquipCostume.outfitId;
AddressableMgr.LoadClothSpine(iClothFriendly, ALoadClothFriendly);
}
if (iWeaponFriendly != DataHandler.PlayEquipCostume.weaponId)
{
iCosTopLoad++;
iWeaponFriendly = DataHandler.PlayEquipCostume.weaponId;
AddressableMgr.LoadWeaponSpine(iWeaponFriendly, ALoadWeaponFriendly);
}
// 상대 코스튬 로드.
iCosTopLoad += 2;
AddressableMgr.LoadClothSpine(specEnemy.costumeView, ALoadClothEnemy);
AddressableMgr.LoadWeaponSpine(specEnemy.weaponView, ALoadWeaponEnemy);
// 애니메이션 로드.
if (!handleVs.IsValid())
Addressables.LoadAssetAsync<SkeletonDataAsset>("spine/VS/VS_SkeletonData.asset").Completed += ALoadVsComp;
// 내 스킬 프리셋.
int iskillpreset = GameUIMgr.SGetSkillPreset();
if (iskillpreset != DataHandler.PlayData.usePreset)
{
DataHandler.PlayData.usePreset = iskillpreset;
}
// 내 펫 프리셋.
int ipetpreset = GameUIMgr.SGetPetPreset();
if (ipetpreset != DataHandler.PlayData.usePetPreset)
{
DataHandler.PlayData.usePetPreset = ipetpreset;
BattleMgr.SSetPet(ipetpreset);
}
// 내 각성 프리셋.
int iawakenpreset = GameUIMgr.SGetAwakenPreset();
if (iawakenpreset != DataHandler.PlayAwaken.usePreset)
{
DataHandler.PlayAwaken.usePreset = iawakenpreset;
}
StartCoroutine(nameof(CoBattleJoin));
dust.SetActive(false);
iLoading--;
}
// 통신 실패 - 입장.
private void AJoinFail(SvError error, object request)
{
CoverCamera.Release();
iLoading--;
}
private void setTierNum(int tier, bool isEnemy = false)
{
if (tier <= 9)
{
if (isEnemy)
imgJoinEnemyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinEnemyTier.rectTransform.anchoredPosition.x - 2, imgJoinEnemyTier.rectTransform.anchoredPosition.y + 3, 0);
else
imgJoinMyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinMyTier.rectTransform.anchoredPosition.x - 2, imgJoinMyTier.rectTransform.anchoredPosition.y + 3, 0);
}
else if (tier <= 12)
{
if (isEnemy)
imgJoinEnemyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinEnemyTier.rectTransform.anchoredPosition.x - 1, imgJoinEnemyTier.rectTransform.anchoredPosition.y + 7, 0);
else
imgJoinMyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinMyTier.rectTransform.anchoredPosition.x - 1, imgJoinMyTier.rectTransform.anchoredPosition.y + 7, 0);
}
else if (tier <= 30)
{
if (isEnemy)
imgJoinEnemyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinEnemyTier.rectTransform.anchoredPosition.x, imgJoinEnemyTier.rectTransform.anchoredPosition.y + 2, 0);
else
imgJoinMyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinMyTier.rectTransform.anchoredPosition.x, imgJoinMyTier.rectTransform.anchoredPosition.y + 2, 0);
}
else if (tier <= 48)
{
if (isEnemy)
imgJoinEnemyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinEnemyTier.rectTransform.anchoredPosition.x, imgJoinEnemyTier.rectTransform.anchoredPosition.y, 0);
else
imgJoinMyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinMyTier.rectTransform.anchoredPosition.x, imgJoinMyTier.rectTransform.anchoredPosition.y, 0);
}
else if (tier <= 51)
{
if (isEnemy)
imgJoinEnemyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinEnemyTier.rectTransform.anchoredPosition.x, imgJoinEnemyTier.rectTransform.anchoredPosition.y + 2, 0);
else
imgJoinMyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinMyTier.rectTransform.anchoredPosition.x, imgJoinMyTier.rectTransform.anchoredPosition.y + 2, 0);
}
else if (tier <= 57)
{
if (isEnemy)
imgJoinEnemyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinEnemyTier.rectTransform.anchoredPosition.x, imgJoinEnemyTier.rectTransform.anchoredPosition.y - 3, 0);
else
imgJoinMyTierNum.rectTransform.anchoredPosition = new Vector3(imgJoinMyTier.rectTransform.anchoredPosition.x, imgJoinMyTier.rectTransform.anchoredPosition.y - 3, 0);
}
}
private void setTierResultNum(int tier)
{
if (tier <= 9)
imgResultTierNum.rectTransform.anchoredPosition = new Vector3(imgResultTier.rectTransform.anchoredPosition.x - 2, imgResultTier.rectTransform.anchoredPosition.y + 3, 0);
else if (tier <= 12)
imgResultTierNum.rectTransform.anchoredPosition = new Vector3(imgResultTier.rectTransform.anchoredPosition.x - 1, imgResultTier.rectTransform.anchoredPosition.y + 7, 0);
else if (tier <= 30)
imgResultTierNum.rectTransform.anchoredPosition = new Vector3(imgResultTier.rectTransform.anchoredPosition.x, imgResultTier.rectTransform.anchoredPosition.y + 2, 0);
else if (tier <= 48)
imgResultTierNum.rectTransform.anchoredPosition = new Vector3(imgResultTier.rectTransform.anchoredPosition.x, imgResultTier.rectTransform.anchoredPosition.y, 0);
else if (tier <= 51)
imgResultTierNum.rectTransform.anchoredPosition = new Vector3(imgResultTier.rectTransform.anchoredPosition.x, imgResultTier.rectTransform.anchoredPosition.y + 2, 0);
else if (tier <= 57)
imgResultTierNum.rectTransform.anchoredPosition = new Vector3(imgResultTier.rectTransform.anchoredPosition.x, imgResultTier.rectTransform.anchoredPosition.y - 3, 0);
}
private void setTierMyInfo(int tier)
{
if (tier <= 9)
imgLobbyTierNum.rectTransform.anchoredPosition = new Vector3(imgLobbyTier.rectTransform.anchoredPosition.x - 4, imgLobbyTier.rectTransform.anchoredPosition.y + 3, 0);
else if (tier <= 12)
imgLobbyTierNum.rectTransform.anchoredPosition = new Vector3(imgLobbyTier.rectTransform.anchoredPosition.x - 1, imgLobbyTier.rectTransform.anchoredPosition.y + 7, 0);
else if (tier <= 30)
imgLobbyTierNum.rectTransform.anchoredPosition = new Vector3(imgLobbyTier.rectTransform.anchoredPosition.x, imgLobbyTier.rectTransform.anchoredPosition.y + 2, 0);
else if (tier <= 48)
imgLobbyTierNum.rectTransform.anchoredPosition = new Vector3(imgLobbyTier.rectTransform.anchoredPosition.x, imgLobbyTier.rectTransform.anchoredPosition.y, 0);
else if (tier <= 51)
imgLobbyTierNum.rectTransform.anchoredPosition = new Vector3(imgLobbyTier.rectTransform.anchoredPosition.x, imgLobbyTier.rectTransform.anchoredPosition.y + 2, 0);
else if (tier <= 57)
imgLobbyTierNum.rectTransform.anchoredPosition = new Vector3(imgLobbyTier.rectTransform.anchoredPosition.x, imgLobbyTier.rectTransform.anchoredPosition.y - 5, 0);
}
private IEnumerator CoBattleJoin()
{
// 리소스 로딩 대기.
while (iCosTopLoad > 0 || !handleVs.IsValid())
yield return YieldInstructionCache.WaitForSeconds(0.1f);
BattleMgr.SContetnUnlockCloseAll();
// 데이터 계산. 생명력 보정.
dPvpSpec specmy = dPvpSpec.GetMyBestSpec(DataHandler.playPvp.usePreset, DataHandler.playPvp.usePetPreset, DataHandler.playPvp.useExtraPreset);
specEnemy.CalcSkillCool();
//BigInteger bihpcalc = ((specmy.charAtk + specEnemy.charAtk) / 2L) * 20L / ((specmy.charHp + specEnemy.charHp) / 2L);
//specmy.charHp *= bihpcalc;
//specEnemy.charHp *= bihpcalc;
//BattleMgr 전투 중지, 데이터 세팅.
BattleMgr.SPreparePvp(specmy, specEnemy);
yield return null;
// 코스튬 세팅.
if (bInitNeedBattleCos)
{
charJoinMy.SetCostume(tx2dClothFriendly);
charJoinEnemy.SetCostume(tx2dClothEnemy);
}
yield return null;
charJoinMy.SetCostume(tx2dClothFriendly);
charJoinEnemy.SetCostume(tx2dClothEnemy);
// 전투 코스튬.
BattleMgr.SSetEnemyCostume(specEnemy.weaponView, specEnemy.costumeView, specEnemy.colorHair, specEnemy.colorTop, specEnemy.colorEye);
rtrfJoinMy.DOLocalMoveX(700f, 0.25f).SetRelative().SetEase(Ease.InQuad);
rtrfJoinEnemy.DOLocalMoveX(-700f, 0.25f).SetRelative().SetEase(Ease.InQuad);
yield return null;
// UI.
canvasUI.enabled = false;
GameUIMgr.SCloseUpPanel();
GameUIMgr.SSetMainUiOn(true);
BattleMgr.SSetBattleUiOn(true);
BattleMgr.SSetClearFailUiOn(false);
BattleMgr.SSetCameraOn(true);
GameUIMgr.SSetMainUiGroupRight(false, true, true, false);
GameUIMgr.SSetMainUiGroupLeft(false, false, false);
// VS 연출.
skAnimJoin.skeletonDataAsset = handleVs.Result;
skAnimJoin.Initialize(true);
skAnimJoin.UnscaledTime = true;
skAnimJoin.AnimationState.SetAnimation(0, "start", false);
skAnimJoin.transform.localScale = Vector3.one;
yield return YieldInstructionCache.WaitForSeconds(1.8f);
//전투 시작.
goCanvasJoin.SetActive(false);
yield return YieldInstructionCache.WaitForSeconds(0.7f);
BattleMgr.SStartPvp();
CoverCamera.Release();
// 입장시에 표시한 상대 코스튬 리소스 해제.
tx2dClothEnemy = null;
AddressableMgr.ReleaseClothSpine(specEnemy.costumeView);
AddressableMgr.ReleaseWeaponSpine(specEnemy.weaponView);
}
// 내 의상 리소스 로드.
private void ALoadClothFriendly(Texture2D obj)
{
tx2dClothFriendly = obj;
iCosTopLoad--;
}
// 내 무기 리소스 로드.
private void ALoadWeaponFriendly(Skin obj)
{
charJoinMy.SetWeapon(obj);
iCosTopLoad--;
}
// 적 의상 리소스 로드.
private void ALoadClothEnemy(Texture2D obj)
{
tx2dClothEnemy = obj;
iCosTopLoad--;
}
// 적 무기 리소스 로드.
private void ALoadWeaponEnemy(Skin obj)
{
charJoinEnemy.SetWeapon(obj);
iCosTopLoad--;
}
// VS 연출 로드.
private void ALoadVsComp(AsyncOperationHandle<SkeletonDataAsset> obj)
{
MeshRenderer renderer = skAnimJoin.GetComponent<MeshRenderer>();
renderer.sortingLayerID = canvasUI.sortingLayerID;
renderer.sortingOrder = 106;
handleVs = obj;
CoverCamera.Release();
}
#endregion Join
#region Result
// 결투장 나가기 버튼.
public void ExitPvp()
{
GameUIMgr.SOpenPopup2Button(LocalizationText.GetText("msg_exitnoreward"), AExitPvp, igroup: cGoods.TPvpTicket);
SoundMgr.PlaySfx(SoundName.BtnPress);
}
// 결투장 도중 종료.
private void AExitPvp()
{
iLoading++;
CoverCamera.Hold();
tglAuto.SetIsOnWithoutNotify(false);
canvasUI.enabled = true;
goCanvasResult.SetActive(false);
GameUIMgr.SSetPvpTicket(DataHandler.playPvp.ticket);
GameUIMgr.SOpenUpPanel(pvp: true);
GameUIMgr.SSetMainUiOn(false);
GameUIMgr.SCloseMenu();
BattleMgr.SSetBattleUiOn(false);
BattleMgr.SSetClearFailUiOn(false);
BattleMgr.SSetCameraOn(false);
GameUIMgr.SSetMainUiGroupRight(true, true, false, true);
GameUIMgr.SSetMainUiGroupLeft(true, true, true);
GameUIMgr.SReturnToPreservePreset();
BattleMgr.SExitPvp();
//dust.SetActive(true);
imgResultWin.gameObject.SetActive(false);
imgResultLose.gameObject.SetActive(false);
CoverCamera.Release();
iLoading--;
}
public static void SResultPvp(int iresult, int imyhprate, int ienemyhprate, BigInteger bimydmg, BigInteger bienemydmg)
{
curMgr.ResultPvp(iresult, imyhprate, ienemyhprate, bimydmg, bienemydmg);
}
// 결투장 결과 처리. iresult 1: 승리, 2: 패배.
private void ResultPvp(int iresult, int imyhprate, int ienemyhprate, BigInteger bimydmg, BigInteger bienemydmg)
{
iLoading++;
CoverCamera.Hold();
nPvpBattleRequest data = new nPvpBattleRequest();
data.vsUserId = iEnemyUserId;
data.battleResult = iresult;
data.damageRatio = 100 - ienemyhprate;
data.vsDamageRatio = 100 - imyhprate;
data.battleDmg = bimydmg;
data.vsBattleDmg = bienemydmg;
SvConnectManager.Instance.RequestSvPost(true, 0, UrlApi.GetUrl(UrlApi.PvpResult), typeof(nPvpBattleReturn), AResultSucc, AResultFail, data, false);
}
// 통신 실패 - 결과.
private void AResultFail(SvError error, object request)
{
canvasUI.enabled = true;
CoverCamera.Release();
iLoading--;
}
// 통신 성공 - 결과.
private void AResultSucc(object result, object request)
{
nPvpBattleReturn data = result as nPvpBattleReturn;
if (data == null || data.playPvp == null || data.rankPvp == null)
{
AResultFail(new SvError(eErrorCode.NULL_OR_EMPTY), request);
return;
}
nPvpBattleRequest reqdata = request as nPvpBattleRequest;
tglAuto.SetIsOnWithoutNotify(tglBattleAuto.isOn);
if (data.playPvp.ticket <= 0)
tglAuto.SetIsOnWithoutNotify(false);
// 결과 UI 표시.
goCanvasResult.SetActive(true);
if (data.rankPvp.tier != DataHandler.pvpMyRank.tier)
{
skAnimResultRankUp.gameObject.SetActive(true);
if (!handleRankUp.IsValid())
Addressables.LoadAssetAsync<SkeletonDataAsset>("spine/RankUp_top/RankUp_top_SkeletonData.asset").Completed += ALoadRankUpComp;
goResultRankUp.SetActive(true);
imgResultTier.sprite = SGetTierImg(data.rankPvp.tier);
imgResultTierNum.sprite = SGetTierNumImg(data.rankPvp.tier);
setTierResultNum(data.rankPvp.tier);
txtResultTier.text = LocalizationText.GetText(FormatString.CombineAllString("tier", data.rankPvp.tier.ToString()));
}
else
{
skAnimResultRankUp.gameObject.SetActive(false);
goResultRankUp.SetActive(false);
imgResultTier.sprite = imgLobbyTier.sprite;
imgResultTierNum.sprite = imgLobbyTierNum.sprite;
setTierResultNum(data.rankPvp.tier);
txtResultTier.text = txtTier.text;
}
if (!handleWinLose.IsValid())
Addressables.LoadAssetAsync<SkeletonDataAsset>("spine/win_lose/win_lose_SkeletonData.asset").Completed += ALoadWinLoseComp;
// 승리.
if (reqdata.battleResult == 1)
{
imgResultTop.color = new Color(241f / 255f, 174f / 255f, 42f / 255f, 1f);
txtResultAdd.text = DataHandler.sysPvp.pointClear.ToString();
imgResultWin.gameObject.SetActive(true);
imgResultLose.gameObject.SetActive(false);
}
// 패배.
else
{
imgResultTop.color = new Color(147f / 255f, 147f / 255f, 147f / 255f, 1f);
txtResultAdd.text = DataHandler.sysPvp.pointFail.ToString();
imgResultWin.gameObject.SetActive(false);
imgResultLose.gameObject.SetActive(true);
}
imgResultBottom.color = imgResultTop.color;
txtResultPoint.text = FormatString.TextInt(data.playPvp.point);
iEnemyUserId = -1;
specEnemy = null;
DataHandler.UpdatePvpPlay(data.playPvp);
DataHandler.UpdatePvpMyRank(data.rankPvp);
SetMyInfo();
//dust.SetActive(true);
StartCoroutine(CoOpenResult(reqdata.battleResult == 1));
}
private IEnumerator CoOpenResult(bool bwin)
{
while (!handleWinLose.IsValid())
yield return YieldInstructionCache.WaitForSeconds(0.1f);
if (bwin)
{
skAnimResult.AnimationState.SetAnimation(0, "win_start", false);
skAnimResult.transform.localScale = Vector3.one;
yield return YieldInstructionCache.WaitForSeconds(0.765f);
skAnimResult.AnimationState.SetAnimation(0, "win_loop", true);
yield return null;
}
else
{
skAnimResult.AnimationState.SetAnimation(0, "lose_start", false);
skAnimResult.transform.localScale = Vector3.one;
yield return YieldInstructionCache.WaitForSeconds(0.3f);
}
// 남은 티켓 수 확인하여 n초 후 다시 매칭. 대기 시간 도중에 결과 팝업 끌 수 없음.
if (tglAuto.isOn)
{
yield return YieldInstructionCache.WaitForSeconds(1.5f);
goCanvasResult.SetActive(false);
JoinPvpStart();
}
CoverCamera.Release();
iLoading--;
}
public void CloseResult()
{
if (iLoading > 0)
return;
AExitPvp();
}
// WinLose 연출 로드.
private void ALoadWinLoseComp(AsyncOperationHandle<SkeletonDataAsset> obj)
{
MeshRenderer renderer = skAnimResult.GetComponent<MeshRenderer>();
renderer.sortingLayerID = canvasUI.sortingLayerID;
renderer.sortingOrder = 106;
skAnimResult.skeletonDataAsset = obj.Result;
skAnimResult.Initialize(true);
skAnimResult.UnscaledTime = true;
handleWinLose = obj;
CoverCamera.Release();
}
// RankUp 연출 로드.
private void ALoadRankUpComp(AsyncOperationHandle<SkeletonDataAsset> obj)
{
MeshRenderer renderer = skAnimResultRankUp.GetComponent<MeshRenderer>();
renderer.sortingLayerID = canvasUI.sortingLayerID;
renderer.sortingOrder = 106;
skAnimResultRankUp.skeletonDataAsset = obj.Result;
skAnimResultRankUp.Initialize(true);
skAnimResultRankUp.UnscaledTime = true;
skAnimResultRankUp.AnimationState.SetAnimation(0, "animation", false);
skAnimResultRankUp.transform.localScale = Vector3.one;
handleRankUp = obj;
CoverCamera.Release();
}
#endregion Result
}