private void SHOTMOVE(unit u,unit e,real dmg,real spd) { timer t = CreateTimer();int id = GetHandleId(t); SaveUnitHandle(Hash,id,0,u);SaveUnitHandle(Hash,id,1,e);SaveReal(Hash,id,2,dmg);SaveReal(Hash,id,3,spd);SaveReal(Hash,id,4,0.); TimerStart(t,.04,true,\ lambda void() { timer t = GetExpiredTimer();int id = GetHandleId(t) unit u = LoadUnitHandle(Hash,id,0),e = LoadUnitHandle(Hash,id,1); real dmg = LoadReal(Hash,id,2),spd = LoadReal(Hash,id,3),d = LoadReal(Hash,id,4); real ang = Atan2(GetUnitY(e)-GetWidgetY(u),GetUnitX(e)-GetWidgetX(u)),maxdis =GetDistanceBetweenCoords(GetUnitX(e), GetWidgetX(u), GetUnitY(e), GetWidgetY(u)); real x = GetWidgetX(u) + spd * Cos(ang),y = GetWidgetY(u) + spd * Sin(ang); if d <= maxdis { SetUnitX(u,x);SetUnitY(u,y) } else { TT(pc[GetPlayerId(GetOwningPlayer(u))]+I2S(R2I(dmg)),e); unit dum = CreateUnit(GetOwningPlayer(u),'h002',x,y,0.);UnitAddAbility(dum,'A00N');IssueTargetOrderById(dum,852095,e); UnitDamageTarget(u,e,dmg,true,false,null,null,null);RemoveUnit(u); FlushChildHashtable(Hash,id);PauseTimer(t);DestroyTimer(t) } SaveReal(Hash,id,4,d+spd) } ) }
private void SHOTMOVE(unit u,unit e,real dmg,real spd) { timer t = CreateTimer();int id = GetHandleId(t); SaveUnitHandle(Hash,id,0,u);SaveUnitHandle(Hash,id,1,e);SaveReal(Hash,id,2,dmg);SaveReal(Hash,id,3,spd);SaveReal(Hash,id,4,0.); TimerStart(t,.04,true,\ lambda void() { timer t = GetExpiredTimer();int id = GetHandleId(t) unit u = LoadUnitHandle(Hash,id,0),e = LoadUnitHandle(Hash,id,1); real dmg = LoadReal(Hash,id,2),spd = LoadReal(Hash,id,3),d = LoadReal(Hash,id,4); real ang = Atan2(GetUnitY(e)-GetWidgetY(u),GetUnitX(e)-GetWidgetX(u)),maxdis =GetDistanceBetweenCoords(GetUnitX(e), GetWidgetX(u), GetUnitY(e), GetWidgetY(u)); real x = GetWidgetX(u) + spd * Cos(ang),y = GetWidgetY(u) + spd * Sin(ang); if d <= maxdis { SetUnitX(u,x);SetUnitY(u,y) } else { TT(pc[GetPlayerId(GetOwningPlayer(u))]+I2S(R2I(dmg)),e); unit dum = CreateUnit(GetOwningPlayer(u),'h002',x,y,0.);UnitAddAbility(dum,'A00N');IssueTargetOrderById(dum,852095,e); UnitDamageTarget(u,e,dmg,true,false,null,null,null);RemoveUnit(u); FlushChildHashtable(Hash,id);PauseTimer(t);DestroyTimer(t) } SaveReal(Hash,id,4,d+spd) }) }
[HoBu4oK], зачем тебе сЖасс, ты что дестроишь глобальные триггеры или импортишь свои наработки? Пиши плиз каждое действие на отдельно строке а не нескольео на одной, от этого ты умней не становишься и код этим не оптимизируешь.
[HoBu4oK], увеличь скорость движения, тогда исчезать будет ближе к цели
Code
scope EP2 {
private void SHOTMOVE(unit u,unit e,real dmg,real spd) { timer t = CreateTimer(); int id = GetHandleId(t); SaveAgentHandle(Hash,id,0,u); SaveAgentHandle(Hash,id,1,e); SaveReal(Hash,id,2,dmg); SaveReal(Hash,id,3,spd); TimerStart(t,.04,true,\ lambda void() { timer t = GetExpiredTimer(); int id = GetHandleId(t) unit u = LoadUnitHandle(Hash,id,0); unit e = LoadUnitHandle(Hash,id,1); unit dum; real dmg = LoadReal(Hash,id,2); real spd = LoadReal(Hash,id,3); real d = LoadReal(Hash,id,4); real ang = Atan2(GetUnitY(e)-GetWidgetY(u),GetUnitX(e)-GetWidgetX(u)); real maxdis = GetDistanceBetweenCoords(GetWidgetX(e), GetWidgetX(u), GetWidgetY(e), GetWidgetY(u)); real x = GetWidgetX(u) + spd * Cos(ang); real y = GetWidgetY(u) + spd * Sin(ang); if (d <= maxdis) { SetUnitX(u,x); SetUnitY(u,y) } else { TT(pc[GetPlayerId(GetOwningPlayer(u))]+I2S(R2I(dmg)),e); dum = CreateUnit(GetOwningPlayer(u),'h002',x,y,0.); UnitAddAbility(dum,'A00N');IssueTargetOrderById(dum,852095,e); UnitDamageTarget(u,e,dmg,true,false,null,null,null); RemoveUnit(u); FlushChildHashtable(Hash,id); PauseTimer(t); DestroyTimer(t) } SaveReal(Hash,id,4,d+spd) } ) }
callback onUnitSpellEffect('A00M') { timer t=CreateTimer(); int h=GetHandleId(t) unit u=GetTriggerUnit(); real x=GetWidgetX(u); real y=GetWidgetY(u); real sek=6.28 unit d=CreateUnit(GetOwningPlayer(u),'h00G',x+120.*Cos(1.),y+120.*Sin(1.),90.); SaveAgentHandle(Hash,h,0,d); SaveReal(Hash,h,1,sek); SaveReal(Hash,h,2,0); SaveAgentHandle(Hash,h,3,u);
TimerStart(t,.04,true, \ lambda void() { timer t = GetExpiredTimer(); integer h = GetHandleId(t); unit d = LoadUnitHandle(Hash,h,0); unit u = LoadUnitHandle(Hash,h,3); real sek = LoadReal(Hash,h,1); real f = LoadReal(Hash,h,2); if (f >= sek * 3.) { for(unit e; UnitsInRange(GetWidgetX(u),GetWidgetY(u), 650.)use TG) { if (IsUnitEnemy(e,GetOwningPlayer(u)) && !IsUnitType(e,UNIT_TYPE_STRUCTURE) && GetWidgetLife(e)>.405 && !IsUnitType(e, UNIT_TYPE_MAGIC_IMMUNE)) { SHOTMOVE(d,e,GetHeroStr(u,true),25.); pdtr = true; } } if (!LoadBoolean(Hash,h,4)) { RemoveUnit(d); } FlushChildHashtable(Hash,h); PauseTimer(t); DestroyTimer(t); } else { f += .34; SetUnitX(d,GetWidgetX(u)+90.*Cos(f+90.-25.12)); SetUnitY(d,GetWidgetY(u)+90.*Sin(f+90.-25.12)); } SaveReal(Hash,h,2,f); } )
}
}
Стал более очевидным местами. Заюзал коллбэк, местами выпилил лишние сохранения в хэш. И, бтв, что делает функция TT?
Добавлено (09 Октября 2012, 15:16:12) --------------------------------------------- И еще: если ты пишешь на cJass, юзай только его синтаксис, не смешивай с классическим JASS2, иначе получается тихий ужас. К примеру, у тебя на одной строчке было if cond and cond 2 && cond3 (это грубый пример, показывающий конструкцию)
увеличь скорость движения, тогда исчезать будет ближе к цели
Не мне надо именно чтобы до цели долетел и умер.
Добавлено (09 Октября 2012, 15:18:27) ---------------------------------------------
Quote (|HoBu4oK|)
И еще: если ты пишешь на cJass, юзай только его синтаксис, не смешивай с классическим JASS2, иначе получается тихий ужас. К примеру, у тебя на одной строчке было if cond and cond 2 && cond3 (это грубый пример, показывающий конструкцию)
Умирает, дамик, в 1-ой точке юнита, тобишь, где 1-ый X,Y, до оттуда долетает, идёт стан и урон, а цель уже может быть в далеко от 1-ого X,Y
Quote (Ty3uK)
Ну вот ты же и сравниваешь через GetDistanceBetweenCoords (где-то я ее видел... : D )
Ну да у тебя в наработке : D, не давно нашел, а теперь юзаю, а до этого(месяц назад где-то или 2) юзал SquareRoot, но что-то слишком тошный он, большой)