Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
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();
    }

}
`
ОЖИДАНИЕ РЕКЛАМЫ...