влад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.count-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]),GetUnitFlyHeight(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]=true}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]),GetUnitY(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 } )) )) Отредактировано влад10011, 04.05.2013 в 12:58. |
04.05.2013, 12:42 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Clamp
Lost in space
offline
Опыт:
71,258Активность: |
Самого текстмакро нету, что ты хочешь?
Clamp добавил: Чрезвычайно усложнено всё, нет отступов и отладки. Тебе не будут помогать :) |
04.05.2013, 13:02 | #2
+1/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
влад10011
offline
Опыт:
2,337Активность: |
Clamp, ну.... я не привык ставить отступы, а от отладки нету смысла, фаталит сразу при включении способности.(я просто не увижу её) Текст макро есть в карте(это обычный ХАТ). |
04.05.2013, 13:05 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Bornikkeny
Silenced by Bornikkeny
offline
Опыт:
24,410Активность: |
Не читабаельный код. Что уж поделаешь.... |
04.05.2013, 13:24 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
влад10011
offline
Опыт:
2,337Активность: |
Оказалось, фаталило из за передвижения молнии во время притягивания юнита:
((код
MoveLightningEx(l[i],true,x,y,GetUnitFlyHeight(u),GetUnitX(Unit[i]),GetUnitY(Unit[i]),GetUnitFlyHeight(Unit[i])); )) Но почему из за этого действия фаталило....Неизвестно... Тему закрывайте... Отредактировано влад10011, 04.05.2013 в 14:42. |
04.05.2013, 14:02 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
IceFog
offline
Опыт:
7,993Активность: |
Если хочешь увидеть отладку используй Debug Log от Doc'а. |
04.05.2013, 14:35 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J64_
offline
Опыт:
4,724Активность: |
l[i] возможно не инитиализировано, либо там находится значение null. |
04.05.2013, 17:04 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|