Một system sky vừa viết ra!Nói chung nó rất đơn giản để làm nhưng rất hữu dụng với những bạn rành về trigger spell! Đây: Mã: library TargetCast //*********************************************************** //* Target cast Library //* Written by Azuha Sky //* Requires A Dummy //* A simple system but useful! //*********************************************************** //* Dummy Cast Ability Event //* Some time,you like create a dummy and order it cast ability //* to a unit!But that is bad because some leak can't remove //* and it's very long! //* And here!You can use this library to cast spell to a target //* it's short and useful! //*********************************************************** //* Use this code to cast ability to a target //* call TargetCast(unit source,unit target,integer ability,string order,integer level of ability) //* or //* call TargetCastEx(unit source,unit target,integer ability,string order,real damage,attack attack type,damagetype damage type,integer level) //* and Area //* call TargetCastLoc(unit source,real x,real y,integer ability,string order,integer level of ability) //* call TargetCastLocEx(unit source,real x,real y,integer ability,string order,real damage,attacktype Att,damagetype damage type,integer level of ability,real area effect) //* Any effect create with percent (Might be you want create a buff for target with percent cast) //* function AdvancedCast takes unit source,unit target,integer spell,string order,integer level,integer percent //* //* Thank you for using! //*********************************************************** globals private constant integer DUMMY_UNITED = 'o000' //You can edit that DUMMY UNITED to cast to target // because some you dummy not is this ID! private constant integer imID = 'Amim' //Requires target unit not Resistant any spell! private unit u endglobals // ******************* // ***Using Trigger*** // ******************* function AdvancedCast takes unit source,unit target,integer spell,string order,integer level,integer percent returns nothing local unit dummy = CreateUnitAtLoc(GetOwningPlayer(source),DUMMY_UNITED,GetUnitLoc(target),0.0) call UnitAddAbility(dummy,spell) call UnitAddAbility(dummy,'Aloc') call SetUnitAbilityLevel(dummy,spell,level) call SetUnitUserData(dummy,0) call SetUnitFlyHeight(dummy,0,0) call UnitApplyTimedLife(dummy, 'BTLF', 0.50) call PauseUnit(dummy,false) if percent>GetRandomInt(1,100) then if GetUnitAbilityLevel(target,imID)>0 then debug call BJDebugMsg("Can't cast ability to this target!May be this target resist this spell!Unit: "+GetUnitName(target)) else call IssueTargetOrder(dummy,order,target) endif endif set dummy = null set source = null set target = null endfunction function TargetCast takes unit source, unit target, integer spell, string order, integer level returns nothing local unit dummy = CreateUnitAtLoc(GetOwningPlayer(source),DUMMY_UNITED,GetUnitLoc(target),0.0) call UnitApplyTimedLife(dummy, 'BTLF', 0.40) call UnitAddAbility(dummy,spell) call UnitAddAbility(dummy,'Aloc') call SetUnitAbilityLevel(dummy,spell,level) call SetUnitUserData(dummy,0) call SetUnitFlyHeight(dummy,0,0) call IssueTargetOrder(dummy,order,target) call PauseUnit(dummy,false) if (GetUnitAbilityLevel(target,imID) > 0) then debug call BJDebugMsg("Can't cast ability to this target!May be this target resist this spell!Unit: "+GetUnitName(target)) endif set dummy = null set source = null set target = null set u = null endfunction function TargetCastEx takes unit source, unit target, integer spell, string order, real damage, attacktype Atype, damagetype Dtype, integer level returns nothing local unit dummy = CreateUnitAtLoc(GetOwningPlayer(source),DUMMY_UNITED,GetUnitLoc(target),0.0) call UnitApplyTimedLife(dummy, 'BTLF', 0.40) call UnitAddAbility(dummy,spell) call UnitAddAbility(dummy,'Aloc') call SetUnitAbilityLevel(dummy,spell,level) call SetUnitUserData(dummy,0) call SetUnitFlyHeight(dummy,0,0) call IssueTargetOrder(dummy,order,target) call PauseUnit(dummy,false) //Call damage target if (GetUnitAbilityLevel(target,imID) > 0) then debug call BJDebugMsg("Can't cast ability to this target!May be this target resist this spell!Unit: "+GetUnitName(target)) else call UnitDamageTarget(source,target,damage,false,false,Atype,Dtype,null) endif if damage ==0 then debug call BJDebugMsg("Can't cause damage to target!Please fix error at your trigger!May be real damage taken equal to 0!") endif set dummy = null set source = null set target = null set u = null endfunction // ********************* // **Location Trigger ** // ********************* private function Check takes nothing returns boolean return IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(u)) and GetWidgetLife(GetFilterUnit())>0.405 and GetUnitAbilityLevel(GetFilterUnit(),'Avul')==0 endfunction function TargetCastLoc takes unit source, real x, real y, integer spell, string order, integer level returns nothing local unit dummy = CreateUnit(GetOwningPlayer(source),DUMMY_UNITED,x,y,0.0) call UnitApplyTimedLife(dummy, 'BTLF', 0.45) call UnitAddAbility(dummy,spell) call UnitAddAbility(dummy,'Aloc') call SetUnitAbilityLevel(dummy,spell,level) call SetUnitUserData(dummy,0) call SetUnitFlyHeight(dummy,0,0) call IssuePointOrder(dummy,order,x,y) call PauseUnit(dummy,false) set dummy = null set source = null set u = null endfunction function TargetCastLocEx takes unit source, real x, real y, integer spell, string order, real damage, attacktype Atype, damagetype Dtype, integer level, real range returns nothing local group g = CreateGroup() local unit enum local unit dummy = CreateUnit(GetOwningPlayer(source),DUMMY_UNITED,x,y,0.0) call UnitApplyTimedLife(dummy, 'BTLF', 0.45) call UnitAddAbility(dummy,spell) call UnitAddAbility(dummy,'Aloc') call SetUnitAbilityLevel(dummy,spell,level) call SetUnitUserData(dummy,0) call SetUnitFlyHeight(dummy,0,0) call IssuePointOrder(dummy,order,x,y) call PauseUnit(dummy,false) set u=source if damage ==0 then debug call BJDebugMsg("Can't cause damage to target!Please fix error at your trigger!May be real damage taken equal to 0!") endif call GroupEnumUnitsInRange(g,x,y,range,Condition(function Check)) loop set enum = FirstOfGroup(g) exitwhen (enum==null) call GroupRemoveUnit(g,enum) call UnitDamageTarget(source,enum,damage,false,false,Atype,Dtype,null) endloop set dummy = null set source = null set enum = null set u = null call GroupClear(g) call DestroyGroup(g) endfunction endlibrary Rất đơn giản để sử dụng!Chỉ cần dùng lệnh: TargetCast(người dùng,mục tiêu,chỉ số code kỹ năng,lệnh sử dụng,cấp độ) Chúc các bạn có thể dùng tốt với trigger của mình!:)
tại sao phải dùng cái này thay vì dùng xe? xe còn có cả "recycle" dummy cái này tạo dummy rồi add expiration timer (create/remove) -> không hiệu quả >call UnitAddAbility(dummy,'Aloc') dummy không có sẵn 'Aloc' ? có sẵn thì sao mà phải add? >call SetUnitUserData(dummy,0) sau khi create thì UserData bằng 0 sẵn rồi, việc gì phải đặt? mà nếu UserData khác 0 thì có vấn đề gì? >call PauseUnit(dummy,false) dòng này để làm gì? nếu sợ lúc issue order, dummy bị pause thì phải un-pause trước dòng "call Issue..." chứ? >if (GetUnitAbilityLevel(target,imID) > 0) then > debug call BJDebugMsg("Can't cast ability to this target!May be this target resist this spell!Unit: "+GetUnitName(target)) > endif nếu chỉ có 1 dòng "debug" ở trong if thì cả 3 dòng trên nên là debug không ở debug mode: kiểm tra điều kiện xong không làm gì thì có cần thiết kiểm tra? ngoài ra cái if này khá riêng biệt (specific) cho một mục đích nào đó, tôi cảm thấy ko cần thiết
Nhưng có một số lỗi mà xecast không hề dùng spell khi ra lệnh!Điển hình là mình!OrderId("thunderbolt") dùng cho nó rồi nhưng vẫn ko thực hiện lệnh! Thêm nữa là một số bạn không biết chỉnh sửa dummy vẫn có thể bị lỗi,cần setUserData!
>Nhưng có một số lỗi mà xecast không hề dùng spell khi ra lệnh!Điển hình là mình!OrderId("thunderbolt") dùng cho nó rồi nhưng vẫn ko thực hiện lệnh! bạn nói thế nào ấy chứ tớ dùng orderid của thunderbolt mãi có sao đâu Mã: set xc = xecast.createBasicA( 'AHtb', 852095 ,Player(15)) // 852095 = order id thunderbolt call xc.castOnTarget( u ) >Thêm nữa là một số bạn không biết chỉnh sửa dummy vẫn có thể bị lỗi,cần setUserData! tôi ko nghĩ với dummy vừa tạo ra có thể gây lỗi gì
>Nhưng có một số lỗi mà xecast không hề dùng spell khi ra lệnh!Điển hình là mình!OrderId("thunderbolt") dùng cho nó rồi nhưng vẫn ko thực hiện lệnh! bạn nói thế nào ấy chứ tớ dùng orderid của thunderbolt mãi có sao đâu Mã: set xc = xecast.createBasicA( 'AHtb', 852095 ,Player(15)) // 852095 = order id thunderbolt call xc.castOnTarget( u ) >Thêm nữa là một số bạn không biết chỉnh sửa dummy vẫn có thể bị lỗi,cần setUserData! tôi ko nghĩ với dummy vừa tạo ra có thể gây lỗi gì
Mình cùng từng gặp lỗi như bạn khi dùng xecast system, nhưng giờ mình đã sửa được. Thực ra lỗi ko phải tại xecast mà tại dùng các system khác có sử dụng hàm SetUnitUserData như AIDS hay AutoIndex thì mới bị như vậy. Bạn thử coi lại các system của bạn đi, còn xecast hoạt động rất tốt. Khuyên các bạn muốn dùng dummy cast spell thì nên dùng xecast của Vex và cách dùng tự mình nhận thấy là rất đơn giản và hiệu quả với recycle dummy. Nếu bạn AzuhaSky nghi ngờ thì thử tạo 1 map riêng chỉ dùng mỗi xecast để thử. Chắc chắn chạy. Không thì bạn dùng sai
Nhưng lỡ một số bạn sử dụng AutoIndex thì thế nào?Mình viết system để phòng hờ trường hợp này!Vả lại mới học!
Hỏi thế thì chịu. Mỗi system có 1 tác dụng. Nó giúp người làm map làm map nhanh hơn hiệu quả hơn. Như cái xecast là dùng dummy cast spell, dummy ko phải là cứ tạo rồi kill, nếu cast nhìu lần trong 1 thời gian nhỏ với kiểu đó thì cực lag. Và dùng xecast sẽ hạn chế điều này.
người sử dụng AutoIndex và AIDS phải biết lọc unit nào cần index và unit nào không cần bạn chỉ cần chỉ ra dummy unit của mình, người ta dùng khắc biết hơn nữa, nếu các dummy của bạn đc index mà bạn SetUnitUserData như vậy sẽ gây lỗi cho các system index trên UnitsClear?
Anh Tom nói hết rồi nhưng mình vẫn muốn nói chi tiết hơn là các unit không cần đánh index ở đây chính là những dummy làm eff và cast spell hộ