Добавлен nvc123,
опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
cJass
Тип:
Наработка
Версия Warcraft:
1.26
Описание
При создание триггерных способностей для каждой новой способности приходится создавать новый триггер, который отслеживает применение способности, а также условие и действие. Это система позволяет избежать этой рутины и предоставляет простой способ регистрации действий выполняемых при касте способностей.
Инструкция
Для установки системы просто скачайте файл системы в папку \AdicHelper\lib\ вашего jngp и пропишите в шапке карты include "spellcast.j"
Регистрация действия для способности производится с помощью вызова функции addSpell при инициализации карты
void addSpell(int rawcode, string name)
int rawcode - равкод способности для которой регистрируется действие
string name - имя функции которая будет вызвана при применении способности
Пример
library mySpell initializer init{
void mySpellAction(){
// код вызываемый при применении способности
}
private void init(){
addSpell('A000', "mySpellAction"); // регистрация функции mySpellAction для способности с равкодом 'A000'
}
}
Регистрация экземпляра структуры
Иногда возникает необходимость в создание бд способности (каждая запись - отдельная способности) к которой необходимо обращаться при применении способностей записанных в этой бд. Система позволяет избежать ручного поиска записи в бд и вместо этого напрямую привязывает способность к определённому экземпляру структуры. Это производится с помощью макроса onCast() и функции addStructObject (или макроса addCastableObject) которая регистрирует экземпляр структуры.
Макрос onCast(){ } записывается внутри структуры и содержит в фигурных скобках код вызываемый при применении способности. Из этого кода можно напрямую обращаться к полям зарегистрированного экземпляра структуры.
Функция регистрации экземпляра структуры (в структуре должен быть использован макрос onCast()) :
void addStructObject(int object, int rawcode, string structName)
int object - экземпляр структуры для которой будет вызван onCast()
int rawcode - равкод способности для которой регистрируется экземпляр структуры
string structName - название структуры экземпляр который регистрируется
Макрос регистрации экземпляра текущей структуры (должен быть вызван в методе структуры в которой использован макрос onCast()) :
addCastableObject(int object, int rawcode)
int object - экземпляр структуры для которой будет вызван onCast()
int rawcode - равкод способности для которой регистрируется экземпляр структуры
Пример (бд юнитов создаваемых при применении соответствующих способностей)
struct summoningSpell{
private int unitRawcode;
// создание записи в бд
static thistype new(int spellRawcode, int summoningUnitRawcode){
thistype this = thistype.create();
unitRawcode = summoningUnitRawcode;
addCastableObject(this, spellRawcode);
}
onCast(){
// действие выполняемое при применении способностей связанных с этой бд
// в данном случае это создание юнита в точке применения способности по равкоду записанному в бд
CreateUnit(GetOwningPlayer(GetTriggerUnit()), unitRawcode, GetSpellTargetX(), GetSpellTargetY()), 0)
}
}
Код системы
library spellcast initializer init{
private hashtable hash;
define onCast() = {
static void spellCastAction(){
thistype this=getStructObject(GetSpellAbilityId());
this.on##Cast();
}
private void on##Cast
}
define addCastableObject(object, rawcode) = addStructObject(object, rawcode, `FUNCNAME`)
private void act(){
string structName=LoadStr(hash, GetSpellAbilityId(), 1);
if(structName != null){
ExecuteFunc("s__"+structName+"_spellCastAction");
}else{
ExecuteFunc(LoadStr(hash, GetSpellAbilityId(), 0));
}
}
void addSpell(int a,string b){
SaveStr(hash, a, 0, b);
}
private string getStructName(string name){
int i=0;
loop{
exitwhen i==StringLength(name)
if(SubString(name, i, i+1) == "."){
return SubString(name, 0, i);
}
i++;
}
return name;
}
int getStructObject(int rawcode){
return LoadInteger(hash, rawcode, 2)
}
void addStructObject(int object, int rawcode, string structName){
string name=getStructName(structName);
SaveStr(hash, rawcode, 1, name);
SaveInteger(hash, rawcode, 2, object);
}
private void init(){
trigger a=CreateTrigger()
TriggerRegisterAnyUnitEventBJ(a,EVENT_PLAYER_UNIT_SPELL_EFFECT)
TriggerAddAction(a,function act)
hash=InitHashtable();
}
}
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Hodor
Отредактирован nvc123