Форумы Blizzard.GG

Вернуться   Форумы Blizzard.GG > Warcraft III > Творцы миров > Библиотека "Творцов" > Jass - язык программирования Warcraft 3

Ответ
 
Опции темы
Старый 25.10.2007, 12:27   #1
TM Team
Либерал года
Помощник модератора
 
Аватар для Авварон
 
Регистрация: 16.08.2005
Сообщений: 3,685
Авварон :mafia:Авварон :mafia:Авварон :mafia:Авварон :mafia:Авварон :mafia:Авварон :mafia:Авварон :mafia:Авварон :mafia:Авварон :mafia:Авварон :mafia:Авварон :mafia:
По умолчанию Ability Effect

Ability Effect

Авторы: ABBAPOH & TM team

Для понимания статьи необходим средний уровень жасса.

Вступление

Эта статья посвящена одной (точнее двум) очень полезным, но редко используемым функциям.

Код:
native GetAbilityEffect     takes string abilityString, effecttype t, integer index returns string
native GetAbilityEffectById takes integer abilityId, effecttype t, integer index returns string
В любой способности имеется куча строковых полей (обычно это поля графики) - Графика - Цель, Графика - Эффект и т.п. Близзы так сделали, что можно получить значения этих полей, то есть из кода мы можем узнать, какая графика у какого заклинания. Это можно сделать как раз при помощи этих функций; наиболее часто используемой является вторая - она берет ИД способности ('A01B' например), тип эффекта, номер поля и возвращает хранящуюся строку.

Какие типы эффектов можно использовать?:
Код:
constant effecttype EFFECT_TYPE_EFFECT      = ConvertEffectType(0) // Графика - Эффект 
constant effecttype EFFECT_TYPE_TARGET      = ConvertEffectType(1) // Графика - Цель
constant effecttype EFFECT_TYPE_CASTER      = ConvertEffectType(2) // Графика - Маг
constant effecttype EFFECT_TYPE_SPECIAL     = ConvertEffectType(3) // Графика - Особые
constant effecttype EFFECT_TYPE_AREA_EFFECT = ConvertEffectType(4) // Графика - Область
constant effecttype EFFECT_TYPE_MISSILE     = ConvertEffectType(5) // Графика - Анимация дистанционной атаки
constant effecttype EFFECT_TYPE_LIGHTNING   = ConvertEffectType(6) // Графика - Эффекты Молнии
Перевод дан для официальной версии вара.
Все эти поля, кроме EFFECT_TYPE_LIGHTNING содержат то, что мы туда запишем (молнию можно из списка выбирать, писать ручками туда нельзя).
Для чего может понадобится доставать способности? - можно хранить там ЛЮБЫЕ строки, необязательно пути к эффектам. Ну например, для функции преобразования символа в число можно "упрятать" строку с символами в объекты, чтобы ее сложнее было найти.
Код:
function Chr takes string s, integer i returns string
 return SubString(s, i-1, i)
endfunction
 
function I2Char takes integer i returns string
 return Chr(GetAbilityEffectById(1093677105,ConvertEffectType(0),0), i + 1)
endfunction
Согласитесь, сразу отпадает желание искать ту способность, в которой записана строка
А сейчас переходим к одному из примеров использования функции GetAbilityEffectById.

Спелл Система

Данная система работает на функции получения эффектов; плюсом этой системы является ее простота и удобство использования; кроме того, теоретически она должна давать небольшое преимущество по сравнению с обычными системами.
Код:
//SPELL EFFECT
function SpellEffect_Con takes nothing returns boolean
   set udg_String=GetAbilityEffectById(GetSpellAbilityId(), EFFECT_TYPE_EFFECT, 1)
   return SubString(udg_String, 0, 3) == "SE:"
endfunction

function SpellEffect_Act takes nothing returns nothing
   call ExecuteFunc(SubString(udg_String, 3, StringLength(udg_String))+"_Act")
endfunction
 
function InitTrig_SpellSystem takes nothing returns nothing
    set gg_trg_SpellSystem = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_SpellSystem , EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_SpellSystem , Condition( function SpellEffect_Con  ) )
    call TriggerAddAction( gg_trg_SpellSystem , function SpellEffect_Act )
endfunction
Разбираем что делается - регистрируем триггер на событие EVENT_PLAYER_UNIT_SPELL_EFFECT, добавляем, условия, действия. Смотрим условие - в переменную udg_String записываем поле EFFECT_TYPE_EFFECT способности, которую скастал юнит. Затем мы достаем первые 3 символа из строки и сравниваем со строкой "SE:". Если условие выполнено, то это означает что спелл находится в системе (т.е. если у спелла в Графика - Эффект лежит строка вида "SE:FuncName"). Переходим к действиям триггера - достаем из udg_String подстроку из символов с 3его по последний (т.е.если строка "SE:FuncName", то получим "FuncName") и экзекутим функцию с полученныи именем. Функция FuncName и содержит действия нашего заклинания.

Чем система лучше регистрации триггеров на каждый спелл? - во первых имеется всего ОДИН триггер, и для каждого сказанного заклинания проверяется ОДНО условие (когда просто регистрируем триггер, то приходится проверять ВСЕ условия - если у вас 100 спеллов, то при касте ЛЮБОГО спелла надо выполнить 100 проверок). Далее, заклинания НИКАК не зависят от кода - в коде лежит только функция действия, все остальное лежит в РО; не нужно копипастить действия по созданию триггера или что-то куда-то заносить.

Заключение


Замечание - Можно сделать так, чтобы строки можно было хранить не только в способностях (кстати, баффы это тоже способности и для них все работает), но и в ЛЮБЫХ объектах. Но это, как говорится - совсем другая тема - об этом повествует статья remal'а - Реализация дополнительных данных в объектах карты

Мы рассмотрели один конкретный пример - спелл систему. Однако это не единственное применение функции GetAbilityEffect - ее можно использовать например в системе РС. Можно хранить те строки, которые нежелательно видеть нубам, пытающимся взломать вашу карту
__________________
Цитата:
Сообщение от Druu Посмотреть сообщение
хотс - это немоба

Последний раз редактировалось Авварон; 14.06.2008 в 21:53.
Авварон вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Текущее время: 04:04. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
(c) Blizzard.GG