И так эта статься для тех кто хочет сделать как в доте чтоб магический круг собирал предметы (когда герой скидывает их на круг) и выбрасывал их (при нажатии на кнопку). Сначала нам понадобиться две способности. 1) Эта способность любая чтоб она была мгновенная. Назовен ее Drop Item - эта кнопка будет выбрасывать предметы. 2) Аналогичная первой. - Назовем ее Get Item - эта кнопка будет собирать предметы которые скинул на магический круг герой. Теперь перейдем к триггера. Первый триггер назовем Drop Item - он будет отвечать за скидывание предметов. Его работа проста. Создаем событие Юнит начинает применять способность. Далле условие что применяемая способность равна = способности Drop Item. И действие Для начала создадим локальные перменные.
Code
local integer l = 0 - это наша перменная целоисчислительная для цикла.
Code
local unit u = GetTriggerUnit() - это наша перменная в которой знчение юнит применивший заклинание.
теперь делаем цикл
Code
loop exitwhen l > 5 if (UnitItemInSlot(u, l) != null) then call UnitDropItemPoint(u, UnitItemInSlot(u, l), GetUnitX(u), GetUnitY(u)) endif set l = l + 1 endloop
Code
UnitItemInSlot() - это функция которая будет проверять есть ли у юнита предмет в слоте.
Если есть то делать действие
Code
call UnitDropItemPoint() - Эта функция отвечает за сбрасывание предмета у юнита на его положение на карте.
и все закрываем цикл и пишем
Code
set u = null(аля оптимизация)
Все наш триггер по сбросу предметов готов. Теперь переходим к триггеру для поднятия предметов. Создаем то же самое событие что и для первого триггера (юнит использует способность) Далее условие что наша способность равна = способность GetItem И действие. Сначала создаем локалные чтоб было легче писать функции и сокрашать их.
Code
local unit u = GetTriggerUnit() - наш юнита который применил способность local integer l = 0 - целоисчислительная для цикла. local integer id = 0 - целоисчислительная для взятия у предметов их id.
и
Code
local rect r = Rect(GetUnitX(u) - 100, GetUnitY(u) - 100, GetUnitX(u) + 100, GetUnitY(u) + 100) - это наша область вокруг юнита для того чтоб юнит мог ориентироваться где ему собирать предметы.
теперь цикл
Code
loop exitwhen l > 5 - 5 = это кол -во слотов у юнита. Счет начинаеться с 0. дальше нам надо узнать есть ли у юнита свободные слоты. if (UnitItemInSlot(u, l) == null) then если етьс то выполнить следующие действия set bj_lastRemovedItem = null - этим мы объявляем что все предметы которые были у нашого круга все они равны = null.
далле нам нужно опеределиться все предметы что есть в области вокруг юнита.
Code
call EnumItemsInRect(r, null, function SeeItem) - эта функция берет все предметы вокруг юнита и вызывает функцию для них - эту функцияю мы создадим для
Code
утановления bj_lastRemovedItem - что вокруг юнита есть предмет.
далее мы создаем отдельную в этом жу триггер функция для установелния предметов вокруг юнита.
Code
function SeeItem takes nothing returns nothing set bj_lastRemovedItem = GetEnumItem() endfunction
возвращаемся к нашему циклу. Теперь нам надо узнать не равен ли bj_lastRemovedItem нулю
Code
if (bj_lastRemovedItem != null) then
если не равен то делать действия.
Code
set id = GetItemTypeId(bj_lastRemovedItem) - помните нашу перменную id которую мы создали для записи id предмета которго выделии. Вот в нее мы и записываем id нашего выделенного вокруг юнита предмета.
и теперь можно добавить предмет юнита просто сделав так
Code
call UnitAddItemById(u, id)
и последнее это надо удалить предмет который мы выделяли.
Code
call RemoveItem(bj_lastRemovedItem)
все наш цикл готов можно его закрывать
Code
endif endif set l = l + 1 endloop
и обязательно оптимизация
Code
set u = null call RemoveRect(r) set r = null
Вот мы и сделали поднятие и выбрасывание предметов как в доте у магического круга. Вот весь триггер. 1)
function Trig_Drop_Item_Actions takes nothing returns nothing local integer l = 0 local unit u = GetTriggerUnit() loop exitwhen l > 5 if (UnitItemInSlot(u, l) != null) then call UnitDropItemPoint(u, UnitItemInSlot(u, l), GetUnitX(u), GetUnitY(u)) endif set l = l + 1 endloop set u = null endfunction
//=========================================================================== function InitTrig_Drop_Item takes nothing returns nothing set gg_trg_Drop_Item = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Drop_Item, EVENT_PLAYER_UNIT_SPELL_CAST ) call TriggerAddCondition( gg_trg_Drop_Item, Condition( function Trig_Drop_Item_Conditions ) ) call TriggerAddAction( gg_trg_Drop_Item, function Trig_Drop_Item_Actions ) endfunction
function SeeItem takes nothing returns nothing set bj_lastRemovedItem = GetEnumItem() endfunction
function Trig_Get_Item_Actions takes nothing returns nothing local unit u = GetTriggerUnit() local integer l = 0 local integer id = 0 local rect r = Rect(GetUnitX(u) - 100, GetUnitY(u) - 100, GetUnitX(u) + 100, GetUnitY(u) + 100) loop exitwhen l > 5 if (UnitItemInSlot(u, l) == null) then set bj_lastRemovedItem = null call EnumItemsInRect(r, null, function SeeItem) if (bj_lastRemovedItem != null) then set id = GetItemTypeId(bj_lastRemovedItem) call UnitAddItemById(u, id) call RemoveItem(bj_lastRemovedItem) endif endif set l = l + 1 endloop set u = null call RemoveRect® set r = null endfunction
//=========================================================================== function InitTrig_Get_Item takes nothing returns nothing set gg_trg_Get_Item = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Get_Item, EVENT_PLAYER_UNIT_SPELL_CAST ) call TriggerAddCondition( gg_trg_Get_Item, Condition( function Trig_Get_Item_Conditions ) ) call TriggerAddAction( gg_trg_Get_Item, function Trig_Get_Item_Actions ) endfunction
Проверить можно просто скинуть предмет окол юнита а потом использовать способность GetItem. Юнит(магический круг) соберет все около него предметы если у него есть свободные слоты. Удачи. Всего наилучшего lawson.
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Суббота, 19 Марта 2011, 23:40:31
Лучше бы написал как сделать, что бы можно было собирать предмет, если нет слотов, а остался один предмет И почему переменную u ты устанавливаешь как переключающий юнит, а не применяющий