Tredor46, это баг варкрафта, а не конкретной карты. Если есть триггеры, реагирующие на приказ, то создается объект с данными о событии, но затем не уничтожается.
То что вылетает у тебя, вовсе не означает что вылетает у других.
Если проблемы с твоим оборудованием, то смена версии карты тебе не поможет.
В случае вопросов о крашах стоит прикладывать отчет об ошибке, создаваемый игрой в папке Errors и имеющий имя %Дата краша%.txt, тогда есть вероятность, что кто-нибудь сможет по нему понять причину.
Убедись в том, что у тебя исправный компьютер (из корпуса не идёт дыма), с операционной системой всё в порядке (синие экраны появляются разве что в страшных снах) и в папке с игрой нет файлов с расширением .mix (это исполняемые файлы, которые игра подгружает на старте и они могут сделать с игрой и компьютером что угодно).
Если крашится с нехваткой памяти, то дело может быть в утечках памяти создаваемых картой, что должен исправлять разработчик.
Но бывает такое, что утечек карта не создает, а память всё равно куда-то улетучивается.
Как я подозреваю, из-за кривых драйверов для видеокарт, которые позволяют памяти течь, либо неэкономно используют её.
В таком случае, можешь попробовать:
Запустить игру в режиме OpenGL (передав параметр командной строки "-opengl"), вроде некоторым это помогает.
Переключиться на DirectX 9, скинув d3d8.dllотсюда в папку с игрой (незнаю, может ли это действительно помочь).
Обновить/откатить версию видеодрайверов.
Пойти играть на Linux'е под Wine'ом. Вероятно, там будут другие версии драйверов, если повезет, то без багов.
Поменять видеокарту на другую.
Если проблема всё же в карте, то начни перебирать все версии, одну за другой, пока не найдешь исправную (если таковая имеется).
Я загрузил скриншот и поставил галочку "Вставить изображения в текст", но похоже что-то пошло не так. Ресурс редактировать почему-то нельзя, поэтому попробую снова через комментарий.
makkad, этот мод модифицирует код игры таким образом, что при попытке добавить на панель приказов команду с координатами, выходящими за пределы сетки, такой запрос будет попросту отклонен и кнопка не появится в игровом интерфейсе.
Конечно, лучше если карта изначально будет сделана правильно, но если захочется поиграть в какую-нибудь карту с кривыми координатами кнопок, но при этом не хочется заморачиваться с ручной правкой архива, то это решение может помочь.
Не знаю на сколько он действительно помогает, ведь ты не поделился информацией о том, каковы значения потребления памяти процессом до и после, но раз ты так говоришь, то поверю на слово.
В таком случае, пользуйся этим решением и дальше, чтобы сбрасывать утечки памяти, создаваемые непонятно кем (я подозреваю видеодрайвера).
Надеюсь, это позволит тебе играть неограничено долго.
Если в карте и правда есть такие баги, то это печально. Я бы мог посмотреть, где там автор накосячил, но не уверен, что смогу найти на это время, тем более, что сам я в эту карту не играю.
Было бы удобнее, если бы ты отсортировал таблицу по колонке "Count", которая отображает количество агентов, но и так уже сойдет.
Не вижу чтобы каких-нибудь агентов было слишком много. Похоже, что группы утекают, но их количество не смертельно.
Нужно было отсортировать список по колонке с количеством объектов и либо сделать скриншот окна, в котором видно самые многочисленые виды агентов, либо скопировать текст всех ячеек и залить сюда файл.
Тогда можно было бы проверить, не утекает ли там что-то слишком сильно.
Менеджер памяти игры утверждает, что занял меньше 400 мегабайт, что не так уж и много.
Может быть, фрагментация памяти слишком велика или кто-то еще (например, драйвера для видеокарты) занял всю память.
Попробуй переключиться на OpenGL или DirectX 9 и сравни потребление памяти.
Еще, если проблема в утечках памяти, вызваных не варкрафтом, то может помочь периодический перезапуск игры и загрузка сохранения. Посмотри сколько памяти игра занимает в момент сохранения и после загрузки.
Я так понимаю, речь идёт о краше из-за нехватки памяти. В карте, конечно, еще остались утечки, но не настолько критичные, чтобы играть было совсем невозможно. Я видел на иринаботе лобби с игроками, которые играли 2 часа.
Покажешь отсортированую по количеству объектов таблицу, показываему этой программой?
А еще не помешает отчет об ошибке, создаваемый игрой в папке Errors.
Бывают невезучие игроки, у которых карты постоянно крашатся с нехваткой памяти, в то время как остальные играют как ни в чём не бывало. Может у тебя варкрафт сломаный с модами кривыми или операционная система/драйвера глючат.
Еще слышал, что иногда помогает переключение игры в режим OpenGL передачей параметра командной строки "-opengl" (один человек утверждал, что в его карте потребление памяти отличалось на гигабайт).
Функция вывода в консоль крашится, если к программе не подключена консоль.
Краш-код
program my_first_program;
begin
WriteLn('Hello, World!'); // Ты пытался, но у тебя ничего не вышло.
end.
printf
При конструировании массива, который передается функциям с переменным числом аргументов, при передаче DWORD'а тот конвертируется в int32 и, если его значение вне диапазона 0..0x7FFFFFFF, то выкидывается исключение RangeError, которое приводит к крашу моих модов. Это происходит независимо от режима сборки (релиз/отладка) и состояния флага проверки ошибок диапазонов.
Remark: Note that there is no support for DWord (or cardinal) arguments in array of const. They are converted to vtInteger/vtLongint. This is for Delphi compatibility, and the compiler will ignore any resulting range checks when in mode Delphi.
В документации написано, что это сделано для совместимости с Delphi, но каким образом это (краши везде, кроме Delphi) способствует ей я так и не понял.
Пример кода с крашем
program omg;
uses
SysUtils;
var
number: Dword = 0xFFFFFFFF;
begin
WriteLn(Format('number = %d', [number])); // crash
end.
Этот код не в состоянии вывести в консоль значение переменной.
Исправляется ручным конвертированием значения в тип, который точно вместит в себя все его значения:
WriteLn(Format('number = %d', [Int64(number)]));
Память мертвого потока
При попытке освободить память, которая была выделена во время исполнения точки входа библиотеки, можно легко получить краш.
Происходит это в случае, если поток, во время исполнения которого была выделена память, уже завершился. Такое может произойти в случае, когда вместо помещения .mix файла в папку с игрой (тогда игра сама загрузит его и точка входа выполнится в главном потоке, который будет долго жить), используется инъектор DLL (в таком случае, в целевом процессе создается поток, который завершается сразу после загрузки библиотеки).
Вообще, в freepascal'е есть функция создания потока BeginThread которая, возможно, корректно обрабатывает завершение потока, перекладывая права владения на кого-нибудь другого, но поток в котором исполняется точка входа находится вне моей власти.
Для решения этой пролемы можно попробовать в точке входа сразу создавать новый поток через BeginThread и уже в нём выделять память, либо воспользоваться возможностью смены менеджера памяти (подключение модуля cmem самым первым в главном файле программы позволит использовать менеджер памяти из msvcr.dll).
Пример краш-кода
program dead_memory;
var
memory: Pointer;
procedure OnChatMessage(s: PChar);
begin
// ...
FreeMem(memory); // crash
end;
begin
memory:= GetMem(1024);
AddChatHandler(@OnChatMessage);
end.
quq_CCCP, значит не нашлось никого, кого бы это беспокоило достаточно сильно, чтобы тот был готов оплатить разработку нового мода. Сам я уже давно перестал зависать в варкрафте, но иногда ко мне приходят с просьбами сделать мод и я берусь, если задача мне по силам и оплата устраивает.
Но, как по мне, в данном случае проще перезапустить игру.
В файле "UI/FrameDef/UI/ScriptDialog.fdf" есть какие-то настройки для скриптового диалога и его кнопок, попробуй поиграться с ним.
Если умеешь делать хаки, то при помощи этой программы ты можешь увидеть список нативных функций и их адреса. Отредактируй функцию DialogDisplay и заглуши её, после чего сможешь больше не видеть никаких диалогов.
Правда, если ты играешь на платформе с античитом, то он может обратить внимание на модификацию игры.
Gerbant, если у зашедшего в лобби с большой картой игрока висит застывший счетчик прогресса скачивания и не дает хосту стартануть игру, то может помочь этот мод.
Скачай Ladik MPQ Editor. Там же в конце есть ссылка на скачивание архива со списками файлов. Когда будешь открывать War3Patch.mpq укажи дополнительный список файлов "WarCraft III.txt" и тогда имена всех файлов определятся.
Но, чем редактировать стандартные архивы, куда удобнее использовать mix-архивы.
nazarpunk, то что её добавили в рефе не указывает на её наличие в 1.26a версии.
Также, похоже, что там удалили настройку слушателя и добавили еще каких-то полей.
SLina, если не можешь адаптировать код под компилятор microsoft'а, то попробуй воспользоваться GCC. Если сидишь на windows'е, то установи MSYS или WSL. Там можно будет установить компилятор и запускать bash скрипты.
Вот скрипт, который может скомпилировать пакет wc3 (хотя лучше, конечно, воспользоваться какой-нибудь системой сборки):
Здесь я использую "__attribute__((packed))", чтобы выключить выравнивание данных.
Вероятно, это какое-то нестандартное расширение компилятора, которое понимает мой GCC, но не принимает твой MSVC. В таком случае, замени эту опцию на аналог из своей системы.
» WarCraft 3 / Какая версия карты земли бога не вылетает?
Ред. IceFog
» WarCraft 3 / Какая версия карты земли бога не вылетает?
Если проблемы с твоим оборудованием, то смена версии карты тебе не поможет.
Как я подозреваю, из-за кривых драйверов для видеокарт, которые позволяют памяти течь, либо неэкономно используют её.
» Администрация XGM / Отсутствует короткое описание в ленте
» WarCraft 3 / Баги из-за сокрытия кнопок
А если собираться играть компанией, то можно договориться заранее всем поставить этот мод.
» WarCraft 3 / Баги из-за сокрытия кнопок
Ред. IceFog
» WarCraft 3 / Последнее убежище
Надеюсь, это позволит тебе играть неограничено долго.
Не вижу чтобы каких-нибудь агентов было слишком много. Похоже, что группы утекают, но их количество не смертельно.
» WarCraft 3 / Последнее убежище
Еще интересно, сколько памяти игра занимает на старте и как быстро она растет по мере игры.
Тогда можно было бы проверить, не утекает ли там что-то слишком сильно.
Может быть, фрагментация памяти слишком велика или кто-то еще (например, драйвера для видеокарты) занял всю память.
Ред. IceFog
» WarCraft 3 / Последнее убежище
А еще не помешает отчет об ошибке, создаваемый игрой в папке Errors.
Ред. IceFog
» WarCraft 3 / Открытая виртуальная машина
WriteLn
printf
Исправляется ручным конвертированием значения в тип, который точно вместит в себя все его значения:
Память мертвого потока
» WarCraft 3 / Открытая виртуальная машина
Прокрутить к ресурсу
» WarCraft 3 / Неограниченый размер карт без багов
Прокрутить к ресурсу
» WarCraft 3 / Секретные поля камеры
Объяви константы, скопировав себе в код следующие строчки:
Ред. IceFog
» WarCraft 3 / Что изменить в mpq чтоб грохнуть диалоги
» WarCraft 3 / Секретные поля камеры
Ред. IceFog
» WarCraft 3 / Что изменить в mpq чтоб грохнуть диалоги
Правда, если ты играешь на платформе с античитом, то он может обратить внимание на модификацию игры.
Ред. IceFog
» WarCraft 3 / Помогите запустить карту
Ред. IceFog
» WarCraft 3 / Секретные поля камеры
» WarCraft 3 / Открытая виртуальная машина
» WarCraft 3 / Как получить нормальный доступ к содержимому War3Patch.mpq?
» WarCraft 3 / Секретные поля камеры
» WarCraft 3 / Секретные поля камеры
Также, похоже, что там удалили настройку слушателя и добавили еще каких-то полей.
» WarCraft 3 / Просмотр состояния виртуальной машины JASS
» WarCraft 3 / Просмотр состояния виртуальной машины JASS
Прокрутить к ресурсу
Ред. IceFog
» WarCraft 3 / Супер хоткей
Ред. IceFog
» WarCraft 3 / Супер хоткей
Вероятно, это какое-то нестандартное расширение компилятора, которое понимает мой GCC, но не принимает твой MSVC. В таком случае, замени эту опцию на аналог из своей системы.