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

Air Time (seconds) -

Cái này là tùy bạn chỉnh thời gian bay đó mà
 
Cho hỏi tốc độ bay lên bay xuống của skill IMPALE

Air Time (seconds) -

Cái này là tùy bạn chỉnh thời gian bay đó mà
thank bạn nhưng mình hỏi tốc độ bay lên bay xuống để làm custom spell ý
Tiện thể hỏi luôn cái Model Editor của mình bị thế này khi xem model ,có ai biết chỉnh lại bình thường koGlow.jpg
 
Link đây,search google một cái là ra ngay,bạn down về giải nén,copy tất cả các file bên trong chép đè vào thư mục Warcraft III của bạn.

Giải nén ra nhưng khi vào World Editor vẫn là bản 1.23 bạn ơi :(
 
Dòng order string "Human - Dragonhawk Rider - Cloud" của tớ không hoạt động, không hiểu sao, vì cast bình thường thì vẫn được, order thì unit không nhận lệnh
 
thank bạn nhưng mình hỏi tốc độ bay lên bay xuống để làm custom spell ý
Tiện thể hỏi luôn cái Model Editor của mình bị thế này khi xem model ,có ai biết chỉnh lại bình thường koView attachment 169363

Nó không tìm thấy texture nên bị vậy đó, sửa lại link texture là được, trong particle node ấy.
 
Ai da... sau 2 ngày học vjass và cho ra cái này...
demo: http://www.mediafire.com/?exc2e4x0rbh4959
Có vài vấn đề ở đây:
- Nếu đã dùng jass thì đừng dùng Location nữa mà dùng x và y đi! GetSpellTargetX() và GetSpellTargetY()
- Và nếu group dùng ngay tức thời mà ko dùng để lưu thì dùng static group để đỡ phải khởi tạo local group nhiều lần và mất công destroy
- Khi người ta lấy instance (giá trị khởi tạo) thì chả ai dùng cách loop như của cậu để tìm ra "id" phù hợp cả. Nếu đã custom cả cái id thì người ta sẽ dùng riêng 1 stack để lưu các giá trị đã dùng rồi
và nếu trong đó ko có giá trị nào thì mới tăng thêm giá trị id max. Còn nếu ko người ta sẽ dùng function allocate và deallocate của vjass để lấy ra id
- Chính việc ko khởi tạo rõ ràng đã làm code cậu chậm đi ở 2 chỗ khi khởi tạo phải loop để kiểm tra từ đầu và khi run thì dù cái id đó ko có chạy thì vẫn dính loop!
- Không chỉ ảnh hưởng tới tốc độ mà cậu còn khiến code cậu chạy sai lệch khi mà ngay cả cái timer của instance này chạy lun cả code của instance khác. Như vậy khi multicast thì chưa chắc interval deal dam của nó đã là SPELL_INTERVAL của cậu mà có thể là khoảng cách giữa 2 lần cast liên tiếp nếu khoảng cách này nhỏ hơn SPELL_INTERVAL. Thường thì khi gặp trường hợp thế này hoặc là dùng system như kiểu T32 của Jesus4Lyf hoặc TimerUtils của Vexorian. Mà ko xài hàng của người khác thì bản thân vẫn tự viết code để loop với chỉ 1 timer loop liên tục tất cả các instance là được

Tóm lại: Code chưa tối ưu, hoạt động có khi còn ko theo đúng ý coder @@

thank bạn nhưng mình hỏi tốc độ bay lên bay xuống để làm custom spell ý
Nếu cậu làm custom theo như cách tớ đã nói thì tốc độ phụ thuộc thời gian bay (số lần loop) và độ cao max
Thời gian bay thì 0.9, độ cao max khoảng 400 << Cỡ này. Chính xác hơn thì ko rõ ...
Mà độ cao thì còn tùy thuộc vào độ to của unit đấy nữa cơ nếu cậu tạo effect attach origin @@
 
Chỉnh sửa cuối:
ai biết cách skill chọc đất impale khi đang air time thì ko bị invul ko
 
Cho mình hỏi có cách nào move vị trí item trong inventory mà ko dùng tới lệnh UnitDropItemSlot không ? Vì khi dùng lệnh này unit thường bị đứng khựng lại :-< rất phiền
 
chú vuongkkk có thể cho xin cái nick yahoo để có gì tui hỏi vài thứ được không??
có vài cái chú nói bên trên cũng chưa hiểu cách fix làm sao nên để hỏi riêng lại thì đỡ spam 4rum hơn
mới học nên sai sót nhiều cũng thường tình nên cần có người như chú chỉ sai và chỉ cách fix :D thanks nhiều
 
ai biết cách skill chọc đất impale khi đang air time thì ko bị invul ko
Đấy là cậu stun unit trước rồi cho unit đấy bay = cách thay đổi độ cao unit đó như map demo impale ko invu này

Cho mình hỏi có cách nào move vị trí item trong inventory mà ko dùng tới lệnh UnitDropItemSlot không ? Vì khi dùng lệnh này unit thường bị đứng khựng lại :-< rất phiền
Thực ra là ko có cách nào. Nhưng nếu làm thế này thì có hiệu ứng tương tự!
PHP:
function ChangeSlot_Actions takes nothing returns nothing
    local item it=UnitItemInSlot(gg_unit_Hpal_0000, 0)
    local integer id=GetItemTypeId(it)
    call RemoveItem(it)
    call UnitAddItemToSlotById(gg_unit_Hpal_0000, id, 5)
endfunction

function InitTrig_ChangeSlot takes nothing returns nothing
    set gg_trg_ChangeSlot = CreateTrigger(  )
    call TriggerRegisterPlayerEventEndCinematic( gg_trg_ChangeSlot , Player(0) )
    call TriggerAddAction( gg_trg_ChangeSlot , function ChangeSlot_Actions )
endfunction

chú vuongkkk có thể cho xin cái nick yahoo để có gì tui hỏi vài thứ được không??
có vài cái chú nói bên trên cũng chưa hiểu cách fix làm sao nên để hỏi riêng lại thì đỡ spam 4rum hơn
mới học nên sai sót nhiều cũng thường tình nên cần có người như chú chỉ sai và chỉ cách fix :D thanks nhiều
System của người ta tớ đã cho cậu link rồi!.
Còn nếu cậu ko hiểu cách dùng thì có map này cho cậu coi 2 trigger SlideData và CommonMove dùng 2 system mà tớ đã nêu.
Cậu thích code tay như em đã trình bày thì có thể tham khảo map này
 
Chỉnh sửa cuối:
Cho mình hỏi có cách nào move vị trí item trong inventory mà ko dùng tới lệnh UnitDropItemSlot không ? Vì khi dùng lệnh này unit thường bị đứng khựng lại :-< rất phiền

ví dụ item muốn di chuyển là A:

drop A
lặp từ slot 1 đến slot cần di chuyển
nếu slot này trống, đưa "dummy item" cho hero, nếu không thì thôi
đưa item A cho hero
drop các "dummy item"

Mã:
function UnitAddItemToSlot takes unit u, item it, integer [COLOR="#0000FF"]slot[/COLOR] returns boolean
    local integer i = 0
    local item array it2
    local integer it2c = 0
    local boolean ok
    loop
        exitwhen i > slot - 1
        if UnitItemInSlot(u,i) == null then
            set it2c = it2c + 1
            set it2[it2c] = [COLOR="#0000FF"]SlotFiller[/COLOR][it2c-1]
            call UnitAddItem(u,it2[it2c])
        endif
        set i = i + 1
    endloop
    call SetItemVisible(it,true)
    set ok = UnitAddItem(u,it)
    set i = 1
    loop
        exitwhen i > it2c
        call UnitRemoveItem(u,it2[i])
        call SetItemPosition(it2[i], [COLOR="#0000FF"]ItemHideX[/COLOR], [COLOR="#0000FF"]ItemHideY[/COLOR] )
        set it2[i] = null
        set i = i + 1
    endloop
    return ok
endfunction

ở đây:

slot là số slot cần di chuyển đến, từ 0 -> 5

SlotFiller là item array chứa các "dummy item" (tạo lúc mới vào game)
ItemHideXItemHideY là vị trí để dấu item
 
ví dụ item muốn di chuyển là A:

drop A
lặp từ slot 1 đến slot cần di chuyển
nếu slot này trống, đưa "dummy item" cho hero, nếu không thì thôi
đưa item A cho hero
drop các "dummy item"

Mã:
function UnitAddItemToSlot takes unit u, item it, integer [COLOR="#0000FF"]slot[/COLOR] returns boolean
    local integer i = 0
    local item array it2
    local integer it2c = 0
    local boolean ok
    loop
        exitwhen i > slot - 1
        if UnitItemInSlot(u,i) == null then
            set it2c = it2c + 1
            set it2[it2c] = [COLOR="#0000FF"]SlotFiller[/COLOR][it2c-1]
            call UnitAddItem(u,it2[it2c])
        endif
        set i = i + 1
    endloop
    call SetItemVisible(it,true)
    set ok = UnitAddItem(u,it)
    set i = 1
    loop
        exitwhen i > it2c
        call UnitRemoveItem(u,it2[i])
        call SetItemPosition(it2[i], [COLOR="#0000FF"]ItemHideX[/COLOR], [COLOR="#0000FF"]ItemHideY[/COLOR] )
        set it2[i] = null
        set i = i + 1
    endloop
    return ok
endfunction

ở đây:

slot là số slot cần di chuyển đến, từ 0 -> 5

SlotFiller là item array chứa các "dummy item" (tạo lúc mới vào game)
ItemHideXItemHideY là vị trí để dấu item

Cám ơn anh,em đã làm được rồi,cách chèn dummyitem vào các slot trống để move item tới slot mong muốn rất hay :"> rất sáng tạo,em ko tài nào nghĩ đc như vậy

Nhưng em làm thử thì có vẻ nó ko move được item có sẵn trên người unit,vì thế em thêm dòng lệnh UnitRemoveItem() trước khi add nên đã làm được rồi \m/


P/s: Không biết ở map mọi người ra sao,map của em có 4k7 doodads (trong đó 1 nửa là cây,một nửa là doodads) thôi mà khi dùng spell (warstomp,thunder clap.v.v.) fps giảm từ 64 xuống còn có 55 fps (em dùng fraps để đo)
Trước đó thì map em tầm 10k doodads thì giảm xuống tới 43 fps,em đã xóa hết ko dùng các model có animation,ko đặt sát nhau,ko dùng model đổi màu mà cũng chỉ được tới 55 fps (đã test thử khi xóa hết doodads). Map em size 128x128
Trong khi đó ở map Dota thì test các spell tương tự cũng chỉ chênh lệnh 62~64 fps
Liệu có phải do phần mềm nén map chưa tốt hay do một nguyên nhân nào đó ?
Ai có kinh nghiệm vụ này thì chia sẻ giúp :D
 
Chỉnh sửa cuối:
Cám ơn anh,em đã làm được rồi,cách chèn dummyitem vào các slot trống để move item tới slot mong muốn rất hay :"> rất sáng tạo,em ko tài nào nghĩ đc như vậy

Nhưng em làm thử thì có vẻ nó ko move được item có sẵn trên người unit,vì thế em thêm dòng lệnh UnitRemoveItem() trước khi add nên đã làm được rồi \m/

quên ko nói, function trên không có drop item A =))

function trên chỉ add item "it" cho unit "u" vào slot "slot" :-j
 
Cám ơn anh,em đã làm được rồi,cách chèn dummyitem vào các slot trống để move item tới slot mong muốn rất hay :"> rất sáng tạo,em ko tài nào nghĩ đc như vậy

Nhưng em làm thử thì có vẻ nó ko move được item có sẵn trên người unit,vì thế em thêm dòng lệnh UnitRemoveItem() trước khi add nên đã làm được rồi \m/


P/s: Không biết ở map mọi người ra sao,map của em có 4k7 doodads (trong đó 1 nửa là cây,một nửa là doodads) thôi mà khi dùng spell (warstomp,thunder clap.v.v.) fps giảm từ 64 xuống còn có 55 fps (em dùng fraps để đo)
Trước đó thì map em tầm 10k doodads thì giảm xuống tới 43 fps,em đã xóa hết ko dùng các model có animation,ko đặt sát nhau,ko dùng model đổi màu mà cũng chỉ được tới 55 fps (đã test thử khi xóa hết doodads). Map em size 128x128
Trong khi đó ở map Dota thì test các spell tương tự cũng chỉ chênh lệnh 62~64 fps
Liệu có phải do phần mềm nén map chưa tốt hay do một nguyên nhân nào đó ?
Ai có kinh nghiệm vụ này thì chia sẻ giúp :D
Map 128~256,cho hết tất cả cây vào,dùng spell warstomp Fps có 58 :3cool_embarrassed: (Dùng Frap để đo)
-----------------------------------------------------------------------
Tiện hỏi luôn là làm thế nào để :
Xác định thời gian chính xác khi unit này từ A đến B (mình tạo 1 trigger order unit move rồi xóa nó đi nhưng không muốn phải đếm giây từ a đến b là bao nhiêu) ?
-----------------------------------------------------------------------
Làm thế nào để phóng to cái model aura mà không chỉnh sửa bên ngoài (ý mình là chỉnh sửa bằng WE) ?
 

P/s: Không biết ở map mọi người ra sao,map của em có 4k7 doodads (trong đó 1 nửa là cây,một nửa là doodads) thôi mà khi dùng spell (warstomp,thunder clap.v.v.) fps giảm từ 64 xuống còn có 55 fps (em dùng fraps để đo)
Trước đó thì map em tầm 10k doodads thì giảm xuống tới 43 fps,em đã xóa hết ko dùng các model có animation,ko đặt sát nhau,ko dùng model đổi màu mà cũng chỉ được tới 55 fps (đã test thử khi xóa hết doodads). Map em size 128x128
Trong khi đó ở map Dota thì test các spell tương tự cũng chỉ chênh lệnh 62~64 fps
Liệu có phải do phần mềm nén map chưa tốt hay do một nguyên nhân nào đó ?
Ai có kinh nghiệm vụ này thì chia sẻ giúp :D

vì trong dota không dùng WarStomp,Thunder Clap cả :-?? mà chỉ dùng custom WarStomp và ThunderClap vì loại gốc có vụ rung terrain làm "ăn" FPS map lắm! :-s
 
Có cái Defending Blast đây, làm từ tầm 1 năm trc bây giờ lôi lại ngồi sửa. Trong khi đó, mình mất tới hơn 1 tuần để tìm điểm khác biệt giữa cái của mình và trong dota. Trong dota thì: khi invoker vẩy ra cái DB thì cái này đi đến đâu là unit bị knockback theo kiểu tỏa ra chứ ko chỉ bị đẩy lùi theo 1 hướng, trong khi spell của mình đẩy cả cục unit chỉ theo 1 hướng nên rất lag. p/s: ai hiểu k nhỉ?
Mã:
Defending Blast Start
    Events
        Unit - A unit Begins casting an ability
    Conditions
        (Ability being cast) Equal to Deafening Blast Main
    Actions
        Set DBCaster = (Casting unit)
        Set DBTargetPoint = (Target point of ability being cast)
        Set KnockBackDuration = 7.50
        Set DBDamage = 12500.00
        Set Position[1] = (Position of DBCaster)
        Set Position[2] = (Position[1] offset by 70.00 towards (Angle from Position[1] to DBTargetPoint) degrees)
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                (Distance between Position[1] and DBTargetPoint) Less than or equal to 50.00
            Then - Actions
                Set DBAngle = (Facing of DBCaster)
            Else - Actions
                Set DBAngle = (Angle from Position[1] to DBTargetPoint)
        Unit - Create 1 Defending Blast for (Owner of DBCaster) at Position[2] facing DBAngle degrees
        Animation - Change (Last created unit)'s animation speed to 50.00% of its original speed
        Unit - Add a 0.80 second Generic expiration timer to (Last created unit)
        Set DBDummy = (Last created unit)
        Custom script:   call RemoveLocation( udg_Position[1] )
        Custom script:   call RemoveLocation( udg_Position[2] )
        Trigger - Turn on Defending Blast Period <gen>
        Trigger - Turn on Defending Blast Knock <gen>

Defending Blast Period
    Events
        Time - Every 0.01 seconds of game time
    Conditions
    Actions
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                (DBDummy is dead) Equal to True
            Then - Actions
                Trigger - Turn off (This trigger)
            Else - Actions
        Set Position[1] = (Position of DBDummy)
        Set Position[2] = (Position[1] offset by 13.00 towards DBAngle degrees)
        Unit - Move DBDummy instantly to Position[2]
        Set EnemiesGroup = (Units within 225.00 of Position[1] matching (((((Matching unit) is A structure) Equal to False) and (((Matching unit) is in DamageDone) Equal to False)) and (((((Matching unit) is in DBDamageGroup) Equal to False) and (((Matching unit) is alive) Equal to Tru
        Unit Group - Pick every unit in EnemiesGroup and do (Actions)
            Loop - Actions
                Unit Group - Remove (Picked unit) from EnemiesGroup
                Unit Group - Add (Picked unit) to DBDamageGroup
                Unit - Order (Picked unit) to Stop
                Unit - Cause DBCaster to damage (Picked unit), dealing DBDamage damage of attack type Spells and damage type Unknown
                Unit - Set the custom value of (Picked unit) to (Integer((KnockBackDuration / 0.03)))
        Unit Group - Remove all units from EnemiesGroup
        Custom script:   call RemoveLocation( udg_Position[1] )
        Custom script:   call RemoveLocation( udg_Position[2] )

Defending Blast Knock
    Events
        Time - Every 0.01 seconds of game time
    Conditions
    Actions
        Unit Group - Pick every unit in DBDamageGroup and do (Actions)
            Loop - Actions
                Set KnockbackPosition[1] = (Position of (Picked unit))
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        (Custom value of (Picked unit)) Less than or equal to 1
                    Then - Actions
                        Unit Group - Add (Picked unit) to DamageDone
                        Unit Group - Remove (Picked unit) from DBDamageGroup
                        Unit - Create 1 Dummy Unit for (Owner of DBCaster) at KnockbackPosition[1] facing Default building facing degrees
                        Unit - Add Defending Blast Attack Prevent to (Last created unit)
                        Unit - Order (Last created unit) to Neutral Pandaren Brewmaster - Drunken Haze (Picked unit)
                        Unit - Add a 2.00 second Generic expiration timer to (Last created unit)
                    Else - Actions
                        Unit - Set the custom value of (Picked unit) to ((Custom value of (Picked unit)) - 1)
                        Set KnockbackPosition[2] = (KnockbackPosition[1] offset by (7.00 / 5.00) towards DBAngle2 degrees)
                        Destructible - Pick every destructible within 150.00 of KnockbackPosition[2] and do (Actions)
                            Loop - Actions
                                Destructible - Kill (Picked destructible)
                        Unit - Move (Picked unit) instantly to KnockbackPosition[2]
                Custom script:   call RemoveLocation( udg_KnockbackPosition[1] )
                Custom script:   call RemoveLocation( udg_KnockbackPosition[2] )
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                And - All (Conditions) are true
                    Conditions
                        (DBDummy is alive) Equal to False
                        (Number of units in DBDamageGroup) Equal to 0
            Then - Actions
                Unit Group - Remove all units from DBDamageGroup
                Unit Group - Remove all units from DamageDone
                Unit Group - Remove all units from EnemiesGroup
                Trigger - Turn off (This trigger)
            Else - Actions
 
^ Là vì units bị knock back theo 1 hướng xác định từ trước (theo hướng của biến DBAngle2 - biến này chả thấy set ở đâu nhưng lại dùng). Còn trong dota mỗi unit bị knock back theo 1 hướng riêng, ví dụ lúc pick unit để knockback, thêm vào:
Mã:
set Position[1] = position of picked unit
set Position[2] = position of DB_Dummy
set DBAngle3[custom value of picked unit] = Angle between Position[1] and Position[2]
Remove leak...
Và khi move knocked-back units thì move theo biến DBAngle3
 
vì trong dota không dùng WarStomp,Thunder Clap cả :-?? mà chỉ dùng custom WarStomp và ThunderClap vì loại gốc có vụ rung terrain làm "ăn" FPS map lắm! :-s

Thế cái War Stomp của Centaur cũng xài custom "rung terrain" à?
 
Back
Top