Бывает ситуации, когда из-за незнания того, как устроен движок hlds, rehlds, regamedll...
у нас непредвиденно вылетает сервер, уведомляя только лишь, что прекращена работа hlds.exe
В данном уроке рассматривается частный случай, но вы вполне можете решить такие возникающие проблемы, если разбираетесь в исходниках на c++.
Чтобы понять, почему эта ошибка произошла, нам необходимо заняться отладкой приложения.
Так как у меня windows, я продемонстрирую как это делается для нее.
1) Скачиваем visual studio, express, например.
2) Затем запускаем сервер.
3) Проделываем вещи, которые вызывали прекращение работы сервера.
4) После появится окно об ошибке, нажимаем отладка.
5) Затем на кнопку Yes и попадаем в visual studio. Нажимаем на кнопку break.
6) Для того, чтобы увидеть, в какой строчке кода сервер ложится, нам нужно скачать исходники к тому, что мы хотим дебажить, а точнее к последнему, так как упал именно он.
7) mp.dll в окне call stack, в моем случае это regamedll. Скачиваем с github исходники к regamedll.
8) Что-то типо такого будет, когда необходимо задать исходник. Указываем исходник и в call stack еще раз нажимаем на последнюю строчку.
9) Попадаем на тот участок кода, который у нас вызвал проблему.
У нас вызывается UTIL_ResetEntities() при каждом рестарте сервера, а if (pEntity->IsPlayer()) вызывает ошибку, так как у pEntity нет свойства IsPlayer. Получается что функция автоматически очищает созданные объекты пользователя после рестарта, но сейчас она это сделать не может. Так как наблюдается конфликт удаление объекта при рестарте и при ручном удалении объекта.
10) Теперь ищем проблему у себя в коде.
Оказывается, что при перезагрузке мы удаляли объекты, поэтому движок не смог их удалить нормально, так как мы уже это сделали сами два раза.
11) Нужно разрешить проблема с удалением объектов. Когда find_ent_by_class выводит объект, который уже был удален.
P.S. Ошибка оказывается была не в уничтожении объекта, а неверное назначение смещения. offset, там было для linux. set_pdate