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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
12
16
6 лет назад
12
эти функции зовутся enum-ераторы, они служат оберткой для жасса и просто представляют собой константу-число. Испольлзуются, чтобы ты не подсунул тупому жассу какой-нибудь мусор вместо разрешенных чисел, т.к. фильтровать числа сложнее, чем такие константы.
У типа атаки нет ограничения сверху в версии 1.26, что позволяет вылезать выше разрешенного кол-ва атак, но тогда и коэф урона по броне будет браться с потолка - памяти, которая содержит ваще другие данные, но всегда одни и те же в плане порядка - макс скорость существ, макс скорость зданий, и т.п. Строить на этом что-то можно, если разведать, к каким данным попадает игра, но смысла мало. В прошлом я видел исследования на эту тему уже.
Ивенты являются просто числами, и обычно не пересекаются, за редким исключением. Поэтому у тебя ConvertPlayerEvent(259) == ConvertGameEvent(259), это 259 == 259 в игре. Типы в игре вообще не имеют значения, если жестко не прописано в условии, а при математическом сравнении тип не проверяется. Скормить триггерам можно любой номер, опять же, но в каждом, куда я заходил, стояли проверки на входе на скормленное число, поэтому пользоваться этим бесполезно. Плюс все триггеры вызываются вследствие того, что их вызывает игра по событию. Те события, к которым невозможно сейчас привязать триггер. всё равно не будут вызывать привязанный каким-либо хак-способом триггер.
Принятый ответ
0
21
6 лет назад
Отредактирован scopterectus
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), чтобы не произошли конфликты в будущем.
0
16
6 лет назад
Отредактирован DracoL1ch
0
игре пофиг, некорректное число отменит регистрацию конкретного ивента и всё
0
32
6 лет назад
0
ScopteRectuS, размечтался, если под это число не заготовлено события, ниче не выйдет, да и выйти за границы там нельзя из за проверок.
Своих событий таким образом не сделать, как и не достучатся до внутриигровых.
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, естественно, при получении не нативного эвента, функция должна понять это и сделать то, что нужно.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.