Добавлен , не публикуется
Я столкнулся с проблемой: многие люди хотят сделать ауру, которая будет работать, как обычная аура, но при этом добавлять нестандартные способности ( к примеру +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 )
}
}



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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
15
10 лет назад
Отредактирован EnergyFrost
0
Если она пройдет, сделаю
уже не хочу.
2
8
10 лет назад
2
На мой взгляд автор слишком сильно перемудрил. Вообще говоря, я бы не стал в данной ситуации искать какой-то универсальный способ. Ибо в зависимости от того, что конкретно хочется получить от ауры, всё можно сделать и проще.
0
15
10 лет назад
Отредактирован EnergyFrost
0
можно сделать и проще.
Просвети меня
Ну хорошо, скажем так: я хочу получить от ауры: крит юниту, хп, атаки, уворот , брони, жар преисподней на каждого юнита(пассив), ну и напоследок сжигание маны.
Мб и можно сделать как-то попроще, но я , к сожалению, не нахожу другого способа.
Скрипт был обновлен, т.к была найдена ошибка. Теперь не будет создаватся по 100 копий при действие, если боев ед. повышает лвл споосбности. (1 боев ед- 1 структура)
0
28
10 лет назад
0
EnergyFrost, сделай чтобы был только 1 таймер
ссылку на статью я вроде кидал
и исправь то что я указал во втором коменте
тогда возможно опубликуют
и хэш тогда ненужен будет
так же используй initializer вместо фиксированного имени триггера
кроме того у тебя ошибка в коде
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 //работает на иллюзиях?
} 
эта функция не вызывается таймером
и можно вместо такой проверки просто проверить есть ли на юните баф
и если есть то давать бонусы
так же я не понимаю зачем нужна функция StringHash
да и вобще можно было сделать намного проще
просто пикать всех юнитов и если у них есть баф то давать им скил а если бафа нету то ремовать скил
0
15
10 лет назад
0
nvc123:
EnergyFrost, сделай чтобы был только 1 таймер
ссылку на статью я вроде кидал
и исправь то что я указал во втором коменте
тогда возможно опубликуют
и хэш тогда ненужен будет
так же используй initializer вместо фиксированного имени триггера
кроме того у тебя ошибка в коде
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 //работает на иллюзиях?
} 
эта функция не вызывается таймером
и можно вместо такой проверки просто проверить есть ли на юните баф
и если есть то давать бонусы
так же я не понимаю зачем нужна функция StringHash
да и вобще можно было сделать намного проще
просто пикать всех юнитов и если у них есть баф то давать им скил а если бафа нету то ремовать скил
ты прав...люблю я себе все усложнять
0
15
3 года назад
0
Случайно наткнулся, и тут есть еще 1 проблема, аура меньше уровня почему то в приоритете, если 2 героя и у них разный уровень способностей то урон будет скакать туда сюда
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.