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

Status
Không mở trả lời sau này.
Nhờ Tom hướng dẫn mình lại vụ unit slide đến mép bản đồ thì dừng lại nhé.
 
Chỉnh sửa cuối:
1/ hồi bản 1.23 thì có giờ thì ko ....
Trong lúc mình chờ mình đã tìm ra cái này :D, mặc dù chắc là ko dùng gì nhưng có lẽ post lên người khác biết vẫn tốt :P
globals
hashtable MyHash = InitHashtable()
endglobals
function Integer2Widget takes integer int returns widget
call SaveFogStateHandle(MyHash,0,0,ConvertFogState(int))
return LoadWidgetHandle(MyHash,0,0)
endfunction
2/Nếu 1 unit A summon ra nhiều unit B thì nên
- học thêm 1 chút vjass và dùng các system dùng để đánh index cho unit
- tạo array group grpB và set/get bằng cách grpB[GetUnitIndex(unitA)] add/remove unitB
Ko thì cách của cậu cũng được hashtable cũng ko sao. Còn để test độ lag thì cho dùng spell liên tục và bật Frame per Second = /fps để kiểm tra độ lag của map

Trong cái mình đang làm thì 1 A chỉ có 1 B, nhưng bạn có thể giúp mình 1 số link tham khảo về cái bạn nói đánh index cho unit ko? vjass mình ko dùng nhưng đọc cũng hiểu đc chút chút. Trường hợp xấu nhất thì save nó ra mở = MPQ editor để xem = jass cũng dc
3/Dùng lệnh RemoveUnit là đảm bảo unit đã bị xóa sổ. Còn kiểm tra bằng cách DisplayText: GetUnitName(removeUnit) trước và sau khi remove.
Nếu unit đó tồn tại trong map thì sẽ ra unit name = tên cụ thể nếu ko tồn tại trong map thì sẽ ra (null)
Tác dụng là gắn vào 1 unit 1 giá trị integer và Get là lấy ra giá trị đã gắn. Nếu ko dùng hàm set thì mặc định khi get là 0.
Đây chính là hàm mấu chốt cho các system để "đánh số báo danh" cho 1 unit

Vậy là chỉ có tên của unit bị remove thay đổi hay sao ý :D. Cám ơn bạn nhiều. Mà có 1 điều là lúc đầu mình GetUnitUserData thì ra 0, nhưng remove xong Get lại thì nó là 48, nó đổi là vì unit đó đã ko tồn tại nữa phải ko, ý mình là nếu dùng những hàm khác ảnh hưởng unit thì cái UserData mình set đâu có bị gì phải ko :D?


Quay về cái ability abcxyz lúc nãy, ví dụ mình có 1 unitA tạo 3 unitB, mình tạo 3 mảng arrUnitB1, arrUnitB2, arrUnitB3 và lưu index dữ liệu vào UserDat của unitA, rồi khi nào cần mình arrUnitB1/2/3[GetUnitUserData(GetTriggerUnit())] đế lấy unit B thứ 1/2/3 của A đc phải ko?

Với lại ngoài các dữ liệu có thể lưu cho unit như UserData, UnitRallyUnit thì còn có gì tương tự vậy để lưu vô cho unit ko vậy?


p/s:mình vừa thử lại: ngay cả sau khi remove mình GetUnitName cũng vẫn ra đc tên unit T_T
function Trig_Test_Actions takes nothing returns nothing
local unit u=CreateUnit(Player(0),'hspt',000,0,0)

call BJDebugMsg("Truoc remove " + R2S(GetUnitUserData(u)) + " - " + I2S(GetHandleId(u)))
//call KillUnit(u)
call RemoveUnit(u)
if u!=null then//and GetWidgetLife(u)>0.405 then
call BJDebugMsg("Sau remove " + R2S(GetUnitUserData(u)) + " - " + GetUnitName(u) + I2S(GetHandleId(u)))
endif
set g=null

endfunction

p/s 2: SetUnitRallyUnit đâu có hoạt đ6ọng với mấy con Unit ko xài Rally đâu nhỉ :D, vừa thử
 
Chỉnh sửa cuối:
1, cái đó theo bây giờ vẫn còn tại và còn một cái "kế nhiệm" tốt hơn nó là Hashtable

p/s:mình vừa thử lại,

theo mình "đoán" đầu tiên bạn cục bộ đơn vị đó bằng hàm local. tiếp theo kiểm tên bằng handle(u) đó
sau đó remove unit với handle là (u).
mặc dù unit đã xóa sổ nhưng trong cục bộ function vẫn còn data của unit đó. có thể là tên thậm chí còn có thể lưu trữ lại Z Y X cuối cùng trước khi xóa sổ (bằng cách set u = null) vì điều này sẽ khiến (u) vẫn hiển thị tên :-". nếu
globals
private unit u
endglobals

set u=CreateUnit(Player(0),'hspt',000,0,0) thay vì local unit u=CreateUnit(Player(0),'hspt',000,0,0) thì điều đó có thể không xảy ra:-"
 
1, cái đó theo bây giờ vẫn còn tại và còn một cái "kế nhiệm" tốt hơn nó là Hashtable

p/s:mình vừa thử lại,

theo mình "đoán" đầu tiên bạn cục bộ đơn vị đó bằng hàm local. tiếp theo kiểm tên bằng handle(u) đó
sau đó remove unit với handle là (u).
mặc dù unit đã xóa sổ nhưng trong cục bộ function vẫn còn data của unit đó. có thể là tên thậm chí còn có thể lưu trữ lại Z Y X cuối cùng trước khi xóa sổ (bằng cách set u = null) vì điều này sẽ khiến (u) vẫn hiển thị tên :-". nếu
globals
private unit u
endglobals

set u=CreateUnit(Player(0),'hspt',000,0,0) thay vì local unit u=CreateUnit(Player(0),'hspt',000,0,0) thì điều đó có thể không xảy ra:-"
Mình vừa thử thay nó = 1 biến unit global, và cũng ko khác gì :D
 
Mấy Pro chỉ em cái, em dở nhất mấy cái vụ Trigger và biến nên không làm một số spell hay được mong các bác giúp giùm em.:2cool_beated:
1: Biến
Hướng dẫn cách làm biến tạo Unit ngay tại bản thân( chơi chiêu ấy)
Hướng dẫn cách làm biến tạo Unit ở các Unit xung quanh một vùng.
2: Spell
Một spell cơ bản về sử dụng chiêu gây sát thương bằng chính lượng damage của mình
Một spell cơ bản về sử dụng chiêu gây sát thương bằng các chỉ số Agi, Str ...
Một spell cơ bản về sử dụng chiêu gây sát thương bằng chính lượng mana hoặc Hp của mình ấy.
(Lưu ý cơ bản thôi nha đùng quá phức tạp:4cool_oh:)

Mong các Pro chỉ dùm cho, cảm ơn nhiều :cuteonion57::cuteonion57:

Quote lại lần nữa ai giúp mình không, làm ơn đi mà :3cool_adore:
 
Hướng dẫn cách làm biến tạo Unit ở các Unit xung quanh một vùng: dùng trigger Unit - Creat 1 ...............

---------- Post added at 09:28 ---------- Previous post was at 09:19 ----------

Một spell cơ bản về sử dụng chiêu gây sát thương bằng các chỉ số Agi, Str: dùng trigger Unit - Damage Target
 
Hướng dẫn cách làm biến tạo Unit ở các Unit xung quanh một vùng: dùng trigger Unit - Creat 1 ...............

---------- Post added at 09:28 ---------- Previous post was at 09:19 ----------

Một spell cơ bản về sử dụng chiêu gây sát thương bằng các chỉ số Agi, Str: dùng trigger Unit - Damage Target

- làm thế nào để cái đó có thể "tạo Unit ở các Unit xung quanh một vùng" ?

- dùng trigger đó gây damage rồi sao? "bằng chỉ số Agi, Str" thì thế nào?
 
^
toàn ăn hiếp em:
Mã:
bua lun 1
    Events
        Unit - A unit Starts the effect of an ability
    Conditions
        (Ability being cast) Equal to bua lun 1 
    Actions
        Unit - Cause (Casting unit) to damage (Target unit of ability being cast), dealing ((Real((Level of bua lun 1  for (Casting unit)))) + ((Real((Strength of (Casting unit) (Exclude bonuses)))) x 2.00)) damage of attack type Spells and damage type Normal
:(

---------- Post added at 09:56 ---------- Previous post was at 09:37 ----------

cho em hỏi cách làm -repick giống dota :D
p.s: hôm qua em có hỏi unit slide là gì thôi mà cũng cho em ăn point :9cool_too_sad:

---------- Post added at 10:12 ---------- Previous post was at 09:56 ----------

cho em hỏi về mấy cái tọa độ trong 12 ô chứa icon :|
 
@Ice Dragon:

Mình vừa thử thay nó = 1 biến unit global, và cũng ko khác gì
p/s:mình vừa thử lại: ngay cả sau khi remove mình GetUnitName cũng vẫn ra đc tên unit T_T

Thực chất trong cùng 1 trigger thì dù hàm của cậu có remove unit đó, trừ khi set null giá trị unit ko thì sẽ lun lun lấy ra được GetUnitUserData và GetHandId thì kể cả trigger khác mà ko làm null nó thì vẫn lấy được.
Đây là trigger thử nghiệm của mình
Mã:
globals
    unit Untitled_Trigger_001_u
endglobals

function Trig_Untitled_Trigger_001_Actions takes nothing returns nothing
call BJDebugMsg("Truoc remove " + R2S(GetUnitUserData(Untitled_Trigger_001_u)) + " - " + I2S(GetHandleId(Untitled_Trigger_001_u)))
call RemoveUnit(Untitled_Trigger_001_u)

if Untitled_Trigger_001_u!=null then
call BJDebugMsg("Sau remove " + R2S(GetUnitUserData(Untitled_Trigger_001_u)) + " - " + GetUnitName(Untitled_Trigger_001_u) + I2S(GetHandleId(Untitled_Trigger_001_u)))
endif
endfunction

function InitTrig_Untitled_Trigger_001 takes nothing returns nothing
    set gg_trg_Untitled_Trigger_001 = CreateTrigger(  )
    call TriggerRegisterPlayerEventEndCinematic( gg_trg_Untitled_Trigger_001, Player(0) )
    call TriggerAddAction( gg_trg_Untitled_Trigger_001, function Trig_Untitled_Trigger_001_Actions )
    set Untitled_Trigger_001_u=CreateUnit(Player(0),'hspt',000,0,0)
endfunction

Mà có 1 điều là lúc đầu mình GetUnitUserData thì ra 0, nhưng remove xong Get lại thì nó là 48!
Mình cá là cậu có code làm ảnh hưởng đến giá trị chứ code thử của mình ko như thế

Với lại ngoài các dữ liệu có thể lưu cho unit như UserData, UnitRallyUnit thì còn có gì tương tự vậy để lưu vô cho unit ko vậy?
Ko. Nhưng chỉ cần UserData là đã đủ rồi

Quay về cái ability abcxyz lúc nãy, ví dụ mình có 1 unitA tạo 3 unitB, mình tạo 3 mảng arrUnitB1, arrUnitB2, arrUnitB3 và lưu index dữ liệu vào UserDat của unitA, rồi khi nào cần mình arrUnitB1/2/3[GetUnitUserData(GetTriggerUnit())] đế lấy unit B thứ 1/2/3 của A đc phải ko?
Sao ko dùng group thì chỉ cần 1 cái array và bao nhiêu unit cũng được :-?

Học vjass:
Vô cùng đơn giản nếu cậu đã dùng được jass. Chỉ 1 ngày là dùng được vjass. Xem ở <Jass new gen folder>/jasshelper/jasshelpermanual.html

1 số link tham khảo về cái bạn nói đánh index cho unit
Unit Indexer

Slide là gì ???
Hình minh họa
Hướng dẫn

cho em hỏi về mấy cái tọa độ trong 12 ô chứa icon
View attachment 149087
Ví dụ: Thứ tự trong WE tính từ trên xuống
Item đầu tiên tương đương vị trí là cột 0 dòng 0
Item thứ 6 tương đương vị trí là cột 1 dòng 1y
 
Chỉnh sửa cuối:
ko đc rồi mấy anh ơi
em disable speelbook xong, nó mất cả spellbook thì lấy gì:
1) làm icon cho đẹp
2) làm sao nâng skill lên tiếp lv2
bây giờ chỉ ok 75%, em muốn là:
1 skill passive (có icon hẳn hoi và ko nhấn vào đc)
bây giờ làm sao để ko cho nhấn vào spellbook nhưng vẫn hiện icon của nó :-/

---------- Post added at 11:29 ---------- Previous post was at 11:10 ----------

nói toán lại em muốn chuyển dạng 1 skill active (nhấn đc) thành 1 skill passive (ko nhấn đc)
 
YAN[asian];21584751 nói:
Nhờ Tom hướng dẫn mình lại vụ unit slide đến mép bản đồ thì dừng lại nhé.

Xóa bài mà ko giúp hả Tom? :(
 
Anh Tom............. l...ự...u......đ...ạ...n :-??:">
cho em hỏi cách chuyển 1 skill từ active sang passive vì spellbook nhấn đc, xấu lắm
p.s: em chỉ nói vậy cho vui chứ ko phải chửi anh nhé :|
 
YAN[asian];21588898 nói:
Xóa bài mà ko giúp hả Tom? :(

tiếp theo hướng dẫn về slide của tôi:

Mã:
SlideMove  // ko cần OFF sẵn, cứ ON luôn
    Events
        Time - Every 0.04 seconds of game time
    Conditions
    Actions
        For each (Integer A) from 1 to SlideIndex, do (Actions)
            Loop - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        SlideTick[(Integer A)] Equal to 0
                    Then - Actions
                        For each (Integer B) from (Integer A) to (SlideIndex - 1), do (Actions)
                            Loop - Actions
                                Set SlideAngle[(Integer B)] = SlideAngle[((Integer B) + 1)]
                                Set SlideDistance[(Integer B)] = SlideDistance[((Integer B) + 1)]
                                Set SlideTick[(Integer B)] = SlideTick[((Integer B) + 1)]
                                Set SlideUnit[(Integer B)] = SlideUnit[((Integer B) + 1)]
                        Set SlideIndex = (SlideIndex - 1)
                    Else - Actions
                -------- ---------------- --------
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        SlideTick[(Integer A)] Greater than 0
                    Then - Actions
                        Set SlideTick[(Integer A)] = (SlideTick[(Integer A)] - 1)
                        Set TempLoc = (Position of SlideUnit[(Integer A)])
                        Set TempLoc2 = (TempLoc offset by SlideDistance[(Integer A)] towards SlideAngle[(Integer A)] degrees)
                        [COLOR="#0000FF"]If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            If - Conditions
                                ((Playable map area) contains TempLoc2) Equal to True
                            Then - Actions
                                Unit - Move SlideUnit[(Integer A)] instantly to TempLoc2
                                Special Effect - Create a special effect at TempLoc2 using Abilities\Spells\Human\FlakCannons\FlakTarget.mdl
                                Destructible - Pick every destructible within 200.00 of TempLoc2 and do (Actions)
                                Loop - Actions
                                    Destructible - Kill (Picked destructible)
                            Else - Actions
                                Set SlideTick[(Integer A)] = 0[/COLOR]
                        Custom script:   call RemoveLocation( udg_TempLoc )
                        Custom script:   call RemoveLocation( udg_TempLoc2 )
                    Else - Actions

phần xanh là phần thay đổi.

trước khi di chuyển unit thì kiểm tra xem point này (TempLoc2) có ở trong Playable map area hay không
- có: di chuyển, tạo effect, phá cây
- không: dừng slide bằng cách đặt số tick = 0

tôi nghĩ không cần thiết phải demo.

Anh Tom............. l...ự...u......đ...ạ...n :-??:">
cho em hỏi cách chuyển 1 skill từ active sang passive vì spellbook nhấn đc, xấu lắm
p.s: em chỉ nói vậy cho vui chứ ko phải chửi anh nhé :|

tôi không thấy vui thì làm thế nào giờ? :-/

chuyển active sang passive: không có cách nào

giải quyết vấn đề trên:
tạo ability Apassive, có hiện iconkhông có tác dụng gì (Storm Hammer, Vorpal Blade,...)

trigger:
Mã:
Learn
    Events
        Unit - A unit Learns a skill
    Conditions
        (Learned Hero Skill) Equal to [B]ability A[/B]
    Actions
        Set TempUnit = (Triggering unit)
        Set TempInt = (Learned skill level)
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                TempInt Equal to 1
            Then - Actions
                Unit - Add [B]Spell Book[/B] to TempUnit
            Else - Actions
                [COLOR="#0000FF"]Unit - Set level of [B]ability trong spellbook[/B] for TempUnit to TempInt[/COLOR]

khi học ability A, nếu là level 1 thì add spellbook (đã disable) cho Trigger unit, nếu lên level (từ 2 trở lên) thì đặt level cho ability trong spellbook lên đúng level vừa học
có bao nhiêu ability trong spellbook thì phải có bấy nhiêu dòng màu xanh
 
sửa đi sửa lại mà vẫn lag.... chỉ còn 1 cách thôi....
mình chỉ cho bạn, bạn hứa ko đc nói với ai nghe chưa! :8onion13:
[spoil]tạo lại map mới thử đê! :cuteonion23::2onion2:[/spoil]

như mình đã nói đấy thôi:
1. Doodad nhìu 1 chỗ lag
2. tạo một lượt nhìu unit lag
3. timer loop nhìu lần nhìu đơn vị lag
4. một vài action ko hợp lệ trong hàm lag
5. period time của skill buff ko đúng chỉ định lag
6. blah blah blah... lag...
:cuteonion15:

sửa ko hết thì cách đấy là nước cờ cuối cùng!

Toàn từ mới.... !

Anh tom... còn có nguyên nhân nào khác không
 
blah blah blah là... bá láp đó. Trigger blah nghĩa là trigger đọc vào mà ko hiểu nó ghi gì
 
map vltk của mình đưa cho thằng nào edit lại chắc nó cũng hoa cả mắt :) cái trigger Tống kim dài đến nỗi Con trượt bên cạnh dài còn khoảng chưa đầy 1cm =)) đấy là cố cắt ra trigger khác bớt rồi đấy. Vì cái này lớn nhất map nên mình xem kỹ cả rồi.... chắc phải có nguyên nhân nào đó chứ ?
 
Thực chất trong cùng 1 trigger thì dù hàm của cậu có remove unit đó, trừ khi set null giá trị unit ko thì sẽ lun lun lấy ra được GetUnitUserData và GetHandId thì kể cả trigger khác mà ko làm null nó thì vẫn lấy được.
Đây là trigger thử nghiệm của mình

Điều này nghĩa là khi lưu 1 Unit vào 1 biến rồi sau đó RemoveUnit nếu như ko đi kèm null biến đó thì ko có cách nào phân biệt unit chứ trong biến đó đã Remove hay chưa?
Nghĩa là
function test takes nothing returns nothing
local unit u=CreateUnit(Player(0),'<id unit>',0,0,0)
if GetRandomInt(0,1)==0 then
call RemoveUnit(u)
//Nếu ở đây mình ko set u=null hay gì khác
endif
//thì ngay chỗ này ko thể nào biết đc u đã bị remove chưa đúng ko bạn?
endfucntion
Sao ko dùng group thì chỉ cần 1 cái array và bao nhiêu unit cũng được
Vì quên :">. Tại đó h ít dùng group :D.
Mà tính ra mình vẫn dùng đc 1 arr cho 3 units nhở, ví dụ như cái trên
Quay về cái ability abcxyz lúc nãy, ví dụ mình có 1 unitA tạo 3 unitB, mình tạo 3 mảng arrUnitB1, arrUnitB2, arrUnitB3 và lưu index dữ liệu vào UserDat của unitA, rồi khi nào cần mình arrUnitB1/2/3[GetUnitUserData(GetTriggerUnit())] đế lấy unit B thứ 1/2/3 của A đc phải ko?
Thì mình dùng UnitB[GetUnitUserData(GetTriggerUnit())*3+0/1/2] để lấy unit B thứ 1/2/3 của A nhỉ :-?

map vltk của mình đưa cho thằng nào edit lại chắc nó cũng hoa cả mắt :) cái trigger Tống kim dài đến nỗi Con trượt bên cạnh dài còn khoảng chưa đầy 1cm =)) đấy là cố cắt ra trigger khác bớt rồi đấy. Vì cái này lớn nhất map nên mình xem kỹ cả rồi.... chắc phải có nguyên nhân nào đó chứ ?

Bạn thật may mắn hơn 1 số người đang sửa chữa map trên cái file war3map.j >"<
 
Chỉnh sửa cuối:
ừa, giả lập mảng 2 chiều @@
nhưng mà tớ giờ cũng ko chắc dùng group hay unit array nhanh hơn nữa ...
 
ừa, giả lập mảng 2 chiều @@
nhưng mà tớ giờ cũng ko chắc dùng group hay unit array nhanh hơn nữa ...

Theo tớ nghĩ thì group thì vẫn phải chứa dữ liệu về các unit phần tử, nên ít nhất nó vẫn phải là 1 array unit đc thêm vào 1 số tính năng :-?
Mà cái chính là tớ ghét làm việc với Group vì cứ phải dùng ForGroup gọi qua 1 hàm khác, lại phải truyền dữ liệu qua biến tạm T_T
Hay có cách nào lấy ra từng unit trong group giống như loop qua array nhỉ ?
 
Status
Không mở trả lời sau này.
Back
Top