Можно ли отключить стандартное применение способностей ИИ (например, "Волна силы" или "Неуязвимость", когда враг применяет ее сразу, как только его начнут атаковать), не отключая при этом всего ИИ? Имею в виду, что способности перестают применяться автоматически только если убрать "Компьютер" из слота игрока. Но при этом все поведение игрока в атаке меняется.

Принятый ответ

В результате решил использовать такой вариант - пока вроде, работает.
  1. Создаем способность-дубликат на основе Канала и даем ее боевой единице.
  2. Сохраняем в кэш ключ - ID дубликата и значение - ID основной способности.
  3. Применяем при помощи специальной функции, которая берет из кэша нужную способность, добавляет ее боевой единице, заставляет применить и отключает через пару секунд. Пример такой функции:
nothing order_Immediate(unit u, integer abilId) {
  integer realAbilId = GetStoredIntegerBJ(I2S(abilId), "abildoubles", cache)
  
  if (GetUnitAbilityLevelSwapped(realAbilId, u) == 0) {UnitAddAbility(u, realAbilId)}
  else {SetUnitAbilityLevel(u, realAbilId, 1)}
  
  IssueImmediateOrder(u, AbilityId2String(realAbilId))

  PolledWait(3)

  SetUnitAbilityLevel(u, realAbilId, 0)
}
Отключаем, а не удаляем - чтобы не сбрасывалась перезарядка. К тому же, если удалить способность, то она перестанет применяться (например, неуязвимость), а если обнулить ее уровень, то не перестанет. Проблем с таким методом пока не обнаружил.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
27
3 года назад
Отредактирован MpW
0
У вас войска игрока-компьютера управляются ИИ-скриптом? в триггерах есть - раздел ИИ. короче, там короче можно включить/отключить управление скриптом над юнитом. Если ты отключаешь, то скрипт никак не может управлять юнитом, он полностью свободен, и есть возможность управлять триггерно через отдачу приказами.
можно так временно отобрать контроль над юнитом у скрипта

Мб бредово, но как вариант стоит попробовать. У юнитов можно удалить эти способности. И выдавать в нужный момент.
0
32
3 года назад
0
МрачныйВорон, мб SetPlayerAbilityAvalible?
0
1
3 года назад
0
quq_CCCP:
МрачныйВорон, мб SetPlayerAbilityAvalible?
Если других вариантов нет, то этот кажется подходящим. Разрешать способность, триггерно применять, и через пару секунд снова запрещать. А вариант с удалением и добавлением требует хранения массива соответствий - это лишние данные и лишние действия, чтобы определить, кому какую способность давать.

Но здесь проблема в другом. За те несколько секунд, пока способность разрешена, другие боевые единицы по всей карте вполне могут ее применить.

Пока приходит в голову только такой вариант (усовершенствованный вариант от МрачныйВорон): создать дубликаты всех необходимых способностей на основе какого-нибудь Канала, и потом по наличию способности-дубликата выдавать основную способность, триггерно ее применять и снова удалять. Дело, конечно, долгое, - жаль, если без этого никак.
0
1
3 года назад
0
В результате решил использовать такой вариант - пока вроде, работает.
  1. Создаем способность-дубликат на основе Канала и даем ее боевой единице.
  2. Сохраняем в кэш ключ - ID дубликата и значение - ID основной способности.
  3. Применяем при помощи специальной функции, которая берет из кэша нужную способность, добавляет ее боевой единице, заставляет применить и отключает через пару секунд. Пример такой функции:
nothing order_Immediate(unit u, integer abilId) {
  integer realAbilId = GetStoredIntegerBJ(I2S(abilId), "abildoubles", cache)
  
  if (GetUnitAbilityLevelSwapped(realAbilId, u) == 0) {UnitAddAbility(u, realAbilId)}
  else {SetUnitAbilityLevel(u, realAbilId, 1)}
  
  IssueImmediateOrder(u, AbilityId2String(realAbilId))

  PolledWait(3)

  SetUnitAbilityLevel(u, realAbilId, 0)
}
Отключаем, а не удаляем - чтобы не сбрасывалась перезарядка. К тому же, если удалить способность, то она перестанет применяться (например, неуязвимость), а если обнулить ее уровень, то не перестанет. Проблем с таким методом пока не обнаружил.
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.