ShineLight
offline
Опыт:
723Активность: |
Создание Orb эффекта
Эта статья расскажет вам о том, как сделать Orb эффект на собственной карте. Правда, для того, чтобы понять, что тут написано вам необходимо базовое знание какого-нибудь языка программирования (желательно Jass или C++).
Итак, начнем. Перво-наперво выберем те предмет и способность, которые будут образовывать Orb эффект. Для примера возьмем заклинание "Жар Преисподней" и предмет "Огненный плащ". Первое, что необходимо сделать - в параметрях предмета убрать ссылку на используемую способность ( в нашем случае это "Предмет: Жар Преисподней"). Далее (если ва это нужно) создаете и импортируете 4 черных инконки(BTNBlack, DISBTNBlack, PASBTNBlack,DISPASBTNBlack) и заменяете ими иконки той спосомности, которую вы отслеживаете у предмета (в нашем случаю это "Предмет: Жар Преисподней"). У этой же способности можно и удалить название, чтобы при случайном наведении оно не отображалось. ВНИМАНИЕ: Вам необходимо знать идентификаторы способностей и предметов. Для этого в редакторе объектов в меню "Вид" нужно поставить галочку на пункте "Показать названия переменных". Далее ищите тот предмет (юнит, способность) который вам нужен и запоминаете название. далее с стать е используются стандартные названия:
Теперь перейдем к редактору триггеров. Сперва, надо открыть страничку для нестандартного кода. Для этого щелкните в редакторе триггеров на панели слева на строку с названием карты и иконкой карты. Теперь справа вводите: -------------------------------------------------------------------------------------------------------- Данная функция добавляет способность, соответстующую предмету, если конфликтующее заклинание не изучено unit u - юнит с предметом integer ab - идентификатор способности (используемые в примере перечислены выше" integer orb_ab - идентификатор способности, которая перекрывает мпособность данного предмета boolean do_it - если переменная равна true, по после положительной проверки способность будет добавлени юниту, если false, то не будет. function Orb_effect_on takes unit u, integer ab, integer orb_ab, boolean do_it returns boolean Переменная, которая возвращает значение: можно добавить способность или нет local boolean b = true Проверяет: исследована ли у данного юнита "перекрывающая" способность if ( GetUnitAbilityLevel(u,orb_ab) < 1 ) then если нет, то Возвращаемое значение говорит, что перекрытия не произошло set b = false Если надо добавлять способность, то if ( do_it == true ) then добавляем способность предмета юниту call UnitAddAbilityBJ( ab, u ) endif endif возвращаем отчет об учпешности (если true, то Orb эффект активизирован, если false, то - нет return b endfunction -------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------
Проверяет: есть ли еще такие же предметы, как и данный, находящиеся в инвентаре у героя unit u - тоже, что и в предыдущей функции integer itemId - идентификатор предмета function IsElseItemInInventory takes unit u, integer itemId returns boolean Счетчик local integer i = 0 Предмет в данном слоте юнита local item indexItem Количество предметов в инвентаре юнита, идентичных данному local integer items_of_type = 0 Цикл loop Заканчивается, если количество циклов превосходит количество предметов в инвентаре exitwhen i > bj_MAX_INVENTORY Определяем текщий предмет set indexItem = UnitItemInSlot( u, i) Если слот не пустой и текущий предмет идентичен данному, то if (indexItem != null) and (GetItemTypeId(indexItem) == itemId) then Увеличиваем счетчик количества таких же предметов, как и данный set items_of_type = items_of_type + 1 endif Увеличиваем счетчик цикла set i = i + 1 endloop Если в инвентаре присутствуют предметы, идентичные данному, то возвращаем "ДА" if ( items_of_type > 1 ) then return true endif Иначе - "НЕТ" return false endfunction -------------------------------------------------------------------------------------------------------- Теперь создадим 3 триггера (я назвал их "Orb on", "Orb effect off" и "Orb effect"). давайте рассмотрим каждый из них в отдельности:
Orb on Функция проверяет : Юнит, поднявший предмет - Герой?
function Trig_Orb_on_Conditions takes nothing returns boolean Если не герой, то не выполняем действия if ( not ( IsUnitType(GetManipulatingUnit(), UNIT_TYPE_HERO) == true ) ) then return false endif Если герой, то - выполняем return true endfunction Функция обработки события
function Trig_Orb_on_Actions takes nothing returns nothing Создаем локальную переменную типа юнит и присваиваем ей значение юнита, получившего предмет local unit u = GetManipulatingUnit() Проверяем этот предмет - "Огненный плащ"? if ( GetItemTypeId(GetManipulatedItem()) == 'clfm' ) then Если да, то вызываем функцию (описанную выще), которая проверит на Orb эффект и, если можно, добавит юниту способность "Предмет: Жар Преисподней" call Orb_effect_on(GetManipulatingUnit(), 'AIcf', 'AEim', true ) endif endfunction ===========================================================================
Это функция инициализации триггера. Содержит событие и действие function InitTrig_Orb_on takes nothing returns nothing Создаем триггер set gg_trg_Orb_on = CreateTrigger( ) Триггер вызывается, если произошло событие "Юнит получил предмет" call TriggerRegisterAnyUnitEventBJ( gg_trg_Orb_on, EVENT_PLAYER_UNIT_PICKUP_ITEM ) Проверяется : Юнит, поднявший предмет - Герой? call TriggerAddCondition( gg_trg_Orb_on, Condition( function Trig_Orb_on_Conditions ) ) Обработка события call TriggerAddAction( gg_trg_Orb_on, function Trig_Orb_on_Actions ) endfunction "Orb effect off"
Эта функция обрабатывает событие "Юнит бросает предмет"
function Trig_Orb_effect_off_Actions takes nothing returns nothing local unit u = GetManipulatingUnit() Если бросаемый предмет - "Огненный плащ", то if ( GetItemTypeId(GetManipulatedItem()) == 'clfm' ) then Если Orb эффект не был активизирован и больше таких предметов в инвентаре у юнита нет, то if ( ( Orb_effect_on(u, 'AIcf', 'AEim', false ) == false ) and (IsElseItemInInventory(u, 'clfm') == false) ) then Удаляем у него способность, которая могла быть "перекрыта" (способность "Предмет: Жар Преисподней") call UnitRemoveAbility( u, 'AIcf') endif endif endfunction ===========================================================================
Данная функция инициализирует триггер, отключающий Orb эффект function InitTrig_Orb_effect_off takes nothing returns nothing set gg_trg_Orb_effect_off = CreateTrigger( ) Если происходит событие "Юнит бросает предмет" call TriggerRegisterAnyUnitEventBJ( gg_trg_Orb_effect_off, EVENT_PLAYER_UNIT_DROP_ITEM ) Обработка данного события call TriggerAddAction( gg_trg_Orb_effect_off, function Trig_Orb_effect_off_Actions ) endfunction Orb effect
Эта функция обрабатывает событие "Герой изучил какую-то способность"
function Trig_Orb_effect_Actions takes nothing returns nothing local unit u = GetTriggerUnit() Если эта способность - "Жар преисподней", то if ( GetUnitAbilityLevel( u, 'AEim') > 0 ) then Удаляем способность "Предмет: Жар Преисподней" call UnitRemoveAbility( u, 'AIcf') endif endfunction ===========================================================================
Данная функция инициализирует триггер, отключающий Orb эффект, в том случае, если было изучено "перекрывающее" заклинание function InitTrig_Orb_effect takes nothing returns nothing set gg_trg_Orb_effect = CreateTrigger( ) Событие "Герой изучил какую-то способность" call TriggerRegisterAnyUnitEventBJ( gg_trg_Orb_effect, EVENT_PLAYER_HERO_SKILL ) Обработка данного события call TriggerAddAction( gg_trg_Orb_effect, function Trig_Orb_effect_Actions ) endfunction Теперь вы можете создать любой Orb эффект. При создании данного эффекта также получился эффект того, что способность "Предмет: Жар ПреисподнеЙ" добавляется только один раз (сколько бы предметов с такой способностью юнит не поднимал). На этом можно было бы остановиться, то я хочу добавить еще одну небольшую возможность: так называемые "Схлопывающиеся бутылочки". Этот триггер позволит сделать так, чтобы одинаковые предметы, имеющие заряды, превращались в один предмет с количеством зарядов, равным сумме заредов первого и второго предметов.
Для этого создадим еще один триггер:
Я назвал его Two2One Проверяет: данный предмет - "имеющий заряды"
function Trig_Two2One_Conditions takes nothing returns boolean Если "нет", то if ( not ( GetItemType(GetManipulatedItem()) == ITEM_TYPE_CHARGED ) ) then дальше триггер не выполняется return false endif return true endfunction function Trig_Two2One_Actions takes nothing returns nothing local integer i = 0 local item indexItem = null local item mit = GetManipulatedItem() local integer mit_id = GetItemTypeId(mit) local unit u = GetManipulatingUnit() Количество зарядов local integer chrg = 0 Если имеются еще такие предметы, то if (IsElseItemInInventory( u, mit_id)) then loop exitwhen i > bj_MAX_INVENTORY Устанавливаем текущий предмет set indexItem = UnitItemInSlot( u, i) Если он идентичен данному, то if (indexItem != null) and (GetItemTypeId(indexItem) == mit_id) then Добавляем количество зарядов set chrg = chrg + GetItemCharges( UnitItemInSlot(u, i)) Удаляем данный предмет call RemoveItem( indexItem ) endif set i = i + 1 endloop Если зарядов больше 0, то if ( chrg > 0 ) then Создаем предмет для юнита set mit = UnitAddItemById( u, mit_id) Устанавливаем количество зарядов call SetItemCharges( mit, chrg) endif endif endfunction ===========================================================================
function InitTrig_Two2One takes nothing returns nothing set gg_trg_Two2One = CreateTrigger( ) Событие - "Юнит поднимает предмет" call TriggerRegisterAnyUnitEventBJ( gg_trg_Two2One, EVENT_PLAYER_UNIT_PICKUP_ITEM ) Данный предмет - "имеющий заряды"? call TriggerAddCondition( gg_trg_Two2One, Condition( function Trig_Two2One_Conditions ) ) "Схлопывание" предметов call TriggerAddAction( gg_trg_Two2One, function Trig_Two2One_Actions ) endfunction Вот и все. К статье прикреплена карта с примером. Я буду рад, если моя статься кому-нибудь поможет. Удачной разработки! |
08.02.2007, 12:14 | #1
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
dk
offline
Опыт:
61,843Активность: |
Первый вопрос: ты когда-нибудь слышал о ВВ-кодах? Почитай и попробуй оформить статью нормально)
Про объединение предметов с зарядами уже есть наработка, причем она абсолютно универсальная и написана на гуи... Отредактировано Dead_knight, 21.02.2007 в 08:02. |
08.02.2007, 12:33 | #2
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
NETRAT
offline
Опыт:
83,762Активность: |
хм, странно, мне всегда казалось что орбэффект - это якобы баг и от него следует избавляться, и айсфрог еще от него не избавился исключительно из-за кривых рук, а не из соображений баланса. И вообще, лично я думаю что создание орб эффекта(триггерно) - это больший геморрой чем избавление от него. |
08.02.2007, 12:38 | #3
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
iNFiNiTi
offline
Опыт:
499Активность: |
Цитата:
Полностью с тобой согласен! Я даже до конца не дочитал статью, поняв что это просто ЖИРНЮЩИЙ гемор на 5-ой точке! |
|
08.02.2007, 12:47 | #4
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Lord of Death
Потерянный надолго
offline
Опыт:
2,208Активность: |
Нафик надо! Гораздо проще в Обжект Едиторе поменять модель сферы какой-нибудь, чем писать эту тонну. Ну конечно только в том случае, если эффект один. Да и джаз сверху не самый оптимизированный. |
08.02.2007, 13:25 | #5
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Coffin666
Universal dominator
offline
Опыт:
3,242Активность: |
УУу через джасс орб эффект создавать аццтойно,Имхо проще через Редактор Объектов Отредактировано Coffin666, 08.02.2007 в 19:27. |
08.02.2007, 19:20 | #6
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Krol
offline
Опыт:
16,909Активность: |
НТ всё верно говорит, это баг! Да если кому и нада, то на основе сферы это сделать в 100 раз легче, чем тыт ута понаписал, имхо. |
08.02.2007, 21:26 | #7
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
ShineLight
offline
Опыт:
723Активность: |
Во-первых: ошибки никакой нет (код смотреть надо внимательно!). Хотя я согласен насчет оформления.
Во-вторых: кода нетак много, но для одной способности действительно неразумно. В-третьих: если вам не нравится перекрытие эффекта спосбностью, то можно эту часть убрать и переделать так, чтобы только остался тот эффект, который не позволяет собирать n одинаковых предметов с накладывающимися способностями. ShineLight добавил: К тому же, на моей карте есть один предмет, который в 4х экземплярах делает любого героя танком. |
09.02.2007, 08:29 | #8
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
p01nTT
offline
Опыт:
10,760Активность: |
??? интересно а где сам орб-эффект
или надо создать событие с уроном/атакой??? тогда либо орб будет работать со спеллами или перед уроном можно юзать систему детекта атаки векса и не парится(поставить лимит функций 1 и будет орб) но лучше сделать через систему атаки векса стак орбы и это будет зе бест p01nTT добавил: карту неохота смотреть - я не дома |
09.02.2007, 14:18 | #9
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
BarracuDa
aka ShaggyBear
offline
Опыт:
4,758Активность: |
Цитата:
Присоеденяюсь! Нафига они нужны??? |
|
20.02.2007, 19:19 | #10
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|