Topic hỏi đáp về cách làm map | version 11

Status
Không mở trả lời sau này.
Ai vui lòng check giúp mình với,mình đang làm cái buff làm unit đang liên minh với nhau biến thành kẻ thù,mình lò mò từ trưa tới giờ mới làm được mà nó lag lag,anh biết leak chỗ nào giúp mình :D

1-3.jpg


2-1.jpg
Remove UnitGroup đặt bên ngoài cùng hàng với UnitGroup.
 
Chỉnh sửa cuối:
Cho hỏi là...làm sao để lưu 1 group từ 1 function này qua function khác vậy?
Mình làm thế này nhưng chẳng hiểu vì sao (hình như cái group lưu không được) mà unit trong group đó chỉ nhích lên...1 tí rồi đứng luôn :(

[spoil]
Mã:
struct SWdata
    unit SWCast
    group SWgroup
    real SWangle
    integer SWticktruct

function SWStart takes nothing returns nothing
    local timer SW = GetExpiredTimer()
    local SWdata data = GetTimerData( SW )
    local group SWgroup2
    local unit SWpick
    local location SWloc1
    local location SWloc2

    set SWgroup2 = CreateGroup()
    set SWgroup2 = data.SWgroup
    loop
        set SWpick = FirstOfGroup( SWgroup2 )
        exitwhen SWpick==null
        call GroupRemoveUnit( SWgroup2, SWpick )
        if not UnitHasBuffBJ(SWpick, 'Avul') and not IsUnitType( SWpick, UNIT_TYPE_DEAD ) and IsUnitEnemy(SWpick, GetOwningPlayer(data.SWCast) ) and not IsUnitType( SWpick, UNIT_TYPE_STRUCTURE ) and ( GetUnitAbilityLevelSwapped('A006',  SWpick) >= 1 )then
            set SWloc1 = GetUnitLoc( SWpick )
            set SWloc2 = PolarProjectionBJ( SWloc1, 40, data.SWangle )
    
            call SetUnitPositionLocFacingBJ( SWpick, SWloc2, data.SWangle )
            call RemoveLocation( SWloc1 )
            call RemoveLocation( SWloc2 )
            set SWloc1 = null
            set SWloc2 = null
        endif
 
    endloop 
    
    call DestroyGroup( SWgroup2 )
    set SWgroup2 = null 
    set SWpick = null
    set data.SWtick = data.SWtick - 1

    if data.SWtick < 1 then
        call DestroyGroup( data.SWgroup )
        set data.SWgroup = null    
        call ReleaseTimer( SW )
        call data.destroy()
    endif
    
    set SW = null
endfunction

function SWAct takes nothing returns nothing
    local SWdata data = SWdata.create()
    local timer SW = NewTimer()
    local unit SWCast = GetTriggerUnit()
    local location SWloc1 = GetUnitLoc(SWCast)
    local location SWloc2 = GetSpellTargetLoc()
    local group SWgroup =  GetUnitsInRangeOfLocAll( 80, SWloc2 )
    set data.SWangle = AngleBetweenPoints( SWloc2, SWloc1 )
    set data.SWgroup = SWgroup
    set data.SWtick = 30
    set data.SWCast = SWCast
    
    call SetTimerData( SW, data )
    call TimerStart( SW, 0.04, true, function SWStart )
    
    call RemoveLocation( SWloc1 )
    call RemoveLocation( SWloc2 )
    set SWloc1 = null
    set SWloc2 = null
    set SWCast = null
    set SW = null
endfunction

function SWConds takes nothing returns boolean
     return GetSpellAbilityId() == 'A003'
endfunction

function Trig_Swallow_Actions takes nothing returns nothing
endfunction

//===========================================================================
function InitTrig_Swallow takes nothing returns nothing
    set gg_trg_Swallow = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Swallow, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Swallow, Condition( function SWConds ) )
    call TriggerAddAction( gg_trg_Swallow, function SWAct )
endfunction
[/spoil]

Hức...ai giúp với..
Spell này định là...kéo một đám unit lại theo hướng hero cast.. :-s
 
Mọi người cho hỏi, khi mua đồ trong shop thì nó ko cho vào thùng đồ mà lại vứt xuống đất, mặc dù mình ko xài trigger hay gì gì khác...
 

- Skin giao diện cho map ở đây, có demo luôn, vào coi HD rồi làm theo :D, riêng con chuột thì phải chỉnh đúng race mới hiện ( nếu Human thì chỉnh đường dẫn là Human )
- Font chữ map thì có thể down tại đây
Còn về tưng tưng Camera thì là ( 30 là giựt tưng tưng càng cao càng tưng ác tui thấy 30 ổn nên cho 30, nếu muốn hết tưng thì cho về 0 khi end skill )
Mã:
Camera - Shake the camera for (Owner of Thằng cast skill) with magnitude [B]30.00[/B]
Còn về lệnh vn để về nhà thì, trước tiên bác cần set số Hero của map để tiện cho việc move ( VD: 9x có 6 player thì set 6 Hero, ví dụ sau khi Hero xuất hiện thì set Hero[1] = Last create unit cho player 1, tương tự các player khác
Và code thì bao nhiêu player thì bấy nhiêu code
Mã:
Go Home 1
    Events
        Player - Player 1 (Red) types a chat message containing [B]vn[/B] as An exact match
    Conditions
    Actions
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                [B](Hero[1] is alive) Equal to True[/B]
            Then - Actions
                Set War_Hero = (Center of War Hero <gen>)
                Camera - Pan camera for (Owner of Hero[1]) to War_Hero over 0.00 seconds
                Unit - Move Hero[1] instantly to War_Hero
                Special Effect - Create a special effect at War_Hero using Abilities\Spells\Human\MassTeleport\MassTeleportCaster.mdl
                Special Effect - Destroy (Last created special effect)
                Custom script:   call RemoveLocation(udg_War_Hero)
            Else - Actions
P.S:
- Bác phải nhớ trước khi muốn move nó về nhà thì thêm hàm if là nó phải còn sống, nếu nó vừa chết mà move về, có thể sẽ ảnh hưởng đến trigger hồi sinh của nó :D
- Chắc bác sẽ nói tại sao ko viết 1 trigger rồi nhét 6 player gõ vn sẽ về nhà = vòng Loop, thì mình xin nhắc luôn nếu nhét 6 player vào 1 và làm Loop thì khi 1 player gõ vn thì 6 thằng bay về nhà hết, nên phải chia ra :D để thằng nào gõ thì thằng đó về :D

-----

À nhân tiện mình cũng hỏi luôn, nghe nhiều ng` nói model HQ HQ là model rì thế, Hàn Quốc chăng ? và ở đâu có thể down những model HQ này

Pác hiểu nhầm em cái camera , ý em hok phải "tưng tưng" khi cast spell mà là khi player move camera của họ , nó sẽ giống như cái kiểu " có quán tính" , kéo thêm 1 đoạn ngắn nữa mới dừng .

Còn cái move hero thì mình phải lập đến 6 trigger phải ko . Đây là lệnh move hero của mình làm với 1 trigger nhưng khổ cái thấy cái effect tạo ra lag lag sao ấy:D

Mã:
    Events
        Player - Player 1 (Red) types a chat message containing -gh as An exact match
        Player - Player 2 (Blue) types a chat message containing -gh as An exact match
        Player - Player 3 (Teal) types a chat message containing -gh as An exact match
        Player - Player 4 (Purple) types a chat message containing -gh as An exact match
        Player - Player 5 (Yellow) types a chat message containing -gh as An exact match
        Player - Player 6 (Orange) types a chat message containing -gh as An exact match
        Player - Player 7 (Green) types a chat message containing -gh as An exact match
        Player - Player 8 (Pink) types a chat message containing -gh as An exact match

    Conditions

    Actions
        Set Hero_GH = (Center of Nhan vat Spwn <gen>)
        Set GH_Unit = (Units owned by (Triggering player))
        Unit Group - Pick every unit in GH_Unit and do (Actions)
            Loop - Actions
                If (((Picked unit) is A Hero) Equal to True) then do (Unit - Move (Picked unit) instantly to Hero_GH) else do (Do nothing)
                Camera - Pan camera for (Owner of (Picked unit)) to Hero_GH over 0.00 seconds
                Special Effect - Create a special effect at Hero_GH using Abilities\Spells\Human\ManaFlare\ManaFlareBoltImpact.mdl
                Special Effect - Destroy (Last created special effect)
        Custom script:   call DestroyGroup (udg_GH_Unit)
        Custom script:   call RemoveLocation( udg_Hero_GH )

Down cái skin về nó hok có hướng dẫn pac ơi , với lại mình replace mấy cái này thay cho mấy cái mặc định trong interface phải ko pác :>

Còn HQ thì đính thực là High Quality :D
 
Cho hỏi là...làm sao để lưu 1 group từ 1 function này qua function khác vậy?
Mình làm thế này nhưng chẳng hiểu vì sao (hình như cái group lưu không được) mà unit trong group đó chỉ nhích lên...1 tí rồi đứng luôn :(

[spoil]
Mã:
[B]Globals
   integer tempData
endglobals[/B]

struct SWdata
    unit SWCast
    group SWgroup
    real SWangle
    integer SWticktruct
[B]endstruct[/B]

[B]function callback takes nothing returns nothing
   local SWdata data = tempData
   local unit SWpick = GetEnumUnit()
   local location SWloc1
   local location SWloc2

   if not UnitHasBuffBJ(SWpick, 'Avul') and not IsUnitType( SWpick, UNIT_TYPE_DEAD ) and IsUnitEnemy(SWpick, GetOwningPlayer(data.SWCast) ) and not IsUnitType( SWpick, UNIT_TYPE_STRUCTURE ) and ( GetUnitAbilityLevelSwapped('A006',  SWpick) >= 1 )then
            set SWloc1 = GetUnitLoc( SWpick )
            set SWloc2 = PolarProjectionBJ( SWloc1, 40, data.SWangle )
    
            call SetUnitPositionLocFacingBJ( SWpick, SWloc2, data.SWangle )
            call RemoveLocation( SWloc1 )
            call RemoveLocation( SWloc2 )
            set SWloc1 = null
            set SWloc2 = null
      endif
  
endfunction[/B]

function SWStart takes nothing returns nothing
    local timer SW = GetExpiredTimer()
    local SWdata data = GetTimerData( SW )
    
    [B]set tempData = data
    call ForGroup(data.SWgroup, function callback)[/B]

    set data.SWtick = data.SWtick - 1

    if data.SWtick < 1 then
        call DestroyGroup( data.SWgroup )
        set data.SWgroup = null    
        call ReleaseTimer( SW )
        call data.destroy()
    endif

endfunction

function SWAct takes nothing returns nothing
    local SWdata data = SWdata.create()
    local timer SW = NewTimer()
    local unit SWCast = GetTriggerUnit()
    local location SWloc1 = GetUnitLoc(SWCast)
    local location SWloc2 = GetSpellTargetLoc()
 
    set data.SWangle = AngleBetweenPoints( SWloc2, SWloc1 )
    [B]set data.SWgroup = GetUnitsInRangeOfLocAll( 80, SWloc2 )[/B]
    set data.SWtick = 30
    set data.SWCast = SWCast
    
    call SetTimerData( SW, data )
    call TimerStart( SW, 0.04, true, function SWStart )
    
    call RemoveLocation( SWloc1 )
    call RemoveLocation( SWloc2 )
    set SWloc1 = null
    set SWloc2 = null
    set SWCast = null
    set SW = null
endfunction

function SWConds takes nothing returns boolean
     return GetSpellAbilityId() == 'A003'
endfunction

function Trig_Swallow_Actions takes nothing returns nothing
endfunction

//===========================================================================
function InitTrig_Swallow takes nothing returns nothing
    set gg_trg_Swallow = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Swallow, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Swallow, Condition( function SWConds ) )
    call TriggerAddAction( gg_trg_Swallow, function SWAct )
endfunction
[/spoil]


Nhưng gì tô đen là phần được thêm vào (hoặc fix), tuy nhiên cũng chưa được tối ưu cho lắm ở chỗ xét điều kiện, nhưng để theo code của bạn cho bạn dễ hiểu...

Còn lúc đầu tại sao nó nhích 1 tí ( chính xác là chỉ trong lần tick đầu tiên của Timer mà thôi) thì được lí giải như sau, Kan tóm tắt lại từng bước mà bạn đã làm:

set Group 1 = AoE(80)
set Group 2 = Group 1

bên kia function SWStart

set Group 3 = Group 2
Loop trong Group 3 và remove unit đã được xét ra khỏi Loop 3, kết thúc loop bạn DestroyGroup 3


Bạn tao ra tất cả 3 biến Group, nhưng dữ liệu về cái AoE(80) chỉ có 1 mà thôi và 3 biến Group đó xài chung 1 dữ liệu này cho dù bạn gán = cho nó.

Vị vậy khi bạn Loop Group 3, rùi Destroy nó, cũng đồng nghĩa bạn đã hủy dữ liệu cái AoE(80) mà 3 biến Group 1 2 3 xài chung, đâm ra lần tick về sau không chạy được vì dữ liệu AoE(80) còn đâu nữa ???

Nói chung mấy cái này phải cần thận, vấn đề này trước đây hình như mcvinh cũng đã gặp với trường hợp của Location

set location 1 = ....
set location 2 = location 1


RemoveLocation 2 là location 1 cũng "đi" lun

Nên phải cần thận
 
Remove UnitGroup đặt bên ngoài cùng hàng với UnitGroup.

Thanks bồ

Giờ mình muốn hỏi là cái Event khi mình ấn một phím bất kỳ (Q chẳng hạn) thì sẽ add thêm skill nó nằm ở chỗ nào :! Mình tìm nó chỉ có các phím Right,Left,Up,Down :((
 
Thanks bồ

Giờ mình muốn hỏi là cái Event khi mình ấn một phím bất kỳ (Q chẳng hạn) thì sẽ add thêm skill nó nằm ở chỗ nào :! Mình tìm nó chỉ có các phím Right,Left,Up,Down :((
Vì các phím chữ nó dành cho HotKey của Skill nên nó không có lệnh gọi riêng.. mình chỉ biết mấy mũi tên và nút Esc thôi.
 
Vậy Ulti của Invoker trong Dota nó làm kiểu gì nhỉ ? :D
 
Theo mình biết thì Ultimate của Invo Dota là 1 spell Channel k có options j cả. Mỗi là cast thì nó sẽ check số lượng Q W E của hero. Giả sử Q = 0 W = 1 E = 2 thì nó sẽ cho ra skill Chaos Meteor. Vậy thôi.
 
Cho mình hỏi có action nao` dung` để chọn toàn bộ unit trong một AOE trừ Hero Cast Spell ra ko??
 
Vậy mình có thể đặt

event Unit - A unit starts the effect of an ability

conditions - Ability being cast equal to XXX

Action mình phải đặt sao để có thể check số lượng Q W E mà bạn nói ?

Cho mình hỏi có action nao` dung` để chọn toàn bộ unit trong một AOE trừ Hero Cast Spell ra ko??

đặt matching unit not equal to caster (triggering unit)
 
Mọi ng` cho hỏi cái hình Icon lá cờ undead khi chơi melee nằm ở chỗ nào hay cho cái đường địa chỉ nó cái, kiếm trong Abilities hay Buff Extra cũng ko thấy @@!
[spoil]
74eb8764e12a97f5c73725ed78bfc888_36405760.wc3scrnshot10111119393501.jpg
[/spoil]
 
Chỉnh sửa cuối:
Mọi ng` cho hỏi cái hình Icon lá cờ undead khi chơi melee nằm ở chỗ nào hay cho cái đường địa chỉ nó cái, kiếm trong Abilities hay Buff Extra cũng ko thấy @@!


ReplaceableTextures\CommandButtons\BTNRallyPointUndead.blp

Theo mình biết thì Ultimate của Invo Dota là 1 spell Channel k có options j cả. Mỗi là cast thì nó sẽ check số lượng Q W E của hero. Giả sử Q = 0 W = 1 E = 2 thì nó sẽ cho ra skill Chaos Meteor. Vậy thôi.

làm thử xem có "vậy thôi" không? 8-|
 
Cái này k khó. Bạn cho 3 biến int là Qint Wint Eint chẳng hạn. R check số lượng thôi
 
Cái này k khó. Bạn cho 3 biến int là Qint Wint Eint chẳng hạn. R check số lượng thôi

không khó thì làm đi? :-/
 
các bác cho hỏi làm sao xuất model ra khỏi map được nhỉ
 
trong Import Manage trên thanh menu -> Export File (30 ký tự)
 
Status
Không mở trả lời sau này.
Back
Top