using UnityEngine;
using UnityEngine.UI;
using Unity.Netcode;
using UnityEngine.InputSystem;
using System.Collections.Generic;
using Unity.VisualScripting;
using TMPro;
using Unity.VisualScripting.Antlr3.Runtime;
public class UiManager : NetworkBehaviour {
public string Class = "";
// In-game UI
[SerializeField] Canvas inGameUI;
[SerializeField] Slider manaSlider;
[SerializeField] Slider healthSlider;
[SerializeField] Slider ammoSlider;
// Starting UI & classes
[SerializeField] Canvas StartingUI;
[SerializeField] Button LancerOption;
[SerializeField] Button MageOption;
[SerializeField] GameObject LeaveSessionStuff;
[SerializeField] GameObject ShowLobbyCodeButton;
[SerializeField] Canvas MultiplayerCanvas;
[SerializeField] GameObject MultiplayerWidgetCanvas;
[SerializeField] TMP_Text ClassTextBox;
[SerializeField] TMP_Text ActualClassTextBox;
// player scripts
public PlayerStatHandler PlayerStatHandler;
public PlayerSpells PlayerSpells;
public PlayerMovement PlayerMovement;
public BulletScript BulletScript;
public List<GameObject> RandomPartsOfTheMultiplayerUi = new List<GameObject>();
public List<GameObject> ChildrenOfManaSlider = new List<GameObject>();
public List<GameObject> ChildrenOfAmmoSlider = new List<GameObject>();
// Teleport points
[SerializeField] GameObject TestMapTeleportPoint;
[SerializeField] GameObject TutorialMapTeleportPoint;
[SerializeField] GameObject SpawnBoxTeleportPoint;
// for PlayerMovement.cs
public float classMovespeedMultiplier;
private float lancerClassMovespeedMultiplier = 1.25f;
private float mageClassMovespeedMultiplier = 1f;
private ulong clientId;
private bool hasConnected = false;
private float mouseLockTimer = 0f;
private float mouseLockCooldownTimer = 0.2f;
// inputs
private InputAction MouseMode;
void Start()
{
// disable the in-game UI until a class and lobby has been chosen
inGameUI.enabled = false;
manaSlider.enabled = false;
healthSlider.enabled = false;
ammoSlider.enabled = false;
LancerOption.enabled = false;
MageOption.enabled = false;
StartingUI.enabled = false;
MultiplayerCanvas.enabled = true;
LeaveSessionStuff.SetActive(false);
NetworkManager.Singleton.OnClientConnectedCallback += ClientConnected;
Debug.Log("Start Function - phase 0 - everything set to its proper value + network client grabbed");
}
private void ClientConnected(ulong id)
{
if (id == NetworkManager.Singleton.LocalClientId)
{
// disable the in-game UI until a class and lobby has been chosen
inGameUI.enabled = false;
manaSlider.enabled = false;
healthSlider.enabled = false;
ammoSlider.enabled = false;
if (IsServer)
{
LancerOption.enabled = false;
MageOption.enabled = false;
StartingUI.enabled = false;
}
else
{
LancerOption.enabled = true;
MageOption.enabled = true;
StartingUI.enabled = true;
}
Debug.Log("lancer option enabled? " + LancerOption.enabled);
LeaveSessionStuff.SetActive(false);
PlayerStatHandler = NetworkManager.Singleton.ConnectedClients[id].PlayerObject.GetComponent<PlayerStatHandler>();
PlayerSpells = NetworkManager.Singleton.ConnectedClients[id].PlayerObject.GetComponent<PlayerSpells>();
PlayerMovement = NetworkManager.Singleton.ConnectedClients[id].PlayerObject.GetComponent<PlayerMovement>();
BulletScript = NetworkManager.Singleton.ConnectedClients[id].PlayerObject.GetComponent<BulletScript>();
MouseMode = InputSystem.actions.FindAction("setMouseMode");
hasConnected = true;
clientId = id;
// set the players position to the starting box
// NetworkManager.Singleton.ConnectedClients[id].PlayerObject.transform.position = transform.position = new Vector3(30f, 6f, 2f);
MultiplayerSelection();
Debug.Log("ClientConnected function finished");
}
}
void FixedUpdate()
{
if (hasConnected == true && Class != "")
{
HealthStuffs();
if (Class == "Mage") { ManaStuffs(); }
// AmmoStuffs()
handleMouseMode();
}
}
// actual constant UI stuffs
void ManaStuffs()
{
manaSlider.value = PlayerSpells.playerMana / PlayerSpells.playerMaxMana;
}
void AmmoStuffs()
{
if (BulletScript.enabled == true)
{
ammoSlider.value = BulletScript.ammo / BulletScript.maxAmmo;
}
}
void HealthStuffs()
{
// adjust the health bar
healthSlider.value = PlayerStatHandler.PlayerHP / PlayerStatHandler.PlayerMaxHP;
}
// on button press (lancer button)
public void selectLancerClass()
{
Class = "Lancer";
PlayerMovement.classMovespeedMultiplier = lancerClassMovespeedMultiplier;
Debug.Log("Lancer Class picked");
startingClassPickHasBeenChosen();
}
// on button press (mage button)
public void selectMageClass()
{
Class = "Mage";
PlayerMovement.classMovespeedMultiplier = mageClassMovespeedMultiplier;
Debug.Log("Mage class has been picked");
startingClassPickHasBeenChosen();
}
public void MultiplayerSelection()
{
if (IsServer)
{
StartingUI.enabled = false;
inGameUI.enabled = false;
LancerOption.enabled = false;
MageOption.enabled = false;
foreach (GameObject obj in RandomPartsOfTheMultiplayerUi)
{
obj.SetActive(true);
}
LeaveSessionStuff.SetActive(false);
Debug.Log("MultiplayerSelection Function");
}
}
public void afterMultiplayerSelection()
{
Debug.Log("Activating stuff");
StartingUI.enabled = true;
LancerOption.enabled = true;
MageOption.enabled = true;
LeaveSessionStuff.SetActive(true);
ShowLobbyCodeButton.SetActive(true);
foreach (GameObject obj in RandomPartsOfTheMultiplayerUi)
{
obj.SetActive(false);
}
moveUserToBlackBox(clientId);
Debug.Log("AfterMultiplayerSelection function");
if (Class != "")
{
enableInGameUI();
}
}
void handleMouseMode()
{
if (mouseLockTimer <= mouseLockCooldownTimer) { mouseLockTimer += Time.deltaTime; }
if (MouseMode != null && MouseMode.IsPressed() && mouseLockTimer >= mouseLockCooldownTimer)
{
mouseLockTimer = 0f;
if (Cursor.lockState == CursorLockMode.None)
{
Cursor.lockState = CursorLockMode.Locked;
MultiplayerCanvas.enabled = false;
}
else
{
Cursor.lockState = CursorLockMode.None;
MultiplayerCanvas.enabled = true;
}
}
}
void startingClassPickHasBeenChosen()
{
Debug.Log("StartingClassPickHasBeenChosen");
disableStartingUI();
enableInGameUI();
}
void disableStartingUI()
{
// remove the buttons from the UI once the classes have been chosen
LancerOption.enabled = false;
MageOption.enabled = false;
StartingUI.enabled = false;
Debug.Log("Disabled UI");
// lock the cursor after selecting a menu option
moveUserToTestMap(clientId);
Cursor.lockState = CursorLockMode.Locked;
MultiplayerCanvas.enabled = false;
}
void moveUserToTestMap(ulong id)
{
NetworkManager.Singleton.ConnectedClients[id].PlayerObject.transform.position = TestMapTeleportPoint.transform.position;
}
void moveUserToBlackBox(ulong id)
{
NetworkManager.Singleton.ConnectedClients[id].PlayerObject.transform.position = SpawnBoxTeleportPoint.transform.position;
}
void enableInGameUI()
{
// enable the in-game UI since a class and lobby has been chosen
inGameUI.enabled = true;
healthSlider.enabled = true;
MultiplayerCanvas.enabled = false;
Debug.Log("In-game UI enabled");
disableInGameUIbasedOnClass();
}
void disableInGameUIbasedOnClass()
{
// if the player chose mage as their class then enable the mana bar for them
if (Class == "Mage")
{
// enable all the mage stuff
manaSlider.enabled = true;
foreach (GameObject obj in ChildrenOfManaSlider)
{
obj.SetActive(true);
Debug.Log("Child in ManaSlider enabled");
}
// disable ammo slider + all it's children
ammoSlider.enabled = false;
foreach (GameObject obj in ChildrenOfAmmoSlider)
{
obj.SetActive(false);
Debug.Log("Child in AmmoSlider disabled");
}
}
else if (Class == "Lancer")
{
// disable mana slider + all it's children
manaSlider.enabled = false;
foreach (GameObject obj in ChildrenOfManaSlider)
{
obj.SetActive(false);
Debug.Log("Child in ManaSlider disabled");
}
// disable ammo slider + all it's children
ammoSlider.enabled = false;
foreach (GameObject obj in ChildrenOfAmmoSlider)
{
obj.SetActive(false);
Debug.Log("Child in AmmoSlider disabled");
}
}
// Change the text on the text components.
ClassTextBox.text = "current class:";
ClassTextBox.color = new Color(ClassTextBox.color.r, ClassTextBox.color.g, ClassTextBox.color.b, 0.7f);
ActualClassTextBox.text = Class;
if (Class == "Lancer")
{
ActualClassTextBox.color = new Color(1f, 0.155f, 0.55f, 0.7f); // semi-transparent pink for lancer
}
else if (Class == "Mage")
{
ActualClassTextBox.color = new Color(0f, 0f, 1f, 0.7f); // semi-transparent blue for mage
}
}
}