11

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

А в .ai скрипте я могу вызвать функцию из погруженной библиотеки, если она упакована в карту?
11

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

Т.е. если писать бота, то только через чат обмениваться данными между ботами?
11

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

А, как работать с общими данными для всех машин на одной машине?
11

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

IceFog, можешь объяснить, как запустить только один экземпляр библиотеки при загрузке карты, как у тебя в Example.dll, чтобы не было дизсинхронизации, только на С++. Аналог твоего запуска библиотеки на паскале:
begin
	InitCamera;
	InitSpell;
	CreateAngryWorker;
	CreateMeat;
end.
Пробывал следующий код:
BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{	
	if (ul_reason_for_call != DLL_PROCESS_ATTACH) return TRUE;
	DisableThreadLibraryCalls(hModule);

	if (fRegistrJassApi() == FALSE) return TRUE;
	if (fRegistrNatives() == FALSE) return TRUE;
	HUNIT u;
	u = CreateUnit(GetLocalPlayer(),ID_UNIT_MAIN_HUMAN1,0,0,0);
	IssuePointOrder(u,"move",1000,1000);
	return TRUE;
}
Он запускается на обоих машинах. Как перевести с паскаля на С++ твой Example.dll?
11

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

Unryze, у меня получилось с помощью в этой статьи xgm.guru/p/wc3/anyscript (Сценарий на любом языке) поиграть по сети со своей dll'кой. Это и есть мемхак?
11

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

Я сделал небольшой мод (исходники), исправляющий эту ошибку.
Обе ссылки выдают 404 ошибку.
11

» WarCraft 3 / Своя нативка на С++

Unryze, а если я память не освобожу в функции, то это будет утечка при __cdecl, когда я выйду из варкрафта?
11

» WarCraft 3 / Своя нативка на С++

Да ты прав GetJassNative, используют соглашение cdecl. Но RegisterJassNative я использую c stdcall.
// Natives variable
HRACE (__cdecl *_ConvertRace) (Integer i);
bool fRegistrNatives()
{
	*((int*)&_ConvertRace) = (int)GetJassNative("ConvertRace");
}

HRACE ConvertRace(Integer i)
{
	return _ConvertRace(i);
}
Могу опубликовать все нативные функции на с++.
11

» WarCraft 3 / Своя нативка на С++

IceFog,
cdecl (C calling convention)
Стандартное соглашение о вызовах для программ на C/C++.
В данном соглашение аргументы передаются справа налево и кладутся на стек, как и в [[#STDCALL Standart Calling Convention|stdcall]], возвращаемое значение кладется в регистр EAX. Но вот стек уже очищается функцией, которая вызывает. Имена функций начинаются с символа нижнего подчеркивания, без указания количества байт для аргументов к конце.
stdcall (Standart Calling Convention)
STDCALL это стандартное соглашение для Win32 API. В данном соглашение, аргументы передаются справа налево и очистка стека ложится на вызываемую функцию. Для передачи аргументов используется стек, т.е. перед вызовом нужно положить аргументы на стек. Возвращаемое значение записывается в регистр eax.
КОРОЧЕ, РАЗНИЦА:
__cdecl - очистку стека производит вызывающая программа (*). Основной способ вызова для Си. Это основной способ вызова функций с переменным числом аргументов.
__stdcall (он же winapi) - очистку стека производит вызываемая подпрограмма. (**). Применяется при вызове функций WinAPI.
Даже в твоём коде файла moduleutils.pas используется stdcall:
unit ModuleUtils;

interface

const
	JASS_API_DLL_NAME = 'JassApi.dll';

type
	PJassString = Pointer;
	
	TJassStringHandle = longword;
	TJassFunctionHandle = longword;
	TJassHandle = longword;

	TSingle = record Value: Single end;

function GetJassNative(Name: PChar): Pointer; stdcall; external JASS_API_DLL_NAME;
function GetStringHandle(Value: PChar): TJassStringHandle; stdcall; external JASS_API_DLL_NAME;
function GetStringFromHandle(StringHandle: TJassStringHandle): PChar; stdcall; external JASS_API_DLL_NAME;
function GetJassString(Value: PChar): PJassString; stdcall; external JASS_API_DLL_NAME;
function GetJassStringContent(JassString: PJassString): PChar; stdcall; external JASS_API_DLL_NAME;
implementation
end.
11

» WarCraft 3 / Вызов функций вк 3, через mix (dll)

Ev3nt,
*(BYTE*) (GameDll + 0x2de2a0+ 0x0) = 0xE8;
*(DWORD*) (GameDll + 0x2de2a0+ 0x1) = (DWORD)hookCHS - (dwGameBaseAddress + 0x2de2a0+ 0x5);
*(BYTE*) (GameDll + 0x2de2a0+ 0x5) = 0xC3;
Тут что два одинаковых адреса в разных переменных? В GameDll и в dwGameBaseAddress?
11

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

IceFog, в твоих исходниках Example\Natives.pas, есть две одинаковые константы
ITEM_TYPE_POWERUP: HITEMTYPE = 2;
ITEM_TYPE_TOME: HITEMTYPE = 2;
Это ошибка или нет?
Если посудить ITEM_TYPE один и тот же.
11

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

IceFog, Пожалуйста выложи свой JassApi,dll, а то твоя библиотека RedirectCalls.dll требует функции AddEventHandler у библиотеки JassApi.dll. Вот скриншот.
Загруженные файлы
11

» WarCraft 3 / Пути

Я ещё подумаю пока. Может быть, через 4 массива сделать ту же самую систему.
11

» WarCraft 3 / Пути

Есть у меня одна идейка, как можно реализовать поиск путей между двумя точками. Нужно создать 4 переменных стоковых (String). Занести в первую переменную уже заранее подготовленную и записанную в текстовом виде карту путей. Карта путей будет иметь разрешение 128*128 (большие клетки на карте)*4(маленькие клетки в одной большой клетке) = 65 536 маленьких клеток на карте путей. 1 маленькая клетка 1 символ в стоке. Символ "1" или "0". Можно пройти в этой клетке или нет. 1 - можно, 0 - нет. 1 стока будет отвечать за рельеф на игровой карте. 2 стока будет отвечать за разрушаемые объекты деревья на игровой карте. 3 стока будет отвечать за расположения любых юнитов на игровой карте. 4 стока необходима для расчёта оптимального пути между клетками. С начало в 4 стоку заносятся все данные из первых 3 сток. А потом уже идёт аналитический процесс для определения оптимального пути между клетками на карте путей, по тем или иным условиями. Например наш юнит занимает на карте путей 2*2 маленькие клетки. И нужно будет определить оптимальный путь на карте путей именно для этого юнита, у которого такой размер на карте путей. Это мы будем делать следующим образом. Проверять сразу 2 соседнии клетки с любой стороны, а именно сверху, снизу, слева и справа. И условие будет такое, если хоть одна маленькая клетка свободная, то меняем числовое значение удаленности от первой точки на карте в переменной, а если 2 клетки заняты, то не меняем никакие числовые значения в переменной. А если мы не доберемся до этой клетки на карте и все остальные клетки на карте уже заняты, то пройти в эту точку нельзя.
Да, кстати, забыл добавить, что придётся создавать массив из 65 536 числовых элементов. Это можно реализовать следующим образом. Создать несколько однотипных массивов по 8192 числовых элементов. Данный огромный массив будет состоять из 8 таких массивов. В который мы с помощью отдельных функций и будем записывать и забирать наши числовые значения. А именно числовые значения удалённости от первой точки на карте. До следующей точки на карте.
11

» WarCraft 3 / Пути

Я тоже это только что проверил. Нет, надо искать другой выход. Из этой ситуации.
11

» WarCraft 3 / Аналог способности канал

quq_CCCP, а скажи, пожалуйста, заклинание "Цепь молний" AI сможет использовать сам по своему усмотрению?
11

» WarCraft 3 / Аналог способности канал

Нет не баф. Мне надо применить заклинание "Целительная волна", через какую-нибудь другую способность, аналогичную способности канал. Так как в списке заклинаний у способности канал нету этого заклинания.