/
SpellEntanglingRootsAOE.zn
72 lines (61 loc) · 3.77 KB
/
SpellEntanglingRootsAOE.zn
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
library SpellEntanglingRootsAOE {
/* == Создаём необходимые переменные == */
group g = CreateGroup();
unit caster, target, dummys[];
real spellX, spellY, range, data[];
boolean isEnemy;
integer level, playerId;
/* == Настройки заклинания == */
constant integer abilityHero = 'SEer'; // Способность для героя.
constant integer abilityDummy = 'CEer'; // Способность для дамми. В ней производится настройка всех параметров
constant integer abilityDummyOrder = 852171/*entanglingroots*/; // Id приказа для дамми способности
constant integer dummyId = 'dumy'; // Равкод дамми кастера
// Указываем радиус захвата заклинания
function getRange() -> real {
data[1] = 200; // 1 уровень
data[2] = 300; // 2 уровень
data[3] = 400; // 3 уровень
return data[level];
}
// На кого действует заклинание
function isTarget() -> boolean {
if (IsUnitType(target, UNIT_TYPE_STRUCTURE)) return false; // Отсеиваем здания
if (IsUnitType(target, UNIT_TYPE_MECHANICAL)) return false; // Отсеиваем механических юнитов
if (caster == target) return false; // Отсеиваем кастера
if (!IsPlayerEnemy(GetOwningPlayer(caster), GetOwningPlayer(target))) return false; // Отсеиваем союзников
return true;
}
/* === Реализация заклинания === */
function onInit(){
trigger t = CreateTrigger();
for (0 <= playerId < bj_MAX_PLAYER_SLOTS) {
// Создаём даммика для каждого игрока и выдаём ему абилку
dummys[playerId] = CreateUnit(Player(playerId), dummyId, 0, 0, 0);
UnitAddAbility(dummys[playerId], abilityDummy);
// Регистрируем событие для каждого игрока
TriggerRegisterPlayerUnitEvent(t, Player(playerId), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
}
TriggerAddAction(t, function(){
if (abilityHero != GetSpellAbilityId()) return; // Используем return чтоб не использовать Condition
caster = GetTriggerUnit();
level = GetUnitAbilityLevel(caster, abilityHero);
spellX = GetSpellTargetX();
spellY = GetSpellTargetY();
range = getRange();
playerId = GetPlayerId(GetOwningPlayer(caster));
GroupClear(g); // Не забываем очистить группу, чтоб не зацепить прошлых юнитов
GroupEnumUnitsInRange(g, spellX, spellY, range + 200, null); // Делаем радиус немного больше, ибо функция не учитывает радиус юнита
SetUnitAbilityLevel(dummys[playerId], abilityDummy, level);
ForGroup(g, function() {
target = GetEnumUnit();
if (!UnitAlive(target)) return; // Отсеиваем мёртвых юнитов
if (!IsUnitInRangeXY(target, spellX, spellY, range)) return; // Отсеиваем юнитов по расстоянию функцией, которая учитывает радиус юнита
if (!isTarget()) return; // Отсеиваем цели
SetUnitX(dummys[playerId], GetUnitX(target));
SetUnitY(dummys[playerId], GetUnitY(target));
IssueTargetOrderById(dummys[playerId], abilityDummyOrder, target);
});
});
t = null;
}
}