2023-01-29 20:42:03 +00:00
|
|
|
|
using Comfort.Common;
|
|
|
|
|
using EFT;
|
|
|
|
|
using EFT.UI;
|
2023-01-17 19:34:30 +00:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
2023-01-29 20:42:03 +00:00
|
|
|
|
using UnityEngine;
|
2023-04-08 17:59:17 +01:00
|
|
|
|
using System.Reflection;
|
|
|
|
|
using CWX_DebuggingTool.Models;
|
2023-01-17 19:34:30 +00:00
|
|
|
|
|
|
|
|
|
namespace CWX_DebuggingTool
|
|
|
|
|
{
|
2024-01-12 14:08:58 +00:00
|
|
|
|
public sealed class BotmonClass : MonoBehaviour
|
2023-01-17 19:34:30 +00:00
|
|
|
|
{
|
2023-01-21 11:21:21 +00:00
|
|
|
|
private GUIContent _guiContent;
|
2023-01-17 19:34:30 +00:00
|
|
|
|
private GUIStyle _textStyle;
|
|
|
|
|
private Player _player;
|
|
|
|
|
private Dictionary<string, List<Player>> _zoneAndPlayers = new Dictionary<string, List<Player>>();
|
2023-04-08 17:59:17 +01:00
|
|
|
|
private Dictionary<string, BotRoleAndDiffClass> _playerRoleAndDiff = new Dictionary<string, BotRoleAndDiffClass>();
|
2023-01-21 11:21:21 +00:00
|
|
|
|
private List<BotZone> _zones;
|
|
|
|
|
private GameWorld _gameWorld;
|
2024-01-24 21:08:06 +00:00
|
|
|
|
private GameObject _mainCamera;
|
2023-01-17 21:08:50 +00:00
|
|
|
|
private IBotGame _botGame;
|
2023-01-17 21:46:54 +00:00
|
|
|
|
private Rect _rect;
|
2023-04-08 17:59:17 +01:00
|
|
|
|
private string _content = "";
|
2023-01-17 23:08:02 +00:00
|
|
|
|
private Vector2 _guiSize;
|
|
|
|
|
private float _distance;
|
2023-01-17 19:34:30 +00:00
|
|
|
|
|
|
|
|
|
private BotmonClass()
|
|
|
|
|
{
|
2023-01-21 11:21:21 +00:00
|
|
|
|
|
2023-01-17 19:34:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-01-12 14:08:58 +00:00
|
|
|
|
public BotMonitorMode Mode { get; set; }
|
2023-01-17 19:34:30 +00:00
|
|
|
|
|
|
|
|
|
~BotmonClass()
|
|
|
|
|
{
|
2024-01-12 14:08:58 +00:00
|
|
|
|
ConsoleScreen.Log("BotMonitor Disabled on game end");
|
2023-01-17 19:34:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Awake()
|
|
|
|
|
{
|
2023-01-21 11:21:21 +00:00
|
|
|
|
// Get GameWorld Instance
|
2023-01-17 19:34:30 +00:00
|
|
|
|
_gameWorld = Singleton<GameWorld>.Instance;
|
|
|
|
|
|
2023-01-21 11:21:21 +00:00
|
|
|
|
// Get BotGame Instance
|
2023-01-17 21:08:50 +00:00
|
|
|
|
_botGame = Singleton<IBotGame>.Instance;
|
|
|
|
|
|
2023-01-21 11:21:21 +00:00
|
|
|
|
// Get Player from GameWorld
|
|
|
|
|
_player = _gameWorld.MainPlayer;
|
2024-01-24 21:08:06 +00:00
|
|
|
|
|
|
|
|
|
// Get Player Camera
|
|
|
|
|
_mainCamera = GameObject.Find("FPS Camera");
|
2023-01-21 11:21:21 +00:00
|
|
|
|
|
|
|
|
|
// Make new rect to use for GUI
|
|
|
|
|
_rect = new Rect(0, 60, 0, 0);
|
|
|
|
|
|
|
|
|
|
// Get all BotZones
|
2023-01-17 19:34:30 +00:00
|
|
|
|
_zones = LocationScene.GetAllObjects<BotZone>().ToList();
|
|
|
|
|
|
2023-01-21 11:21:21 +00:00
|
|
|
|
// Set up the Dictionary
|
2023-01-17 21:08:50 +00:00
|
|
|
|
foreach (var botZone in _zones)
|
2023-01-17 19:34:30 +00:00
|
|
|
|
{
|
2023-01-17 21:08:50 +00:00
|
|
|
|
_zoneAndPlayers.Add(botZone.name, new List<Player>());
|
2023-01-17 19:34:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-01-21 11:21:21 +00:00
|
|
|
|
// Add existing Bots to list
|
2024-01-12 14:08:58 +00:00
|
|
|
|
if (_gameWorld.AllAlivePlayersList.Count > 1)
|
2023-01-17 19:34:30 +00:00
|
|
|
|
{
|
2023-08-08 19:34:27 +01:00
|
|
|
|
foreach (var player in _gameWorld.AllAlivePlayersList)
|
2023-01-17 19:34:30 +00:00
|
|
|
|
{
|
2023-04-08 17:59:17 +01:00
|
|
|
|
if (player.IsYourPlayer) continue;
|
2023-01-17 19:34:30 +00:00
|
|
|
|
|
2023-04-08 17:59:17 +01:00
|
|
|
|
_playerRoleAndDiff.Add(player.ProfileId, GetBotRoleAndDiffClass(player.Profile.Info));
|
|
|
|
|
|
|
|
|
|
var theirZone = player.AIData.BotOwner.BotsGroup.BotZone.NameZone;
|
|
|
|
|
|
|
|
|
|
_zoneAndPlayers[theirZone].Add(player);
|
2023-01-17 19:34:30 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2023-01-17 21:08:50 +00:00
|
|
|
|
|
2023-01-21 11:21:21 +00:00
|
|
|
|
// Sub to Event to get and add Bot when they spawn
|
2023-01-17 21:08:50 +00:00
|
|
|
|
_botGame.BotsController.BotSpawner.OnBotCreated += owner =>
|
|
|
|
|
{
|
2023-04-08 17:59:17 +01:00
|
|
|
|
var player = owner.GetPlayer;
|
2024-01-12 14:08:58 +00:00
|
|
|
|
_zoneAndPlayers[owner.BotsGroup.BotZone.NameZone].Add(player);
|
2023-04-08 17:59:17 +01:00
|
|
|
|
_playerRoleAndDiff.Add(player.ProfileId, GetBotRoleAndDiffClass(player.Profile.Info));
|
2023-01-17 21:08:50 +00:00
|
|
|
|
};
|
2024-01-12 14:08:58 +00:00
|
|
|
|
|
2024-01-12 14:33:05 +00:00
|
|
|
|
// Sub to event to get and remove Bot when they despawn
|
2024-01-12 14:08:58 +00:00
|
|
|
|
_botGame.BotsController.BotSpawner.OnBotRemoved += owner =>
|
|
|
|
|
{
|
|
|
|
|
var player = owner.GetPlayer;
|
|
|
|
|
_zoneAndPlayers[owner.BotsGroup.BotZone.NameZone].Remove(player);
|
|
|
|
|
_playerRoleAndDiff.Remove(player.ProfileId);
|
|
|
|
|
};
|
2023-01-17 19:34:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-04-08 17:59:17 +01:00
|
|
|
|
public BotRoleAndDiffClass GetBotRoleAndDiffClass(InfoClass info)
|
|
|
|
|
{
|
2024-01-12 14:08:58 +00:00
|
|
|
|
var settings = info.GetType().GetField("Settings", BindingFlags.Public | BindingFlags.Instance).GetValue(info);
|
2023-04-08 17:59:17 +01:00
|
|
|
|
|
2024-01-12 14:08:58 +00:00
|
|
|
|
var role = settings.GetType().GetField("Role", BindingFlags.Instance | BindingFlags.Public).GetValue(settings).ToString();
|
|
|
|
|
var diff = settings.GetType().GetField("BotDifficulty", BindingFlags.Instance | BindingFlags.Public).GetValue(settings).ToString();
|
2023-04-08 17:59:17 +01:00
|
|
|
|
|
|
|
|
|
return new BotRoleAndDiffClass(string.IsNullOrEmpty(role) ? "" : role, string.IsNullOrEmpty(diff) ? "" : diff);
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-24 20:15:25 +00:00
|
|
|
|
public float GetRotationToPlayer(Player player, Player bot)
|
|
|
|
|
{
|
|
|
|
|
var directionToTarget = player.CameraPosition.position - bot.Transform.position;
|
|
|
|
|
directionToTarget.y = 0;
|
|
|
|
|
var targetRotation = Quaternion.LookRotation(directionToTarget, Vector3.up);
|
|
|
|
|
var degreeOfRot = Quaternion.Angle(player.CameraPosition.rotation, targetRotation);
|
|
|
|
|
return degreeOfRot;
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-17 19:34:30 +00:00
|
|
|
|
public void OnGUI()
|
|
|
|
|
{
|
|
|
|
|
// set basics on GUI
|
|
|
|
|
if (_textStyle == null)
|
|
|
|
|
{
|
|
|
|
|
_textStyle = new GUIStyle(GUI.skin.box);
|
|
|
|
|
_textStyle.alignment = TextAnchor.MiddleLeft;
|
2024-01-24 20:15:25 +00:00
|
|
|
|
_textStyle.fontSize = 14;
|
2023-01-17 19:34:30 +00:00
|
|
|
|
_textStyle.margin = new RectOffset(3, 3, 3, 3);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// new GUI Content
|
|
|
|
|
if (_guiContent == null)
|
|
|
|
|
{
|
|
|
|
|
_guiContent = new GUIContent();
|
2024-01-12 14:33:05 +00:00
|
|
|
|
}
|
2024-01-24 20:15:25 +00:00
|
|
|
|
_content = string.Empty;
|
2024-01-12 14:33:05 +00:00
|
|
|
|
|
|
|
|
|
if (Mode >= BotMonitorMode.DelayedSpawn)
|
|
|
|
|
{
|
|
|
|
|
_content += $"Alive & Loading = {_botGame.BotsController.BotSpawner.AliveAndLoadingBotsCount}\n";
|
|
|
|
|
_content += $"Delayed Bots = {_botGame.BotsController.BotSpawner.BotsDelayed}\n";
|
|
|
|
|
_content += $"All Bots With Delayed = {_botGame.BotsController.BotSpawner.AllBotsWithDelayed}\n";
|
2023-01-17 19:34:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-01-12 14:08:58 +00:00
|
|
|
|
// If Mode Greater than or equal to Total show total
|
|
|
|
|
if (Mode >= BotMonitorMode.Total)
|
2023-01-17 19:34:30 +00:00
|
|
|
|
{
|
2023-10-09 22:38:59 +01:00
|
|
|
|
_content += $"Total = {_gameWorld.AllAlivePlayersList.Count - 1}\n";
|
2023-01-21 11:21:21 +00:00
|
|
|
|
}
|
2023-01-17 19:34:30 +00:00
|
|
|
|
|
2024-01-12 14:08:58 +00:00
|
|
|
|
// If Mode Greater than or equal to PerZoneTotal show total for each zone
|
|
|
|
|
if (Mode >= BotMonitorMode.PerZoneTotal && _zoneAndPlayers != null)
|
2023-01-21 11:21:21 +00:00
|
|
|
|
{
|
2023-04-08 17:59:17 +01:00
|
|
|
|
foreach (var zone in _zoneAndPlayers)
|
2023-01-17 19:34:30 +00:00
|
|
|
|
{
|
2024-01-12 14:08:58 +00:00
|
|
|
|
if (_zoneAndPlayers[zone.Key].FindAll(x => x.HealthController.IsAlive).Count <= 0) continue;
|
2023-04-08 17:59:17 +01:00
|
|
|
|
|
2024-01-12 14:08:58 +00:00
|
|
|
|
_content += $"{zone.Key} = {_zoneAndPlayers[zone.Key].FindAll(x => x.HealthController.IsAlive).Count}\n";
|
2023-04-08 17:59:17 +01:00
|
|
|
|
|
2024-01-12 14:08:58 +00:00
|
|
|
|
// If Mode Greater than or equal to FullList show Bots individually also
|
|
|
|
|
if (Mode < BotMonitorMode.FullList) continue;
|
2023-04-08 17:59:17 +01:00
|
|
|
|
|
2024-01-12 14:08:58 +00:00
|
|
|
|
foreach (var player in _zoneAndPlayers[zone.Key].Where(player => player.HealthController.IsAlive))
|
2023-01-17 19:34:30 +00:00
|
|
|
|
{
|
2024-01-24 20:15:25 +00:00
|
|
|
|
// if (Mode == BotMonitorMode.Directions)
|
|
|
|
|
// {
|
|
|
|
|
// // get bot direction from player
|
|
|
|
|
// _content += $"[{GetRotationToPlayer(_player, player)}]";
|
|
|
|
|
// }
|
|
|
|
|
|
2024-01-24 21:08:06 +00:00
|
|
|
|
_distance = Vector3.Distance(player.Transform.position, _player.CameraPosition.position);
|
2023-04-08 17:59:17 +01:00
|
|
|
|
_content += $"> [{_distance:n2}m] [{_playerRoleAndDiff.First(x => x.Key == player.ProfileId).Value.Role}] " +
|
|
|
|
|
$"[{player.Profile.Side}] [{_playerRoleAndDiff.First(x => x.Key == player.ProfileId).Value.Difficulty}] {player.Profile.Nickname}\n";
|
2023-01-17 19:34:30 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-01-12 14:08:58 +00:00
|
|
|
|
|
2023-01-17 23:08:02 +00:00
|
|
|
|
_guiContent.text = _content;
|
2023-01-17 19:34:30 +00:00
|
|
|
|
|
2023-01-17 23:08:02 +00:00
|
|
|
|
_guiSize = _textStyle.CalcSize(_guiContent);
|
2023-01-17 19:34:30 +00:00
|
|
|
|
|
2023-01-17 23:08:02 +00:00
|
|
|
|
_rect.x = Screen.width - _guiSize.x - 5f;
|
|
|
|
|
_rect.width = _guiSize.x;
|
|
|
|
|
_rect.height = _guiSize.y;
|
2023-01-17 21:46:54 +00:00
|
|
|
|
|
|
|
|
|
GUI.Box(_rect, _guiContent, _textStyle);
|
2023-01-17 19:34:30 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|