Здравствуйте, товарищи!
Надеюсь, мой вопрос не покажется сильно глупым, а ситуация недостойной внимания.
Такое дело, я делаю карту, используя GUI, но с небольшим использованием триггеров на JASS'е в тех случаях, когда GUI со своей задачей справиться не может.
я использую массивы для обозначения игроков. Вроде, если этот юнит принадлежит игроку Х, то добавить этого юнита в "ГруппаЮнитов" [Номер владельца юнита]. И многие триггеры работают хорошо, проблем не возникает.
Однако есть пара триггеров (больше пока не удалось обнаружить), которые правильно работать отказываются. Причем, они работают идеально для первого игрока (т.е. код соответствует моей хотелке и этот код срабатывает), но не для остальных. Прилагаю скриншот с примером.
После улучшения триггер берет все заводы данного игрока, удаляет у них первый набор способностей и добавляет его же, только улучшенный. Также блокирует/разблокирует их соответственно. Однако у второго игрока со всех заводов удаляются способности, но новые не добавляются (блокировка/разблокировка работает).
Не знаю, насколько честно, но я постарался перепробовать все и перечитать все, что мог найти и сделать. Теперь обращаюсь к вам, подскажите что-нибудь?
На JASS'e работаю не очень, в основном подглядываю или перевожу GUI триггеры, а потом их исправляю. Хеш-таблицы также не понимаю. Если решений без хеш-таблиц не будет, буду учить тогда.
Спасибо!

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

я забыл выставить максимальное количество массивов для группы юнитов...
тоже ща об этом хотел сказать и вспомнил как у меня была похожая проблема с группами, когда ещё на 1.26 сидел

И выяснилось, что первый игрок это все-таки 1, второй игрок это 2.
ну в твоём случае с ГУИ - да. Я ж объяснил как это работает
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
19
3 года назад
0
Похожие вопросы:

ответ
Получите, распишитесь.
немного кода
globals
  integer udg_p_i = 1
  player array udg_p
endglobals
function int takes nothing returns nothing
local integer i = 1
  loop
    exitwhen i  > 10
    if GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING then
      set udg_p[udg_p_i]=Player(i)
      set udg_p_i = udg_p_i + 1
    endif
    set i = i + 1
  endloop
endfunction
function cd takes nothing returns nothing
  local integer i = 1
  local integer cap = 0
  loop
    exitwhen i > udg_p_i
    set cap = (5+LoadInteger(udg_hash, GetHandleId(udg_Player[GetPlayerId(udg_p[i])]), 2))
    if GetHeroXP(udg_Player[GetPlayerId(udg_p[i])) < cap then
      call AddHeroXP( udg_Player[GetPlayerId(udg_p[i]), 20, false )
    endif
    set i = i + 1
  endloop
endfunction
Я так понял что статьи не помогут.
функцию int() вызови при инициализации
P.S.
Помогите сделать так, чтобы действия выполнялись не по циклу
ахахах, тогда закомменти пару строк)
тебе нужно создать соответствующие глобалки вручную
функция cd() это и есть функция которая должна быть в твоем действии
Если что непонятно, спрашиваем -_-
ответ
Одна и та же переменная в одном вызове функции не может принимать разные значения. Почему нельзя использовать две переменные?
Я вообще не очень понимаю, что ты хочешь сделать такой функцией. Опиши ситуацию, пожалуйста.
ответ
Вопрос решён. Не нужно ничего сортировать. Мне нужно было 3 первых места. Я просто в цикле сравнимал позицию данного игрока в ледербоарде с нужной мне позицией.
ответ
Должно работать:
function GetRandomPlayerIndex takes nothing returns integer
    set udg_Buf_A = 0
    set bj_forLoopAIndex=0 //red
    set bj_forLoopAIndexEnd=10  //light blue
    loop
        exitwhen(bj_forLoopAIndex>bj_forLoopAIndexEnd)
        if(GetPlayerSlotState(Player(bj_forLoopAIndex))==PLAYER_SLOT_STATE_PLAYING)and(GetPlayerController(Player(bj_forLoopAIndex)))==MAP_CONTROL_USER)and(udg_AccEmpPlayer[bj_forLoopAIndex]==false)then
                set udg_PlayersPlay[udg_Buf_A]=Player(bj_forLoopAIndex)
                set udg_Buf_A=(udg_Buf_A+1)
        endif
    set bj_forLoopAIndex=bj_forLoopAIndex+1
    endloop
    set udg_Random=GetRandomInt(0,udg_Buf_A)
    set udg_RndPlayer=udg_PlayersPlay[udg_Random]
    return udg_RndPlayer
endfunction
ответ
Это не удаление, а присвоение. Ты смотрел реализацию из первого комментария?

Сделал, написал комменты, разберёшься.

1
22
3 года назад
Отредактирован PROSHELDOTU
1
Нумерация игроков начинается с 0
Т.е. у крсаного Id = 0, у синего 1 и т.д.
Номер можно получить по этой нативке:
native GetPlayerId takes player whichPlayer returns integer
а это BJ функция, которая работает в ГУИ и начинает нумерацию игроков с 1:
function GetConvertedPlayerId takes player whichPlayer returns integer
    return GetPlayerId(whichPlayer) + 1
endfunction
0
4
3 года назад
Отредактирован PraetorianSM
0
Proshel_Doty:
Спасибо большое! Не знал, что красный игрок нулевой. Однако проблема все равно не в этом. Как видно в примере, там используется функция одного и того же игрока. Однако, срабатывает только половина триггера. Т.е. проблема, видимо, не в том, что он не может найти на кого применять действия, а в том, что триггер для кого-то срабатывает не так, неправильно или неполностью.
Upd. Причем, для красного игрока (не важно какой номер, ибо сами по себе я цифры в массивах не использую) все срабатывает нормально.
1
26
3 года назад
1
Попробуй все действия выполнить сразу в одном переборе. А то у тебя лишний перебор идет всех юнитов.
Выбрать всех:
  • Убрать способность
  • Добавить способность
1
22
3 года назад
Отредактирован PROSHELDOTU
1
попробуй не TriggerPlayer юзать, а Игрока-владельца юнита, который завершает исследование
Ибо событие на юнита, а не на игрока
0
4
3 года назад
0
Lord_Teo:
Делал уже, для верности попробовал еще раз. Пробовал еще вынести в другой триггер, вдруг, ему просто лень дочитывать этот до конца.
Proshel_Doty:
Попробовал. Однако завершение исследование относится к игроку в том числе, например, ссылаясь на число "НынешнийУровеньИсследования" мы ссылаемся на "Игрок". Да и даже если бы он не ссылался на триггернувшегося игрока, почему другие действия срабатывают?
Там вот еще какой прикол. Если сделать это исследование, способности с заводов игрока (опять же, если он не первый) пропадают абилки. Но если построить новый завод, то все способности у завода на месте. Т.е. срабатывает тот триггер, который при завершении строительства завода спрашивает, какой уровень улучшения, и удаляет ненужный набор способностей. Хотя, по логике этого (можно так его назвать?) глюка работать не должен.

Вот, сделал скриншоты. Хоть и без динамики, но думаю, всяко понятней будет.
Загруженные файлы
1
13
3 года назад
1
А что мешает сделать через РО? Задать способностям или что ты используеш, в характеристиках - требования, нужный тебе апгрейд
0
4
3 года назад
0
Borodach:
А что мешает сделать через РО? Задать способностям или что ты используеш, в характеристиках - требования, нужный тебе апгрейд
Дело в том, что это, можно сказать, двухуровневые способности. я пробовал когда-то через улучшения "Жизнь скелетов" повышать уровень способности у юнита, но оно не срабатывало. Так или иначе, это в лучшей мере реализовано через триггеры. Опять же, для первого игрока все работает идеально. Вопрос, почему также не работает для остальных? Почему одна и та же система при подставлении вместо нуля единицы (вместо первого игрока второй) начинает работать неправильно?
1
26
3 года назад
Отредактирован Lord_Teo
1
А как ты тестируешь заводы? Сетевая игра для двух игроков?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.