Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
.đặt condition thì ram cái gì?
theo mình hiểu thì generic nó sẽ đăng kí cho toàn bộ unit trong map... vì vậy tránh sử dụng generic event để giảm lãng phí ram không cần thiết???
, trừ phi xóa trigger
Cho hỏi cái snippet này phần filter là gì ??
Snippet GetClosetUnit: Đây
function SpellFilter takes nothing returns boolean
return GetUnitState(GetFilterUnit(),UNIT_STATE_LIFE) / GetUnitState(GetFilterUnit(),UNIT_STATE_MAX_LIFE)<=0.5
endfunction
function MySpell takes nothing returns nothing
local unit u = GetClosestUnit( x, y, Condition( function SpellFilter )) //unit gần nhất và có máu <= 50%
endfunction
Custom script: call UnitDamageTarget( udg_SlayerCaster, udg_PickedUnit[1], udg_SlayerReal[2], false, true, ATTACK_TYPE_[B]SPELL[/B], DAMAGE_TYPE_NORMAL, null )

condition cũng là handle, có nó thì vẫn tốn RAM (tất nhiên là ít)
bạn sai rồi, generic event đăng ký event cho toàn bộ player, mỗi generic event thì sử dụng 16 handle (tương đương với 16 player).
nói cho chính xác generic event là nhiều "player-owned unit event"
nếu dùng specific event, unit nào cần thì phải đăng ký, mỗi lần dùng 1 handle, mà khi không dùng nữa mà ko xóa thì sẽ leak. Và tôi nói thật, không có cách xóa event đâu, trừ phi xóa trigger
specific event thường đi với "dynamic trigger" (trigger động, nghĩa là trigger được tạo ra khi đang chơi), mà cái này dùng ko cẩn thận sẽ gây lỗi nghiêm trọng. (bạn search trên wc3c.net mà đọc)
như goldviper nói ở trên, sao biết unit nào cần event mà đăng ký? đăng ký cho tất cả các unit thì còn tốn hơn generic event![]()
struct FootmanGuardians extends array
//! runtextmacro AIDS()
// Footmen
private unit a
private unit b
private trigger t
private static method OnDamage takes nothing returns boolean
// Forwards damage as pure damage.
local thistype d=thistype[GetTriggerUnit()]
call UnitDamageTargetBJ( GetEventDamageSource(), d.a, GetEventDamage(), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL )
call UnitDamageTargetBJ( GetEventDamageSource(), d.b, GetEventDamage(), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL )
return false
endmethod
private static method AIDS_filter takes unit u returns boolean
return GetUnitTypeId(u)!='hfoo' // Don't make this struct for footmen.
endmethod
private method AIDS_onCreate takes nothing returns nothing
set this.a=CreateUnit(Player(0),'hfoo',GetUnitX(this.unit),GetUnitY(this.unit),0)
set this.b=CreateUnit(Player(0),'hfoo',GetUnitX(this.unit),GetUnitY(this.unit),0)
set this.t=CreateTrigger()
call TriggerAddCondition(this.t,Condition(function thistype.OnDamage))
call TriggerRegisterUnitEvent(this.t,this.unit, EVENT_UNIT_DAMAGED )
endmethod
private method AIDS_onDestroy takes nothing returns nothing
call DestroyTrigger(this.t)
set this.t=null
call RemoveUnit(this.a)
call RemoveUnit(this.b)
set this.a=null
set this.b=null
endmethod
endstruct
Mã:struct FootmanGuardians extends array //! runtextmacro AIDS() // Footmen private unit a private unit b private trigger t private static method OnDamage takes nothing returns boolean // Forwards damage as pure damage. local thistype d=thistype[GetTriggerUnit()] call UnitDamageTargetBJ( GetEventDamageSource(), d.a, GetEventDamage(), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL ) call UnitDamageTargetBJ( GetEventDamageSource(), d.b, GetEventDamage(), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL ) return false endmethod private static method AIDS_filter takes unit u returns boolean return GetUnitTypeId(u)!='hfoo' // Don't make this struct for footmen. endmethod private method AIDS_onCreate takes nothing returns nothing set this.a=CreateUnit(Player(0),'hfoo',GetUnitX(this.unit),GetUnitY(this.unit),0) set this.b=CreateUnit(Player(0),'hfoo',GetUnitX(this.unit),GetUnitY(this.unit),0) set this.t=CreateTrigger() call TriggerAddCondition(this.t,Condition(function thistype.OnDamage)) call TriggerRegisterUnitEvent(this.t,this.unit, EVENT_UNIT_DAMAGED ) endmethod private method AIDS_onDestroy takes nothing returns nothing call DestroyTrigger(this.t) set this.t=null call RemoveUnit(this.a) call RemoveUnit(this.b) set this.a=null set this.b=null endmethod endstruct
Đây là trường hợp tiêu biểu cho việc sử dụng specific event thay vì generic. Theo Tom thì có leak chỗ nào ko?

Tất nhiên là nếu ko biết rõ cần kiểm tra unit nào thì chẳng ai dùng specific. Ngược lại nếu chỉ theo dõi 1, 2 unit mà dùng generic event thì chả khác nào... giết gà dùng dao mổ trâu.
Cast Spell
Events
Unit - A unit Starts the effect of an ability
Conditions
(Ability being cast) Equal to Animate Dead
Actions
-------- cac actions --------
Trigger này được regist actions bởi một trigger khác đấy! Tất nhiên phải sử dụng hàm này cho các lệnh takes damage unit events!
code của jesus4lyf trên thì ko leak, call DestroyTrigger(this.t) <-- xóa trigger đó
unit take damage thì rõ ràng phải dùng specific event rồi (làm gì có generic event cho unit takes damage), cái đó khỏi bàn
---
tôi đồng ý là nếu dùng specific event sẽ tiết kiệm hơn generic event, tuy nhiên sẽ... phức tạp hơn
cho ví dụ đi?
ví dụ với 1 spell xem nào, thường thì:
Mã:Cast Spell Events Unit - A unit Starts the effect of an ability Conditions (Ability being cast) Equal to Animate Dead Actions -------- cac actions --------
vậy dùng specific unit event thì phải làm thế nào?
---
handle là unit, trigger, event, triggeraction, location,...
Tạo 1 buff trên 1 unit, buff tác dụng trong 10 s, nếu unit đấy chết khi vẫn còn buff thì sẽ + cho Hero 1 lượng dam.
^ khi buff đc create, tạo 1 specific trigger unit death event, khi remove thì clear sạch tất cả những gì liên quan đến trigger
Chính xác, đây là cách cổ điển nhất, tiện nhất nhưng cũng kém hiệu quả nhất...Nói cách tốt nhất là tôi không biết! Tôi thường dùng ABuff system để thực hiện các việc đại loại như vậy nên cũng không biết vụ này lắm!Nói về việc này, cũng có thể dùng Generic events with conditions là ((Dying unit) has buff ABC) equal to true! Không quen sử dụng hàm trên cho lắm bởi tôi chưa phát hiện nhiều các nào MUI đối với Jass!

Chính xác, đây là cách cổ điển nhất, tiện nhất nhưng cũng kém hiệu quả nhất...
Còn việc sử dụng Abuff tức là bạn đã đc hỗ trợ tận răng rồi. lúc này sử dụng specific event đơn giản cực kì![]()


Cho em xin demo map spell Wild Axe ( giống 90% Dota, dealing 2 lần dame của 2 rìu lên và về - tức trigger slide rìu ko gây dame) Thanks trước các tiền bối.
P.s: @ phamthitoquyen, wang yahoo lên cần gì mình chỉ trên yahoo cho luôn

Mình xin trigger tiền bốiE hèm!
Nếu mà bạn giỏi vJass thì mình đưa nguyên site cho bạn coi code đó!
Cái đó ko biết chút gì 
Nói cách tốt nhất là tôi không biết! Tôi thường dùng ABuff system để thực hiện các việc đại loại như vậy nên cũng không biết vụ này lắm!Nói về việc này, cũng có thể dùng Generic events with conditions là ((Dying unit) has buff ABC) equal to true! Không quen sử dụng hàm trên cho lắm bởi tôi chưa phát hiện nhiều các nào MUI đối với Jass!
