19

» WarCraft 3 / Jass MythBusters

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);
}
19

» WarCraft 3 / Журналирование вызовов JASS

Вышла новая версия! Прокрутить к ресурсу
  • Исправлен краш при загрузке сохранений.
  • Исправлен краш при выборе карты с ошибками в сценарии.
  • Добавлена поддержка отрицательного уровня отступа (использует '-' вместо табов).
  • Теперь логируется запуск/остановка потока и его код выхода, а также результат.
  • Теперь все потоки используют один глобальный уровень отступа, так что дочерние потоки будут логировать "глубже" своих родителей. Спящие потоки все также будут запоминать свой уровень отступа и восстанавливать его при пробуждении.
19

» WarCraft 3 / Неограниченое описание

Вышла новая версия! Прокрутить к ресурсу
  • Добавил проверки на нулевой указатель при копировании текста из UnitUIDef.
19

» WarCraft 3 / Открытая виртуальная машина

EugeAl, не понимаю, чего ты хочешь добиться.
Чтобы оно было "по дефолту", нужно чтобы близарды сами добавили эти нативки.
Если же хочется пользовательских модификаций, то нужно ставить моды, а как иначе?
19

» WarCraft 3 / Насколько быстро выполняется if ? - [Jass]

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
2
GetHandleId( GetExpiredTimer() )
Затем сравни их время исполнения.
19

» WarCraft 3 / Журналирование вызовов JASS

Meddin, в стеке виднеется адрес unlimited_description.mix, возможно, что дело в нём.
Нужно будет потом глянуть.
19

» WarCraft 3 / Насколько быстро выполняется if ? - [Jass]

Вместо того, чтобы гадать, можно провести замеры.
Я делал мод, который добавляет нативки для бенчмарков — просто кинь JassApi.dll и
natives.mix в папку с игрой и объяви в коде нативки:
native GetTickCount takes nothing returns integer
native SetOperationLimitEnabled takes boolean state returns nothing
native IsOperationLimitEnabled takes nothing returns boolean
После чего сделай функцию, которая многократно выполняет интересующее тебя действие и засеки время до и после исполнения, затем вычисли разницу.
Важно сделать так, чтобы функция исполнялась достаточно долго для того, чтобы погрешность была не слишком велика. Измерять одно действие смысла мало, а вот повторить его миллион раз уже может иметь смысл, чтобы на выполнение задачи ушли секунды, а не наносекунды, что может привести к погрешности ±100%.
Не забудь отключить лимит операций с помощью вызова SetOperationLimitEnabled(false), а иначе виртуальная машина убьет поток из-за превышения лимита.
19

» WarCraft 3 / Журналирование вызовов JASS

Meddin, протестировал на карте DotA LoD 6.83i и не смог словить крашей ни после сохранения и последующей загрузки, ни после нажатия на кнопку "Начать заново".
Возможно, у тебя стоят какие-нибудь конфликтующие моды.
Без отчёта об ошибке и дампа виртуальной машины сложно что-то сказать.
19

» WarCraft 3 / Журналирование вызовов JASS

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.
19

» WarCraft 3 / Журналирование вызовов JASS

Meddin, у тебя не сохраняется лог?
По идее, он должен сохраняться в любых обстоятельствах, ведь каждую строчку я сразу передаю функции FileWrite, а дальше уже дело за операционной системой.
19

» WarCraft 3 / Помогите (ошибка)

Когда просишь помочь с крашем, то стоит скидывать отчет об ошибке, создаваемый игрой при сбое (файлы .txt и .dmp с датой краша в имени).
Также есть программа, которая позволяет просматривать состояние скрипта карты. Если повезет, с ней сразу раскроется причина.
Она умеет сохранять слепок состояния виртуальной машины, который ты тоже можешь скинуть сюда.
19

» WarCraft 3 / Группы с несуществующими юнитами и FirstOfGroup

Meddin, не похоже, чтобы память утекала.
код
void __cdecl GroupClear(DWORD whichGroup)
{
    CGroup *g;

    g = ConvertHandle<CGroup>(whichGroup);
    if ( g )
        CGroup::Clear(g);
}

void __thiscall CGroup::Clear(CGroup *this)
{
    this->units.vtable->Clear(&this->units);
}

void __thiscall CUnitSet::Clear(CUnitSet *this)
{
    CUnitListNode *node;

    while (TRUE)
    {
        node = this->items.root.value;
        if ( (int)node <= 0 )
            break;
        CUnitListNode::~CUnitListNode(this->items.root.value);
        SMemFree(node, CUnitListNode::TypeName, -2, 0);
    }
    this->size = 0;
}
19

» WarCraft 3 / Последний приют 2

EasyMoney, в чем ты её пытаешься открыть? Если в редакторе, то она и не должна в нём открываться, ведь написано же, что она защищена.
А в игре она у меня запускается через WarCraft версии 1.26a.
19

» WarCraft 3 / Последний приют 2

Drakemor_888, нет, дело не в "такой себе" видеокарте (крашиться может и на RTX 4090), а в потреблении видеопамяти видеодрайвером. Видимо, у многих он ест слишком много, а игре доступно лишь 2 ГБ (хотя у меня есть идеи, как расширить лимит до 4 ГБ) и это приводит к крашу из-за нехватки памяти.
Но, при игре в режиме отрисовки через OpenGL (а не через DirectX, как это происходит по умолчанию), потребление памяти обычно значительно снижается, что позволяет играть дольше или вообще без крашей.
Если и это не поможет, то я делал мод с текстурами пониженого качества, который выкладывал в дискорде карты, который указан в её игровом описании.
Но, думаю что в нём не будет нужды, так как OpenGL и так помогает.
Пускай и был один игрок, которому не помог, но в итоге выяснилось, что он заблуждался, считая что играет на нём, а на самом деле был включен отрисовщик DirectX.
19

» WarCraft 3 / Warcraft Cavegame

Дело оказалось в виртуальной машине VMWare, в которой я играл в WarCraft 3.
Когда гостевая система меняла позицию курсора, то в хост системе та оставалась прежней и, когда я снова двигал мышь, та возвращалась в старую позицию.
Быть может где-то есть настройка, которая поможет избежать этой проблемы или придется посмотреть другую виртуалку.
Но стоит отметить, что другие подобные игры работают правильно.
Наверно, они не двигают курсор в центр экрана, чтобы потом посчитать смещение относительно него, а просто получают смещение из события от операционной системы.
Но, как я понял, в UjAPI такого функционала нет.
19

» WarCraft 3 / Последний приют 2

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

» WarCraft 3 / Не запускает карты свыше 8мб. по локальной сети.

Из-за ошибки в коде игры, если размер карты превышает определенное значение, то происходит арифметическое переполнение и процент загрузки расчитывается неправильно.
Существует мод, который убирает лимит на размер карт и заодно решает эту проблему.
19

» WarCraft 3 / Warcraft Cavegame

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

» WarCraft 3 / Warcraft Cavegame

Дело не в высокой чуствительности, а в том, что камера движется по какой-то странной траектории. Я снизил значение cameraSpeed со 100.0 до 5.0 и медленно двигаю мышь вниз:
На видео оконный режим, но до этого я запускался в полноэкранном режиме.
19

» WarCraft 3 / Warcraft Cavegame

Управление камерой у меня почему-то сломано, так что поиграть не вышло.
19

» WarCraft 3 / Симулятор электромагнитного взаимодействия элементарных частиц в warcraft 3

За 15 секунд накопилось 100 тысяч точек и 4 сотни групп — долго игра так не продержится.
Загруженные файлы
19

» WarCraft 3 / Самоподключающийся архив

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.
19

» WarCraft 3 / Исправление крашей на больших картах

N7 Molot, здесь и не должно быть никакого содержимого, ведь это просто перенаправление.
Впрочем, публиковать это нет нужды, ведь всё и так работает.
Прежде я советовал свой мод в ответе, но с тех пор имя изменилось, а отредактировать комментарий я не могу.
Теперь же всё работает правильно.