Як правильно використовувати Custom Value у редакторі карт Warcraft 3 - Створення карт - Різні
Розглянемо вищесказане з прикладу - спробуємо зробити кілька заклинань, використовуючи custom values юнітів. Отже:Завдання 1Зробимо щось на зразок ульти Ancient apparition з доти. У зазначеній області ворожі юніти втрачають здатність відновлювати здоров'я якимось способом протягом декількох секунд, а кожну секунду втрачають кілька балів здоров'я. Якщо Здоров'я юніту впаде нижче за певний відсоток - юніт гине від руки кастера. При багаторазовому накладенні вбивцею вважатиметься останній кастер, а тривалість обмороження складається. На юнітах під цим заклинанням має висіти ефект до смерті чи закінчення терміну дії закляття.
Завдання 2Зробимо щось простіше. У зазначеній області ворожі герої втрачають частину своєї спритності на кілька секунд. При багаторазовому накладення збільшується тривалість викрадення спритності. На юнітах під цим заклинанням має висіти ефект до закінчення терміну дії закляття.
Приступаємо. В якості здібностей-пустушок візьмемо Буран і Вогненний стовпи - замінимо баффи і приберемо всі стандартні візуальні ефекти.
Загальне: ObjectCounter(Цілочисна) - ця змінна буде лічильником юнітів, на які ми звертаємо свою увагу. При появі нового юніту, дані якого ми хочемо враховувати - ми збільшуємо цю змінну на 1 і привласнюємо custom value цю змінну. Зверніть увагу, що спочатку ми перевіримо - чи не має юніт вже номер, тобто custom value має дорівнювати 0. GroupForspells(Загін, масив) - тут ми зберігатимемо юнітів для різних заклинань, наприклад у групі 1 будуть юніти для заклинання А, групи 2 - юніти для заклинання Б тощо. Можна створювати різноіменні групи і навіть масиви різноіменних груп, зараз нам вистачить ітакий. Name(Рядок, масив) - Масив змінних для зберігання імен юнітів, ми можемо дати ім'я кожному коли забажаємо, якщо побажаємо. PointCaster(точка) - точка, витік якої треба буде видаляти в момент каста заклинання.
Для задачі 1 створюємо таке:
HPdrain (реальна, масив) – значення "замороженого здоров'я" юнітів, при обмороженні ми заносимо поточне здоров'я кожного юніту в цю змінну. HPdrainDur(цілочисленна, масив) - масив часу дії заклинання. Одиниці виміру змінюються залежно від того, якою періодичністю наш тригер заклинання. Оскільки інтервал тригера для цього завдання – 0.03, то щоб заклинання діяло 1 секунду – ми даємо тривалість 33 одиниці. HPDrainCaster(бойова одиниця, масив) - у цій змінній кожен юніт пам'ятає того, хто наслав на нього обмороження останнім, тобто від кого прийняти смерть, якщо здоров'я впаде нижче за критичний рівень. EffectHP(спецефект, масив) - на кожного юніту ми ліпимо спецефект і заносимо в пам'ять, для подальшого руйнування спецефекту та видалення витоку.
Для задачі 2 створюємо наступне: AgilityDrain(цілочисленна, масив) - частина спритності, яку ми заберемо у кожного героя, що потрапив під заклинання, у кожного це число буде своє, зрозуміло. AgilDur(цілочисленна, масив) - масив часу дії заклинання. Одиниці виміру змінюються залежно від того, якою періодичністю наш тригер заклинання. Оскільки інтервал тригера для цього завдання – 1.00, то щоб заклинання діяло 1 секунду – ми даємо тривалість 1 одиниця. EffectAg(спецефект, масив) - на кожного юніту ми ліпимо спецефект і заносимо в пам'ять, для подальшого руйнування спецефекту та видалення витоку.
Тригер з подією каста здібності. До 1 завдання


При касті будь-якого з наших заклинань ми вибираємо відповідні за критеріями юніти в потрібному нам радіусі від точки-мети і заносимо їх у тимчасову групу, по-перше для створення змінних, по-друге - для видалення витоку. Вибираємо всі юніти у групі. Робимо перевірку, чи має юніт вже номер і якщо ні - збільшуємо лічильник, даємо його (номер), даємо ім'я юніту якщо треба та іншу індивідуальну хрень при "знайомстві" з новим юнітом. Після задаємо дані заклинання, тобто для обмороження - здоров'я юнітів, вбивць та час обмороження, для втрати спритності - вираховуємо кількість спритності, забираємо її у цілей і ставимо тривалість стану. Створюємо спецефекти на цілях і також заносимо на згадку. Після - включаємо відповідний тригер. Якщо тригер вже включений – ця дія "зробить нічого".
Тригери заклинань. До 1 завдання


Ми обираємо всіх юнітів у групі з номером нашого заклинання, наприклад, у групі 1 для обмороження та у групі 2 для втрати спритності. (Якщо група порожня - вимикаємо тригер, немає потреби його виконувати якщо немає цілей. Якщо група не порожня то рухаємося далі за діями) Одразу перевіряємо, чи не пройшла дія заклинання у юніту - перевіряємо його ___Dur змінну . Якщо минуло – знищуємо ефект юніту та видаляємо його з групи. Якщо дія ще не минула - забираємо одиницю із тривалості. Якщо здоров'я юніта більше, ніж його поріг здоров'я (для обмороження) - встановлюємо здоров'я на поріг. Якщо менше - прирівнюємо поріг до здоров'я, тобто. ми дозволяємо здоров'ю зменшуватись, але не збільшуватись. Для обмороження - кожні 33 одиниці аремені(кожну секунду) - віднімаємо у юнітів фіксовану кількість здоров'я, що залежить від рівня здатності у нього"потенційного вбивці". Якщо відсоток здоров'я менший за 10-11-12% - робимо "потенційного вбивцю" юніта реальним убивцею, завдаючи жертві 99999 чистої шкоди. Прибираємо спецефект і стави тривалість заклинання для юніта = 0, що залишилася. У 2 задачі просто чекаємо поки термін дії для юніта пройде і повертаємо відібрану спритність.
Для зручності можна заносити всередині циклу custom value of picked unit в цілу чисельність і використовувати її. Виглядатиме не так страшно. Ось мабуть і висвітлив частину потенціалу використання custom values. Сподіваюся, багатьом це допоможе.