XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Doc

offline
Опыт: 63,163
Активность:
Отлов smart'а по юниту
library OrderSystem initializer i

private function a2 takes nothing returns nothing
local unit u = GetTriggerUnit()
if GetIssuedOrderId() == OrderId("smart") then
call BJDebugMsg("!")
endif
set u = null
endfunction

private function i takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER )
call TriggerAddAction(t,function a2)
set t = null
endfunction

endlibrary
В общем, клик по точке отлавливается прекрасно, точно таким же тригом, только с измененным ивентом. А вот с кликом по юниту все намного сложнее. Проблема в том, что клик по юниту отлавливается только один, НО если отдать другой приказ и опять кликнуть по юниту опять же отлавливается только один приказ.
DoctorGester добавил:
Где все жассеры? =(

Отредактировано DoctorGester, 06.02.2010 в 23:58.
Старый 06.02.2010, 23:58
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
GetTriggerUnit - контролируемый юнит
GetIssueTargetUnit
или
GetOrderTargetUnit могу ошибаться я сейчас с телефна пишу
не знаю точное название функции
ищи на GetOrder ... или GetIssue
опятьже не знаю точно
Bee добавил:
все жассеры спят в это время суток
Старый 07.02.2010, 01:01
Doc

offline
Опыт: 63,163
Активность:
Bee, да не нужно мне это) GetOrderedUnit() я и так знаю, проблема в том, что не отслеживается несколько последовательных кликов правой по юниту, собственно сам этот юнит мне сейчас не нужен. Мне нужно при каждом клике увеличивать уровень способности героя, что успешно делается при ивенте ордера на точку.
Старый 07.02.2010, 01:05
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
xd
я не вижу код целиком) уменя не высвечивается строка евента. я не могу говорить точно но чтобы он отлавливал дамми нужен евент клик не на поинт, не мнгновенный а на обьект. в гуи 3 варианта, не запутаешся.
Старый 07.02.2010, 01:31
Doc

offline
Опыт: 63,163
Активность:
Bee, у меня на телефоне тоже самое, но могу тебе сказть, что с ивентом все в порядке
Старый 07.02.2010, 01:55
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
тогда покажи код, где пытался отловить дамми.
Bee добавил:
я просмотрелвнимательно код в первом посте. зачем ты создаеш локалку вв функции а2?
Старый 07.02.2010, 02:13
JamesBlack
black mind
offline
Опыт: 6,595
Активность:
Bee, вся проблема, почему у DoctorGester'а не получается повторно отловить приказ - варик видимо оптимизирует все, и если отдается команда "смарт" на ту же цель, на которую она уже была отдана, он не меняет приказ просто. А с территорией проблема в том, что хрен с два ты попадешь в те же координаты при клике мышкой (мышка при клике немножечко сдвигается), поэтому проблемы и не возникает), поэтому проблемы то у него в том случае и нет, все нажатия обрабатываются.

Когда я посоветовал триггерно отменять приказ и тут же его приказывать снова, выяснилось, что наблюдается большая задержка - юнит долго "думает" над каждым кликом мышки, и если надо часто кликать - вообще практически не атакует.

Что тут сделать я не знаю.
Старый 07.02.2010, 02:17
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
и всетаки мне кажется что проблема в самом коде.
а в гуи у тебя работает?
Старый 07.02.2010, 02:21
JamesBlack
black mind
offline
Опыт: 6,595
Активность:
ну, я код видел, никаких эксцессов там не заметил.
Старый 07.02.2010, 02:30
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Цитата:
Где все жассеры? =(
Вот здесь

FellGuard добавил:
У меня с тем же кодом всё прекрасно отлавливается, даже куча кликов по мышке все ловятся в разном порядке, для верности счётчик ввёл.
Код:
library OrderSystem initializer i
    globals
        integer i=1
    endglobals

    private function a2 takes nothing returns nothing
        local unit u = GetTriggerUnit()
        if GetIssuedOrderId() == OrderId("smart") then
            call BJDebugMsg("! "+I2S(i))
            set i = i + 1
        endif
        set u = null
    endfunction

    private function i takes nothing returns nothing
        local trigger t = CreateTrigger()
        call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER )
        call TriggerAddAction(t,function a2)
        set t = null
    endfunction
endlibrary
Единственная причина мне кажется в том, что что-то ещё срабатывает на то же самое событие и как-то мешает выводить сообщение, экран очищает, например. Проблема не в этом отрезке кода.
Старый 07.02.2010, 08:57
DioD

offline
Опыт: 45,134
Активность:
Смарт и будет отлавливаться только один.
или вы думаете что юнит получает приказ смарт и тут же получает другой приказ (ну например атака), вот ничего подобного.
Старый 07.02.2010, 10:51
Doc

offline
Опыт: 63,163
Активность:
FellGuard, ни фига, с кодом все нормально, сообщение выводится, но только одно, повторяюсь если слегка поменять событие на отлов приказа на точку, все нормально.
DioD, это можно как либо исправить?
Старый 07.02.2010, 13:00
SRes
1110101000
offline
Опыт: 9,997
Активность:
Вполне логично что движок не отправляет лишний раз приказ юниту, если он аналогичен с текущим, ибо это лишний трафик. Исправить нельзя.
Старый 07.02.2010, 13:05
DioD

offline
Опыт: 45,134
Активность:
а зачем?
вы должны знать что смарт на вражеском юните это атака а на дружественном движение
sres не пиши ересь, не знаешь молчи, всё движок ловит.
Старый 07.02.2010, 13:06
Doc

offline
Опыт: 63,163
Активность:
DioD, мне пришла в голову идея закликивания игроком врагов ну и земли соответственно.
вы должны знать что смарт на вражеском юните это атака а на дружественном движение
не ловится так, да и не нужно мне это.
Мне нужно лишь повышать значение переменной при каждом клике, это можно как либо реализовать?
Старый 07.02.2010, 13:20
DioD

offline
Опыт: 45,134
Активность:
приказ смарт отдаётся при каждом клике.
Старый 07.02.2010, 13:31
Doc

offline
Опыт: 63,163
Активность:
DioD, ну не ловится он, проверь
Старый 07.02.2010, 13:36
SRes
1110101000
offline
Опыт: 9,997
Активность:
Да, наш великий диод все знает. Дык чего же ты не отвечаешь четко на вопрос, а петляешь туда-сюда ? Ты писал движок ? Нет ? Ну вот. Я делаю логичные выводы, а ты делаешь выводы из своего величия. В отличии от тебя я не уверяю в своей точке зрения, она может быть ошибочной.
Старый 07.02.2010, 13:36
DioD

offline
Опыт: 45,134
Активность:
отдай два одинаковых приказа, и посчитай сколько сработало событий, не надо делать логических выводов (особенно тебе) надо просто протестировать.
если ты знаешь что твоя точка зрения может быть ошибочной зачем её высказывать то?
автор выдай ПОЛНЫЙ код, а не его часть, приказ ловиться всегда, один за клик.
Старый 07.02.2010, 13:40
Doc

offline
Опыт: 63,163
Активность:
DioD, хорошо, сейчас дам, я только что создал новую карту и вставил туда код FellGuarda, все то же самое, могу вас заверить.
DoctorGester добавил:
library OrderSystem initializer i

private function db takes unit u returns integer
if GetUnitTypeId(u) == 'O000' then
return 'sped'
endif
if GetUnitTypeId(u) == 'Otnk' then
return 'atck'
endif
return 0
endfunction

private function e takes nothing returns nothing
local unit u = GetEnumUnit()
call SetUnitAbilityLevel(u, db(u), GetUnitAbilityLevel(u, db(u)) - 1)
set u = null
endfunction

private function a2 takes nothing returns nothing
local unit u = GetTriggerUnit()
if GetIssuedOrderId() == OrderId("smart") then
call SetUnitAbilityLevel(u, db(u), GetUnitAbilityLevel(u, db(u)) + 1)
endif
set u = null
endfunction

private function a1 takes nothing returns nothing
local group gr = CreateGroup()
call GroupEnumUnitsInRect(gr,bj_mapInitialPlayableArea,null)
call ForGroup(gr,function e)
call GroupClear(gr)
call DestroyGroup(gr)
set gr = null
endfunction

private function a takes nothing returns nothing
local unit u = GetTriggerUnit()
if GetIssuedOrderId() == OrderId("smart") then
call SetUnitAbilityLevel(u, db(u), GetUnitAbilityLevel(u, db(u)) + 1)
endif
set u = null
endfunction

private function i takes nothing returns nothing
local trigger t = CreateTrigger()
local timer tm = CreateTimer()
call TimerStart(tm, 0.5, true, function a1)
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER )
call TriggerAddAction(t,function a)
set t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER )
call TriggerAddAction(t,function a2)
set t = null
endfunction

endlibrary
Ничего принципиально нового.

Отредактировано DoctorGester, 07.02.2010 в 15:28.
Старый 07.02.2010, 13:45
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 10:36.