MRHals Gospodin Ответов: 3

Nullreference drawingplayers с C# для ESP


Привет, с Новым годом всех :) а теперь к проблеме может ли кто-нибудь сказать мне сначала, что означает nullreference, но легкий путь.
Во-вторых, почему это nullreference проблема meaking меня когда я в игру и экран начинает блинки черный, мой лосс ЭСП цвет и т. д..

КОД ОТ ESP:

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.IO;
using UnityEngine;
using EFT;
using EFT.Interactive;

namespace Absolutly
{
    public class Abso : MonoBehaviour
    {

        public Abso() { }
        #region variable
        private GameObject GameObjectHolder;

        private IEnumerable<Player> _playerInfo;
        private IEnumerable<ExfiltrationPoint> _extractPoints;
        private IEnumerable<LootItem> _item;

        private float _playNextUpdateTime;
        private float _evaNextUpdateTime;
        protected float _infoUpdateInterval = 15f;


        private bool _isInfoMenuActive = true;
        private bool _showItems;
        private bool _pInfor;
        private bool _showExtractInfo;

        private float _viewdistance = 300f;
        private float _lootItemDistance = 50f;
        private float _espUpdateInterval = 50f;
        private float _itemsNextUpdateTime;
        private Player _localPlayer;
        private Vector3 camPos;
        #endregion

        #region import

        [DllImport("user32.dll")]
        static extern bool GetCursorPos(out POINT lpPoint);

        [DllImport("user32.dll")]
        static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);

        private const int MOUSEEVENTF_MOVE = 0x0001;
        public static void Move(int xDelta, int yDelta)
        {
            mouse_event(MOUSEEVENTF_MOVE, xDelta, yDelta, 0, 0);
        }
        public struct POINT
        {
            public int X;
            public int Y;
        }
        #endregion

        private void Awake()
        {
            Debug.logger.logEnabled = false;
        }

        private void Start()
        {
            Clear();
        }
        private void Clear()
        {
            _playerInfo = null;
            _extractPoints = null;
            _item = null;
            _itemsNextUpdateTime = 0;
            _localPlayer = null;
        }

        public void Load()
        {
            GameObjectHolder = new GameObject();
            GameObjectHolder.AddComponent<Abso>();
            DontDestroyOnLoad(GameObjectHolder);
        }


        public void Unload()
        {
            Clear();
            Destroy(GameObjectHolder);
            Destroy(GameObjectHolder.GetComponent<Abso>());
            Destroy(this);
            DestroyObject(this);
        }

        private void OnDisable()
        {
            Clear();
        }
        private void OnDestroy()
        {
            Clear();
        }


        private void Update()
        {
            if (Input.GetKeyDown(KeyCode.F1))
            {
                Unload();
            }
            if (Input.GetKeyDown(KeyCode.F11))
            {
                _isInfoMenuActive = !_isInfoMenuActive;
            }

        }

        private void OnGUI()
        {
            if (_isInfoMenuActive)
            {
                GUIOverlay();
            }
            if ((_pInfor && Time.time >= _playNextUpdateTime) || ( Time.time >= _playNextUpdateTime))
            {
                _playerInfo = FindObjectsOfType<Player>();
                _playNextUpdateTime = Time.time + _infoUpdateInterval;
            }
            if (_pInfor)
            {
                DrawPlayers();
            }
            if (_showExtractInfo && Time.time >= _evaNextUpdateTime)
            {
                _extractPoints = FindObjectsOfType<ExfiltrationPoint>();
                _evaNextUpdateTime = Time.time + _infoUpdateInterval;
            }

            if (_showExtractInfo)
            {
                DrawExtractInfo();
            }
            if (_showItems)
            {
                if (Time.time >= _itemsNextUpdateTime)
                {
                    _item = FindObjectsOfType<LootItem>();
                    _itemsNextUpdateTime = Time.time + _espUpdateInterval;
                }
                ShowItemESP();
            }
        }
        private void GetLocalPlayer()
        {
            foreach (Player player in FindObjectsOfType<Player>())
            {
                if (player == null) continue;

                if (EPointOfView.FirstPerson == player.PointOfView && player != null)
                {
                    _localPlayer = player;
                }
            }
        }


        private void DrawExtractInfo()
        {
            try
            {
                foreach (var point in _extractPoints)
                {
                    float distanceToObject = Vector3.Distance(Camera.main.transform.position, point.transform.position);
                    var exfilContainerBoundingVector = new Vector3(
                        Camera.main.WorldToScreenPoint(point.transform.position).x,
                        Camera.main.WorldToScreenPoint(point.transform.position).y,
                        Camera.main.WorldToScreenPoint(point.transform.position).z);

                    if (exfilContainerBoundingVector.z > 0.01)
                    {
                        Color guiBackup = GUI.color;
                        GUI.color = Color.green;
                        int distance = (int)distanceToObject;
                        String exfilName = point.name;
                        string boxText = $"{exfilName} - {distance} M";

                        GUI.Label(new Rect(exfilContainerBoundingVector.x - 50f, (float)Screen.height - exfilContainerBoundingVector.y, 100f, 50f), boxText);
                        GUI.color = guiBackup;
                    }
                }
            }
            catch (NullReferenceException ex)
            {
                File.AppendAllText
                (
                   @"C:\EFT\EXITS.txt",
                   $"{ex.Message}\r\n{ex.StackTrace}\r\n"
                );
            }
        }

        private void ShowItemESP()
        {
            foreach (var Item in _item)
            {
                if (Item == null)
                    continue;

                float distance = Vector3.Distance(Camera.main.transform.position, Item.transform.position);
                Vector3 ItemBoundingVector = new Vector3(Camera.main.WorldToScreenPoint(Item.transform.position).x, Camera.main.WorldToScreenPoint(Item.transform.position).y, Camera.main.WorldToScreenPoint(Item.transform.position).z);
                if (ItemBoundingVector.z > 0.01 && Item != null && (Item.name.Contains("key") || Item.name.Contains("tetriz") || Item.name.Contains("prokill") || Item.name.Contains("ssd") || Item.name.Contains("virtexprocessor") || Item.name.Contains("video_card") || Item.name.Contains("transilluminator")) && distance <= _lootItemDistance)
                {
                    name = Item.name;

                    string text = string.Format($"{Item.name} - [{distance}]M");
                    Color guiBackup = GUI.color;
                    GUI.color = Color.cyan;
                    GUI.Label(new Rect(ItemBoundingVector.x - 50f, (float)Screen.height - ItemBoundingVector.y, 100f, 50f), text);
                    GUI.color = guiBackup;
                }
            }
        }


        private void DrawPlayers()
        {
            foreach (var player in _playerInfo)
                {

                try
                {
                    if (player == null)
                    {
                        break;
                    }

                    if (player.Profile.Info.Nickname == string.Empty)
                    {
                        continue;
                    }

                    if (!player.IsVisible) continue;

                    Vector3 playerPos = player.Transform.position;
                    float distanceToObject = Vector3.Distance(camPos, player.Transform.position);
                    Vector3 playerBoundingVector = Camera.main.WorldToScreenPoint(playerPos);
                    if (distanceToObject <= _viewdistance && playerBoundingVector.z > 0.01)
                    {
                        Vector3 playerHeadVector = Camera.main.WorldToScreenPoint(player.PlayerBones.Head.position);
                        Gizmos.DrawCube(playerPos, new Vector3(1, 1, 2));
                        float boxVectorX = playerBoundingVector.x;
                        float boxVectorY = playerHeadVector.y + 10f;
                        float boxHeight = Math.Abs(playerHeadVector.y - playerBoundingVector.y) + 10f;
                        float boxWidth = boxHeight * 0.65f;
                        var IsAI = player.Profile.Info.RegistrationDate <= 0;
                        var playerColor = player.HealthController.IsAlive ? GetPlayerColor(player.Side) : Color.gray;
                        Utility.DrawBox(boxVectorX - boxWidth / 2f, Screen.height - boxVectorY, boxWidth, boxHeight, playerColor);
                        Utility.DrawLine(new Vector2(playerHeadVector.x - 2f, Screen.height - playerHeadVector.y), new Vector2(playerHeadVector.x + 2f, Screen.height - playerHeadVector.y), playerColor);
                        Utility.DrawLine(new Vector2(playerHeadVector.x, Screen.height - playerHeadVector.y - 2f), new Vector2(playerHeadVector.x, Screen.height - playerHeadVector.y + 2f), playerColor);
                        var playerName = IsAI ? "[BOT]" : player.Profile.Info.Nickname;
                        string playerText = player.HealthController.IsAlive ? playerName : (playerName + " [MRTAV]");
                        string playerTextDraw = string.Format("{0} [{1}]", playerText, (int)distanceToObject);
                        var playerTextVector = GUI.skin.GetStyle(playerText).CalcSize(new GUIContent(playerText));
                        GUI.Label(new Rect(playerBoundingVector.x - playerTextVector.x / 2f, Screen.height - boxVectorY - 20f, 300f, 50f), playerTextDraw);
                    }
                }
                catch (NullReferenceException ex)
                {
                    File.AppendAllText
                    (
                       @"C:\EFT\DrawPlay.txt",
                       $"{ex.Message}\r\n{ex.StackTrace}\r\n"
                    );
                }
            }

        }


        private Color GetPlayerColor(EPlayerSide side)
        {
            switch (side)
            {
                case EPlayerSide.Bear:
                    return Color.red;
                case EPlayerSide.Usec:
                    return Color.blue;
                case EPlayerSide.Savage:
                    return Color.yellow;
                default:
                    return Color.yellow;
                    /*
                    case EPlayerSide.Bear:
                        return ColorUtility.TryParseHtmlString(_bearColor);
                    case EPlayerSide.Usec:
                        return ColorUtility.TryParseHtmlString(_usecColor);
                    case EPlayerSide.Savage:
                        return ColorUtility.TryParseHtmlString(_scavColor);
                    default:
                        return Color.white;
                        */
            }
        }

        private void GUIOverlay()
        {
            GUI.color = Color.gray;
            GUI.Box(new Rect(100f, 100f, 400f, 500f), "");
            GUI.color = Color.white;
            GUI.Label(new Rect(180f, 110f, 150f, 20f), "CITESKI MENI");
            _pInfor = GUI.Toggle(new Rect(110f, 140f, 120f, 20f), _pInfor, "IGRACI ESP"); // Display player
            _showExtractInfo = GUI.Toggle(new Rect(110f, 160f, 120f, 20f), _showExtractInfo, "EXSTRAKTI"); //Display  extraction

            _showItems = GUI.Toggle(new Rect(110f, 280f, 120f, 20f), _showItems, "LOOT STVARI"); //Show items on map
            if (_showItems)
            {
                GUI.Label(new Rect(110f, 320f, 150f, 20f), "LOOT DISTANCA");
                _lootItemDistance = GUI.HorizontalSlider(new Rect(210f, 320f, 120f, 20f), _lootItemDistance, 0.0F, 1500.0F);
            }
        }

        private double GetDistance(double x1, double y1, double x2, double y2)
        {
            return Math.Sqrt(Math.Pow(x2 - x1, 2.0) + Math.Pow(y2 - y1, 2.0));
        }

        private void Circle(int X, int Y, int radius)
        {
            float boxXOffset = X;
            float boxYOffset = Y;
            float boxHeight = radius;
            float boxwidth = radius;
            Vlcrpc.DrawBox(boxXOffset - (radius / 2), boxYOffset - (radius / 2), radius, radius, Color.yellow);
            Vlcrpc.DrawLine(new Vector2(960, 1080), new Vector2(960, 0), Color.white);
            Vlcrpc.DrawLine(new Vector2(0, 540), new Vector2(1920, 540), Color.white);
        }

    }

}


Что я уже пробовал:

Заменить весь код
Обновление графического интерфейса пользователя
Добавлен цвет резервной копии графического интерфейса пользователя
добавлена нулевая ссылка
вообще ничего не получалось

3 Ответов

Рейтинг:
6

Richard MacCutchan

Это та же самая проблема, что и https://www.codeproject.com/Questions/5255717/Csharp-ESP-drawing-error[^], и вы уже получили предложение. Проблема заключается в том, что при захвате исключения вы теряете информацию, которую система будет производить автоматически. Удалите try catch, и вы получите подробную информацию о том, где происходит исключение. Из этого вы должны быть в состоянии исправить это без труда.


MRHals Gospodin

Я пробую этот вариант все готово, но не помогает мне много с темой и это с удалением Catch noup его штраф код, но игра делает меня проблемы снова и я теряю hoppe, чтобы исправить это, и я хочу исправить это, потому что я инвестирую много часов, чтобы создать это. ESP

Если вы можете рассказать мне более подробно, что может быть не так, это очень поможет мне

Richard MacCutchan

As has been explained already, a null reference simply means that you are trying to use a reference that has not been initialised. Unfortunately, the only way to find them is by using the debugger to trace through the code and see exactly where the problem occurs. It may be that you forgot to initialise the reference, or you expect a return from some called method to return it. In almost every case it is simply because you forgot, or missed, something when initially writing your code. And, to be honest, there is not much we can do to help unless we can see an obvious mistake in the code that you show us. But more often than not the mistakes are not obvious. But don't be disheartened, it is a problem that we have all faced from time to time, and sometimes still do. It is just another part of the learning process that all developers go through.

MRHals Gospodin

Вы имеете право, что я буду продолжать смотреть в код myb am blind, так что вижу что-то и должен выглядеть лучше, спасибо за всю помощь.
Не могли бы вы сказать мне, как работает кэш в c#, чтобы кэшировать drawedplayer, а затем снова зациклить его? простой код еще раз спасибо

Рис.: https://i.imgur.com/JQH8Ibm.png

Richard MacCutchan

Я не совсем понимаю, что вы подразумеваете под словом "кэш", но видите ли cache image c - поиск в Google[^], для некоторых предложений.

MRHals Gospodin

Я имею в виду, могу ли я игроки, которые нарисованы, просто кэшировать и зацикливать его снова?

Как коробка игрока 1
сохранить.
А если к игре присоединятся новые игроки
Коробка1 взять один и положить на 2 игрока
Без необходимости программы рисовать для каждого игрока коробки

Richard MacCutchan

Я думаю, что это возможно, взгляните на ссылку Google в моем предыдущем сообщении для получения некоторых предложений.

MRHals Gospodin

Nahhh 10 часов спустя еще не исправил ошибку...

Richard MacCutchan

Никто не говорил, что это легко. Но вы написали код, так что вы лучший человек, чтобы понять, где искать.

Christian Graus

Или установите точки останова и изучите его, пройдя еще раз......

MRHals Gospodin

ошибка игрока-это null, но не пойму, как исправить

Richard MacCutchan

Начните с точки, где должна быть установлена ссылка игрока, и посмотрите, почему она терпит неудачу. Как было сказано ранее, это не то, что мы можем сделать для вас, так как это требует пошагового выполнения кода с помощью отладчика.

Рейтинг:
1

Christian Graus

Любой объект может быть нулевым. Нуль означает, что его не существует.

AnyClass x = null;

теперь x.anyProperty выдаст ошибку, так как x еще не является "AnyClass", это null, заполнитель, содержащий AnyClass, когда вы его создаете


MRHals Gospodin

Но как я могу реализовать это сейчас на своем пути, чтобы теперь заставить его нормально работать?

MRHals Gospodin

Как я могу кэшировать все это выше? это решит мою проблему?

Christian Graus

Ваш код бесполезен. Игрок явно не нулевой. Я понятия не имею, что это такое, так как вы не говорите, в какой строке есть ошибка

MRHals Gospodin

У меня есть только одна ошибка, которая повторяется снова и снова:

System.NullReferenceException: ссылка на объект не установлена на экземпляр объекта
at Absolutly.Abso.DrawPlayers () [0x00029] in <9854d861ae0d247c498e2782f3e1d916>:0

Christian Graus

Видите ли, номер строки сказал бы мне (или вам, если вы посмотрите), что такое null. Вы знаете, как использовать отладчик? Поставьте try catch вокруг всего этого, и когда он поймает, перешагните через него снова и посмотрите, что такое null

MRHals Gospodin

когда я использую отладчик, он не дает ошибок-это настоящая боль. у вас есть какие-нибудь контакты с МИБ?

MRHals Gospodin

Я обновил официальный пост abov, для получения дополнительной информации, если вы myb можете определить, что моя ошибка будет awsom. это полный рабочий код.

Рейтинг:
0

phil.o

Использование отладчика было бы самым быстрым способом для вас обнаружить проблему. Мы не можем отлаживать для вас. Вам нужна помощь в том, как провести сеанс отладки?

Вы также можете изменить способ регистрации исключений; попробуйте изменить блок catch на

catch (NullReferenceException ex)
{
   File.AppendAllText
   (
      @"C:\exeptionseft\DrawPlay.txt",
      $"{ex.Message}\r\n{ex.StackTrace}\r\n"
   );
}
и вы начнете получать лучшую информацию о том, что происходит и где это происходит.


MRHals Gospodin

Я постараюсь спасибо

MRHals Gospodin

Я обновил официальный пост abov, для получения дополнительной информации, если вы myb можете определить, что моя ошибка будет awsom. это полный рабочий код.

phil.o

Извините, но мой ответ тот же: отладьте свой код, чтобы найти, где и почему вы получаете исключение. Я не могу сделать этого для тебя. Пожалуйста, смотрите также ответ nb. 3 Ричарда Маккатчана.

MRHals Gospodin

отладка не показала мне никаких ошибок.

phil.o

Но вы все равно получаете исключение, верно? Отладка не показывает вам никаких ошибок, она просто позволяет вам обнаружить возможные проблемы с вашим кодом.
Опять же, вам нужна помощь в том, как провести сеанс отладки?

MRHals Gospodin

Прежде всего спасибо вам за всю поддержку этого проекта, Да, мне нужна поддержка по поводу отладки и того, как выяснить реальную проблему. Потому что я использую функцию отладки, и она не дает никаких ошибок, и я не уверен, что это я, что я делаю это неправильно, или это ничего не показывает в отладке.
Если у вас есть время помочь мне конечно :)

Рис.: https://i.imgur.com/JQH8Ibm.png

phil.o

Отладка-это навык, который вам нужно практиковать, если вы серьезно относитесь к разработке. Он позволяет исследовать ваш код, выполняя его построчно и наблюдая за значениями ваших переменных.
Вот несколько ссылок, которые помогут вам начать работу:
Введение в отладку[^]
Учебник: научитесь отлаживать код C# с помощью Visual Studio[^]
Однако есть и другие источники; я почти уверен, что вы даже можете найти некоторые из них на своем родном языке, если это облегчит вам задачу. Вы действительно должны найти время, чтобы ознакомиться с отладкой, так как это очень важный навык.

MRHals Gospodin

Спасибо вы будете смотреть прямо в него :)

MRHals Gospodin

Я пытаюсь отладить, но не даю мне никаких ошибок, теряю Хоппе.

phil.o

Не зная, как вы на самом деле пытались отладить, я боюсь, что больше ничем не смогу вам помочь. Опять же, вы единственный, кто может это сделать. Отладка не "выдает ошибки" и не помечает их автоматически; это инструмент для вас. исследовать что происходит?
Где вы поставили точку останова? Какая строка создает исключение? Какая переменная равна нулю? Как/где вы вводите эту переменную? Все это вопросы, на которые вы единственный в состоянии ответить в настоящее время.

Christian Graus

Если нет ошибок, ваш код работает!!!!!

phil.o

Мы часто получаем этот Кут :) Многие новички склонны понимать отладчик как волшебный инструмент, который решит все проблемы автоматически, а не как инструмент исследования.

Christian Graus

Это настоящее приключение :)

MRHals Gospodin

Это не проблема в отладке, потому что у меня есть внутренний cheat .dll, я не могу отлаживать такие вещи, как exsecutable программы. Мне нужно скомпилировать его и попробовать, если он будет отбрасывать те же ошибки.

вот последняя идея, которой я обладал в своей середине
if (player == null)
{
Файл.WriteAllText("greske.txt", "объект игрока равен нулю.");
Файл.WriteAllText("greske.txt", _ply.Метод toString());
по каждому элементу (ВАР р в _ply)
{
Файл.WriteAllText("greske.txt", $"игрок {p.профиль?.Информация?- Прозвище ?? "'Unknown' is null"}: \n{p.Метод toString()}");
}
Файл.WriteAllText("greske.txt", _ply.Метод toString());
вернуть;
}
но не работает, чтобы найти больше, и я узнал, что PLAYer null-это ошибка, но исправить ее сейчас нельзя

Christian Graus

Честно говоря, если вы получите исключение, оно сообщит вам в трассировке стека, в какой строке есть ошибка. Если вы не можете отладить свой код, исправьте его, чтобы вы могли это сделать

Если игрок равен нулю, то код для его загрузки не работает

MRHals Gospodin

Но как отлаживать .dll файлы? файл