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.
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 ko
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
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 @@ 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 @@
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 thanks nhiều
Đấ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 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)endfunctionfunction 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 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
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) ItemHideX và ItemHideY 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 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
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"
Map 128~256,cho hết tất cả cây vào,dùng spell warstomp Fps có 58 (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) ?
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!
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