Конкретно для этого вопроса возьмём следующие константы:
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 в игре. Типы в игре вообще не имеют значения, если жестко не прописано в условии, а при математическом сравнении тип не проверяется. Скормить триггерам можно любой номер, опять же, но в каждом, куда я заходил, стояли проверки на входе на скормленное число, поэтому пользоваться этим бесполезно. Плюс все триггеры вызываются вследствие того, что их вызывает игра по событию. Те события, к которым невозможно сейчас привязать триггер. всё равно не будут вызывать привязанный каким-либо хак-способом триггер.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
21
6 лет назад
0
quq_CCCP, почему? у меня всё работает.
0
32
6 лет назад
0
ScopteRectuS, что работает? Событие юнит успешно завершил атаку достали?
2
21
6 лет назад
Отредактирован scopterectus
2
quq_CCCP, нет, вы неправильно поняли. Я имел ввиду, что если предать функции Convert...( ) разные параметры, то можно получить переменные данного типа, которые можно использовать в своих кастомных функциях, а не в нативных.
2
12
6 лет назад
2
ScopteRectuS:
quq_CCCP, нет, вы неправильно поняли. Я имел ввиду, что если предать функции Convert...( ) разные параметры, то можно получить переменные данного типа, которые можно использовать в своих кастомных функциях, а не в нативных.
Ну можно, наверное, но если ты юзаешь кастомные функции, то можно просто вместо Convert...(Integer) юзать сам Integer. Результат такой же, а писать меньше.
0
21
6 лет назад
Отредактирован scopterectus
0
Sergarr, я хотел написать одну функцию RegisterPlayerUnitEvent( player whichPlayer, playerunitevent whichEvent, code actionFunc ). Если я хочу, чтобы триггер срабатывал при EVENT_PLAYER_UNIT_ATTACKED или EVENT_PLAYER_UNIT_DEATH, то я так и напишу. Но также эту функцию можно будет кормить своими кастомными эвентами, например, EVENT_PLAYER_UNIT_DAMAGED, естественно, при получении не нативного эвента, функция должна понять это и сделать то, что нужно.
0
13
5 лет назад
0
То есть теоретически на этой основе можно сделать мемхак для 1.29+ ?
0
28
5 лет назад
Отредактирован PT153
0
Так как в 1.29 поменяли некоторые цифры для enum-ераторов
Где и когда? Все старые константы не были изменены, за исключением констант, связанных с номерами и количеством игроков.
0
32
5 лет назад
0
Nelloy:
То есть теоретически на этой основе можно сделать мемхак для 1.29+ ?
Причем тут мемхак? Хоть и можно пихать в эти функции какие попало числа, толку от этого практически нет.
Мемхак это в первую очередь доступ к адресам данных игры, из интерпретатора, очень возможно в луа есть такие уязвимости. Китайцы наверное уже что то мутят, на 1.26+ уже есть мемхак. Другое дело что функционал будет долгое время ограничен, т.к развивать это дело пока особо некому. В игре многое что перелопачено и придется проделать очень много работы с нуля чтобы сделать полноценный мемхак для 1.29 или рефорджа,
Если близзарды нас снова кинут, то наверное появится мемхак для старших патчей...
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.