constant native Convert...
Конкретно для этого вопроса возьмём следующие константы:
constant attacktype         ATTACK_TYPE_NORMAL              = ConvertAttackType(0)
constant attacktype         ATTACK_TYPE_MELEE               = ConvertAttackType(1)
constant attacktype         ATTACK_TYPE_PIERCE              = ConvertAttackType(2)
constant attacktype         ATTACK_TYPE_SIEGE               = ConvertAttackType(3)
constant attacktype         ATTACK_TYPE_MAGIC               = ConvertAttackType(4)
constant attacktype         ATTACK_TYPE_CHAOS               = ConvertAttackType(5)
constant attacktype         ATTACK_TYPE_HERO                = ConvertAttackType(6)
Функция ConvertAttackType( ) возвращает нам тип атаки в зависимости от того, какой параметр она возьмёт. Так как всего 7 типов атак, то и создано для них 7 глобальных константных переменных.

Я попробовал ввести в качестве параметра для этой функции числа больше, чем 6 и функция вернула мне что-то, что не равно null. То есть, ConvertAttackType(7) != ConvertAttackType(8).

Хотелось бы ещё добавить, что есть ещё и подобные константы:
constant gameevent          EVENT_GAME_LOADED                 = ConvertGameEvent(256)
constant gameevent          EVENT_GAME_TOURNAMENT_FINISH_SOON = ConvertGameEvent(257)
constant gameevent          EVENT_GAME_TOURNAMENT_FINISH_NOW  = ConvertGameEvent(258)
constant gameevent          EVENT_GAME_SAVE                   = ConvertGameEvent(259)

constant playerevent        EVENT_PLAYER_ARROW_LEFT_DOWN      = ConvertPlayerEvent(261)
constant playerevent        EVENT_PLAYER_ARROW_LEFT_UP        = ConvertPlayerEvent(262)
constant playerevent        EVENT_PLAYER_ARROW_RIGHT_DOWN     = ConvertPlayerEvent(263)
И если ввести ConvertPlayerEvent(259) == ConvertGameEvent(259) (почему именно эти цифры смотрите по коду выше), то это вернёт нам true, несмотря на то, что это два разных типа gameevent и playerevent. Да я знаю, что они наследованы от одного типа. Это я к тому, что ConvertAttackType(7) мог вернуть нам совсем не attacktype, а что то другое, поэтому оно и не равно с ConvertAttackType(8).

И тогда я попробовал ввести большие цифры, чтобы мне не возвращали другие типы: ConvertPlayerUnitEvent(309999) - это не вернуло null. Что это значит? Можно создавать свои типы атак? Свои ивенты?

Лучший ответ:
эти функции зовутся enum-ераторы, они служат оберткой для жасса и просто представляют собой константу-число. Испольлзуются, чтобы ты не подсунул тупому жассу какой-нибудь мусор вместо разрешенных чисел, т.к. фильтровать числа сложнее, чем такие константы.
У типа атаки нет ограничения сверху в версии 1.26, что позволяет вылезать выше разрешенного кол-ва атак, но тогда и коэф урона по броне будет браться с потолка - памяти, которая содержит ваще другие данные, но всегда одни и те же в плане порядка - макс скорость существ, макс скорость зданий, и т.п. Строить на этом что-то можно, если разведать, к каким данным попадает игра, но смысла мало. В прошлом я видел исследования на эту тему уже.
Ивенты являются просто числами, и обычно не пересекаются, за редким исключением. Поэтому у тебя ConvertPlayerEvent(259) == ConvertGameEvent(259), это 259 == 259 в игре. Типы в игре вообще не имеют значения, если жестко не прописано в условии, а при математическом сравнении тип не проверяется. Скормить триггерам можно любой номер, опять же, но в каждом, куда я заходил, стояли проверки на входе на скормленное число, поэтому пользоваться этим бесполезно. Плюс все триггеры вызываются вследствие того, что их вызывает игра по событию. Те события, к которым невозможно сейчас привязать триггер. всё равно не будут вызывать привязанный каким-либо хак-способом триггер.


Views: 1 303

» Лучшие комментарии


DracoL1ch #2 - 3 years ago 10
Голосов: +10 / -0

эти функции зовутся enum-ераторы, они служат оберткой для жасса и просто представляют собой константу-число. Испольлзуются, чтобы ты не подсунул тупому жассу какой-нибудь мусор вместо разрешенных чисел, т.к. фильтровать числа сложнее, чем такие константы.
У типа атаки нет ограничения сверху в версии 1.26, что позволяет вылезать выше разрешенного кол-ва атак, но тогда и коэф урона по броне будет браться с потолка - памяти, которая содержит ваще другие данные, но всегда одни и те же в плане порядка - макс скорость существ, макс скорость зданий, и т.п. Строить на этом что-то можно, если разведать, к каким данным попадает игра, но смысла мало. В прошлом я видел исследования на эту тему уже.
Ивенты являются просто числами, и обычно не пересекаются, за редким исключением. Поэтому у тебя ConvertPlayerEvent(259) == ConvertGameEvent(259), это 259 == 259 в игре. Типы в игре вообще не имеют значения, если жестко не прописано в условии, а при математическом сравнении тип не проверяется. Скормить триггерам можно любой номер, опять же, но в каждом, куда я заходил, стояли проверки на входе на скормленное число, поэтому пользоваться этим бесполезно. Плюс все триггеры вызываются вследствие того, что их вызывает игра по событию. Те события, к которым невозможно сейчас привязать триггер. всё равно не будут вызывать привязанный каким-либо хак-способом триггер.
ScopteRectuS #3 - 3 years ago (изм. ) 0
Голосов: +0 / -0
Скормить триггерам можно любой номер, опять же, но в каждом, куда я заходил, стояли проверки на входе на скормленное число, поэтому пользоваться этим бесполезно. Плюс все триггеры вызываются вследствие того, что их вызывает игра по событию. Те события, к которым невозможно сейчас привязать триггер. всё равно не будут вызывать привязанный каким-либо хак-способом триггер.
Я бы хотел это использовать в своих кастомных функциях, а не в нативных, например так:
globals
	constant  playerunitevent  EVENT_PLAYER_UNIT_DAMAGED  =  ConvertPlayerUnitEvent( 3000 )
endglobals

function RegisterPlayerUnitEvent takes player whichPlayer, playerunitevent whichPlayerUnitEvent, code actionFunc returns nothing
endfunction
А уже внутри функции смотреть, что за playerunitevent функции передали и исходя из этого совершать некие действия. Не произойдут ли какие-нибудь конфликты из-за этого?

Так как в 1.29 поменяли некоторые цифры для enum-ераторов, я собираюсь использовать большие числа (как 3000), чтобы не произошли конфликты в будущем.
DracoL1ch #4 - 3 years ago (изм. ) 0
Голосов: +0 / -0
игре пофиг, некорректное число отменит регистрацию конкретного ивента и всё
quq_CCCP #5 - 3 years ago 0
Голосов: +0 / -0
ScopteRectuS, размечтался, если под это число не заготовлено события, ниче не выйдет, да и выйти за границы там нельзя из за проверок.
Своих событий таким образом не сделать, как и не достучатся до внутриигровых.
ScopteRectuS #6 - 3 years ago 0
Голосов: +0 / -0
quq_CCCP, почему? у меня всё работает.
quq_CCCP #7 - 3 years ago -2
Голосов: +0 / -2
ScopteRectuS, что работает? Событие юнит успешно завершил атаку достали?
ScopteRectuS #8 - 3 years ago (изм. ) 2
Голосов: +2 / -0
quq_CCCP, нет, вы неправильно поняли. Я имел ввиду, что если предать функции Convert...( ) разные параметры, то можно получить переменные данного типа, которые можно использовать в своих кастомных функциях, а не в нативных.
Sergarr #10 - 3 years ago 2
Голосов: +2 / -0
ScopteRectuS:
quq_CCCP, нет, вы неправильно поняли. Я имел ввиду, что если предать функции Convert...( ) разные параметры, то можно получить переменные данного типа, которые можно использовать в своих кастомных функциях, а не в нативных.
Ну можно, наверное, но если ты юзаешь кастомные функции, то можно просто вместо Convert...(Integer) юзать сам Integer. Результат такой же, а писать меньше.
ScopteRectuS #11 - 3 years ago (изм. ) 0
Голосов: +0 / -0
Sergarr, я хотел написать одну функцию RegisterPlayerUnitEvent( player whichPlayer, playerunitevent whichEvent, code actionFunc ). Если я хочу, чтобы триггер срабатывал при EVENT_PLAYER_UNIT_ATTACKED или EVENT_PLAYER_UNIT_DEATH, то я так и напишу. Но также эту функцию можно будет кормить своими кастомными эвентами, например, EVENT_PLAYER_UNIT_DAMAGED, естественно, при получении не нативного эвента, функция должна понять это и сделать то, что нужно.
Nelloy #12 - 1 year ago 0
Голосов: +0 / -0
То есть теоретически на этой основе можно сделать мемхак для 1.29+ ?
PT153 #13 - 1 year ago (изм. ) 0
Голосов: +0 / -0
Так как в 1.29 поменяли некоторые цифры для enum-ераторов
Где и когда? Все старые константы не были изменены, за исключением констант, связанных с номерами и количеством игроков.
quq_CCCP #14 - 1 year ago 0
Голосов: +0 / -0
Nelloy:
То есть теоретически на этой основе можно сделать мемхак для 1.29+ ?
Причем тут мемхак? Хоть и можно пихать в эти функции какие попало числа, толку от этого практически нет.
Мемхак это в первую очередь доступ к адресам данных игры, из интерпретатора, очень возможно в луа есть такие уязвимости. Китайцы наверное уже что то мутят, на 1.26+ уже есть мемхак. Другое дело что функционал будет долгое время ограничен, т.к развивать это дело пока особо некому. В игре многое что перелопачено и придется проделать очень много работы с нуля чтобы сделать полноценный мемхак для 1.29 или рефорджа,
Если близзарды нас снова кинут, то наверное появится мемхак для старших патчей...