Здравствуйте, товарищи!
Надеюсь, мой вопрос не покажется сильно глупым, а ситуация недостойной внимания.
Такое дело, я делаю карту, используя 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
А как ты тестируешь заводы? Сетевая игра для двух игроков?
0
4
3 года назад
Отредактирован PraetorianSM
0
Lord_Teo:
А как ты тестируешь заводы? Сетевая игра для двух игроков?
Изначально этот баг обнаружился в сетевой игре с товарищем, когда тестировали карту. Сейчас при редактировании я использую компьютерного союзника с полностью общими войсками. Еще я использовал такую штуку, что пишу команду в чат и компьютерный игрок сам использовует способность, дабы (если вдруг что) за GetTriggerPlayer сошел не я, а сам компьютерный игрок.
Так же в триггерах нету разницы между человеческим и компьютерным игроком, поэтому в этом тоже проблемы нет.
1
26
3 года назад
Отредактирован Lord_Teo
1
Попробуй в качестве теста сделать переменную константу (тип перменной: Игрок). И заменить в твоем триггере Trigger Player на эту константу. И конкретно задавай игрока перед выполнением этого триггера.
0
4
3 года назад
0
Lord_Teo:
Попробуй в качестве теста сделать переменную константу (тип перменной: Игрок). И заменить в твоем триггере Trigger Player на эту константу. И конкретно задавай игрока перед выполнением этого триггера.
Не-а, не сработало. Видимо, он за момент действия триггера не забывает с каким игроком работает, а просто отказывается выполнять действия дальше. С красным игроком все снова сработало.
1
13
3 года назад
1
Выводи на екран триггер игрока, а в отряде пикнутого.
1
26
3 года назад
1
Сделал триггеры для проверки твоей ситуации с выводом информации. Специально раздробил на 3 триггера, чтобы проследить работу на каждом этапе. Вроде как всё работает!
Загруженные файлы
1
22
3 года назад
Отредактирован PROSHELDOTU
1
Попробовал. Однако завершение исследование относится к игроку в том числе, например, ссылаясь на число "НынешнийУровеньИсследования" мы ссылаемся на "Игрок". Да и даже если бы он не ссылался на триггернувшегося игрока, почему другие действия срабатывают?
Так и что не помогло? Это же варкрафт, тем более я так понимаю 1.26. Возможно TriggerPlayer каким-то образом получает значение как раз красного игрока, поэтому и не работает как надо
Дело в том, что Trigger Player нужно юзать в триггере, который срабатывает на событие игрока, например, игрок написал в чат что-нибудь. А у тебя событие на юнита.
Так что ещё раз: Нужно юзать владелец юнита в этом триггере
Я попробовал всё добавляется
Загруженные файлы
1
4
3 года назад
1
Borodach:
Выводи на екран триггер игрока, а в отряде пикнутого.
Попробовал, и вправду. Происходит что-то странное. Пишет, что владелец юнита, который завершил исследование — Игрок 2, а количество юнитов в отряде его юнитов — 0. Что? Почему? Зачем? Кто знает... И не понятно. Если число заводов 0, то почему с заводами вообще хоть что-то происходит? Час от часу не легче.
Lord_Teo:
Сделал триггеры для проверки твоей ситуации с выводом информации. Специально раздробил на 3 триггера, чтобы проследить работу на каждом этапе. Вроде как всё работает!
Так вот с этим и проблема. Вроде как все должно работать, для первого игрока все срабатывает без изъянов...
Proshel_Doty:
Попробовал. Однако завершение исследование относится к игроку в том числе, например, ссылаясь на число "НынешнийУровеньИсследования" мы ссылаемся на "Игрок". Да и даже если бы он не ссылался на триггернувшегося игрока, почему другие действия срабатывают?
Так и что не помогло? Это же варкрафт, тем более я так понимаю 1.26. Возможно TriggerPlayer каким-то образом получает значение как раз красного игрока, поэтому и не работает как надо
Дело в том, что Trigger Player нужно юзать в триггере, который срабатывает на событие игрока, например, игрок написал в чат что-нибудь. А у тебя событие на юнита.
Так что ещё раз: Нужно юзать владелец юнита в этом триггере
Я попробовал всё добавляется
Да, не сработало. Для верности записал владельца юнита в переменную. Не догадался использовать ResearchingUnit, на этот раз поставил его. И все равно не сработало!
Что ж, отчет дальше: Бородач дал хороший совет. я так же решил попробовать проверять сколько юнитов находится в группе заводов игрока, номер которого я ввел. И выяснилось, что первый игрок это все-таки 1, второй игрок это 2. И когда второй игрок строит завод, этот завод в его группу не попадает. Почему? Прикрепляю этот триггер, вдруг я душевно больной и не могу добавить юнита в отряд...

Товарищи! я сейчас сижу и чуть ли не плачу наверное... Так стыдно...
я забыл выставить максимальное количество массивов для группы юнитов...
Простите меня, пожалуйста за мою бестолковость.
Сейчас все работает просто замечательно.
Вывод из этой ветки можно сделать такой: при работе с массивом нельзя забывать выставлять максимальное количество ячеек этого массива.
Спасибо большое за вашу помощь, друзья! Без нее я бы очень долго втыкал.
Загруженные файлы
1
22
3 года назад
1
я забыл выставить максимальное количество массивов для группы юнитов...
тоже ща об этом хотел сказать и вспомнил как у меня была похожая проблема с группами, когда ещё на 1.26 сидел

И выяснилось, что первый игрок это все-таки 1, второй игрок это 2.
ну в твоём случае с ГУИ - да. Я ж объяснил как это работает
Принятый ответ
0
4
3 года назад
0
Proshel_Doty:
я забыл выставить максимальное количество массивов для группы юнитов...
тоже ща об этом хотел сказать и вспомнил как у меня была похожая проблема с группами, когда ещё на 1.26 сидел

И выяснилось, что первый игрок это все-таки 1, второй игрок это 2.
ну в твоём случае с ГУИ - да. Я ж объяснил как это работает
А, я что-то не понял, что она сама по себе используется. я подумал, ты мне ее дал, чтобы я ее сам использовал, хех. Спасибо еще раз! И всем остальным тоже! Этот вопрос теперь закрыт.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.