Добавлен , не публикуется
Я столкнулся с проблемой: многие люди хотят сделать ауру, которая будет работать, как обычная аура, но при этом добавлять нестандартные способности ( к примеру +X хп юниту или +X дамаг и т.п). К сожалению, я в инете ничего не нашел (мб плохо искал).
Эта наработка поможет вам решить эту проблему.
Для этого вам нужно будет создать способность для героя (самого владельца ауры)
Способность, которую будет получать юнит в области действия ауры
И заполнить поля в скрипте.(разрешено трогать только те поля, где есть комментарии)



library Aura{
private integer spos= 'A001'//аура героя 
private integer array addsp[12]//не трогать

//НАЙСТРОЙКИ
private struct Aura_Data {
integer lvl
unit caster
group g=CreateGroup()
real x
real y
real rad =300.+(100.*GetUnitAbilityLevel(GetLearningUnit(),spos))//область действия. 300-начальное значение; 100-доп дистанция за 1 уровень способности
real time=1. //время обновления юнитов в области кастера
}
//Добавляемые способности. Вместо "0" пропишите код способности. Каждая переменная заполняется сразу после предыдущей (1 потом 2, потом 3 и т.д), либо система будет работать неверно.
private n SSS(){
addsp[1] = 'A000' //1 добавляемая способность юнитам в области действия ауры
addsp[2] = 'A002' //2 добавляемая способность юнитам в области действия ауры
addsp[3] = 0 //3 добавляемая способность юнитам в области действия ауры
addsp[4] = 0 //4 добавляемая способность юнитам в области действия ауры
addsp[5] = 0 //5 добавляемая способность юнитам в области действия ауры
addsp[6] = 0 //6 добавляемая способность юнитам в области действия ауры
addsp[7] = 0 //7 добавляемая способность юнитам в области действия ауры
addsp[8] = 0 //8 добавляемая способность юнитам в области действия ауры
addsp[9] = 0 //9 добавляемая способность юнитам в области действия ауры
addsp[10]= 0 //10 добавляемая способность юнитам в области действия ауры
addsp[11]= 0 //Не трогать!
}




define {
private f=GetFilterUnit()
private eu=GetEnumUnit()
private n=nothing
}

//Условия

private boolean cond(){
timer t = GetExpiredTimer()
Aura_Data d = LoadInteger(hash,GetHandleId(t),StringHash("Aura _Data"))
return GetUnitState(f,UNIT_STATE_LIFE)>0\  //жив?
 && IsUnitAlly(f,GetOwningPlayer(d.caster))==true\ //не пренадлежит врагу?
 && IsUnitType(f,UNIT_TYPE_STRUCTURE)==false \//здание?
 && IsUnitIllusion(f)==false //работает на иллюзиях?
} 

private n aura_back(){
timer t = GetExpiredTimer()
Aura_Data d = LoadInteger(hash,GetHandleId(t),StringHash("Aura _Data"))
integer i=1
loop{
exitwhen addsp[i]==0
UnitRemoveAbility(eu,addsp[i])
i++
}
GroupRemoveUnit(d.g,eu)
}

private n aura_d (){
timer t = GetExpiredTimer()
Aura_Data d = LoadInteger(hash,GetHandleId(t),StringHash("Aura _Data"))
integer i=1
if IsUnitInRangeXY(eu,d.x,d.y,d.rad) && GetUnitAbilityLevel(d.caster,spos)!=0{
loop {
exitwhen addsp[i]==0
UnitAddAbility(eu,addsp[i])
SetUnitAbilityLevel(eu,addsp[i],GetUnitAbilityLevel(d.caster,spos))
i++
}
else
i=1
loop {
exitwhen addsp[i]==0
UnitRemoveAbility(eu,addsp[i])
i++
}
GroupRemoveUnit(d.g,eu)
}
}


private n d_a(){
timer t = GetExpiredTimer()
Aura_Data d = LoadInteger(hash,GetHandleId(t),StringHash("Aura _Data"))
integer i=1
loop {
exitwhen addsp[i]==0
UnitRemoveAbility(eu,addsp[i])
i++
GroupRemoveUnit(d.g,eu)
}
}


private n aura_go(){
timer t = GetExpiredTimer()
Aura_Data d = LoadInteger(hash,GetHandleId(t),StringHash("Aura _Data"))
d.x=GetUnitX(d.caster)
d.y=GetUnitY(d.caster)
ForGroup(d.g,function aura_back)
GroupEnumUnitsInRange(d.g,d.x,d.y,d.rad,function cond)
ForGroup(d.g,function aura_d)
if GetUnitAbilityLevel(d.caster,spos)==0 or d.lvl!=GetUnitAbilityLevel(d.caster,spos) {
ForGroup(d.g,function d_a)
PauseTimer(t)
d.caster=null
DestroyGroup(d.g)
d.g=null
FlushChildHashtable(hash,GetHandleId(t))
DestroyTimer(t)
Aura_Data.destroy(d)
}
}

private boolean Trig_Aura_Conditions (n){
return GetLearnedSkill() == spos 
}

private n Trig_Aura_Actions (){
Aura_Data d = Aura_Data.create()
timer t = CreateTimer()
d.caster=GetLearningUnit()
d.lvl= GetUnitAbilityLevel(d.caster,GetLearnedSkill())
SaveInteger(hash,GetHandleId(t),StringHash("Aura _Data"),d)
SSS()
TimerStart(t,d.time,true,function aura_go)
}

n InitTrig_Aura(){
    gg_trg_Aura = CreateTrigger( )    
        integer i=0
    loop{
        TriggerRegisterPlayerUnitEvent(gg_trg_Aura, Player(i), EVENT_PLAYER_HERO_SKILL, null)
exitwhen  i==11 //кол-во игроков (по-умолчанию 12). Чтобы работало для компьютера поставьте значение=15
    i++
}
   TriggerAddCondition( gg_trg_Aura, Condition( function Trig_Aura_Conditions ) )
    TriggerAddAction( gg_trg_Aura, function Trig_Aura_Actions )
}
}



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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
15
На vJass и cJass недавно пишу, поэтому строго не судить
28
EnergyFrost, вместо scope лучше юзать либы
integer spos= 'A001'//аура героя
integer addsp= 'A000' //добавляемая способность юнитам в области действия ауры
заменить на
define{
private spos= 'A001'//аура героя
private addsp= 'A000' //добавляемая способность юнитам в области действия ауры
}

не стоит забывать про безопасность
define {
f=GetFilterUnit()
eu=GetEnumUnit()
n=nothing
}
define {
private f=GetFilterUnit()
private eu=GetEnumUnit()
private n=nothing
}

private n aura_back(n){
n в скобках можно не указывать
private n aura_back(){
и много таймеров
часть функций лучше заменить методами(ради удобства)
15
nvc123, чем тебе обычные функции нее угодили?. Через 30 минут перезалью. И таймер только один. Или ты предлогаешь для всех юнитов с такой абилой сделаить один таймер?
32
Жаль что наработка для 1 единственной ауры, почему нельзя было сделать для множества скиллов и возможности добавления множества абилок? Складывание и подавление для отдельных аур?
15
quq_CCCP:
Жаль что наработка для 1 единственной ауры, почему нельзя было сделать для множества скиллов и возможности добавления множества абилок? Складывание и подавление для отдельных аур?
Если она пройдет, сделаю
Москва не сразу строилась)
Хотя то, что ты предлагаешь - минутное дело через цикл. А вот подавление потрудиться придется
32
EnergyFrost, кстати можно было 1 группу использовать а не плодить множество...
15
quq_CCCP:
EnergyFrost, кстати можно было 1 группу использовать а не плодить множество...
я не могу додуматься, как это сделать, ведь если обновлять способность, т.е проверять находится ли юнит в области x от юнита(владельца ауры) , то те юниты, на которые действует эта аура от другого кастера, но они не находятся в области этого, то у них удалится. Вот с этой проблемой с столкнулся. А вообще 4 кб мне не жалко выделить на группу, тем более от силы по карте будет бегать не больше 5-10 юнитов (5-10 групп)
quq_CCCP, Как заказывал. Теперь аура может добавить 10 способностей юниту
28
для всех юнитов с такой абилой сделаить один таймер
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.