using System.Collections.Generic; using UnityEngine; using PlayFab; using PlayFab.ClientModels; using UnityEngine.Networking; using UnityEngine.Networking.NetworkSystem; public class ArenaManager : MonoBehaviour { // ╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ // Local Defines // ╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ enum ArenaState { None = -1, Connecting, Confirming, Loading, Prepping, Prepped, Playing, Finished, AIFinishing, Total } // ╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ // Variables // ╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ static ArenaManager m_This; ArenaState m_ArenaState = ArenaState.None; bool m_ArenaTesting = false; string m_Host; int m_Port; string m_Auth; NetworkClient m_NetworkClient; int m_BattleGroup = -1; int m_BattleTier = -1; int m_BattleId = -1; // variables excluded to consolidate // ╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ // Accessors // ╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ // accessors excluded to consolidate // ╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ // Initalization // ╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ // game specific initialization excluded to consolidate // ╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ // Internal // ╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ void ConnectClient( string host, int port, string auth ) { m_NetworkClient = new NetworkClient(); m_Host = host; m_Port = port; m_Auth = auth; m_BattleId = -1; m_OpponentAlias = string.Empty; m_OpponentPlayFabId = string.Empty; m_OpponentHonor = 0; m_OpponentLevel = 0; if( m_ArenaAI != null ) { m_ArenaAI.Destroy(); m_ArenaAI = null; } ResetProgress(); m_NetworkClient.RegisterHandler( ServerMsgType.Connect, OnConnected ); m_NetworkClient.RegisterHandler( ServerMsgType.MatchFound, OnMatchFound ); m_NetworkClient.RegisterHandler( ServerMsgType.MatchReady, OnMatchReady ); m_NetworkClient.RegisterHandler( ServerMsgType.PrepStatus, OnPrepStatus ); m_NetworkClient.RegisterHandler( ServerMsgType.PlayerLoadout, OnPlayerLoadout ); m_NetworkClient.RegisterHandler( ServerMsgType.StartBattle, OnStartBattle ); m_NetworkClient.RegisterHandler( ServerMsgType.OpponentStatus, OnOpponentStatus ); m_NetworkClient.RegisterHandler( ServerMsgType.OpponentEvent, OnOpponentEvent ); m_NetworkClient.RegisterHandler( ServerMsgType.BattleRefresh, OnBattleRefresh ); m_NetworkClient.RegisterHandler( ServerMsgType.EndBattle, OnEndBattle ); m_NetworkClient.RegisterHandler( ServerMsgType.OpponentLeft, OnOpponentLeft ); m_NetworkClient.RegisterHandler( ServerMsgType.OpponentWantsRematch, OnOpponentWantsRematch ); m_NetworkClient.RegisterHandler( ServerMsgType.Disconnect, OnDisconnected ); m_NetworkClient.RegisterHandler( ServerMsgType.Error, OnError ); m_NetworkClient.RegisterHandler( ServerMsgType.Taunt, OnTaunt ); m_NetworkClient.Connect( m_Host, m_Port ); } // various internal calls excluded to consolidate // ╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ // Networking // ╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ void OnConnected( NetworkMessage netMsg ) { // IMPORTANT - THIS IS NEVER CALLED - THE PLAYER NEVER GETS CONNECTED - IT APPEARS TO TIME OUT AFTER THE 10 SECONDS WHICH LEADS TO OnDisconnect if( m_ArenaState != ArenaState.Connecting ) return; if( m_NetworkClient == null || m_NetworkClient.connection.connectionId != netMsg.conn.connectionId ) return; m_NetworkClient.Send( ServerMsgType.Authenticate, new AuthenticateMessage() { PlayFabId = AccountManager.PlayFabID, Alias = AccountManager.Alias, IsLocal = false, AuthTicket = m_Auth, BattleGroup = m_BattleGroup, BattleTier = m_BattleTier } ); } // various other network calls excluded to consolidate // ╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ // Arena AI // ╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ // various functions called by AI excluded to consolidate // ╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ // Interface // ╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ static public void StartConnection( int battleGroup, int battleTier ) { if( m_This != null ) m_This._startConnection( battleGroup, battleTier ); } void _startConnection( int battleGroup, int battleTier ) { if( m_ArenaState != ArenaState.None ) return; m_BattleGroup = battleGroup; m_BattleTier = battleTier; m_ArenaTesting = false; m_ArenaState = ArenaState.Connecting; PlayFabClientAPI.Matchmake( new MatchmakeRequest() { BuildVersion = AccountManager.ServerBuildVersion, Region = Region.USEast, GameMode = AccountManager.ServerGameMode }, ( result ) => { if( m_ArenaState == ArenaState.Connecting ) { ConnectClient( result.ServerIPV4Address, result.ServerPort ?? 7777, result.Ticket ); } }, ( error ) => { if( m_ArenaState == ArenaState.Connecting ) { if( !PopUp_ArenaBattle.DelayToAIBattle() ) { Global_Messages.Log( LocalizationManager.LocalizedString( LocalizationManager.Table.Global, 81 ) ); m_ArenaTesting = false; m_ArenaState = ArenaState.None; Events.ResetMatching(); } } } ); } // various other calls made by player excluded to consolidate }