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



`
ОЖИДАНИЕ РЕКЛАМЫ...
3
15
10 лет назад
3
На vJass и cJass недавно пишу, поэтому строго не судить
2
28
10 лет назад
Отредактирован nvc123
2
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(){
и много таймеров
часть функций лучше заменить методами(ради удобства)
0
15
10 лет назад
0
nvc123, чем тебе обычные функции нее угодили?. Через 30 минут перезалью. И таймер только один. Или ты предлогаешь для всех юнитов с такой абилой сделаить один таймер?
1
32
10 лет назад
1
Жаль что наработка для 1 единственной ауры, почему нельзя было сделать для множества скиллов и возможности добавления множества абилок? Складывание и подавление для отдельных аур?
0
15
10 лет назад
0
quq_CCCP:
Жаль что наработка для 1 единственной ауры, почему нельзя было сделать для множества скиллов и возможности добавления множества абилок? Складывание и подавление для отдельных аур?
Если она пройдет, сделаю
Москва не сразу строилась)
Хотя то, что ты предлагаешь - минутное дело через цикл. А вот подавление потрудиться придется
1
32
10 лет назад
1
EnergyFrost, кстати можно было 1 группу использовать а не плодить множество...
0
15
10 лет назад
0
quq_CCCP:
EnergyFrost, кстати можно было 1 группу использовать а не плодить множество...
я не могу додуматься, как это сделать, ведь если обновлять способность, т.е проверять находится ли юнит в области x от юнита(владельца ауры) , то те юниты, на которые действует эта аура от другого кастера, но они не находятся в области этого, то у них удалится. Вот с этой проблемой с столкнулся. А вообще 4 кб мне не жалко выделить на группу, тем более от силы по карте будет бегать не больше 5-10 юнитов (5-10 групп)
quq_CCCP, Как заказывал. Теперь аура может добавить 10 способностей юниту
0
28
10 лет назад
0
для всех юнитов с такой абилой сделаить один таймер
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 героя и у них разный уровень способностей то урон будет скакать туда сюда
Чтобы оставить комментарий, пожалуйста, войдите на сайт.