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

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

Ответ
 
Rusvermilion
Ограничен ScorpioT1000
offline
Опыт: 18,299
Активность:
Сложеные предметы
Как сделать чтобы при покупке или подборе зелий они соединялись до 10?
Пример как в доте свитки тп, банки маны-хп.
Старый 24.06.2009, 07:30
KyTy3oFF
Смерть или слава!
offline
Опыт: 2,154
Активность:
Копировал с обучающей статьи из того же форума...
Ну а что бы было максимум 10 зарядов, то просто, когда юнит получат итем, то переменная +1, если использует или теряет, то минус сколько там нужно...

Код:
Складывание зарядов:

Событие:
 Боевая еденица - A unit Acquires an item
Условие:
 Or - any (Condition) are true
 Условия:
  (Item type of(Item begin manipulated)) равно <тип предмета1>*
  (Item type of(Item begin manipulated)) равно <тип предмета2>*
  (Item type of(Item begin manipulated)) равно <тип предмета3>*
Действия:
 Set it**=(Item type of(item begin manipulated))
 For each (Integer A) from 1 to 6 do (Actions)
 Цикл - Действия
  If (All Conditions are True) then do (Then Actions) else do (Else Actions)
  Если - Условия
   (Item type of(Item carried by (Triggering unit) in slot (Integer A))) равно it
   (Item carried by (Triggering unit) in slot (Integer A)) не равно (Item begin manipulated)
  То - действия
   Предмет - Set charges remaining in (Item carried by (Triggering unit) in slot (Integer A)) to ((Charges remaining in (Item carried by (Triggering unit) in slot (Integer A)) + (Charges remaining in (Item begin manipulated)))
   Предмет - Remove (Item begin manipulated)
  Иначе - действия

*Тип предмета, данный тригер универсален, и может складывать заряды всех типов предметов, указанных в условии
**Переменная типа "Тип предмета"

Отредактировано KyTy3oFF, 25.06.2009 в 17:22.
Старый 24.06.2009, 09:02
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
Код:
function Trig_ItemsStack_Conditions takes nothing returns boolean
    return ( GetItemCharges(GetManipulatedItem()) > 0 )
endfunction

function Trig_ItemsStack_Actions takes nothing returns nothing
local real x=0
local real y=0
local item it=null
set x=GetUnitX(GetManipulatingUnit())
set y=GetUnitY(GetManipulatingUnit())
    call UnitRemoveItem(GetManipulatingUnit(), GetManipulatedItem())
    if GetInvIOfItemType(GetManipulatingUnit(), GetItemTypeId(GetManipulatedItem())) == 0 then
        set it = CreateItem( GetItemTypeId(GetManipulatedItem()),x,y)
        call DisableTrigger( GetTriggeringTrigger() )
        call UnitAddItem(GetManipulatingUnit(), it)
        call EnableTrigger( GetTriggeringTrigger() )
        call SetItemCharges( it, GetItemCharges(GetManipulatedItem()) )
    else
        call SetItemCharges( GetItemOfTypeFromUnit(GetManipulatingUnit(), GetItemTypeId(GetManipulatedItem())), ( GetItemCharges(GetItemOfTypeFromUnit(GetManipulatingUnit(), GetItemTypeId(GetManipulatedItem()))) + GetItemCharges(GetManipulatedItem())))
    endif
    call RemoveItem(GetManipulatedItem())
set it=null
endfunction

//===========================================================================
function InitTrig_ItemsStack takes nothing returns nothing
local integer i=0
set gg_trg_ItemsStack = CreateTrigger()
loop
exitwhen i>bj_MAX_PLAYER_SLOTS
call TriggerRegisterPlayerUnitEvent(gg_trg_ItemsStack, Player(i), EVENT_PLAYER_UNIT_PICKUP_ITEM, null)
set i=i+1
endloop
call TriggerAddCondition( gg_trg_ItemsStack, Condition( function Trig_ItemsStack_Conditions ) )
call TriggerAddAction( gg_trg_ItemsStack, function Trig_ItemsStack_Actions )
endfunction



А вот это надо вставить в кастом скрипт карты:

Код:
function GetInvIOfItemType takes unit whichUnit, integer itemId returns integer
    local integer index
    local item    indexItem

    set index = 0
    loop
        set indexItem = UnitItemInSlot(whichUnit, index)
        if (indexItem != null) and (GetItemTypeId(indexItem) == itemId) then
            return index + 1
        endif

        set index = index + 1
        exitwhen index >= bj_MAX_INVENTORY
    endloop
    set indexItem=null
    return 0
endfunction


Код:
function GetItemOfTypeFromUnit takes unit whichUnit, integer itemId returns item
    local integer i = GetInvIOfItemType(whichUnit, itemId)
    if (i == 0) then
        return null
    else
        return UnitItemInSlot(whichUnit, i - 1)
    endif
endfunction



Полное избавление от BJ :)

Отредактировано Ranger21, 07.07.2009 в 19:26.
Старый 24.06.2009, 09:17
Rusvermilion
Ограничен ScorpioT1000
offline
Опыт: 18,299
Активность:
KyTy3oFF2 триггера создавать?
Старый 25.06.2009, 05:36
DragonSpirit
у - уходи
offline
Опыт: 22,625
Активность:
Rusvermilion да,триггер ItemsStack
Ranger21 а не проще ли будет заменить GetManipulatingUnit() и GetManipulatedItem() локалками?
Старый 25.06.2009, 14:05
Ranger21
I love beatiul days XD
offline
Опыт: 13,274
Активность:
Проще заменить GetManipulatingUnit() на GetTriggerUnit(), и тогда триггер будет работать ещё быстрее.
Это оптимизация
Старый 25.06.2009, 14:54
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
Цитата:
Ranger21 а не проще ли будет заменить GetManipulatingUnit() и GetManipulatedItem() локалками?

локалки вообще зачастую тупо не нужны, т.к. действие срабатывает намного быстрее , чем меняется глобалка
Старый 25.06.2009, 17:15
KyTy3oFF
Смерть или слава!
offline
Опыт: 2,154
Активность:
Rusvermilion
Зачем? Ты просто ставишь проверку, ну если там меньше 10 то триггер срабатывает... хм...
Советую, только чтобы тебе неделать десятки действий, дать каждому предмету кастум валуе... а потом проверять уже или по хп, ну как удобно))

KyTy3oFF добавил:
Ну вообще то второй, зачем тебе первый? ))
Старый 25.06.2009, 17:21
Ответ

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

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

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

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



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