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

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

 
ShineLight

offline
Опыт: 723
Активность:
Создание Orb эффекта
Эта статья расскажет вам о том, как сделать Orb эффект на собственной карте. Правда, для того, чтобы понять, что тут написано вам необходимо базовое знание какого-нибудь языка программирования (желательно Jass или C++).
Итак, начнем. Перво-наперво выберем те предмет и способность, которые будут образовывать Orb эффект. Для примера возьмем заклинание "Жар Преисподней" и предмет "Огненный плащ". Первое, что необходимо сделать - в параметрях предмета убрать ссылку на используемую способность ( в нашем случае это "Предмет: Жар Преисподней").
Далее (если ва это нужно) создаете и импортируете 4 черных инконки(BTNBlack, DISBTNBlack, PASBTNBlack,DISPASBTNBlack) и заменяете ими иконки той спосомности, которую вы отслеживаете у предмета (в нашем случаю это "Предмет: Жар Преисподней"). У этой же способности можно и удалить название, чтобы при случайном наведении оно не отображалось.
ВНИМАНИЕ: Вам необходимо знать идентификаторы способностей и предметов. Для этого в редакторе объектов в меню "Вид" нужно поставить галочку на пункте "Показать названия переменных". Далее ищите тот предмет (юнит, способность) который вам нужен и запоминаете название. далее с стать е используются стандартные названия:
  1. Предмет "Огненный плащ" - 'clfm'
  2. Способность "Предмет: Жар Преисподней" - 'AIcf'
  3. Способность "Жар Преисподне" - 'AEim'
(Регистр важен)
Теперь перейдем к редактору триггеров. Сперва, надо открыть страничку для нестандартного кода. Для этого щелкните в редакторе триггеров на панели слева на строку с названием карты и иконкой карты. Теперь справа вводите:
--------------------------------------------------------------------------------------------------​------
Данная функция добавляет способность, соответстующую предмету, если конфликтующее заклинание не изучено
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
Вот и все. К статье прикреплена карта с примером. Я буду рад, если моя статься кому-нибудь поможет. Удачной разработки!
Прикрепленные файлы
Тип файла: w3x Orb.w3x (18.4 Кбайт, 88 просмотров )
Старый 08.02.2007, 12:14
dk

offline
Опыт: 60,293
Активность:
Первый вопрос: ты когда-нибудь слышал о ВВ-кодах? Почитай и попробуй оформить статью нормально)
Про объединение предметов с зарядами уже есть наработка, причем она абсолютно универсальная и написана на гуи...

Отредактировано Dead_knight, 21.02.2007 в 08:02.
Старый 08.02.2007, 12:33
NETRAT

offline
Опыт: 83,712
Активность:
хм, странно, мне всегда казалось что орбэффект - это якобы баг и от него следует избавляться, и айсфрог еще от него не избавился исключительно из-за кривых рук, а не из соображений баланса.
И вообще, лично я думаю что создание орб эффекта(триггерно) - это больший геморрой чем избавление от него.
Старый 08.02.2007, 12:38
iNFiNiTi

offline
Опыт: 499
Активность:
Цитата:
И вообще, лично я думаю что создание орб эффекта(триггерно) - это больший геморрой чем избавление от него.

Полностью с тобой согласен! Я даже до конца не дочитал статью, поняв что это просто ЖИРНЮЩИЙ гемор на 5-ой точке!
Старый 08.02.2007, 12:47
Lord of Death
Потерянный надолго
offline
Опыт: 3,008
Активность:
Нафик надо! Гораздо проще в Обжект Едиторе поменять модель сферы какой-нибудь, чем писать эту тонну. Ну конечно только в том случае, если эффект один. Да и джаз сверху не самый оптимизированный.
Старый 08.02.2007, 13:25
Coffin666
Universal dominator
offline
Опыт: 3,242
Активность:
УУу через джасс орб эффект создавать аццтойно,Имхо проще через Редактор Объектов

Отредактировано Coffin666, 08.02.2007 в 19:27.
Старый 08.02.2007, 19:20
Krol

offline
Опыт: 17,884
Активность:
НТ всё верно говорит, это баг! Да если кому и нада, то на основе сферы это сделать в 100 раз легче, чем тыт ута понаписал, имхо.
Старый 08.02.2007, 21:26
ShineLight

offline
Опыт: 723
Активность:
Во-первых: ошибки никакой нет (код смотреть надо внимательно!). Хотя я согласен насчет оформления.
Во-вторых: кода нетак много, но для одной способности действительно неразумно.
В-третьих: если вам не нравится перекрытие эффекта спосбностью, то можно эту часть убрать и переделать так, чтобы только остался тот эффект, который не позволяет собирать n одинаковых предметов с накладывающимися способностями.

ShineLight добавил:
К тому же, на моей карте есть один предмет, который в 4х экземплярах делает любого героя танком.
Старый 09.02.2007, 08:29
p01nTT

offline
Опыт: 11,160
Активность:
??? интересно а где сам орб-эффект
или надо создать событие с уроном/атакой???
тогда либо орб будет работать со спеллами или перед уроном
можно юзать систему детекта атаки векса
и не парится(поставить лимит функций 1 и будет орб)
но лучше сделать через систему атаки векса стак орбы и это будет зе бест

p01nTT добавил:
карту неохота смотреть - я не дома
Старый 09.02.2007, 14:18
BarracuDa
aka ShaggyBear
offline
Опыт: 4,708
Активность:
Цитата:
И вообще, лично я думаю что создание орб эффекта(триггерно) - это больший геморрой чем избавление от него.

Присоеденяюсь! Нафига они нужны???
Старый 20.02.2007, 19:19

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

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

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

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



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