Добавлен nazarpunk,
опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Zinc
Тип:
Наработка
Версия Warcraft:
1.26+
Система мультикаста для заклинаний наподобии "Волна Силы".
Скриншоты
Техничеcкие подробности
Установка
- скопировать триггер SystemCastMultiWave
- скопировать юнита Dummy. Равкод u000
/* Настройки системы */
constant integer DummyID = 'u000';
- скопировать нестандартные способности по вкусу
- скопировать триггер SystemCastMultiWaveSetting
Код системы
//! zinc
library SystemCastMultiWave {
/* Настройки системы */
constant integer DummyID = 'u000';
/**********************************************************
*
* ВСЁ, ЧТО НИЖЕ, ПРАВИТЬ НА СВОЙ СТРАХ И РИСК!!!
*
**********************************************************/
SystemCastMultiWave Struct[];
integer StructI = -1;
function Angle(real x1, real y1, real x2, real y2) -> real { return bj_RADTODEG * Atan2(y2 - y1, x2 - x1); }
function PolarX(real x, real d, real a) -> real { return x + d * Cos(a * bj_DEGTORAD); }
function PolarY(real y, real d, real a) -> real { return y + d * Sin(a * bj_DEGTORAD); }
function Distance(real x1, real y1, real x2, real y2) -> real {
real dx = x2 - x1;
real dy = y2 - y1;
return SquareRoot(dx * dx + dy * dy);
}
function fixAngle(real a) -> real {
if (a > 360){ a = a - 360; }
else if (a < 0){ a = 360 + a; }
return a;
}
public {
struct SystemCastMultiWave {
integer SpellHero, SpellDummy, SpellDummyOrder;
unit DummyUnit[32];
integer WaveCount[32];
integer AngleStep[32];
real DummyLifeTime = 0;
static method create(integer sh, integer sd, string sdo, real dlt) -> SystemCastMultiWave {
integer i;
SystemCastMultiWave this = SystemCastMultiWave.allocate();
this.SpellHero = sh;
this.SpellDummy = sd;
this.SpellDummyOrder = OrderId(sdo);
this.DummyLifeTime = dlt;
if (this.DummyLifeTime == 0){
for (0 <= i < bj_MAX_PLAYER_SLOTS) {
this.DummyUnit[i] = CreateUnit(Player(i), DummyID, 0, 0, 0);
UnitAddAbility(this.DummyUnit[i], this.SpellDummy);
}
}
StructI = StructI + 1;
Struct[StructI] = this;
return this;
}
method setLevel(integer level, integer cw) -> SystemCastMultiWave {
this.WaveCount[level] = cw;
return this;
}
method cast(unit caster, real x, real y, real a){
integer i;
integer level = GetUnitAbilityLevel(caster, this.SpellHero);
integer count = IMaxBJ(1, WaveCount[level]);
player p = GetOwningPlayer(caster);
integer pid = GetPlayerId(p);
real dist = 50, step = 360 / count;
unit u;
if (this.DummyLifeTime == 0){
u = this.DummyUnit[pid];
SetUnitX(u, x);
SetUnitY(u, y);
}
for (0 < i <= count){
if (this.DummyLifeTime > 0){
u = CreateUnit(p, DummyID, x, y, 0);
UnitApplyTimedLife(u, 'BTLF', this.DummyLifeTime);
UnitAddAbility(u, this.SpellDummy);
}
SetUnitAbilityLevel(u, this.SpellDummy, level);
IssuePointOrderById(u, this.SpellDummyOrder, PolarX(x, dist, a), PolarY(y, dist, a));
a = fixAngle(a + step);
}
u = null;
}
method check(integer abi) -> boolean {
return abi == this.SpellHero;
}
}
}
function onInit(){
integer i;
trigger t = CreateTrigger();
for (0 <= i < bj_MAX_PLAYER_SLOTS) {
TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null);
}
TriggerAddAction(t, function(){
integer i;
location loc = GetSpellTargetLoc();
unit u = GetTriggerUnit();
real x, y, a;
for (0 <= i <= StructI){
if (Struct[i].check(GetSpellAbilityId())){
x = GetUnitX(u);
y = GetUnitY(u);
if (loc == null){
a = GetUnitFacing(u);
} else {
a = Angle(x, y, GetLocationX(loc), GetLocationY(loc));
}
Struct[i].cast(u, x, y, a);
}
}
RemoveLocation(loc); loc = null;
u = null;
});
}
}
//! endzinc
Пример настройки
//! zinc
library SystemCastMultiWaveSetting requires SystemCastMultiWave { function onInit() {
//Волна Силы I
SystemCastMultiWave
.create(
'A001', // Равкод способности, которую кастует герой
'A000', // Равкод способности, которую кастует дамми
"shockwave", // Приказ способности, которую кастует дамми
0 // Время жизни дамми, если больше нуля, то на каждый каст будет создан отдельный дамми
)
.setLevel(
1, // Уровень способности, который настраиваем
1 // Количество способностей, которые будут кастованы дамми
)
.setLevel(
2, // Уровень, который настраиваем
2 // Количество способностей, которые будут кастованы дамми
)
.setLevel(
3, // Уровень, который настраиваем
3 // Количество способностей, которые будут кастованы дамми
)
;
// Волна Силы II
SystemCastMultiWave
.create('A002', 'A000', "shockwave", 0)
.setLevel(1, 12)
;
// Пронзающая Смерть I
SystemCastMultiWave
.create('A004', 'A003', "impale", 10)
.setLevel(1, 1)
.setLevel(2, 2)
.setLevel(3, 3)
;
// Пронзающая Смерть II
SystemCastMultiWave
.create('A005', 'A003', "impale", 10)
.setLevel(1, 12)
;
// Тёмная стая I
SystemCastMultiWave
.create('A007', 'A006', "carrionswarm", 0)
.setLevel(1, 1)
.setLevel(2, 2)
.setLevel(3, 3)
;
// Тёмная стая II
SystemCastMultiWave
.create('A008', 'A006', "carrionswarm", 0)
.setLevel(1, 12)
;
// Огненное дыхание I
SystemCastMultiWave
.create('A00A', 'A009', "breathoffire", 0)
.setLevel(1, 1)
.setLevel(2, 2)
.setLevel(3, 3)
;
// Огненное дыхание II
SystemCastMultiWave
.create('A00B', 'A009', "breathoffire", 0)
.setLevel(1, 12)
;
}}
//! endzinc
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
У меня всегда проблемы с градусами в редакторе. (в основном что бы градус всегда был одним и тем же, а не менялся).
Но было бы хорошо если бы было и на GUI.
Отредактирован nazarpunk
RiderOfBalance:
Идея была в том, чтоб показать всем свой уровень и доработать систему по запросам в комментариях.
Но весьма полезна для тех кто учится и начинает переходить
Отредактирован nazarpunk
А можете сделать способность рывок?Просто мне очень нужно.