Добавлен Vampir_kolik,
опубликован
Раздел:
Основы
С выходом двух материалов составленых IceFog'ом (xgm.guru/p/wc3/jass-api (Работа с нативными функциями) и xgm.guru/p/wc3/fast-jass#h1.0.1 (Ускоренная виртуальная машина)) про создание своих нативок в War 3(1.26a). Добавляю свой код для создания нативок на языке C++.
JassApi.h
JassApi.h
typedef int LongBool;
typedef LongBool (__stdcall *pRegisterJassNative) (char *Name, char *Signature, void *Address);
<DLL_NAME>.cpp
#include "JassApi.h"
#include <windows.h>
#include <stdio.h>
pRegisterJassNative RegisterJassNative = NULL;
int __stdcall test()
{
return 3;
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
if (ul_reason_for_call != DLL_PROCESS_ATTACH) return TRUE;
DisableThreadLibraryCalls(hModule);
HMODULE hjApi = GetModuleHandle(L"JassApi.dll");
if(!hjApi) throw("Could not locate JassApi");
RegisterJassNative = (pRegisterJassNative)GetProcAddress(hjApi, "RegisterJassNative");
if(!RegisterJassNative) throw("Could not find RegisterJassNative");
RegisterJassNative("test", "()I",(void *)test);
return TRUE;
}
Чтобы создать dll которая будет подгружаться в Warcraft'е, нужно отключить поддержку Clr-среды в свойствах проекта.
Собираем dll. Закидываем её в папку с игрой. Переименовываем её с расширением ".mix". Закидываем в папку с игрой Jass.dll и RedirectCalls.dll из указанных статей выше. RedirectCalls.dll переименовываем в RedirectCalls.mix.
Собираем dll. Закидываем её в папку с игрой. Переименовываем её с расширением ".mix". Закидываем в папку с игрой Jass.dll и RedirectCalls.dll из указанных статей выше. RedirectCalls.dll переименовываем в RedirectCalls.mix.
Чтобы вызвать нативку в игре пишем:
native test nothing returns integer
native test nothing returns integer
Новые нативки работают и в AI скриптах и в ".j" файле.
Для теста создадим два файла common.ai и human.ai в mpq архиве карты и поместим их по пути "Scripts\".
common.ai - предназначен для общих функций для скриптов human.ai, elf.ai, orc.ai, undead.ai. А эти подскрипты предназначены для AI этих рас.
Код файла common.ai:
common.ai - предназначен для общих функций для скриптов human.ai, elf.ai, orc.ai, undead.ai. А эти подскрипты предназначены для AI этих рас.
Код файла common.ai:
native test nothing returns integer
Код файла human.ai:
function main takes nothing returns nothing
call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "hello!123" )
if test() == 3 then
call DisplayTextToPlayer( GetLocalPlayer(), 0.0, 0.0, "34444444444444" )
endif
endfunction
Чтобы подгрузить эти скрипты в карте воспользуемся следующим кодом в файле "war3map.j":
call MeleeStartingAI()
Добавим этот код в мейн функцию в файле "war3map.j".
Добавим через ГУИ пару игроков чтобы проверить скрипт. Выберем расу у компьютера "human".
И при за грузке карты мы должны увидеть следующие два сообщения:
"hello!123"
"34444444444444"
Тест закончен.
Карту и dll закидывать не буду. Учимся всё делать сами.
И при за грузке карты мы должны увидеть следующие два сообщения:
"hello!123"
"34444444444444"
Тест закончен.
Карту и dll закидывать не буду. Учимся всё делать сами.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован IceFog
В примере оттуда есть сгенерированные обертки для всех нативок из "common.j", но на pascal'е.
Отредактирован Vampir_kolik
cdecl (C calling convention)
Стандартное соглашение о вызовах для программ на C/C++.
STDCALL это стандартное соглашение для Win32 API. В данном соглашение, аргументы передаются справа налево и очистка стека ложится на вызываемую функцию. Для передачи аргументов используется стек, т.е. перед вызовом нужно положить аргументы на стек. Возвращаемое значение записывается в регистр eax.
__cdecl - очистку стека производит вызывающая программа (*). Основной способ вызова для Си. Это основной способ вызова функций с переменным числом аргументов.
__stdcall (он же winapi) - очистку стека производит вызываемая подпрограмма. (**). Применяется при вызове функций WinAPI.
Отредактирован Unryze
Хранящиеся в нём локальные переменные и адреса возврата могут быть перезаписаны случайными значениями, что приведет к непредсказуемым последствиям.
Но, если такую неправильную нативку вызовет кто другой, то весьма вероятны баги и краши.