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

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

Закрытая тема
 
FatalBlade

offline
Опыт: 7,398
Активность:
Герой ПОЛУЧАЕТ ПРИКАЗ передать предмет другому герою - какое событие это отслеживает?
Мне нужно отслеживать не саму передачу предмета одного героя другому, а сам приказ этого действия. Т.е. если герои на далёком расстояние, и я приказываю герою передать предмет из инвентаря другому герою. Как отседить сам приказ? Я пробовал EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER, но не работает.
Напоминаю, мне нужно не EVENT_PLAYER_UNIT_DROP_ITEM, потому что EVENT_PLAYER_UNIT_DROP_ITEM отслеживает саму передачу (или потерю предмета).
Старый 19.11.2012, 14:11
DioD

offline
Опыт: 45,134
Активность:
EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER, но не работает.
показывай код.
Старый 19.11.2012, 14:39
FatalBlade

offline
Опыт: 7,398
Активность:
DioD:
показывай код.
Что показывать то? У меня есть триггер который отслеживает приказ поднятия предмета с земли, и он работает. Там как раз событие EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER. Но он не срабатывает на приказ передачи предмета. Проверил в отдельной карте - то же самое. Видимо EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER не учитывает приказ передачи предмета.
Мне нужно при приказе передачи проверить свои условия, и если условия возвращают false - остановить героя и написать что передача не возможна.
Или же второй вариант, если отследить такой приказ не возможно. При самой передачи предмета (т.е. EVENT_PLAYER_UNIT_PICKUP_ITEM), если условия возвращают false, то вернуть предмет в инвентарь героя, который пытался передать предмет. Здесь я то же без понятия как сделать, потому я не знаю как вычислить героя который передаёт предмет. GetManipulatingUnit() ведь возвращает юнтиа который получает предмет.

Отредактировано FatalBlade, 19.11.2012 в 14:54.
Старый 19.11.2012, 14:45
DioD

offline
Опыт: 45,134
Активность:
показывай как ты проверял, меня не интересует как это просто легко и понятно.
Старый 19.11.2012, 14:49
FatalBlade

offline
Опыт: 7,398
Активность:
Ну ладно
((код jass
function Trig_Pick_Item_Conditions takes nothing returns boolean
return GetOrderTargetItem() != null and GetOrderTargetUnit() == null and IsUnitType( GetOrderedUnit(), UNIT_TYPE_HERO ) == true
endfunction
function Order_HasItemOfLevel takes unit whichUnit, integer level returns boolean
local integer i = 0
loop
exitwhen i > 5
if GetItemLevel(UnitItemInSlot(whichUnit,i)) == level then
return true
endif
set i = i + 1
endloop
return false
endfunction
function Order_HasTheSameItemAlready takes unit whichUnit, integer itt returns boolean
local integer i = 0
loop
exitwhen i > 5
if GetItemTypeId(UnitItemInSlot(whichUnit,i)) == itt then
return true
endif
set i = i + 1
endloop
return false
endfunction
function Trig_Pick_Item_Actions takes nothing returns nothing
local integer id = GetHandleId(gg_unit_h02F_0082)
local unit u = GetOrderedUnit()
local item it = GetOrderTargetItem()
local integer itt = GetItemTypeId(it)
local integer il = GetItemLevel(it)
local boolean CheckSameItem = Order_HasTheSameItemAlready( u, itt )
local boolean CheckSetParts = false
local boolean CheckSetFull = false
local boolean AllowItem = true
local player p = GetOwningPlayer(u)
local integer o = GetPlayerId(p) + 1
local sound s = CreateSoundFromLabel( "InterfaceError",false,false,false,10,10)
local real x
local real y
local integer n = 75
if il == 3 then
set n = 73
set CheckSetFull = Order_HasItemOfLevel( u, 4 )
set AllowItem = CheckSetFull
elseif il == 4 then
set n = 74
set CheckSetParts = Order_HasItemOfLevel( u, 3 )
set CheckSetFull = Order_HasItemOfLevel( u, 4 )
set AllowItem = CheckSetFull and CheckSetParts
endif
if AllowItem == false or CheckSameItem == true then
set x = GetWidgetX(it)
set y = GetWidgetY(it)
call RemoveItem(it)
set it = CreateItem( itt, x, y )
call AttachSoundToUnit(s, u)
call SetSoundVolume(s, 127)
if GetLocalPlayer() == p then
call ClearTextMessages()
call StartSound(s)
endif
call DisplayTimedTextToPlayer( p, 0, 0, 2.00, LoadStr(udg_Hash, id, n + udg_Lan[o]) )
endif
call KillSoundWhenDone(s)
set it = null
set s = null
set p = null
set u = null
endfunction
===========================================================================
function InitTrig_Pick_Item takes nothing returns nothing
local integer index = 0
set gg_trg_Pick_Item = CreateTrigger()
loop
call TriggerRegisterPlayerUnitEvent( gg_trg_Pick_Item, Player(index), EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER, null )
set index = index + 1
exitwhen index >= 10
endloop
call TriggerAddCondition( gg_trg_Pick_Item, Condition( function Trig_Pick_Item_Conditions ) )
call TriggerAddAction( gg_trg_Pick_Item, function Trig_Pick_Item_Actions )
endfunction
))
FatalBlade добавил:
В этом триггере есть условие GetOrderTargetUnit() == null, но и без него не работает. На отдельной карте я вообще не писал никаких условий, и не работало.
Старый 19.11.2012, 15:14
DioD

offline
Опыт: 45,134
Активность:
Если бы была отладка, то сразу бы стало видно, что действия по выкидыванию вещей не запускают данные события, ВООБЩЕ.
приказ 852001, по невыясненным причинам, он не создаёт никаких событий, даже хак с каналом не пашет, увы реализовать то что хотите просто так не выйдет.
function Trig_Untitled_Trigger_002_Actions takes nothing returns nothing
    call DisplayTextToPlayer(GetLocalPlayer(),0,0,"CHECK")
    call TriggerSleepAction(1.0)
    call DisplayTextToPlayer(GetLocalPlayer(),0,0,I2S(GetUnitCurrentOrder(GetTriggerUnit())))
endfunction

//===========================================================================
function InitTrig_Untitled_Trigger_002 takes nothing returns nothing
    set gg_trg_Untitled_Trigger_002 = CreateTrigger(  )
    call TriggerRegisterUnitEvent( gg_trg_Untitled_Trigger_002, gg_unit_Hmkg_0000, EVENT_UNIT_USE_ITEM )
    call TriggerRegisterUnitEvent( gg_trg_Untitled_Trigger_002, gg_unit_Hmkg_0000, EVENT_UNIT_PICKUP_ITEM )
    call TriggerRegisterUnitEvent( gg_trg_Untitled_Trigger_002, gg_unit_Hmkg_0000, EVENT_UNIT_DROP_ITEM )
    call TriggerRegisterUnitEvent( gg_trg_Untitled_Trigger_002, gg_unit_Hmkg_0000, EVENT_UNIT_SELL_ITEM )
    call TriggerRegisterUnitEvent( gg_trg_Untitled_Trigger_002, gg_unit_Hmkg_0000, EVENT_UNIT_PAWN_ITEM )
    call TriggerRegisterUnitEvent( gg_trg_Untitled_Trigger_002, gg_unit_Hmkg_0000, EVENT_UNIT_ISSUED_TARGET_ORDER )
    call TriggerRegisterUnitEvent( gg_trg_Untitled_Trigger_002, gg_unit_Hmkg_0000, EVENT_UNIT_ISSUED_POINT_ORDER )
    call TriggerRegisterUnitEvent( gg_trg_Untitled_Trigger_002, gg_unit_Hmkg_0000, EVENT_UNIT_ISSUED_ORDER )
    call TriggerAddAction( gg_trg_Untitled_Trigger_002, function Trig_Untitled_Trigger_002_Actions )
endfunction
Прикрепленные файлы
Тип файла: w3x 5445.w3x (17.7 Кбайт, 4 просмотров )
Старый 19.11.2012, 17:16
FatalBlade

offline
Опыт: 7,398
Активность:
DioD, ок спс.
А что ты имеешь ввиду "хак с каналом"?
Старый 19.11.2012, 17:46
DioD

offline
Опыт: 45,134
Активность:
карта приложена не просто так, надо после хак с каналом писать
[+] замечание от NIGHTWOLF: 4.1.1 (бессмысленное сообщение)

Отредактировано NIGHTWOLF, 20.11.2012 в 13:08.
Старый 19.11.2012, 17:47
FatalBlade

offline
Опыт: 7,398
Активность:
DioD, чё?
Да и видел что ты с каналом сделал. Просто ты назвал это "хак" :)
Чтож придётся помимо триггера с событием на приказ взятие предмета, создавать отдельный триггер с событием на само взятие предмета.
Старый 19.11.2012, 17:51
Закрытая тема

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

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

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

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



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