makkad, все любопытствующие могут скачать утекшие бинарники с отладочной информацией и открыть в IDA или подобных программах для изучения.
В патче 1.26a содержимое не отличается.
Содержимое нативок
void __fastcall SetWidgetLife(unsigned int widgetHandle, const unreal *newLife)
{
CWidget *widget; // [rsp+20h] [rbp-18h]
widget = ConvertHandle<CWidget>(widgetHandle);
if ( widget )
widget->SetLife(widget, newLife);
}
void __fastcall KillUnit(unsigned int unitHandle)
{
CUnit *unit; // [rsp+20h] [rbp-18h]
unit = ConvertHandle<CUnit>(unitHandle);
if ( unit )
unit->SetLife(unit, &u_0);
}
Исправлен краш при выборе карты с ошибками в сценарии.
Добавлена поддержка отрицательного уровня отступа (использует '-' вместо табов).
Теперь логируется запуск/остановка потока и его код выхода, а также результат.
Теперь все потоки используют один глобальный уровень отступа, так что дочерние потоки будут логировать "глубже" своих родителей. Спящие потоки все также будут запоминать свой уровень отступа и восстанавливать его при пробуждении.
EugeAl, не понимаю, чего ты хочешь добиться.
Чтобы оно было "по дефолту", нужно чтобы близарды сами добавили эти нативки.
Если же хочется пользовательских модификаций, то нужно ставить моды, а как иначе?
LastUchiha, учти, что цикл также будет исполнять свои инструкции для проверки условий и прыжков. Можешь посмотреть во что компилируется функция при помощи JassView. Метки для прыжков это тоже инструкции, но которые ничего не делают и интерпретатор игнорирует их.
Если хочешь, чтобы накладные расходы цикла не сильно влияли на результат, то можешь совершать действие в его теле достаточно много раз, чтобы затенить их.
пример
function BenchmarkComparison takes nothing returns nothing
local integer i = 0
local integer start
local integer elapsed
call SetOperationLimitEnabled(false)
set start = GetTickCount()
loop
exitwhen i > 1000000
// ТВОЁ ДЕЙСТВИЕ
// ТВОЁ ДЕЙСТВИЕ
// ...
set i = i + 1
endloop
set elapsed = GetTickCount() - start
call BJDebugMsg("Time elapsed: " + R2S(elapsed / 1000.0) + " seconds.")
endfunction
Можно сделать два варианта действия для этой функции:
1
if MUIID == 0 then
set MUIID = GetHandleId( GetExpiredTimer() )
endif
После чего сделай функцию, которая многократно выполняет интересующее тебя действие и засеки время до и после исполнения, затем вычисли разницу.
Важно сделать так, чтобы функция исполнялась достаточно долго для того, чтобы погрешность была не слишком велика. Измерять одно действие смысла мало, а вот повторить его миллион раз уже может иметь смысл, чтобы на выполнение задачи ушли секунды, а не наносекунды, что может привести к погрешности ±100%.
Не забудь отключить лимит операций с помощью вызова SetOperationLimitEnabled(false), а иначе виртуальная машина убьет поток из-за превышения лимита.
Meddin, протестировал на карте DotA LoD 6.83i и не смог словить крашей ни после сохранения и последующей загрузки, ни после нажатия на кнопку "Начать заново".
Возможно, у тебя стоят какие-нибудь конфликтующие моды.
Без отчёта об ошибке и дампа виртуальной машины сложно что-то сказать.
This mod was written without the ability to support multiple versions, so adding support for new ones will be more difficult.
The source code is open, so you can add support for your version yourself, but I have no motivation to do that: on those rare occasions when I log into the game, I use version 1.26a. And I use other tools for debugging, so I haven't had any use for this mod yet.
Meddin, у тебя не сохраняется лог?
По идее, он должен сохраняться в любых обстоятельствах, ведь каждую строчку я сразу передаю функции FileWrite, а дальше уже дело за операционной системой.
Когда просишь помочь с крашем, то стоит скидывать отчет об ошибке, создаваемый игрой при сбое (файлы .txt и .dmp с датой краша в имени).
Также есть программа, которая позволяет просматривать состояние скрипта карты. Если повезет, с ней сразу раскроется причина.
Она умеет сохранять слепок состояния виртуальной машины, который ты тоже можешь скинуть сюда.
EasyMoney, в чем ты её пытаешься открыть? Если в редакторе, то она и не должна в нём открываться, ведь написано же, что она защищена.
А в игре она у меня запускается через WarCraft версии 1.26a.
Drakemor_888, нет, дело не в "такой себе" видеокарте (крашиться может и на RTX 4090), а в потреблении видеопамяти видеодрайвером. Видимо, у многих он ест слишком много, а игре доступно лишь 2 ГБ (хотя у меня есть идеи, как расширить лимит до 4 ГБ) и это приводит к крашу из-за нехватки памяти.
Но, при игре в режиме отрисовки через OpenGL (а не через DirectX, как это происходит по умолчанию), потребление памяти обычно значительно снижается, что позволяет играть дольше или вообще без крашей.
Если и это не поможет, то я делал мод с текстурами пониженого качества, который выкладывал в дискорде карты, который указан в её игровом описании.
Но, думаю что в нём не будет нужды, так как OpenGL и так помогает.
Пускай и был один игрок, которому не помог, но в итоге выяснилось, что он заблуждался, считая что играет на нём, а на самом деле был включен отрисовщик DirectX.
Дело оказалось в виртуальной машине VMWare, в которой я играл в WarCraft 3.
Когда гостевая система меняла позицию курсора, то в хост системе та оставалась прежней и, когда я снова двигал мышь, та возвращалась в старую позицию.
Быть может где-то есть настройка, которая поможет избежать этой проблемы или придется посмотреть другую виртуалку.
Но стоит отметить, что другие подобные игры работают правильно.
Наверно, они не двигают курсор в центр экрана, чтобы потом посчитать смещение относительно него, а просто получают смещение из события от операционной системы.
Но, как я понял, в UjAPI такого функционала нет.
Из-за ошибки в коде игры, если размер карты превышает определенное значение, то происходит арифметическое переполнение и процент загрузки расчитывается неправильно.
Существует мод, который убирает лимит на размер карт и заодно решает эту проблему.
Мне кажется, что система игнорирует твои попытки сместить курсор обратно в центр.
Когда я его после этого двигаю, то он смещается относительно старой позиции, а не центра, из-за чего дельта получается совсем не той.
Дело не в высокой чуствительности, а в том, что камера движется по какой-то странной траектории. Я снизил значение cameraSpeed со 100.0 до 5.0 и медленно двигаю мышь вниз:
На видео оконный режим, но до этого я запускался в полноэкранном режиме.
I made two archives for the test: one with priority 42, and the other with 41.
In them I placed a footman icon with a number with the priority of the archive they were in.
It didn't matter in what order the archives were loaded - the result was the same: the icon had the number 42.
Ред. IceFog
» WarCraft 3 / Jass MythBusters
В патче 1.26a содержимое не отличается.
» WarCraft 3 / Журналирование вызовов JASS
Ред. IceFog
» WarCraft 3 / Неограниченое описание
» WarCraft 3 / Открытая виртуальная машина
Чтобы оно было "по дефолту", нужно чтобы близарды сами добавили эти нативки.
Если же хочется пользовательских модификаций, то нужно ставить моды, а как иначе?
Ред. IceFog
» WarCraft 3 / Насколько быстро выполняется if ? - [Jass]
» WarCraft 3 / Журналирование вызовов JASS
Нужно будет потом глянуть.
Ред. IceFog
» WarCraft 3 / Насколько быстро выполняется if ? - [Jass]
natives.mix в папку с игрой и объяви в коде нативки:
Ред. IceFog
» WarCraft 3 / Журналирование вызовов JASS
Возможно, у тебя стоят какие-нибудь конфликтующие моды.
Без отчёта об ошибке и дампа виртуальной машины сложно что-то сказать.
» WarCraft 3 / Журналирование вызовов JASS
» WarCraft 3 / Журналирование вызовов JASS
» WarCraft 3 / Журналирование вызовов JASS
По идее, он должен сохраняться в любых обстоятельствах, ведь каждую строчку я сразу передаю функции FileWrite, а дальше уже дело за операционной системой.
Ред. IceFog
» WarCraft 3 / Помогите (ошибка)
Она умеет сохранять слепок состояния виртуальной машины, который ты тоже можешь скинуть сюда.
Ред. IceFog
» WarCraft 3 / Группы с несуществующими юнитами и FirstOfGroup
» WarCraft 3 / Последний приют 2
А в игре она у меня запускается через WarCraft версии 1.26a.
» WarCraft 3 / Последний приют 2
Пускай и был один игрок, которому не помог, но в итоге выяснилось, что он заблуждался, считая что играет на нём, а на самом деле был включен отрисовщик DirectX.
» WarCraft 3 / Warcraft Cavegame
Быть может где-то есть настройка, которая поможет избежать этой проблемы или придется посмотреть другую виртуалку.
Наверно, они не двигают курсор в центр экрана, чтобы потом посчитать смещение относительно него, а просто получают смещение из события от операционной системы.
Но, как я понял, в UjAPI такого функционала нет.
» WarCraft 3 / Последний приют 2
» WarCraft 3 / Не запускает карты свыше 8мб. по локальной сети.
» WarCraft 3 / Самоподключающийся архив
Ред. IceFog
» WarCraft 3 / Warcraft Cavegame
Когда я его после этого двигаю, то он смещается относительно старой позиции, а не центра, из-за чего дельта получается совсем не той.
Ред. IceFog
» WarCraft 3 / Warcraft Cavegame
Ред. IceFog
» WarCraft 3 / Warcraft Cavegame
» WarCraft 3 / Симулятор электромагнитного взаимодействия элементарных частиц в warcraft 3
» WarCraft 3 / Самоподключающийся архив
In them I placed a footman icon with a number with the priority of the archive they were in.
It didn't matter in what order the archives were loaded - the result was the same: the icon had the number 42.
» WarCraft 3 / Исправление крашей на больших картах
Впрочем, публиковать это нет нужды, ведь всё и так работает.
Теперь же всё работает правильно.