Возможно ли отследить незанятого работника?
Собственно - возможно ли отследить незанятого работника?
Тоесть, я хочу сделать так, чтоб каждого незанятого работника подсвечивало сверху восклицательным знаком (модель talktome)
Думаю вешать баф с анимацией этой модели на афк работника.
Возможно ли как-то отловить это?
Либо если есть идея как можно это оформить подругому, жду предложения.

Лучший ответ:
Вообщем решение как обозначить незанятого раба простое пока не пришло(
Делаем способность А на основе Atol. Если не JNGP, то на основе Asph. Способности даём нужный эффект.
Далее делаем триггер.
Событие: каждые 0.25 секунд игры
Действия
Установить Workers = Юниты на Вся карта типа Работник.
Выбрать всех юнитов в Workers и для каждого делать
    Custom script: if GetUnitCurrentOrder(GetEnumUnit()) == 0 then
    Добавить способность А Выбранному юниту.
    Custom script: else
    Удалить способность А у Выбранного юнита.
    Custom script: endif
Custom script: call DestroyGroup(udg_Workers)

А вот и карта.


Views: 903

» Лучшие комментарии


prog #1 - 10 months ago 0
Голосов: +0 / -0
Всегда можно пойти в лоб - отслеживать приказ stop, добавлять в группу. Отслеживать все остальные приказы, удалять из группы.
МрачныйВорон #2 - 10 months ago 0
Голосов: +0 / -0
читал, что в новых патчах добавили boolean-проверку на бездействие. но это может быть не точно
nvc123 #3 - 10 months ago 0
Голосов: +0 / -0
prog, работник может стать незанятым и без приказа, например когда завершил постройку здания
Obelick #4 - 10 months ago 1
Голосов: +1 / -0
Можно выбирать всех работников на карте и если их текущий приказ = null то значит работник стоит афк.
prog #5 - 10 months ago 0
Голосов: +0 / -0
nvc123, мне казалось что stop отдается автоматически в любом случае, но, конечно, могу ошибаться, давно последний раз с этим работал.
dmgr #6 - 10 months ago 0
Голосов: +0 / -0
Obelick:
Можно выбирать всех работников на карте и если их текущий приказ = null то значит работник стоит афк.
Тригер с проверкой переодичностью каждую 1 сек?
Не не пойдет, большая нагрузка на карту. либо я тебя не правильно понял.
прикрепи пример тригера что имеешь ввиду.
нужно что-то типа:
событие - воин отдал приказ стоп
условие - воин=работник (у меня они самоубийцы в по)
действие - повесить баф или добавить способность с бафом.
иначе - удалить баф/способность.
как-то так...

Steal nerves:
читал, что в новых патчах добавили boolean-проверку на бездействие. но это может быть не точно
1.26 нужен. новые версии кривее всего кривого((((
DracoL1ch #7 - 10 months ago 0
Голосов: +0 / -0
без мемхака?
МрачныйВорон #8 - 10 months ago 0
Голосов: +0 / -0
Obelick, это тоже не всегда помогает к сожалению. как сказал nvc123
PT153 #9 - 10 months ago 1
Голосов: +1 / -0
Достаточно просто отслеживать, что текущий приказ 0.

Не не пойдет, большая нагрузка на карту.
Совсем не большая нагрузка. В лазурных башнях период меньше, а лагов нет.
Clamp #10 - 10 months ago 0
Голосов: +0 / -0
Попробуй ForceUIKey("`") (ну или какой там хоткей на выбор незанятых рабочих)

В лазурных башнях период меньше, а лагов нет.
В лазурных башнях максимум 5 рабочих на игрока
PT153 #11 - 10 months ago (изм. ) 1
Голосов: +1 / -0
Steal nerves, это как раз-таки поможет, если приказ 0, то юнит ничего не делает.

В лазурных башнях максимум 5 рабочих на игрока
А причём тут рабочие? Любой игрок может построит 100500 финальных башен, для которых и делается цикл 4 раза в секунду.

В любом случае нагрузка никчёмная.
Clamp #12 - 10 months ago 0
Голосов: +0 / -0
Подробнее опишу свою идею: запоминаем выделение игрока, после чего форсим выбор незанятых рабочих в цикле, добавляя их в исходно пустую группу. Когда выделится рабочий, уже находящийся в группе, считаем группу полной и всем рабочим без "!" вешаем "!", после чего выделяем тех юнитов, которые были выделены игроком.

Не уверен, что оно сработает, но сомнение есть только в том, можно ли зафорсить не буквенную клавишу, в остальном метод сработает 100%
PT153 #14 - 10 months ago (изм. ) 3
Голосов: +3 / -0
Не виду смысла городить костыли через выделение, ибо приказы могут отдаваться триггерно. Достаточно просто 4 раза в секунду у всех рабочих смотреть приказ. Нагрузки на карту не будет. И вообще, с чего бы её быть? Откуда это убеждение, что периодические события или таймеры - плохо?

Выбираем всех рабочих.
Для всех рабочих проверяем приказ. Если он 0, удаляем рабочего из группы.
На выходе имеем группу незанятых рабочих.

Делал похожее тут. Там карта, где 4 раза в секунду отображаются приказы юнита. Когда юнит ничего не делает, приказ 0.
МрачныйВорон #15 - 10 months ago (изм. ) 0
Голосов: +0 / -0
PT153, ну ладно. если работает. просто это мб не всегда так, я просто уже не помню. Но когда то Диод говорил что не работает. Например, у вас стоит рабочий, его атаковал враг, рабочий естественно убежит от него. Но приказ то он не имеет вообще, тк не получал приказа от игрока вроде. Там надо тогда проверять не сдвинулся. Но и еще много других случаев. Пардон, мы говорим не про бездействие юнита, а про занятость. хотя это почти одно и тоже
PT153 #17 - 10 months ago (изм. ) 4
Голосов: +4 / -0
Но когда то Диод говорил что не работает.
Старички XGM много чего говорили, вот только это было лет 10 назад, за 10 лет вещи изменились. Близы не всегда пишут все изменения. Порой это просто невозможно.
Например, у вас стоит рабочий, его атаковал враг, рабочий естественно убежит от него.
Способ Clamp данный случай не хендлит как раз. При этом убегающий рабочий не является незанятым.
Но приказ то он не имеет вообще, тк не получал приказа от игрока вроде.
Но он имеет приказ. Пруф.
Поэтому способ с проверкой приказа на 0 вполне рабочий.
Прикрепленные файлы
DracoL1ch #18 - 10 months ago 1
Голосов: +1 / -0
Приказа при автоатаке, убегании - нет. Он пустой.
Clamp #19 - 10 months ago 1
Голосов: +1 / -0
Способ Clamp данный случай не хендлит как раз.
Лол, описанный мной вариант тупо выделяет всех рабочих, которые находятся под кнопкой "свободные рабочие", я хз о чём ты. Убегающий рабочий не является незанятым, он занят убеганием (твой кэп).
PT153 #20 - 10 months ago (изм. ) 0
Голосов: +0 / -0
убегании - нет
Есть, приказ "move", карта выложена выше. Для автоатаки не смотрел, ибо речь о рабочих.

Clamp, я изначально не понял, что имелось в виду. Да и сейчас не совсем ясно, с какой периодичностью происходит перебор всех незанятых рабочих. Если это делается единожды и далее занятость снимается и восстанавливается только на отслеживании выделения юнитов, то, как и сказал, такой способ не хендлит случай убегания: рабочий был свободен в момент форса, но после стал убегать, при это игрок им не управлял. Если есть периодичность, то проще просто проверять текущий приказ.

Вроде понял, периодичность должна быть. Но не думаю, что можно вызывать ForceUIKey в цикле без пауз между вызовами.
dmgr #21 - 10 months ago 0
Голосов: +0 / -0
PT153:
убегании - нет
Есть, приказ "move", карта выложена выше. Для автоатаки не смотрел, ибо речь о рабочих.

Clamp, я изначально не понял, что имелось в виду. Да и сейчас не совсем ясно, с какой периодичностью происходит перебор всех незанятых рабочих. Если это делается единожды и далее занятость снимается и восстанавливается только на отслеживании выделения юнитов, то, как и сказал, такой способ не хендлит случай убегания: рабочий был свободен в момент форса, но после стал убегать, при это игрок им не управлял. Если есть периодичность, то проще просто проверять текущий приказ.

Вроде понял, периодичность должна быть. Но не думаю, что можно вызывать ForceUIKey в цикле без пауз между вызовами.
Ваши рассуждения и пруфы, конечно очень интересны и познавательны. Много нового для себя узнал.
Только вот мне не важно будет ли работник убегать или что-то еще. Мне важно будет ли он стоять афк без работы.
И как без переодичности и выборки на него набросить эффект анимации.
Желательно простым способом.
Я думал над способностью "выбрать воина" или "продать предмет/общие магазины"(магазин). Давать ее глобально по карте если приказ работника =0 (афк). Но она не выбирает работников, только героев или воинов с рюкзаком.
Так же думал про способность "спрятаться", типа приказ стоп набрасывает невидимость, а вместо этого вешать анимку (восклицательного знака), но опять же, как тогда убрать невидимость с воина (без проверки и переодичности)...
Вообщем решение как обозначить незанятого раба простое пока не пришло(
PT153 #22 - 10 months ago (изм. ) 3
Голосов: +3 / -0

Вообщем решение как обозначить незанятого раба простое пока не пришло(
Делаем способность А на основе Atol. Если не JNGP, то на основе Asph. Способности даём нужный эффект.
Далее делаем триггер.
Событие: каждые 0.25 секунд игры
Действия
Установить Workers = Юниты на Вся карта типа Работник.
Выбрать всех юнитов в Workers и для каждого делать
    Custom script: if GetUnitCurrentOrder(GetEnumUnit()) == 0 then
    Добавить способность А Выбранному юниту.
    Custom script: else
    Удалить способность А у Выбранного юнита.
    Custom script: endif
Custom script: call DestroyGroup(udg_Workers)

А вот и карта.
Прикрепленные файлы
PT153 #23 - 10 months ago 0
Голосов: +0 / -0
Автор жив?
pro100master #24 - 10 months ago 0
Голосов: +0 / -0
PT153, сбежал от вас =)
dmgr #25 - 10 months ago 0
Голосов: +0 / -0
PT153:
Автор жив?
Жив к сожалению.
По сабжу, твой вариант работает, спасибо!
Но мне он не подходит, я говорил что тригер с переодичностью не пойдет по ряду причин. Например потому, что у меня 2 тригера с переодичностью уже вшиты в карту. Третий даст нагрузку. 12 игроков - три тригера, на них по 20-30 рабочих... Вообщем, такое.
МОжет кто предложит что попроще, или сам придумаю решение.
pro100master #26 - 10 months ago 0
Голосов: +0 / -0
а зачем тут таймер если вы ловите события приказ цели а дейсвия паузить стоп снять паузу и как будето ничего не происходит
dmgr #27 - 10 months ago 0
Голосов: +0 / -0
его
как бы каждые 0.25 сек. подсчет новой группы рабочих или ты о чем?
если есть вариант предложи\покажи
8gabriel8 #28 - 10 months ago 0
Голосов: +0 / -0
newtone, во-первых, в конкретных числах дай данные про нагрузку от периодического таймера. Во-вторых, предложенный вариант с отловом приказа выглядит так:
Событие: 3 события Generic unit Отдал приказ цель-объект/цель-точка/без цели
Условие: Unit-type of (Triggering unit) равно Работник
Действие: If (Issued order) равно Стоп ИЛИ <пусто> и (Triggering unit) is in Unit group FREE_WORKERS равно Нет, Then Добавить спецэффект и внести в группу FREE_WORKERS, Else Ничего
If (Triggering unit) is in Unit group FREE_WORKERS равно Да и (Issued order) не равно Стоп ИЛИ <пусто> Then Убрать спецэффект и убрать из группы FREE_WORKERS, Else Ничего
Только какое-то удобное запоминание спецэффекта нужно сделать.

Например, через предложенную PT153 способность Atol, когда даёшь и удаляешь не эффект, а способность, что мне кажется оптимальным, ведь тогда и группа не нужна, достаточно проверять лишь уровень способности, либо через Custom value, когда юнит получает custom value, эффект сохраняется в переменную-массив с индексом [custom value of (Triggering unit)], а custom_value=custom_value+1, но так есть угроза превышения размера массива при длительной игре, либо можно новые переменные-массивы при превышении лимита массива подключать, либо проверять custom value работника на больше 0, если да, то давать его custom value, а не новый. Лимит массива 8191 на патчах до 1.29 и 32767 на новых, получить превышение лимита массива в таком случае теоретически возможно, если на старых патчах все 12 игроков создадут за всё время игры более 682 незанятых работников каждый, а если кто-то из 12 не создаст, то другим надо будет взять на себя его количество, а на новых патчах более 1365 работников каждому из 24 игроков. Мне трудно представить игру, в которой такое могло бы быть, но если для твоей карты такая угроза может быть актуальной, то можно отслеживать смерть работника с custom value и применять его для новых, так как одновременное нахождение на карте восьми тысяч юнитов не выдержит никакой патч, то есть мёртвых работников с custom value выше 0 заноси в группу, при появлении нового незанятого проверяй количество юнитов в группе больше 0, тогда давай новому работнику custom value трупа, которого из группы убирай. Есть ещё более извращённые варианты, но они нужны для специфических случаев.

Ах да, если незанятого работника мгновенно убьют, то спецэффект так на нём и останется, нужно убирать.
PT153 #29 - 10 months ago (изм. ) 1
Голосов: +1 / -0
Третий даст нагрузку.
Какую? У меня в карте куча башен (20-30 на игрока, всего 10 игроков), каждая чекает врагов рядом 16 раз в секунду, лагает только у людей со слабым интернетом и пк. У меня стабильно 30 фпс, хотя у меня далеко не топовый пк.
Любой другой способ нагружать будет ещё больше. Никак нельзя отследить, что приказ стал 0, в любом случае нужно для каждого юнита периодически смотреть текущий приказ. Либо общий таймер, либо индивидуальный.
8gabriel8:
Ах да, если незанятого работника мгновенно убьют, то спецэффект так на нём и останется, нужно убирать.
Со способностью эффект тоже останется. Удобство тут в том, что в способности можно указать несколько эффектов и точек креплений, не нужно проверять, есть ли у юнита уже такой эффект, и при смерти юнита не нужно эффект удалять.