19

» WarCraft 3 / Поделитесь кто нибудь фаилами ИИ на основные расы режима Melee

Через триггеры можно включить ИИ для игрока, а если нужно для конкретных рас, то, как вариант, можно пройтись по всем игрокам, сверяя их расу и включая ИИ, если оно требуется.

human.ai, orc.ai, undead.ai, elf.ai - вроде такие названия имеют файлы с ИИ для каждой расы.
19

» Warcraft III - Lua / Warcraft III - Lua

PT153, официально - Кирилл ничего не говорил. На деле - да, мы с ним тестили, всё работает.
19

» Программирование / Какое отличие у этих двух локальных переменных ( C )

VuRdaLaK1337, в таком случае вот вам ответ. Если переменная записана в аргументах функции, то при стандартном вызове в C++ (_cdecl) все аргументы передаются через стэк. В случае, если вы объявляете переменную внутри функции, она может быть локальной - обнуляться при повторном вызове функции (не работает с массивами), либо статичной (при объявлении указано static). Статичная переменная в данном случае будет в области видимости этой функции, но при этом будет сохранять свои значения при повторном вызове. Пример:
#include <cstdio>

int a() {
	static int i = 0;
	printf("%d\n", i++);
	return i;
}

int main() {
	while(a() < 10);
	return 0;
}
19

» Warcraft III - Lua / Warcraft III - Lua

EugeAl, нет. Это стандартный функционал lua, я просто чуть-чуть откорректировал функции, чтобы файлы читались из карты.
19

» Warcraft III - Lua / Warcraft III - Lua

Bergi_Bear, постараюсь вечером выйти на связь. Спасибо за фидбек.

Да, dofile я выключил, но ты всегда можешь подключать другие скрипты путём require. Они грузятся из архива карты.
19

» Программирование / Ошибка в Коде

Вы пытаетесь присвоить значение элементу, которого не существует. У вас он от 0 до 7, а не до 8.
19

» WarCraft 3 / YDWE - Китайский редактор карт

Enemy1PK, в таком случае стоило бы добавить, что YDWE также способен запускать модифицированный Warcraft со своими плюшками.
19

» WarCraft 3 / YDWE - Китайский редактор карт

Не знаю как для вас, но многим он уже известен более нескольких лет, тем более что первая версия вышла ещё в далёком 2013 году. :D
19

» WarCraft 3 / Синхронизируем данные через gamecache

N1ghtSiren, как идея, на плюсах можно проверять с помощью:
if (GetForegroundWindow() == FindWindow("Warcraft III", NULL)) {
    // Do smth
}
19

» WarCraft 3 / Lua в WarCraft III

Bergi_Bear, просто 2 функции из jass, по типу wait, не хотели работать, от того и забросил.
19

» WarCraft 3 / Новые нативки для мемхака.

goodlyhero:
Получается, если я хочу использовать эти функции в war3map.j, я должен их каким-то образом загрузить заранее?
Всё верно. Можно их прописать вверху war3map.j (как делал ENAleksey в картах RenderEdge), в common.j (как делают китайцы, сам иногда также делаю), хукнуть метод выделения памяти варика, когда выделяется память под файлы скриптов, увеличить её на N количество символов, куда потом вы добавите свои обьявления (чтобы не обьявлять их в common.j явно), ну и последний вариант. В варике все скрипты преобразуются в коды операций, каждая из которых состоит из 8 байт, первые 4 являются самой операцией, а оставшиеся 4 - это значение. Таким образом вы можете как создать свой триггер, так и обьявить функцию.
Вот вам типы данных и структуры, которые пригодятся, если вы воспользуетесь последним способом:
Код
enum OPCODES
{
	OPTYPE_MINLIMIT = 0x00,
	OPTYPE_ENDPROGRAM = 0x01,
	OPTYPE_OLDJUMP = 0x02,
	OPTYPE_FUNCTION = 0x03,
	OPTYPE_ENDFUNCTION = 0x04,
	OPTYPE_LOCAL = 0x05,
	OPTYPE_GLOBAL = 0x06,
	OPTYPE_CONSTANT = 0x07,
	OPTYPE_FUNCARG = 0x08,
	OPTYPE_EXTENDS = 0x09,
	OPTYPE_TYPE = 0x0A,
	OPTYPE_POPN = 0x0B,
	OPTYPE_MOVRLITERAL = 0x0C,
	OPTYPE_MOVRR = 0x0D,
	OPTYPE_MOVRV = 0x0E,
	OPTYPE_MOVRCODE = 0x0F,
	OPTYPE_MOVRA = 0x10,
	OPTYPE_MOVVR = 0x11,
	OPTYPE_MOVAR = 0x12,
	OPTYPE_PUSH = 0x13,
	OPTYPE_POP = 0x14,
	OPTYPE_CALLNATIVE = 0x15,
	OPTYPE_CALLJASS = 0x16,
	OPTYPE_I2R = 0x17,
	OPTYPE_AND = 0x18,
	OPTYPE_OR = 0x19,
	OPTYPE_EQUAL = 0x1A,
	OPTYPE_NOTEQUAL = 0x1B,
	OPTYPE_LESSEREQUAL = 0x1C,
	OPTYPE_GREATEREQUAL = 0x1D,
	OPTYPE_LESSER = 0x1E,
	OPTYPE_GREATER = 0x1F,
	OPTYPE_ADD = 0x20,
	OPTYPE_SUB = 0x21,
	OPTYPE_MUL = 0x22,
	OPTYPE_DIV = 0x23,
	OPTYPE_MOD = 0x24,
	OPTYPE_NEGATE = 0x25,
	OPTYPE_NOT = 0x26,
	OPTYPE_RETURN = 0x27,
	OPTYPE_LABEL = 0x28,
	OPTYPE_JUMPIFTRUE = 0x29,
	OPTYPE_JUMPIFFALSE = 0x2A,
	OPTYPE_JUMP = 0x2B,
	OPTYPE_MAXLIMIT = 0x2C
	// OPTYPE_STARTLUATHREAD = 0x2D
};

enum OPCODE_VARIABLE_TYPE
{
	OPCODE_VARIABLE_NOTHING = 0,
	OPCODE_VARIABLE_UNKNOWN,
	OPCODE_VARIABLE_NULL,
	OPCODE_VARIABLE_CODE,
	OPCODE_VARIABLE_INTEGER,
	OPCODE_VARIABLE_REAL,
	OPCODE_VARIABLE_STRING,
	OPCODE_VARIABLE_HANDLE,
	OPCODE_VARIABLE_BOOLEAN,
	OPCODE_VARIABLE_INTEGER_ARRAY,
	OPCODE_VARIABLE_REAL_ARRAY,
	OPCODE_VARIABLE_STRING_ARRAY,
	OPCODE_VARIABLE_HANDLE_ARRAY,
	OPCODE_VARIABLE_BOOLEAN_ARRAY
};

typedef struct
{
	DWORD unk;
	DWORD max_size;
	DWORD array;

	UINT32 get(DWORD index)
	{
		DWORD result = 0;
		if (index < max_size)
		{
			result = array + 0x10 * index;
			++* (UINT32*)(result + 0xC);
		}

		return result;
	}

} STRING_TABLE, * PSTRING_TABLE;

typedef struct {
	BYTE unk[8];
	DWORD table;
} CODE_TABLE, * PCODE_TABLE;

typedef struct {
	BYTE rettype;
	BYTE type;
	BYTE reg;
	BYTE opcode;
	DWORD value;
} JASS_OPCODE, * PJASS_OPCODE;

typedef struct
{
	BYTE unk0[0x20];
	PJASS_OPCODE opcode;
	BYTE unk1[0x10];
	UINT has_sleep;
	BYTE unk2[0x2818];
	DWORD index;
	BYTE unk3[0x20];
	PSTRING_TABLE string_table;
	BYTE unk4[0x10];
	PCODE_TABLE code_table;
	BYTE unk5[0x1C];
} JASS_INSTANCE, * PJASS_INSTANCE;

typedef struct {
	DWORD unk;
	DWORD zero1;
	DWORD zero2;
	DWORD zero3;
	DWORD zero4;
	DWORD zero5;
	DWORD type1;
	DWORD type2;
	DWORD value;
	DWORD zero6;

	void set(DWORD value, OPCODE_VARIABLE_TYPE type)
	{
		this->value = value;
		type1 = type;
		type2 = type;
	}

} JASS_DATA_SLOT, * PJASS_DATA_SLOT;

typedef struct {
private:
	DWORD unk1;
	DWORD unk2;
	size_t stack_top; // Idk why it's here
	PJASS_DATA_SLOT stack[32];
	size_t size;
public:
	PJASS_DATA_SLOT pop()
	{
		return stack[--size];
	}

	PJASS_DATA_SLOT& operator[](size_t index)
	{
		return stack[index];
	}

	void clear(size_t number)
	{
		size = number < size ? size - number : 0;
	}

	size_t Size()
	{
		return size;
	}
} JASS_STACK, * PJASS_STACK;

typedef struct {
private:
	std::vector<JASS_OPCODE> oplist;
public:
	void addop(BYTE opcode, BYTE reg = 0, DWORD value = NULL, BYTE type = OPCODE_VARIABLE_NOTHING, BYTE rettype = OPCODE_VARIABLE_NOTHING)
	{
		JASS_OPCODE* _opcode = new JASS_OPCODE;
		_opcode->rettype = rettype;
		_opcode->type = type;
		_opcode->reg = reg;
		_opcode->opcode = opcode;
		_opcode->value = value;

		oplist.push_back(*_opcode);
	}

	DWORD getcode()
	{
		return ((DWORD)&oplist - GetJassMachine()->code_table->table) / 4;
	}

} JASS_OPLIST, * PJASS_OPLIST;