Помогите разобраться, как сделать этот код короче. Я только начинающий Jass'ер, но на мой взгляд, должен быть способ проще и лучше.) Спел стунит врага и держит его на расстоянии перед героем в течении опр. времени.
P.S. Знаю, что integer и real обнулять не надо. Просто для красоты сделал.
Code
function Trig_Orvan_Tenacious_grasp_Conditions takes nothing returns boolean if ( not ( GetSpellAbilityId() == 'A02O' ) ) then return false endif return true endfunction
//function lightoffdelereAttack takes nothing returns nothing //local unit u2=GetTriggerUnit() //local unit u=LoadUnitHandle(udg_Hash, GetHandleId(u2),1) //local timer t=LoadTimerHandle(udg_Hash, GetHandleId(u2),2) //if ( not ( GetEventDamageSource() == u ) ) then //call UnitRemoveBuffBJ( 'BPSE', u2 ) //call PauseTimerBJ( true, t ) //call FlushChildHashtable(udg_Hash, GetHandleId(u2)) //endif //set u=null //set u2=null //t=null //endfunction
function lightoffdelere takes nothing returns nothing local timer t=GetExpiredTimer() local lightning s=LoadLightningHandle(udg_Hash, GetHandleId(t),1) call FlushChildHashtable(udg_Hash, GetHandleId(t)) call DestroyTimer(t) call DestroyLightningBJ( s ) set s=null set t=null endfunction
function Orvan_LIGHTimer takes nothing returns nothing local timer t=GetExpiredTimer() local timer lightdelete=CreateTimer() local unit u=LoadUnitHandle(udg_Hash, GetHandleId(t),1) local unit u2=LoadUnitHandle(udg_Hash, GetHandleId(t),2) local location p=GetUnitLoc(u) local location p2=GetUnitLoc(u2) local lightning s local real r=GetUnitFacing(u) call SetUnitPositionLoc( u2, PolarProjectionBJ(p, 180.00, r) ) call AddLightningLoc( "AFOD", p, p2 ) set s=GetLastCreatedLightningBJ() call SaveLightningHandle(udg_Hash, GetHandleId(lightdelete), 1, s) call TimerStart(lightdelete, 0.03, false, function lightoffdelere) call RemoveLocation(p) call RemoveLocation(p2) set t=null set lightdelete=null set u=null set u2=null set p=null set p2=null set r=0 set s=null endfunction
function Orvan_LIGHTOFF takes nothing returns nothing local timer t=GetExpiredTimer() local trigger tr=LoadTriggerHandle(udg_Hash, GetHandleId(t),1) local trigger tr2=LoadTriggerHandle(udg_Hash, GetHandleId(t),4) local timer t2=LoadTimerHandle(udg_Hash, GetHandleId(t),2) //local unit u=LoadUnitHandle(udg_Hash, GetHandleId(t),3) call DestroyTrigger(tr) call TriggerClearActions(tr) call DestroyTrigger(tr2) call TriggerClearActions(tr2) call PauseTimerBJ( true, t2 ) call FlushChildHashtable(udg_Hash, GetHandleId(t)) call FlushChildHashtable(udg_Hash, GetHandleId(t2)) //call FlushChildHashtable(udg_Hash, GetHandleId(u)) call DestroyTimer(t) call DestroyTimer(t2) set t=null set t2=null set tr=null //set u=null set tr2=null endfunction
function Trig_Orvan_Tenacious_grasp_Actions takes nothing returns nothing local unit u=GetTriggerUnit() local unit u2=GetSpellTargetUnit() local real array r local integer i=0 local timer t=CreateTimer() local timer Timerlight=CreateTimer() local trigger tr=CreateTrigger() //local trigger tr2=CreateTrigger() set r[1]=2 set r[2]=2.5 set r[3]=3 set r[4]=3.5 set i=GetUnitAbilityLevelSwapped('A02O', u) call SaveUnitHandle(udg_Hash, GetHandleId(Timerlight), 1, u) //call SaveUnitHandle(udg_Hash, GetHandleId(u2), 1, u) //call SaveTimerHandle(udg_Hash, GetHandleId(u2), 2, Timerlight) call SaveUnitHandle(udg_Hash, GetHandleId(Timerlight), 2, u2) call SaveTriggerHandle(udg_Hash, GetHandleId(t), 1, tr) call SaveTimerHandle(udg_Hash, GetHandleId(t), 2, Timerlight) //call SaveUnitHandle(udg_Hash, GetHandleId(t), 3, u2) //call SaveTriggerHandle(udg_Hash, GetHandleId(t), 4, tr2) call TriggerRegisterTimerExpireEventBJ( tr, Timerlight ) call TriggerAddAction(tr,function Orvan_LIGHTimer) call TimerStart(t, r[i], false, function Orvan_LIGHTOFF) call StartTimerBJ( Timerlight, true, 0.05 ) //call TriggerRegisterUnitEvent( tr2, u2, EVENT_UNIT_DAMAGED ) //call TriggerAddAction(tr2,function lightoffdelereAttack) set u=null set u2=null set r[1]=0 set r[2]=0 set r[3]=0 set r[4]=0 set t=null set Timerlight=null set tr=null //set tr2=null endfunction
//=========================================================================== function InitTrig_Orvan_Tenacious_grasp takes nothing returns nothing set gg_trg_Orvan_Tenacious_grasp = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Orvan_Tenacious_grasp, EVENT_PLAYER_UNIT_SPELL_CAST ) call TriggerAddCondition( gg_trg_Orvan_Tenacious_grasp, Condition( function Trig_Orvan_Tenacious_grasp_Conditions ) ) call TriggerAddAction( gg_trg_Orvan_Tenacious_grasp, function Trig_Orvan_Tenacious_grasp_Actions ) endfunction
он кривой как отражение в луже под дождем. Кошмар ад и погибель ждет того кто будет этот код использовать. Всюду бж, обнуление реалов, какое то ужасное в своей сути удаление таймеров.
Добавлено (02-06-2011, 20:00) --------------------------------------------- короче, скажи словами, что ты хочешь что бы происходило ?
Первые три функции
1. сносит лайтинг по хэндлу (криво сносит, кстати) 2. двигает юнита и создает лайтинг+сносит его 3. ...пошел ступор.. Не понятно при каких условиях удаляется тот или иной таймер, вообще делаться это все должно совершенно по другому и, на самом деле, делается в 2 функции.
короче, скажи словами, что ты хочешь что бы происходило ?
Герой кидает на врага стун. Враг прикрепляется к нему, на растоянии 100. При повороте героя положения врага в пространстве меняется относительно угла поворота героя. (т.е. враг перед лицом героя) Между ними лайтинг... Всё это чудо длится 2/ 2.5/ 3,/3.5 сек.
Quote (FkoFF)
сносит лайтинг по хэндлу (криво сносит, кстати)
Quote (FkoFF)
пошел ступор.. Не понятно при каких условиях удаляется тот или иной таймер, вообще делаться это все должно совершенно по другому и, на самом деле, делается в 2 функции.
Как нужно?
Сообщение отредактировал Diabfall - Четверг, 02 Июня 2011, 21:12:50
function AttachUnitFrontcb takes nothing returns nothing local timer t=GetExpiredTimer() local integer ti=GetHandleId(t) local unit u=LoadUnitHandle(udg_Data,ti,0) local unit target=LoadUnitHandle(udg_Data,ti,1) local lightning lt=LoadLightningHandle(udg_Data,ti,2) local real range=LoadReal(udg_Data,ti,3) local real timeleft=LoadReal(udg_Data,ti,4) local real array z
if timeleft>0 and IsUnitType(target,UNIT_TYPE_DEAD)==false and IsUnitType(u,UNIT_TYPE_DEAD)==false then set z[1]=GetWidgetX(u)+range*Cos(GetUnitFacing(u)*bj_DEGTORAD) set z[2]=GetWidgetY(u)+range*Cos(GetUnitFacing(u)*bj_DEGTORAD) set z[3]=GetWidgetX(target) set z[4]=GetWidgetY(target) set z[5]=SquareRoot((z[1]-z[3]) * (z[1]-z[3]) + (z[2]-z[4])*(z[2]-z[4]))/4 set z[6]=bj_RADTODEG * Atan2(z[4] - z[2], z[3]- z[1])
set t=null set u=null set target=null set lt=null endfunction
function AttachUnitFront takes unit u, unit target, real range, real duration returns nothing local timer t=CreateTimer() local integer ti=GetHandleId(t) local lightning lt=AddLightning(model,false,0,0,0,0)
call TimerStart(t,0.03,true,function AttachUnitFrontcb) set t=null set lt=null endfunction
бтв, специально сделал что бы противник плавно перемещался в точку перед лицом героя, потому что на мой сугубо личный это не красиво когда юнит мгновенно перетаскивается.
FkoFF, в твоём примере u - герой target - цель range - расстояние? или угол? duration - время
Во второй функции timeleft>0 т.е. нужна третья функция, которая будет нарушать это условие?
Попробовал использовать... Юнит улетает за карту. Видимо, из-за того, что я не правильно присваивал значения переменным.
Code
function Trig_Orvan_Tenacious_grasp_Conditions takes nothing returns boolean if ( not ( GetSpellAbilityId() == 'A02O' ) ) then return false endif return true endfunction
function Orvan_LIGHTOFF takes nothing returns nothing local timer t=GetExpiredTimer() local integer ti=GetHandleId(t) local unit u=LoadUnitHandle(udg_Hash,ti,0) local unit target=LoadUnitHandle(udg_Hash,ti,1) local lightning lt=LoadLightningHandle(udg_Hash,ti,2) local real range=LoadReal(udg_Hash,ti,3) local real timeleft=LoadReal(udg_Hash,ti,4) local real array z
if timeleft>0 and IsUnitType(target,UNIT_TYPE_DEAD)==false and IsUnitType(u,UNIT_TYPE_DEAD)==false then set z[1]=GetWidgetX(u)+range*Cos(GetUnitFacing(u)*bj_DEGTORAD) set z[2]=GetWidgetY(u)+range*Cos(GetUnitFacing(u)*bj_DEGTORAD) set z[3]=GetWidgetX(target) set z[4]=GetWidgetY(target) set z[5]=SquareRoot((z[1]-z[3]) * (z[1]-z[3]) + (z[2]-z[4])*(z[2]-z[4]))/4 set z[6]=bj_RADTODEG * Atan2(z[4] - z[2], z[3]- z[1])
set t=null set u=null set target=null set lt=null endfunction
function Orn takes nothing returns nothing local unit u local unit target local real range local real array duration local timer t=CreateTimer() local integer ti=GetHandleId(t) local lightning lt=AddLightning("AFOD",false,0,0,0,0) local integer i set u=GetTriggerUnit() set target=GetSpellTargetUnit() set duration[1]=2 set duration[2]=2.5 set duration[3]=3 set duration[4]=3.5 set range=180 set i=GetUnitAbilityLevelSwapped('A02O', u) call PauseUnit(target,true) call SaveUnitHandle(udg_Hash,ti,0,u) call SaveUnitHandle(udg_Hash,ti,1,target) call SaveLightningHandle(udg_Hash,ti,2,lt) call SaveReal(udg_Hash,ti,3,range) call SaveReal(udg_Hash,ti,4,duration[i]) call TimerStart(t,0.03,true,function Orvan_LIGHTOFF) set t=null set lt=null set u=null set target=null endfunction
//=========================================================================== function InitTrig_Orvan1 takes nothing returns nothing set gg_trg_Orvan1 = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Orvan1, EVENT_PLAYER_UNIT_SPELL_CAST ) call TriggerAddCondition( gg_trg_Orvan1, Condition( function Trig_Orvan_Tenacious_grasp_Conditions ) ) call TriggerAddAction( gg_trg_Orvan1, function Orn ) endfunction
Во второй функции timeleft>0 т.е. нужна третья функция, которая будет нарушать это условие?
нет же.
Quote (SirNikolas)
И молния не будет реагировать на рельеф.
молния ниже рельефа не пойдет, ну да впрочем ты таки прав.
Quote (SirNikolas)
И еще опечатка.
ошибка в том что y ось множится на Cos а не на Sin Diabfall, Сравни свой код и мой код (в частности инит в триггере 'Orn'), и больше не повторяй своих ошибок. Собственно триггер по идее готов к работе, пробуй - отпиши результат.
function Orvan_LIGHTOFF takes nothing returns nothing local timer t=GetExpiredTimer() local integer ti=GetHandleId(t) local unit u=LoadUnitHandle(udg_Hash,ti,0) local unit target=LoadUnitHandle(udg_Hash,ti,1) local lightning lt=LoadLightningHandle(udg_Hash,ti,2) local real range=LoadReal(udg_Hash,ti,3) local real timeleft=LoadReal(udg_Hash,ti,4) local real array z
if timeleft>0 and IsUnitType(target,UNIT_TYPE_DEAD)==false and IsUnitType(u,UNIT_TYPE_DEAD)==false then call SaveReal(udg_Hash,ti,4,timeleft-0.03) set z[1]=GetWidgetX(u)+range*Cos(GetUnitFacing(u)*bj_DEGTORAD) set z[2]=GetWidgetY(u)+range*Sin(GetUnitFacing(u)*bj_DEGTORAD) set z[3]=GetWidgetX(target) set z[4]=GetWidgetY(target) set z[5]=SquareRoot((z[1]-z[3]) * (z[1]-z[3]) + (z[2]-z[4])*(z[2]-z[4]))/4 set z[6]=bj_RADTODEG * Atan2(z[4] - z[2], z[3]- z[1])
set t=null set u=null set target=null set lt=null endfunction
function Orn takes nothing returns nothing local unit u=GetTriggerUnit() local unit target=GetSpellTargetUnit() local real range=180 local real array duration local timer t=CreateTimer() local integer ti=GetHandleId(t) local lightning lt=AddLightning("AFOD",false,0,0,0,0) local integer i=GetUnitAbilityLevel(u,GetSpellAbilityId()) call PauseUnit(target,true) call SaveUnitHandle(udg_Hash,ti,0,u) call SaveUnitHandle(udg_Hash,ti,1,target) call SaveLightningHandle(udg_Hash,ti,2,lt) call SaveReal(udg_Hash,ti,3,range) call SaveReal(udg_Hash,ti,4,1.5+.5*level) call TimerStart(t,0.03,true,function Orvan_LIGHTOFF) set t=null set lt=null set u=null set target=null endfunction
//=========================================================================== function InitTrig_Orvan1 takes nothing returns nothing set gg_trg_Orvan1 = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Orvan1, EVENT_PLAYER_UNIT_SPELL_CAST ) call TriggerAddCondition( gg_trg_Orvan1, Condition( function Trig_Orvan_Tenacious_grasp_Conditions ) ) call TriggerAddAction( gg_trg_Orvan1, function Orn ) endfunction
Сравни свой код и мой код (в частности инит в триггере 'Orn'), и больше не повторяй своих ошибок.
Ок.)
Quote (FkoFF)
Собственно триггер по идее готов к работе, пробуй - отпиши результат.
Попробовал. Теперь эффект заканчивается с течением времени, но юнит-цель криво перемещается, и после нескольких поворотов героя юнит-цель вообще улетает.
function Orvan_LIGHTOFF takes nothing returns nothing local timer t=GetExpiredTimer() local integer ti=GetHandleId(t) local unit u=LoadUnitHandle(udg_Hash,ti,0) local unit target=LoadUnitHandle(udg_Hash,ti,1) local lightning lt=LoadLightningHandle(udg_Hash,ti,2) local real range=LoadReal(udg_Hash,ti,3) local real timeleft=LoadReal(udg_Hash,ti,4) local real array z
if timeleft>0 and IsUnitType(target,UNIT_TYPE_DEAD)==false and IsUnitType(u,UNIT_TYPE_DEAD)==false then call SaveReal(udg_Hash,ti,4,timeleft-0.03) set z[1]=GetWidgetX(u)+range*Cos(GetUnitFacing(u)*bj_DEGTORAD) set z[2]=GetWidgetY(u)+range*Sin(GetUnitFacing(u)*bj_DEGTORAD) set z[3]=GetWidgetX(target) set z[4]=GetWidgetY(target) set z[5]=SquareRoot((z[1]-z[3]) * (z[1]-z[3]) + (z[2]-z[4])*(z[2]-z[4]))/4 set z[6]=bj_RADTODEG * Atan2(z[4] - z[2], z[3]- z[1])
set t=null set u=null set target=null set lt=null endfunction
function Orn takes nothing returns nothing local unit u=GetTriggerUnit() local unit target=GetSpellTargetUnit() local real range=180 local timer t=CreateTimer() local integer ti=GetHandleId(t) local lightning lt=AddLightning("AFOD",false,0,0,0,0) local integer i=GetUnitAbilityLevel(u,GetSpellAbilityId()) call PauseUnit(target,true) call SaveUnitHandle(udg_Hash,ti,0,u) call SaveUnitHandle(udg_Hash,ti,1,target) call SaveLightningHandle(udg_Hash,ti,2,lt) call SaveReal(udg_Hash,ti,3,range) call SaveReal(udg_Hash,ti,4,1.5+0.5*i) call TimerStart(t,0.03,true,function Orvan_LIGHTOFF) set t=null set lt=null set u=null set target=null endfunction
//=========================================================================== function InitTrig_Orvan1 takes nothing returns nothing set gg_trg_Orvan1 = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Orvan1, EVENT_PLAYER_UNIT_SPELL_CAST ) call TriggerAddCondition( gg_trg_Orvan1, Condition( function Trig_Orvan_Tenacious_grasp_Conditions ) ) call TriggerAddAction( gg_trg_Orvan1, function Orn ) endfunction
function Orvan_LIGHTOFF takes nothing returns nothing local timer t=GetExpiredTimer() local integer ti=GetHandleId(t) local unit u=LoadUnitHandle(udg_Hash,ti,0) local unit target=LoadUnitHandle(udg_Hash,ti,1) local lightning lt=LoadLightningHandle(udg_Hash,ti,2) local real range=LoadReal(udg_Hash,ti,3) local real timeleft=LoadReal(udg_Hash,ti,4) local real array z
if timeleft>0 and IsUnitType(target,UNIT_TYPE_DEAD)==false and IsUnitType(u,UNIT_TYPE_DEAD)==false then call SaveReal(udg_Hash,ti,4,timeleft-0.03) set z[1]=GetWidgetX(u)+range*Cos(GetUnitFacing(u)*bj_DEGTORAD) set z[2]=GetWidgetY(u)+range*Sin(GetUnitFacing(u)*bj_DEGTORAD) set z[3]=GetWidgetX(target) set z[4]=GetWidgetY(target) set z[5]=SquareRoot((z[1]-z[3]) * (z[1]-z[3]) + (z[2]-z[4])*(z[2]-z[4]))/4 set z[6]=bj_RADTODEG * Atan2(z[4] - z[2], z[3]- z[1])
set t=null set u=null set target=null set lt=null endfunction
function Orn takes nothing returns nothing local unit u=GetTriggerUnit() local unit target=GetSpellTargetUnit() local real range=180 local timer t=CreateTimer() local integer ti=GetHandleId(t) local lightning lt=AddLightning("AFOD",false,0,0,0,0) local integer i=GetUnitAbilityLevel(u,GetSpellAbilityId()) call PauseUnit(target,true) call SaveUnitHandle(udg_Hash,ti,0,u) call SaveUnitHandle(udg_Hash,ti,1,target) call SaveLightningHandle(udg_Hash,ti,2,lt) call SaveReal(udg_Hash,ti,3,range) call SaveReal(udg_Hash,ti,4,1.5+0.5*i) call TimerStart(t,0.03,true,function Orvan_LIGHTOFF) set t=null set lt=null set u=null set target=null endfunction
//=========================================================================== function InitTrig_Orvan1 takes nothing returns nothing set gg_trg_Orvan1 = CreateTrigger( ) call TriggerRegisterAnyUnitEventBJ( gg_trg_Orvan1, EVENT_PLAYER_UNIT_SPELL_CAST ) call TriggerAddCondition( gg_trg_Orvan1, Condition( function Trig_Orvan_Tenacious_grasp_Conditions ) ) call TriggerAddAction( gg_trg_Orvan1, function Orn ) endfunction