Topic hỏi đáp cho anh em (Về cách làm map)

Status
Không mở trả lời sau này.
lượng damage gây ra hiện lên đầu làm dễ lắm nhưng có 1 vấn đề là nếu khi hero địch đánh nhau với nature creep chẳng hạn thì vẫn hiện số ===> biết vị trí của nó rồi ww vào kill nó như chơi, trong map Blade Vs Demon của tôi đã thử và ngay lập tức phải xóa đi ...

Có thể giới hạn bằng cách dùng GetLocalPlayer() -> những ai nhìn được text nào. Giới hạn chỉ show damage của mình hoặc ally do/taken. Cách dùng như thế này:

Mã:
//Phía trên này là tạo ra text. Text thì vẫn cứ tạo ra trước.
call <lệnh hide floating text vừa tạo>
if GetLocalPlayer()==<condition mà mình muốn, ví dụ damageSource = mình/ally, hoặc triggering unit == mình/ally>
call <lệnh show floating text... là j` quên roài :P>
endif
Chung chung là như thế, có j` bác Tom sửa hộ :D.

@Rex:
E lười update, với cả project bây h chuyển qua tay thằng khác rồi. Khổ cái thằng này cũng thuộc loại lười, mới ra được 3.2. Bác Rex mod rồi chơi nội bộ cũng được, hoặc nếu cho lên epicwar thì nhớ ghi là bị sửa :D.
 
cái này nhờ anh Tom rồi nhưng mà có được đâu hay làm hộ cái map demo đi :D
 
oài, tạm thời xóa hết game để học thì rồi :D, bao h thi xong đã nhé :))
 
Em down chương trình nén map về, nhưng sao toàn .zip kô vậy? Không bít cách mở !!! :((
 
... xài winzip? Dùng window để extract? Dùng winrar?
 
Jass thì phải rõ ràng trong sáng vào mới giúp được...chứ loạn giang hồ thế này thì,,,
Không khác convert từ GUI sàn là bao, sao tận dụng được sức mạnh của nó.



Thay bằng:



Hạn chế dùng các lệnh có hậu tố BJ...BJ sẽ gọi 1 function khác để thực thi nó..**** chỉ dành cho GUI.




Các spell dạng như này rất ko nên dùng PolledWait or Sleep...Hãy dùng timer...Hoặc ko thì khả năng crash là rất lớn.

Các function c1-4 hoàn toàn làm cho code thêm rối rắm.
Group destroy xong phải null

thực ra khi sử dụng Map Optimizer của Vex, những cái liên quan đến bj ấy cũng đã được fix thành non BJ (thì để làm nhỏ map mà)

Thực ra Blizzard ko muốn đưa ra Blizzard Junction làm gì đâu, tại vì khi Map Maker nhớ đến lệnh đó, theo cách hiểu thông thường thì hơi bị ngược
chẳng hạn Create unit

BJ: create (1) unit (footman) cho (player 1) tại vị trí (point) mắt hường về xyz

nonBJ: create (player 1) , (unit footman) ở point mắt hường về xyz

Nếu hiểu theo kiểu vietnamese thì ko sao, nhưng nếu dich ra tiếng việt thì có vần đề rồi.... với bọn tây nó đọc thì cảm thấy hơn khó ... ngược thì đúng hơn nên BJ sinh ra ko phải là thừa

hay cái AddAbility cũng thế, rõ ràng nếu (ability code) trước, (unit) sau thì dễ hiểu hơn là (unit) trước (ability code) sau của nonBJ ...

TÓm lại là non hay ko non BJ thì cuối cùng khi dùng Map optimizer, tất cả về non hết ....
-------------------------------

CÒn về sleep hay wait, theo em thì dùng timer mới có khả năng gây cash cao hơn, bác cứ thử si pam creep rồi pause hay destroy timer kiểu gì đó xem

Sleep hay wait thì theo em chỉ không chính xác khi giá trị dưới 0.08
còn nếu > 0.08, nó hoạt động xem ra đáng tin hơn là timer vì nó ko có HandlerFunction, hơn nữa theo em thì trong cách chia nhỏ process của war, timer rõ ràng nó phải tham chiếu vào phần loop ít nhất là cấp 3 (vì đi kèm TimerStart, còn có thêm HandlerFunction nữa mà, trong khi wait kia thì chạy thẳng vào đồng hồ của war luôn tức là ít nhất loop cấp 2, loop cấp 1 chắc chắn là TriggerRegisterxyzEvent vì khi có war, thì những cái này ko thể ko có, nhưng Timerstart hay wait thì có thể có, có thể ko .... )

Nên xét về mặt priority, có khi wait sẽ nhanh hơn timer, và TriggerRegisterEvent sẽ nhanh nhất

Tất nhiên những cái trên cũng chỉ là ý kiến của riêng em mà thôi .....
 
Ừ...ý kiến trên ko có gì sai cả..nhưng..
Timer bây giờ ko ai dùng kiểu destroy cả mà New và Realease (hoạt động rất tốt)
Spell theo kiểu periodic hoặc wait kiểu này theo anh nên dùng timer..và hầu hết Jasser đều làm vậy..việc chứng minh thì dành cho các cao thủ ..cũng rất nhiều người đồng tình với việc này...
 
::( Ơ...cho em hỏi winzip, winrar là gì ạ... [-O< ...đang cần lắm...
 
Cho hỏi làm sao tạo ra 1 trigger jass. Mỗi lần add code thấy có mỗi chỗ cái hình bản đồ của Trigger Editor. Nhưng khi mở 1 số map ra thì thấy nó có 1 trigger jass luôn.
 
( Hic ) Cho em hỏi lần cuối: ::( .....sử dụng thế nào ạ? Nén được em đội ơn lắm lắm ^:)^ Tiện thể xin cảm ơn bạn kia rất nhìu :D
 
you never know how to use it but I will tell you yeah,yeah lam nhu sau sau ne yeah yeah yeah extract here(sorry hâm mộ Miley quá đừng ban em)
Dùn winzip lâu ko dùng quên rùi =)) còn dùng winrar mấy cái đó sẽ có hình winrar thì bấm chuột phải rùi extract here.This is ziprar
 
Kô hiểu sao nhiều khi 1 số map khi vào chơi đc 1 lúc, đông đông tí (khoảng 80/100, 6v6) là giật điên cuồng, nhưng kô giật kiểu low frame rate mà kiểu cứ 1 tí lại đứng hình rồi lại chạy tiếp bt, ví dụ đứng hình 1s rồi chạy 1s rồi lại đứng 1s rồi lại chạy 1s ...
Ai biết cần điều chỉnh những gì trong map để có thể giảm tình trạng này chỉ tui với :D
(cấu hình: 2gb ddr2, core2duo e4500 2.2ghz, geforce 8600gt 256mb, độ phân giải 1440*900(sửa registry), max settings)
 
Ừ...ý kiến trên ko có gì sai cả..nhưng..
Timer bây giờ ko ai dùng kiểu destroy cả mà New và Realease (hoạt động rất tốt)
Spell theo kiểu periodic hoặc wait kiểu này theo anh nên dùng timer..và hầu hết Jasser đều làm vậy..việc chứng minh thì dành cho các cao thủ ..cũng rất nhiều người đồng tình với việc này...

Có phải bác rex đang nói đến new và realease của Red TimerUtils của Vex ???


Mã:
library_once TimerUtils initializer redInit
//*********************************************************************
//* TimerUtils (Red flavor)
//* ----------
//*
//*  To implement it , create a custom text trigger called TimerUtils
//* and paste the contents of this script there.
//*
//*  To copy from a map to another, copy the trigger holding this
//* library to your map.
//*
//* (requires vJass)   More scripts: htt://www.wc3campaigns.net
//*
//* For your timer needs:
//*  * Attaching
//*  * Recycling (with double-free protection)
//*
//* set t=NewTimer()      : Get a timer (alternative to CreateTimer)
//* ReleaseTimer(t)       : Relese a timer (alt to DestroyTimer)
//* SetTimerData(t,2)     : Attach value 2 to timer
//* GetTimerData(t)       : Get the timer's value.
//*                         You can assume a timer's value is 0
//*                         after NewTimer.
//*
//* Red flavor: Fastest, method in existence for timer attaching,
//*             only takes an array lookup, H2I and subtraction. 
//*             However, all the code in your map requires extra care
//*             not to forget to call ReleaseTimer. It also requires
//*             to preload a lot of timers at map init, they use
//*             memory and handle ids.
//*
//********************************************************************

//================================================================
    globals
        private constant integer QUANTITY   = 256
        private constant integer ARRAY_SIZE = 8191 //changing this to a higher value would effectively
                                                   //cripple the performance making this thing irrelevant

    endglobals

    //=================================================================================================
    private function H2I takes handle h returns integer
        return h
        return 0
    endfunction

    //==================================================================================================
    globals
        private integer array data[ARRAY_SIZE]
        private integer OFFSET
    endglobals

    //It is dependent on jasshelper's recent inlining optimization in order to perform correctly.
    function SetTimerData takes timer t, integer value returns nothing
        debug if(H2I(t)-OFFSET<0) then
        debug     call BJDebugMsg("SetTimerData: Wrong handle id, only use SetTimerData on timers created by NewTimer")
        debug endif
        set data[H2I(t)-OFFSET]=value
    endfunction

    function GetTimerData takes timer t returns integer
        debug if(H2I(t)-OFFSET<0) then
        debug     call BJDebugMsg("GetTimerData: Wrong handle id, only use GetTimerData on timers created by NewTimer")
        debug endif

        return data[H2I(t)-OFFSET]
    endfunction

    //==========================================================================================
    globals
        private timer array tT
        private integer tN = 0
        private constant integer HELD=0x28829022
        //use a totally random number here, the more improbable someone uses it, the better.
    endglobals

    //==========================================================================================
    function NewTimer takes nothing returns timer
        if (tN==0) then
            //If this happens then the QUANTITY rule has already been broken, try to fix the
            // issue, else fail.
            debug call BJDebugMsg("NewTimer: Warning, Exceeding TimerUtils_QUANTITY, please increase it for your map, fix your map's timer leaks or switch to blue flavor when applicable")
            set tT[0]=CreateTimer()
            if (H2I(tT[0])-OFFSET<0) or (H2I(tT[0])-OFFSET>=ARRAY_SIZE) then
                //all right, couldn't fix it
                call BJDebugMsg("NewTimer: Unable to allocate a timer, you should probably switch to the blue flavor or fix timer leaks.")
                return null
            endif
        else
            set tN=tN-1
        endif
        call SetTimerData(tT[tN],0)
     return tT[tN]
    endfunction

    //==========================================================================================
    function ReleaseTimer takes timer t returns nothing
        if(t==null) then
            debug call BJDebugMsg("Warning: attempt to release a null timer")
            return
        endif
        if (tN==8191) then
            debug call BJDebugMsg("Warning: Timer stack is full, destroying timer!!")

            //stack is full, the map already has much more troubles than the chance of bug
            call DestroyTimer(t)
        else
            call PauseTimer(t)
            if(GetTimerData(t)==HELD) then
                debug call BJDebugMsg("Warning: ReleaseTimer: Double free!")
                return
            endif
            call SetTimerData(t,HELD)
            set tT[tN]=t
            set tN=tN+1
        endif    
    endfunction

    private function redInit takes nothing returns nothing
     local integer i
     local integer last
     local boolean correct
        loop
            set tT[0] = CreateTimer()
            set OFFSET=H2I(tT[0] )
            set i=1
            set correct=true
            loop
                exitwhen (i==QUANTITY)
                set tT[i] = CreateTimer()
                if(H2I(tT[i])-OFFSET<0) or (H2I(tT[i])-OFFSET>=ARRAY_SIZE) then
                    debug call BJDebugMsg("TimerUtils_redInit: Failed a initializing attempt")
                    set correct=false
                    exitwhen true
                endif
                set i=i+1
            endloop
            exitwhen correct
        endloop
        set tN=QUANTITY
    endfunction

endlibrary

Nếu đúng bác dùng cái này thì
.... thực chất nó cũng là create timer và ... pausetimer mà!!!! ... Vex đâu phải god mà có thể tham gia chèn code vào war3 đc .... nên cuối cùng vẫn phải createtimer mà anh.
Kể cả về say người ta dùng ... XoaDongHo và TaoDongHo do Rex làm thì nó vẫn phải base trên cái đó ....

tất nhiên với BlueTimer thì nó sử dụng luôn cái CSData attach nên em ko bàn nhiều mà ở đây bàn đến RedTimer thôi

cũng mới đọc qua cái này thấy cũng hay, nhưng 1 số chỗ em chỉ nghi nó index các timer bằng số ngẫu nhiên nên chắc chắn sẽ có tầm vài phần nghìn % để có bug, tất nhiên em ko phải chuyên tin nên để hỏi lại xem đã ...

CÒn về nguyên tắc của RedTimer như bác Rex đã dùng

Đầu tiên

* function redInit takes nothing returns nothing
tạo ra 256 timer (exitwhen (i==QUANTITY)) QUANTITY = 256 ở trên cùng và có thể thay đổi
sau đó index mỗi cái theo i bắt đầu từ 1 - QUANTITY
Cuối cùng set tN=QUANTITY = 256 ....... hay

* function NewTimer takes nothing returns timer
Nếu Jasser dùng newtimer, set tN=tN-1, tức là bộ đếm lùi cái 256 timer kia

* function ReleaseTimer takes timer t returns nothing
Khi relealse timer thì thông báo cho SYStem này biết để pausetimer và - index set tN=tN+1, coi như timer này free to use

Điểm mạnh ở đây là ko sử dụng DestroyTimer nên tất nhiên tốc độ phải nói là rất nhanh, và tài nguyên bộ nhớ có thể kiểm xoát đc ... tóm lại có nhiều ưu điềm hơn rất nhiều so với cách làm thông thường ... cái này thì em có lẽ đồng ý ....

Như vậy cái RedTimer này là công cụ quản lý timer giúp jasser đỡ lúng túng để quản lý hộ các timer do họ tạo ra thôi, NÓ VẪN PHẢI BASE TRÊN VIỆC TẠO RA TIMER = CREATETIMER

Cách index này hồi trước cũng thấy bác tom làm trên GUI để move mấy cái knockback hay gì gì đó đấy ... mà dùng cách này nghĩ lại thấy đc đấy nhỉ, đỡ phải lo nghĩ đến tràn bộ nhớ
 
ai cho em cái chương trình đọc map dota với, cai WE ko đọc dc ah
 
Đã bảo ko đọc được vì nó bị protect rùi mà sao cứ lập hêtts topic nè rùi spam ở topic kia để hỏi thế.Ko có chương trình đọc map protect đâu mà tìm chắc vào year 3000 thì có
 
Có ai giúp với, làm sao để mà 1 con hero cast spell transform thành 1 con khác mà đứng yên không di chuyển, chỉnh ''Is a building'' thì vào game bị văng ra, cho nó transform thành 1 cái nhà khác thì 5 giây sau lại văng ra?? :-/
 
Bạn ui hình như nếu 1 hero mà transform thành 1 building thì văng game là đúng đó vì đang từ hero-building coi như hero die mà/Bạn chỉ cần chỉnh cho hero sau khi transform ko có khả năng di chuyển hoặc nếu bạn muốn hóa rùi tăng phòng thủ thì thêm mana flare cho hero rùi buộc nó phải cast hoặc bạn chủ động cast (mana flare:+def và nếu enemy cast spell--- lên tiên =))O:-) )
 
Cho hỏi cái phần ''chỉnh cho hero sau khi transform ko có khả năng di chuyển'' ở đâu vậy? :D
 
Status
Không mở trả lời sau này.
Back
Top