XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
влад10011

offline
Опыт: 2,337
Активность:
Фаталит спелл
Здрасте,
В общем, у меня спелл фаталит если использовать его более 1 раза в 1-2 сек.
Не могу найти проблему Х_Х
((кат система для спелла
((код
/*
Виспы Идут друг за другом змейкой
*/
library Wisps initializer Init {
define {
private dist=200.
private dist2=100.
private li=Wisp__li молния
}
! runtextmacro XAT("WispR","integer","0")
! runtextmacro XAT("Wisp","unit","null")
integer Count=0;
timer Timer=CreateTimer();
private record units {
unit array w[100]
lightning array l[100]
integer count
}
public unit RemoveWispEx(integer i) {
units un=i//GetWispR(GetWisp(u));
if un.count>2 {
RemoveWisp(un.w[un.count]);RemoveWispR(un.w[un.count]);
DestroyLightning(un.l[un.count]);
un.count--
return un.w[un.count+1]
}
return null
}
private void tim() {
units u;
integer i=1,k;
real x,x2,y,y2,d,a;
loop
u=i;
k=2;
loop {
x=GetUnitX(u.w[k]);y=GetUnitY(u.w[k]);
x2=GetUnitX(u.w[k-1]);y2=GetUnitY(u.w[k-1]);
d=DistXY(x,y,x2,y2);
MoveLightningEx(u.l[k],true,x,y,GetUnitFlyHeight(u.w[k])+50,x2,y2,GetUnitFlyHeight(u.w[k-1])+50);
if d>dist {
a=Atan2(y2-y,x2-x);
SetUnitX(u.w[k],x+(d-dist)*Cos(a));
SetUnitY(u.w[k],y+(d-dist)*Sin(a));
}elseif d<dist2 {
a=Atan2(y2-y,x2-x);
SetUnitX(u.w[k],x-(dist2-d)*Cos(a));
SetUnitY(u.w[k],y-(dist2-d)*Sin(a));
}
k++
ifloop k>u.count
}
i++
ifloop i>Count;
endloop
if Count==0{PauseTimer(Timer)}
}
public boolean ControlWisp(unit u) {
if GetWispR(u)==0 {
units un=cdef(units);
Count++
un.count=0;
un.count++;
un.w[un.count]=u;
un.count++;
un.w[un.count]=CreateUnit(GetOwningPlayer(u),'ewsp',GetUnitX(u),GetUnitY(u),0);
un.l[un.count]=AddLightningEx(li, true,GetUnitX(un.w[un.count]),GetUnitY(un.w[un.count]),150,GetUnitX(u),GetUnitY(u),350);
SetWispR(un.w[un.count],un.count);SetWisp(un.w[un.count],u);
SetWispR(u,un);
if Count==1 {TimerStart(Timer,0.025,true,function tim)}
return true
}
return false
}
public unit AddWispUnit(unit u) {
units un=GetWispR(u);
un.count++
un.w[un.count]=CreateUnit(GetOwningPlayer(u),'ewsp',GetUnitX(un.w[un.count-1]),GetUnitY(un.w[un.coun​t-1]),GetRandomReal(1,360));
un.l[un.count]=AddLightningEx(li, true,GetUnitX(un.w[un.count]),GetUnitY(un.w[un.count]),150,GetUnitX(u),GetUnitY(u),150);
SetWisp(un.w[un.count],u);SetWispR(un.w[un.count],un.count);
return un.w[un.count]
'ewsp'
}
public void AddWispUnitEx(unit u,unit u2) {
units un=GetWispR(u2);
un.count++
un.w[un.count]=u;
un.l[un.count]=AddLightningEx(li, true,0,0,0,0,0,0);
}
private void Init() {
}
}
))
))
((кат Спелл
((код
/*
Кастующий способность притягивает последнего виспа и подпинывает его по параболе к цели.
Но в этом моменте вылезает фатал ерор, если в это время ещё раз кинуть способность.
*/
library KickWisp initializer Init uses Wisps {
define {
private Height=200;
private Speed=25;
private Damag=50;
private Range=250;
private AttackType=HERO
private li=Wisp__li
}
private real array Dist1,Dist2,X,Y,Z;
private integer Count=0;
private unit array Unit,Dummy;
private timer Timer=CreateTimer();
private unit Caster;
private boolean array Bool;
private lightning array l;
private void Damageee() {
unit u=GetEnumUnit()
UnitDamageTarget(Caster,u,Damag*GetUnitAbilityLevel(Caster,'A000'),true,false,AttackTypes(AttackType​),DAMAGE_TYPE_FIRE,WEAPON_TYPE_WHOKNOWS)
u=null
}
private boolean Filt() {
return IsUnitEnemy(GetFilterUnit(),GetOwningPlayer(Caster))==true
}
private void tim() {
integer i=1
loop
unit u=Dummy[i];
real a
real x=GetUnitX(u);
real y=GetUnitY(u);
real d=DistXY(x,y,X[i],Y[i]),d2=DistXY(x,y,GetUnitX(Unit[i]),GetUnitY(Unit[i]));
if d>55 and Bool[i]==false {
a=Atan2(Y[i]-y,X[i]-x);
SetUnitX(u,x+Speed*Cos(a));SetUnitY(u,y+Speed*Sin(a));
Dist1[i]-=Speed;
SetUnitFlyHeight(u,(4.*(Z[i]+Height)/Dist2[i])*(Dist2[i]-Dist1[i])*(Dist1[i]/Dist2[i]),0.)
}elseif d2>55 and Bool[i]==true {
a=Atan2(GetUnitY(Unit[i])-y,GetUnitX(Unit[i])-x);
SetUnitX(u,x+Speed*Cos(a));SetUnitY(u,y+Speed*Sin(a));
MoveLightningEx(l[i],true,x,y,GetUnitFlyHeight(u),GetUnitX(Unit[i]),GetUnitY(Unit[i]),GetUnitFlyHeig​ht(Unit[i]));
}elseif d2<=55 and Bool[i]==true {
DestroyLightning(l[i]);
Bool[i]=false;
}elseif d<=55{
Caster=Unit[i];
group g=CreateGroup();GroupEnumUnitsInRange(g,X[i],Y[i],Range,Condition(function Filt))
ForGroup(g,function Damageee)
DestroyGroup(g)
IssuePointOrder(u,"detonate",X[i],Y[i])
if i!=Count {
Dist1[i]=Dist1[Count];
Dist2[i]=Dist2[Count];
X[i]=X[Count];
Y[i]=Y[Count];
Z[i]=Z[Count];
Bool[i]=Bool[Count];
Dummy[i]=Dummy[Count];
Unit[i]=Unit[Count];
}
Count--
}
if(Count==0){PauseTimer(Timer)}
i++
ifloop i>Count
endloop
}
private function Con takes nothing returns boolean
return GetSpellAbilityId()=='A000'
endfunction
private function Run takes nothing returns nothing
unit u=GetSpellAbilityUnit();
real x=GetSpellTargetX(),y=GetSpellTargetY();
Count++
Dummy[Count]=Wisps_RemoveWispEx(GetWispR(u));
if(Dummy[Count]==null){Count--;u=null;return}
Unit[Count]=u;
if DistXY(GetUnitX(u),GetUnitY(u),GetUnitX(Dummy[Count]),GetUnitY(Dummy[Count]))>100{Bool[Count]=tru​e}else{Bool[Count]=false;}
X[Count]=x;Y[Count]=y;
Dist1[Count]=DistXY(GetUnitX(u),GetUnitY(u),x,y);Dist2[Count]=Dist1[Count];
if Bool[Count] {
l[Count]=AddLightningEx(li,true,GetUnitX(u),GetUnitY(u),GetUnitFlyHeight(u),GetUnitX(Dummy[Count]),G​etUnitY(Dummy[Count]),GetUnitFlyHeight(Dummy[Count]));
}
Z[Count]=GetUnitFlyHeight(Dummy[Count])+150;
UnitAddAbility(Dummy[Count], 'Amrf');
SetUnitFlyHeight(Dummy[Count],Z[Count],0);
UnitRemoveAbility(Dummy[Count], 'Amrf');
if(Count==1){TimerStart(Timer,0.025,true,function tim)}
u=null;
endfunction
private function Init takes nothing returns nothing
trigger t= CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
TriggerAddCondition(t, Condition( function Con ) )
call TriggerAddAction(t, function Run)
endfunction
}
))
))
Прикрепленные файлы
Тип файла: w3x !WoodWars.w3x (46.4 Кбайт, 3 просмотров )

Отредактировано влад10011, 04.05.2013 в 12:58.
Старый 04.05.2013, 12:42
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
Самого текстмакро нету, что ты хочешь?
Clamp добавил:
Чрезвычайно усложнено всё, нет отступов и отладки. Тебе не будут помогать :)
Старый 04.05.2013, 13:02
влад10011

offline
Опыт: 2,337
Активность:
Clamp, ну.... я не привык ставить отступы, а от отладки нету смысла, фаталит сразу при включении способности.(я просто не увижу её)
Текст макро есть в карте(это обычный ХАТ).
Старый 04.05.2013, 13:05
Bornikkeny
Silenced by Bornikkeny
offline
Опыт: 24,410
Активность:
Не читабаельный код. Что уж поделаешь....
Старый 04.05.2013, 13:24
влад10011

offline
Опыт: 2,337
Активность:
Оказалось, фаталило из за передвижения молнии во время притягивания юнита:
((код
MoveLightningEx(l[i],true,x,y,GetUnitFlyHeight(u),GetUnitX(Unit[i]),GetUnitY(Unit[i]),GetUnitFlyHeig​ht(Unit[i]));
))
Но почему из за этого действия фаталило....Неизвестно...
Тему закрывайте...

Отредактировано влад10011, 04.05.2013 в 14:42.
Старый 04.05.2013, 14:02
IceFog

online
Опыт: 6,486
Активность:
Если хочешь увидеть отладку используй Debug Log от Doc'а.
Старый 04.05.2013, 14:35
J64_

offline
Опыт: 4,724
Активность:
l[i] возможно не инитиализировано, либо там находится значение null.
Старый 04.05.2013, 17:04
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 20:41.