[Tutorial] How to make custom Auto-Cast spells

Thảo luận trong 'World Editor' bắt đầu bởi Tom_Kazansky, 16/7/08.

  1. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    Tom sẽ hướng dẫn lại cách tạo 1 auto cast spell. Cụ thể là spell Impetus (DotA)

    Impetus: hero làm mục tiêu mất nhiều máu hơn, phụ thuộc vào khoảng cách giữa hero và mục tiêu

    ---
    Đầu tiên, vào Object Editor:
    - Buffs/Effects: tạo 1 custom buff, base từ Poison (stacking). Đổi tên, đổi icon...
    - Abilities: tạo 1 custom ability, base từ Poison Arrows (tìm thấy trong abilities của Neutral Hostile). Chỉnh lại các dữ liệu của Poison Arrows như sau:
    Icon: ReplaceableTextures\CommandButtons\BTNImpalingBolt.blp
    [​IMG]

    Sau đó vào Trigger Editor:

    Tôi sẽ nói sơ qua cách làm như sau: Ta phải có 1 trigger mà trigger này sẽ hoạt động khi 1 unit "take damage" (nhận sát thương). Và nếu unit đó có buff Impetus thì sẽ deal thêm damage, phụ thuộc vào khoảng cách giữa unit đó và thằng deal dam (Damage Source).
    Chú ý: Cho dù spell này đc cast hay để auto (attack ấy) thì nếu đánh trúng thì unit sẽ có buff, cho nên ko lo lỗi gì cả, mà hoàn toàn MUI. Vì khi có buff, ta sẽ remove buff đó luôn, và có Damage Source rõ ràng nên ko lo 2 unit đánh 1 unit sẽ nhầm lẫn.

    Vì trigger ko có event: "Generic unit take damage" chỉ có "Specific unit take damage". Nên ta sẽ pick từng unit rồi add event cho trigger cần dùng, pick unit là "specific" rồi đó.

    Trigger thứ 1:
    [​IMG]
    Ta cần 2 biến unit group, TempGroup và TakeDamGroup. Khi 1 unit đã có event take damage rồi thì phải add vào TakeDamGroup (để biết là nó "đã có event") nếu add event 2 lần thì sẽ lỗi, unit đó sẽ take 2 lần damage.
    Trigger này để add event cho các unit đã đc đặt sẵn.

    [​IMG]
    Trigger này là khi 1 unit "đi" vào bản đồ, cho dù là đc summon, create (trigger),... Tất nhiên vẫn phải kiểm tra xem unit này đã ở trong TakeDamGroup chưa, nếu chưa thì mới add. (cẩn thận vẫn hơn)

    [​IMG]

    Trigger này là trigger chính đây.
    Variable:
    TempUnit, TempUnit2 - unit,
    TempLoc, TempLoc2 - point
    TempInt - integer
    TempReal - real

    Trigger này chưa có event, nhưng event đã đc add nhờ 2 trigger trên. Bây giờ có "event a unit takes damage" rồi.
    Đối với event này thì có: (Triggering unit) là unit bị mất máu (một trong những unit đã add event ấy). (Damage source) là unit deal damage.

    Trước hết phải turn off trigger này, rồi turn on sau khi xong. Ko turn off sẽ có chuyện ko hay xảy ra.
    Sau đó kiểm tra xem Damage source có ability Impetus ko (level > 0), rồi kiểm tra Triggering unit có buff ko. (thật ra chỉ cần điều kiện này thôi, ko cần nhiều)
    Nếu Trigger unit có buff, tức là bị Damage source làm mất máu khi dùng Impetus. Vậy ta sẽ cho Damage source deal thêm damage theo khoảng cách giữa 2 unit này. Có số damage rồi thì dùng floating text để show và dùng Unit - Damage Target để deal damage thôi. Nhớ là pure damage thì nên dùng ATTACK_TYPE_CHAOS và DAMAGE_TYPE_UNIVERSAL.

    Đến đây thì đã xong rồi, từ cách làm này các bạn có thể tạo các auto cast spell mà mình muốn. Hoặc vài spell như trong DotA: Glaive of Wisdom (deal damage = % Int ) Arcane Orb (deal damage = % current mana)
    ----



    -----
    BONUS SPELLS:

    Thêm 1 spell nữa nhá. Ai chơi DotA 6.53 rồi sẽ biết Magina ( Anti Mage ) có cái blink rất "ảo" (nhiều người cho rằng rất "cool", tôi cũng nghĩ thế, chỉ hơi thiếu tí sound thôi)

    Ta cần các biến sau:
    InstantMovementCaster, InstantMovementDummy - unit //caster và dummy
    InstantMovementFade - real //đây là biến đếm cho việc "mờ" của dummy và caster
    InstantMovementBlink - boolean //biến này để kiểm tra xem caster đã cast xong chưa, xong rồi thì mới hiện dummy và bắt đầu "mờ" dummy, caster.

    Cần 4 trigger ( :| )
    Mã:
    InstantMovementBegin
        Events
            Unit - A unit Begins casting an ability
        Conditions
            (Ability being cast) Equal to Instant Movement 
        Actions
            Set InstantMovementCaster = (Casting unit)
            Set TempLoc = (Position of InstantMovementCaster)
            Set TempLoc2 = (Target point of ability being cast)
            Unit - Create 1 Dummy Instant Movement for (Owner of InstantMovementCaster) at TempLoc facing (Angle from TempLoc to TempLoc2) degrees
            Set InstantMovementDummy = (Last created unit)
            Animation - Play InstantMovementDummy's spell throw animation
            Animation - Change InstantMovementDummy's vertex coloring to (100.00%, 100.00%, 100.00%) with 100.00% transparency
            Custom script:   call RemoveLocation( udg_TempLoc )
            Custom script:   call RemoveLocation( udg_TempLoc2 )
    
    Vì vấn đề animation nên ta phải tạo dummy ngay từ lúc caster bắt đầu cast. Nhưng lúc này phải cho transperency của dummy = 100% (ko nhìn thấy gì) và bắt dummy thực hiện động tác (animation) "spell throw" như caster.
    Mã:
    InstantMovementBlink
        Events
            Unit - A unit Starts the effect of an ability
        Conditions
            (Ability being cast) Equal to Instant Movement 
        Actions
            Set InstantMovementFade = 50.00
            Set InstantMovementBlink = True
            Animation - Change InstantMovementCaster's vertex coloring to (100.00%, 100.00%, 100.00%) with 50.00% transparency
            Animation - Change InstantMovementDummy's vertex coloring to (100.00%, 100.00%, 100.00%) with 50.00% transparency
            Trigger - Turn on InstantMovementTimer <gen>
    
    Start effect, tức là đã caster đã cast xong (bây giờ đã move rồi). Vậy thì hiện dummy ra với 1 nữa transperency và caster cũng phải "mờ" đi 1 nửa. Bậy trigger "mờ" dummy và caster lên. Nhớ rằng biến InstantMovementBlink phải = true (vì đã cast xong)
    Mã:
    InstantMovementStop
        Events
            Unit - A unit Stops casting an ability
        Conditions
            (Ability being cast) Equal to Instant Movement 
        Actions
            If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                If - Conditions
                    InstantMovementBlink Equal to False
                Then - Actions
                    Unit - Remove InstantMovementDummy from the game
                Else - Actions
    
    stop casting là dừng cast, có thể là cast xong, có thể là bị stun chẳng hạn, nói chung là bị interrupt (gián đoạn :|, "cắt cơn" ấy :'> ) Nếu chưa cast xong thì remove dummy, ko thì thôi.
    Mã:
    InstantMovementTimer
        Events
            Time - Every 0.01 seconds of game time
        Conditions
        Actions
            Set InstantMovementFade = (InstantMovementFade + 1.00)
            Animation - Change InstantMovementCaster's vertex coloring to (100.00%, 100.00%, 100.00%) with (100.00 - InstantMovementFade)% transparency
            Animation - Change InstantMovementDummy's vertex coloring to (100.00%, 100.00%, 100.00%) with InstantMovementFade% transparency
            If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                If - Conditions
                    InstantMovementFade Equal to 100.00
                Then - Actions
                    Unit - Remove InstantMovementDummy from the game
                    Trigger - Turn off (This trigger)
                Else - Actions
    
    Sau khi cast xong thì bật trigger này, cứ 0.01s dummy sẽ mờ đi 1% và caster sẽ hiện rõ hơn 1%.

    50 + 1 = 51 -> 100 - 50 = 49 => số này nhỏ dần, caster sẽ hiện ra dần dần

    Khi InstantMovementFade = 100 tức là dummy đã mờ hẳn và caster đã hiện ra rõ hẳn.

    Đến đây đã xong.

    PS: à mà spell này ko MUI nhg tôi nghĩ blink chỉ trong 0.33s nên ko có vấn đề gì to lớn. Mà nếu ko chắc thì có lẽ tôi sẽ nghĩ ra cách làm cho MUI.
    ---
    Hy vọng mọi người hiểu.

    Tom đã gửi kèm map demo.
     

    Các file đính kèm:

    zero1231 thích bài này.
  2. sukaraki

    sukaraki Donkey Kong

    Tham gia ngày:
    12/5/08
    Bài viết:
    356
    Nơi ở:
    Demonworld
    Mô phật :D 1 skill auto cast làm = 4 trigger.Em nghĩ newbie không có đủ kiên nhẫn đâu anh Tom ới ời.Skill nhảy từ point này tới point kia, làm hiệu ứng nhảy lên của chém điên [mà nhảy từ point này sang point kia chứ ko chỉ nhảy lên] khi đạt tới pointkia thì nó xả kiếm xuống, nổ cái bùm dưới chân và đất lõm xuống trong 1 s .Trong lúc nhảy có phoenix fire trong người để cho người ta thấy đường vòng cung di chuyển. Chiêu đó 3 trigger, thằng đệ của em nó đòi xin map để học nhưng mà khi thấy vậy nó nản ngay, nói gì tới 4 trigger thì...
     
  3. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    Sao lại 4 trigger, cái auto cast có 3 trigger thôi. Trigger thứ 3 là trigger chính. Mà tất cả spell auto cast cho vào 1 trigger thứ 3 là đc.

    4 trigger kia là cái spell Instant Movement đấy chứ.
     
  4. sukaraki

    sukaraki Donkey Kong

    Tham gia ngày:
    12/5/08
    Bài viết:
    356
    Nơi ở:
    Demonworld
    à anh ! trong pick unit có vụ pick con gần con mình rồi match nó là matching unit equal to an illusion >>> em định làm chiêu ảo ảnh, tức là khi tạo ra các con phân thân thì mình sẽ pick lũ đó, rồi mỗi 0.5 s thay đổi sự mờ ảo của nó ,thay đổi màu sắc nó , cho chiêu đó 1 effect thật mờ ảo đúng như ý định của skill : làm confuse địch. Nhưng không thể pick đc. Tại sao nhỉ .Em đã cẩn thận set con caster là 1 biến, sau 2 giây mới pick đám xung quanh con caster [vì thời gian cast phân thân lâu mà ] và đám đó phải là illusion mới pick rồi khi pick đc sẽ đưa chúng vào 1 unit group để trigger 2 sẽ thay đổi độ mờ ảo và màu sắc của chúng . thế mà chẳng pick đc con nào cả >>>> ????

    Còn nữa ,đã chơi qua HAVOC của anh, thấy hệ thống giấu hero info rất hay, anh chỉ em làm đc ko ?

    @ PS : mọi người hãy xem qua topic memory leak của anh Tom nếu chưa xem :D
     
  5. bonongvodoi

    bonongvodoi Youtube Master Race

    Tham gia ngày:
    3/6/08
    Bài viết:
    58
    Còn em thì làm theo kiểu này khác anh Tom, với kiểu em làm chỉ cần dùng 2 trigger thôi , nhưng chỉ hoạt động lúc auto cast , kô hoạt động khi ta cast spell

    Vi dụ , em tạo 1 skill với tên Frost arrows : Gắn ảnh hưởng của băng vào mỗi phát tấn công , làm chậm và deal thêm damage các unit trong aoe qui định sẵn (Khi bắn thì tất cả các unit quanh unit bị bắn đều bị frost nova:D)

    Việc cần làm bây h là tạo 1 skill Cold arrows , hạ hết thông số để nó trở thành skill mượn nhưng chú ý sửa :
    ++Text - Order String - Turn off : uncoldarrows
    ++Text - Order String - Use/Turn on : coldarrows
    Rồi tạo ra 1 skill frost nova cho unit , tạo 1 dummy unit kô có model

    Trigger1 : Order
    ---Event : A unit is issued an order with no target
    ---Condition : để kô
    ---Action :
    ++If (Issued order) equal to (order(coldarrrows)) then Trigger - Turn on Frost arrows
    ++If (Issued order) equal to (order(uncoldarrrows)) then Trigger - Turn off Frost arrows

    Trigger2 :Frost arrows ( Tạo hai biến : Attacking và Attacked đều là kiểu unit)
    ---Event : A unit is a attacked
    ---Condition :
    +Level of Frost arrows for attacking unit great than or equal to 1
    +Mana of attacking unit great than or equal to *lượng mana tối thiểu còn phóng được skill Frost nova*
    ---Action
    ++Set Attacking = (Attacking unit)
    ++Set Attacked= (Attacked unit)
    ++Wait ((Distance between (Position of Attacking) and (Position of Attacked))/*Tốc độ đạn bay của Hero*) second *Đợi cái missel của hero vừa bay tới attacked unit*:D
    ++Bắt tất cả unit trong phạm vi 180 Aoe của Attacked với điều kiện .....
    +Tạo 1 con Dummy unit tại vị trí Attacked
    +Set thời gian sống 1s
    +Add skill Frost nova cho last created unit
    +Set level của Frost nova cho last created unit to level của skill Frost arrows cho Hero
    +Order last created unit bắn frost nova lên các picked unit.
    Em có làm thư rồi và thấy nó hoat động khá tốt
    Mấy anh coi thử được hem ...;;);;)
     
  6. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    @bonongvodoi, cách của em có vài điểm cần lưu ý:
    thứ 1: event như vậy, sẽ có rất nhiều người "spam" skill này. khi hero vung kiếm (:D minh họa thôi, tức là đánh nhưng mục tiêu chưa mất máu :D) thì stop hero lại -> trigger vẫn hoạt động -> chuyện gì xảy ra chắc em biết rồi.
    thứ 2: wait như vậy ko chính xác, nếu unit bị đánh chạy ra xa hay vào gần em thì sao ?
    thứ 3: chưa có trigger hero này cast Frost Arrow như 1 spell. (manual cast , not auto )
     
  7. bonongvodoi

    bonongvodoi Youtube Master Race

    Tham gia ngày:
    3/6/08
    Bài viết:
    58
    Hì hì
    Thứ 1 , đúng là em hơi sai thật , nhưng mà thôi cũng tạm chấp nhận được , bởi vì có thằng nào bít đâu mà spam , trừ khi nó đọc và hỉu được trigger em là thôi

    Thứ 2 , hè hè , sorry các pác , ở nhà em text với mấy thằng lính đứng yên , nên thấy thời gian nó nổ nova rất chính xác , mà quên mất cái vụ nó chạy lung tung nữa ( cái này thì , em có thể tạo 1 buff mới trong cái skill cold arrows, rồi wait tới khi thằng attacked có buff đó rồi nổ nova cũng ổn :D)

    Thứ 3 , thì em đã nói rồi , spell đó chỉ phục vụ cho auto cast thôi:D:D

    Hì , mà thôi làm theo cách của ông anh tom là ổn nhất , em mới làm thử rồi , chuẩn xác vãi .....;;);;);;)
     
  8. god_of_the_noob

    god_of_the_noob Mr & Ms Pac-Man

    Tham gia ngày:
    6/3/08
    Bài viết:
    188
    Nơi ở:
    Bốn bể là nhà
    anh em có bít cách làm cho 1 trig làm cho khi attack thì add abi báh vô tới khi đánh phát tiếp thì remove abi đó đi ko
     
  9. sukaraki

    sukaraki Donkey Kong

    Tham gia ngày:
    12/5/08
    Bài viết:
    356
    Nơi ở:
    Demonworld
    - Cậu này thật pó tay.Câu hỏi của cậu cũng chính là câu trả lời chứ gì nữa ?

    tóm tắt họat động : khi bắn 1 phát , nếu shootflag = 0 [thì ban đầu nó = 0 mà ] thì cho nó = 1 và remove ability [??] , bắn phát tiếp theo [lúc này shootflag đã = 0 rồi ] thì add ability [??] của cậu vào. =))

    P/S : đây đâu phải auto cast ???
     
  10. god_of_the_noob

    god_of_the_noob Mr & Ms Pac-Man

    Tham gia ngày:
    6/3/08
    Bài viết:
    188
    Nơi ở:
    Bốn bể là nhà
    vít ra đành hoàng đi khó hỉu wá.....
    p/s tui làm cái này là do rỗi hơi muốn lấy base là frost arrow biến thành poison arrow( mặc dù WE đã có sẵn):D:D:D:D:D:D:D:D...thanks trước nha
     
  11. sukaraki

    sukaraki Donkey Kong

    Tham gia ngày:
    12/5/08
    Bài viết:
    356
    Nơi ở:
    Demonworld
    - Mô phật :o ! đưa cả cái trigger ra chình ình mà phán câu xanh rờn vậy ? Quyết tâm ko bao giờ chỉ tên này nữa .Chỉ chuốc bực vào thân X(
     
  12. Jin Axl

    Jin Axl > Draw 2 Life Moderator Lão Làng GVN

    Tham gia ngày:
    2/3/06
    Bài viết:
    8,255
    Nơi ở:
    Over the rainbow
    Giấu cái chó gì ?8-}
    Tại ổng tự viết custom battle system, cái default của WE đọc ko ra, chỉ hiển thị dmg : 0-0, armor : 0, nên ổng bực quá tắt đi đó chứ =))
     
  13. Dark_DragonKing

    Dark_DragonKing Mr & Ms Pac-Man

    Tham gia ngày:
    23/7/08
    Bài viết:
    217
    anh Tom ơi muốn làm 1 skill auto - cast melee thì sao ạ?
     
  14. Diệp Thanh

    Diệp Thanh Kirin Tor Moderator Lão Làng GVN

    Tham gia ngày:
    7/2/04
    Bài viết:
    4,365
    :D giấu cái mèo gì....như trên
     
  15. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    Tương tự thôi, nhưng có lẽ dùng Black Arrow. (ko lo về cái effect gọi xương hay unit chết bị mất xác, khi nó take dam mà có thể chết thì chưa chết ngay đâu, remove buff luôn có lẽ ko sao, anh nghĩ thế :| )
     
  16. Ice_water

    Ice_water Dragon Quest

    Tham gia ngày:
    11/1/07
    Bài viết:
    1,457
    Cách hay nhất là xài ability của mấy cái orb :>
     
  17. lucifekit

    lucifekit The Warrior of Light

    Tham gia ngày:
    25/2/06
    Bài viết:
    2,344
    Phần Action không có lệnh bắt dummy unit dùng skill custom mình mới tạo à:(
     
  18. lucifekit

    lucifekit The Warrior of Light

    Tham gia ngày:
    25/2/06
    Bài viết:
    2,344
    Đây nè,mình định làm skill auto blizzard tự động tạo 1 dummy unit cast blizzard tại chỗ mình target mà không biết sai chỗ nào.Ai check giùm với:(
     

    Các file đính kèm:

    • Rain.rar
      Kích thước:
      14.6 KB
      Đọc:
      10
  19. Tom_Kazansky

    Tom_Kazansky

    Tham gia ngày:
    28/12/06
    Bài viết:
    3,454
    Nơi ở:
    Hà Nội
    Các lỗi:
    - Về trigger:
    Mã:
    UnitTakeDamage
        Events
        Conditions
        Actions
            [B]Trigger - Turn off (This trigger)[/B] // (1)
            Set TempUnit = (Triggering unit)
            Set TempUnit2 = (Damage source)
            Set TempReal = (Damage taken)
            -------- Blizzard Rain --------
            Set TempInt = (Level of Blizzard Rain<arow>  for TempUnit2)
            If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                If - Conditions
                    TempInt Greater than 0
                    (TempUnit has buff Blizzard Rain ) Equal to True
                Then - Actions
                    Unit - Remove Blizzard Rain  buff from TempUnit
                    Unit - Create 1 Blizzard Rain Caster for (Owner of TempUnit2) at (Position of TempUnit) facing Default building facing degrees
                    Unit - Set level of Blizzard Rain<auto>  for (Last created unit) to (Level of Blizzard Rain<arow>  for TempUnit2)
                    [B]Special Effect - Create a special effect at (Position of TempUnit) using Abilities\Spells\Human\Blizzard\BlizzardTarget.mdl[/B] // (2)
                    Unit - Order (Last created unit) to Human Archmage - Blizzard (Position of TempUnit)
                    [B]Unit - Remove (Last created unit) from the game[/B] // (3)
                Else - Actions
    
    (1) trigger này khi chạy phải turn off, sau đó làm gì đó xong thì turn on lại, vì nếu ko turn off, có chuyện sẽ xảy ra.
    (2) tạo special effect xong ko destroy, leak
    (3) tạo dummy unit xong lại remove luôn, sao nó cast Blizzard đc ? /:) Add expired timer thôi, 5 wave x 1s => add 5.1s là ổn

    Ngoài ra còn point leak.
    Cuối cùng, trigger sẽ như sau:
    Mã:
    UnitTakeDamage
        Events
        Conditions
        Actions
            Trigger - Turn off (This trigger)
            -------- ---------------------------- --------
            Set TempUnit = (Triggering unit)
            Set TempUnit2 = (Damage source)
            Set TempReal = (Damage taken)
            -------- Blizzard Rain --------
            Set TempInt = (Level of Blizzard Rain<arow>  for TempUnit2)
            If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                If - Conditions
                    TempInt Greater than 0
                    (TempUnit has buff Blizzard Rain ) Equal to True
                Then - Actions
                    Unit - Remove Blizzard Rain  buff from TempUnit
                    Set TempLoc = (Position of TempUnit)
                    Unit - Create 1 Blizzard Rain Caster for (Owner of TempUnit2) at TempLoc facing Default building facing degrees
                    Unit - Set level of Blizzard Rain<auto>  for (Last created unit) to (Level of Blizzard Rain<arow>  for TempUnit2)
                    Unit - Add a 5.10 second Generic expiration timer to (Last created unit)
                    Unit - Order (Last created unit) to Human Archmage - Blizzard TempLoc
                    Custom script:   call RemoveLocation( udg_TempLoc )
                Else - Actions
            -------- ---------------------------- --------
            Trigger - Turn on (This trigger)
    
    - Về Object:
    Cái skill Blizzard của dummy, có Stats - Casting Time = 0 => skill nà sẽ bị hỏng, để default 1,
    Dummy unit thì dùng Art - Model File là .mdl

    Ngoài ra melee unit ko dùng Auto - Cast skill đc (Combat - Attack - Weapon Type: Melee, phải là Missile mới là range)

    Rất tiếc là melee unit mà dùng Auto - Cast skill, cụ thể là Black Arrow thì cho dù đã deactive auto cast vẫn như đang auto - cast ::( và các skill auto cast khác thì hoàn toàn ko dùng đc.
    -------------
    Đã sửa map và gửi kèm ở dưới
     

    Các file đính kèm:

  20. lucifekit

    lucifekit The Warrior of Light

    Tham gia ngày:
    25/2/06
    Bài viết:
    2,344
    Quá hay,cám ơn anh.

    Em cứ tưởng cho unit cast skill xong thì remove nó luôn cho đỡ tốn bộ nhớ:(

    Về sau các skill tương tự thế này chỉ cần thay unit,thay spell,thacòn mấy cái trigger trên vẫn giữ lại được đúng không ạ?

    Để làm thử chiêu auto moonsoon luôn:D

    À anh có list mấy cái custom script đó không:|?

    À làm sao cho con Sentry đó của em 1 tay bên trái cầm băng,1 tay bên phải cầm sét vậy.
     

Chia sẻ trang này