19

» WarCraft 3 / Неограниченый размер карт без багов

makkad, конечно, ведь выделить 8 МБ оперативной памяти — не проблема. А вот если потребуется цельный кусок в сотни мегабайт, то вероятность провала значительно повышается.
19

» WarCraft 3 / как написать *.mix камерахак? zoom

HTMZ, если умеешь программировать, то можешь и сам себе сделать:
  • Прослушивать клавиатуру можно через SetWindowsHookEx с параметром WH_KEYBOARD.
  • Дальше меняй свойство камеры CAMERA_FIELD_TARGET_DISTANCE через нативную функцию SetCameraField. С этим тебе поможет JASS API.
19

» WarCraft 3 / Неограниченый размер карт без багов

Последние новости!
  • Добавил объяснение причин проблемы.
  • Поменял расширение файла с DLL на MIX.
19

» WarCraft 3 / Крашлог, вопрос вылета

Принятый ответ
Краш произошел при попытке прочитать память по адресу 0x372, который, очевидно, не является корректным указателем, что и привело к аварийному завершению работы программы.
Инструкция процессора, которая пыталась выполнить эту операцию, расположена по адресу 0x66DDCA5B, который находится в пределах MSVCR80.dll (диапазон 0x66D80000 - 0x66E1B000), содержащей функции стандартной библиотеки языка C.
Также, в стеке мелькают адреса связаных с графикой библиотек: nvd3dum.dll (драйвер для видеокарты NVDIA?), d3d8.dll (DirectX).
Возможно, проблема с видеокартой или драйверами. Еще можно заподозрить модели и текстуры или неправильные визуальные настройки какого-нибудь объекта в редакторе объектов или вызов какой-нибудь нативки, влияющей на визульную составляющую, с неправильными аргументами.
Если ты скинешь свои версии библиотек, которые использовались в момент краша игры, то может быть получится выяснить что-нибудь еще.
"C:\WINDOWS\WinSxS\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.9672_none_d08f9da24428a513\MSVCR80.dll"
"C:\WINDOWS\System32\DriverStore\FileRepository\nv_dispi.inf_amd64_84b2c943d6816eb7\nvd3dum.dll"
"C:\WINDOWS\SYSTEM32\d3d8.dll"

Ах да, еще забыл спросить: что это за вирусня у тебя на компьютере установлена, внедряющая свой код во все процессы?
D:\games\L2M\Lineage2M_RU\LM\Binaries\Win64\GameGuard\npggNT.des
19

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

Последние новости!
Выложил исходники.
Изначально было написано на MASM'е, но сейчас решил переписать на C.
19

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

WilliamBz, описание и правда было немногословным. Добавил больше информации в описание.
Я слышал, что в новых версиях варкрафта близарды убрали storm.dll, от которого зависит mix-архив и, как следствие, работать оно врядли будет.
Что на счет вирусов, то просто глянь на коментарий выше с жертвой их паранойи. Надо бы выложить исходники, чтобы он мог указать, где же там троян.
В редакторе ничего указывать не нужно, просто помести mix в папку с игрой и его файлы станут доступны картам.
По сети с ним можно играть, но те, у кого он будет отсутствовать, не смогут увидеть новых моделей/текстур/музыки и всего прочего, что ты туда добавишь.
Варкрафт позволяет скачать карту в лобби, но дополнительные архивы придется качать отдельно.
19

» WarCraft 3 / Good Jassspy (JASS логер)

JackFastGame, я недавно выкладывал исходники интерпретатора JASS-байткода, ты можешь скачать Lazarus IDE и скомпилировать их. Тебе нужно добавить логирование инструкций вызова функций.
19

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

Последние новости!
Теперь исходный код доступен для скачивания.
19

» WarCraft 3 / Определение хоста карты

quq_CCCP, я понял о чем ты, видел как-то такую "наработку", но она не будет работать, ведь без разницы, хост ты или обычный игрок — данные будут обработаны всеми в одно и тоже игровое время.
19

» WarCraft 3 / Определение хоста карты

по геймкешу и зажержке синха, без мемхака, способ не очень надежный.
Скорее, совершенно нерабочий, ведь обработка сетевых команд (синк кэша, приказ юнитам...) и симуляция игрового мира у всех игроков проходит одинаково, а иначе была бы десинхронизация.
19

» WarCraft 3 / какие нативки не умеют работать с длинными string 1000-4000 ?

Если копирование функцией SubString происходит начиная с первого байта, а хэши входной строки и результата совпадают, то может быть возвращена изначально переданая строка, вместо ожидаемой подстроки.
Разработчик функции решил не создавать копию подстроки в памяти, а вместо этого временно поставить нуль-терминатор посреди оригинальной строки, передать указатель на неё в конструктор нового объекта-строки, после чего вернуть буфер в исходный вид.
Но память, которую он временно модифицировал, принадлежала менеджеру строк и её нельзя было трогать
Проблема усугубляется тем, что StringHash обрабатывает только первые 1023 байта, так что любые две строки, учитываемый регион которых совпадает, имеют одинаковый хэш, что увеличивает вероятность бага на больших строках.
SubString
RCString *__thiscall RCString::create_slice(RCString *this, RCString *result, __int16 start, __int16 end)
{
  const char *chars; // eax MAPDST
  size_t chars_length; // eax
  __int16 end_validated; // cx
  char original_char; // bl
  char *p_slice_nt_position; // esi
  RCString temp; // [esp+14h] [ebp-18h] BYREF
  int _try_level; // [esp+28h] [ebp-4h]

  chars = RCString::c_str(this);
  if ( chars && (chars_length = Storm_506_SStrLen(chars)) != 0 && start <= (__int16)chars_length )
  {
    end_validated = end;
    if ( end >= (__int16)chars_length )
      end_validated = chars_length;
    original_char = chars[end_validated];
    p_slice_nt_position = (char *)&chars[end_validated];
    *p_slice_nt_position = 0;
    RCString::ctor(&temp, &chars[start]);
    *p_slice_nt_position = original_char;
    _try_level = 1;
    RCString::from(result, &temp);
    LOBYTE(_try_level) = 0;
    RCString::dtor(&temp);
  }
  else
  {
    RCString::from(result, &RCString::null);
  }
  return result;
}

int __cdecl Jass::Common::SubString(JassString *source, int start, int end)
{
  const char *chars; // eax
  int id; // esi
  RCString slice; // [esp+8h] [ebp-18h] BYREF
  int _try_level; // [esp+1Ch] [ebp-4h]

  RCString::create_slice(&source->string, &slice, start, end);
  _try_level = 0;
  chars = RCString::c_str(&slice);
  id = GetJassStringId(chars);
  _try_level = -1;
  RCString::dtor(&slice);
  return id;
}
19

» WarCraft 3 / какие нативки не умеют работать с длинными string 1000-4000 ?

если заменить
то проблему можно увидеть
	set slice = SubString(s, StringLength(s) - 20, StringLength(s))
	call BJDebugMsg("«" + slice + "»")
	set slice = SubString(s, StringLength(s) - 20 - 1, StringLength(s) - 1)
	call BJDebugMsg("«" + slice + "»")
« or simply the host.»
«m or simply the host»
Запись строки в переменную не повлияла на работоспособность.
Так же, я заглянул в нативки StringLength и SubString, но не обнаружил в них ограничений на длину строк.
Вместо этого, я обнаружил проблему при склейке строк оператором "+".
легендарный код
Третий параметр функций Copy и Cat отвечает за размер целевого буфера.
Локальная переменная занимает 4100 байт в стеке и вряд ли уместит в себе 2 гигабайта.
RCString *__stdcall CreateStringFromTwoBuffers(RCString *result, const char *a, const char *b)
{
    char buffer[4100]; // [esp+18h] [ebp-1008h] BYREF

    Storm_501_SStrCopy(buffer, a, 4097u);
    Storm_503_SStrCat(buffer, b, 0x7FFFFFFFu);
    RCString::ctor(result, buffer);
    return result;
}
19

» WarCraft 3 / какие нативки не умеют работать с длинными string 1000-4000 ?

Я не заметил проблем при работе с длинными строками.
код
function Trig_test_Actions takes nothing returns nothing
local integer COUNT = 8
local string array strings
local integer i = 0
local string s = ""
	set strings[0] = "Lua is a powerful, efficient, lightweight, embeddable scripting language."
	set strings[1] = "It supports procedural programming, object-oriented programming, functional programming, data-driven programming, and data description."
	set strings[2] = "Lua combines simple procedural syntax with powerful data description constructs based on associative arrays and extensible semantics."
	set strings[3] = "Lua is dynamically typed, runs by interpreting bytecode with a register-based virtual machine, and has automatic memory management with a generational garbage collection, making it ideal for configuration, scripting, and rapid prototyping."
	set strings[4] = "Lua is implemented as a library, written in clean C, the common subset of standard C and C++."
	set strings[5] = "The Lua distribution includes a host program called lua, which uses the Lua library to offer a complete, standalone Lua interpreter, for interactive or batch use."
	set strings[6] = "Lua is intended to be used both as a powerful, lightweight, embeddable scripting language for any program that needs one, and as a powerful but lightweight and efficient stand-alone language."
	set strings[7] = "As an extension language, Lua has no notion of a \"main\" program: it works embedded in a host client, called the embedding program or simply the host."

	loop
		set s = s + strings[i]

		if i < (COUNT - 1) then
			set s = s + "\n"
		endif

		set i = i + 1
		exitwhen i >= COUNT
	endloop

	call BJDebugMsg("s length = " + I2S(StringLength(s)))
	call BJDebugMsg("«" + SubString(s, StringLength(s) - 20, StringLength(s)) + "»")
	call BJDebugMsg("«" + SubString(s, StringLength(s) - 10, StringLength(s)) + "»")
	call BJDebugMsg("«" + SubString(s, StringLength(s) - 10 - 1, StringLength(s) - 1) + "»")
endfunction

function InitTrig_test takes nothing returns nothing
    set gg_trg_test = CreateTrigger()
    call TriggerRegisterPlayerChatEvent(gg_trg_test, Player(0), "-test", true)
    call TriggerAddAction(gg_trg_test, function Trig_test_Actions)
endfunction
Вывод:
s length = 1182
« or simply the host.»
« the host.»
«y the host»
19

» WarCraft 3 / Опасен ли мемхак?

nazarpunk, у виртуальной машины есть много инструкций. Можно исправить некоторые из них, а другие продолжат таить угрозу. Еще есть выход за границы таблицы хэндлов — quq_CCCP показывал мне китайскую карту, вроде на 1.29 патче, которая пошла этим путем и взламывала игру.
Еще бывают модели, от которых игра критует — как знать, может и через них можно хакнуть.
19

» WarCraft 3 / Опасен ли мемхак?

nazarpunk, на одном мемхаке вылетает, а на другом возьмет и не вылетит.
19

» WarCraft 3 / Опасен ли мемхак?

nazarpunk, ужапи не имеет исходного кода и я не могу проверить то, насколько хорошо он исправляет уязвимости. Близарды тоже "фиксили" уже.
Да и если даже исправить все известные уязвимости, то всё равно стоит опасаться появления новых, ведь уже известно какого качества код у варкрафта.
19

» WarCraft 3 / Опасен ли мемхак?

Vlod, конечно, можно обойтись без этого, но, как я понимаю, обычно игроки запускают игру от админа. Хотя я советовал бы создать отдельного пользователя (например, warcraft) и забрать у него все права какие только можно. Еще можно запускать игру из песочницы или в виртуальной машине. Впрочем, даже так лучше не запускать левые карты, а лишь те, что скачаны из довереных источников. Лучше даже запретить игре права на запись в папку Maps и тогда она не сможет туда качать новые карты от незнакомцев.
19

» WarCraft 3 / Опасен ли мемхак?

Для написания вредоносного кода тут потребуется значительно больше сил
Что сложного взять, к примеру, доту лича и достать оттуда его "DotaAllstarsHelper.dll" и заменить его каким-нибудь "trojan.dll", а дальше делай что хочешь — вся система в твоем распоряжении.
Тем более варкрафт работает без рут прав
Как раз таки наоборот. Если игра установлена в ProgramFiles, то там для записи требуются права админа, а варик в своей папке любит создавать новые файлы и ему потребуются повышенные привелегии для этого.
19

» WarCraft 3 / Мафия 1.60 - патчи от IceFog'а

просто его никогда не пикают
Я вообще незнаю кто эту роль добавил. А хочешь поиграть с ним — хостани сам.
Дневное время по умолчанию поставлена на 0
Да, я уже исправил в последней версии голосование с нулевым лимитом.
когда таймер уже начался, он не меняется
Может позже сделаю возможность смены времени на ходу.
19

» WarCraft 3 / Мафия 1.60 - патчи от IceFog'а

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

» WarCraft 3 / Работа с нативными функциями

Если ты регистрируешь нативку в библиотеке, загружаемой этой системой, то учти, что она ждет пока не завершится функция main в JASS скрипте и только после этого загружает библиотеки. До этого момента запустить ИИ с пользовательскими нативками не выйдет.
Наверно, нужно будет исправить это, так как сейчас уже можно загружать библиотеки сразу.
Раньше это было нужно, потому что там еще был код, который пересоздавал главный поток, а делать это пока тот исполняется — плохая идея.
19

» WarCraft 3 / Сценарий на любом языке

Зачем синхронизировать то, что и так есть на клиентах всех игроков?
Если скрипт на компьютере одного игрока решит, что нужно запросить помощь, то и на других компьютерах те прийдут к тому же выводу, ведь всё исполняется синхронно.
19

» WarCraft 3 / Сценарий на любом языке

Какими данными? Зачем?
Складывается такое впечатление, будто ты не писал прежде на JASS'е, а иначе почему даже простое создание юнита вызывает у тебя проблемы?
Попробуй сначала почитать статьи и сделать простенькую карту на нём или изучить уже существующие, а уже потом на C++ перейти как окрепнешь.
19

» WarCraft 3 / Работа с нативными функциями

Если нативка зарегистрирована, то виртуальная машина JASS'а сможет её использовать.
Учитывая, что и обычный и ИИ скрипты исполняются ею, то почему бы и нет?
Единственная проблема — регистрация должна произойти до компиляции, а иначе компилятор откажется работать, сетуя на несуществующую нативку.
19

» WarCraft 3 / Сценарий на любом языке

Хранить данные ты можешь где угодно и делать что захочешь до тех пор, пока состояние всех игровых клиентов одинаковое. И не важно, на C++ ты пишешь или же на JASS'е, в итоге, если ты сделал опасные изменения локально лишь у одного игрока, то его отсоединит от остальных.
Используй нативку GetLocalPlayer с осторожностью.