using Client; using Common; using TMPro; using Unity.Entities; using Unity.NetCode; using Unity.Networking.Transport; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; namespace UI { public class ClientConnectionManager : MonoBehaviour { [SerializeField] private TMP_InputField _addressField; [SerializeField] private TMP_InputField _portField; [SerializeField] private TMP_Dropdown _connectionModeDropdown; [SerializeField] private Button _connectButton; [SerializeField] private ColorPicker _colorPicker; private ushort Port => ushort.Parse(_portField.text); private string Address => _addressField.text; private void OnEnable() { _addressField.text = "127.0.0.1"; _portField.text = "7979"; _connectionModeDropdown.onValueChanged.AddListener(OnConnectionModeChanged); _connectButton.onClick.AddListener(OnButtonConnect); OnConnectionModeChanged(_connectionModeDropdown.value); } private void OnDisable() { _connectionModeDropdown.onValueChanged.RemoveAllListeners(); _connectButton.onClick.RemoveAllListeners(); } private void OnConnectionModeChanged(int connectionMode) { string buttonLabel; _connectButton.enabled = true; switch (connectionMode) { case 0: buttonLabel = "Start Host"; break; case 1 : buttonLabel = "Start Server"; break; case 2: buttonLabel = "Start Client"; break; default: buttonLabel = ""; _connectButton.enabled = false; break; } var buttonText = _connectButton.GetComponentInChildren(); buttonText.text = buttonLabel; } private void OnButtonConnect() { DestroyLocalSimulationWorld(); SceneManager.LoadScene(1); switch (_connectionModeDropdown.value) { case 0: StartServer(); StartClient(); break; case 1: StartServer(); break; case 2: StartClient(); break; default: Debug.LogError("Error: Unknown connection mode", gameObject); break; } } private static void DestroyLocalSimulationWorld() { //Destroy default world, we will create a new one foreach (var world in World.All) { if (world.Flags == WorldFlags.Game) { world.Dispose(); break; } } } private void StartServer() { //Create server world var serverWorld = ClientServerBootstrap.CreateServerWorld("TD Server World"); //Define endpoint for world to listen to, and set network driver to listen to specified port var serverEndPoint = NetworkEndpoint.AnyIpv4.WithPort(Port); { using var networkDriverQuery = serverWorld.EntityManager.CreateEntityQuery(ComponentType.ReadWrite()); networkDriverQuery.GetSingletonRW().ValueRW.Listen(serverEndPoint); } } private void StartClient() { //Create server world var clientWorld = ClientServerBootstrap.CreateClientWorld("TD Client World"); //Set IP adress and port for server to host on var connectionEndpoint = NetworkEndpoint.Parse(Address, Port); { using var networkDriverQuery = clientWorld.EntityManager.CreateEntityQuery(ComponentType.ReadWrite()); networkDriverQuery.GetSingletonRW().ValueRW.Connect(clientWorld.EntityManager, connectionEndpoint); } World.DefaultGameObjectInjectionWorld = clientWorld; //create entity with join request component, so that the ClientRequestGameEntrySystem can take over var teamRequestEntity = clientWorld.EntityManager.CreateEntity(); var color = _colorPicker.Color; clientWorld.EntityManager.AddComponentData(teamRequestEntity, new ClientTeamRequest { Value = TeamType.Player, Color = color, }); } } }