Anh ơi! e mới tập làm map thui nhưg khó quá anh ah anh có thể viết 1 bài chi tiêt được ko.Tất cả các bước đề làm map í.
Em muốn làm một map dang như DDay vêy nếu được giúp em nha thanks anh nhìu.
Chà, cái đó thì nhiều vấn đề lắm. Anh chỉ làm một vài bài hướng dẫn NHỎ thôi.
Em cần 1 tut về khóa map sao cho người khác ko deprotect được...
Thật ra vấn đề ko phải là có bị deprotect hay ko, mà là dùng tool làm cho map nhẹ đi, load nhanh hơn,.. và protect một thể. Chứ protect kiểu gì thể nào chả có người deprotect đc. (có virus thì ắt có anti-virus mà :wink: )
====================================================================
Tui đang cần bài tut về handler về cua KaTTaNa nè Help!!!
Và nhân tiện giải thích lun tại sao nên xài handler vẻ
Và 1 số cách anti BJ nữa
Hình như mấy chữ BJ màu đỏ la leaky
Handler của KaTTana:
- Đầu tiên phải có script: Local Handle Vars, lấy ở đây:
http://www.wc3jass.com/viewtopic.php?t=224 hoặc vô trong map demo (Tom gửi kèm ở dưới mà lấy), script này trong map demo thì Tom đã "sửa" một chút rồi.
- Có thể dùng WE bình thường, nhg nên dùng NewGen (mà Dragon đang dùng NewGen đúng ko ? ) vì có
library đỡ phải cho vào
map header
- Cách sử dụng:
Ta sẽ tạo func (function = hàm) Knockback (rất cơ bản

)
Đầu tiên, tạo 1 trigger, tên tùy ý, KnockBack chẳng hạn, convert ra jass rồi xóa hết các thứ ở trong rồi viết cái mới:
Mã:
function Knockback takes unit a, real dist, real angle returns nothing
//a là unit bị knock, dist là khoảng các, angle là góc knock
local timer t = CreateTimer() // tạo timer
local integer tick = 25
//store data into "t"
call SHHandle( t, "Knockback_Unit" , a )
call SHReal( t, "Knockback_Distance" , dist / tick )
call SHReal( t, "Knockback_Angle" , angle )
call SHInt( t, "Knockback_Tick" , tick )
call TimerStart( t, 0.04, true, function KnockbackE )
set t = null
endfunction
Trong func trên, ta cần các biến là a, dist và angle (như comment)
tạo 1 biến local, timer, tên là t
biến integer tick là biến đếm.
SHHandle là func của Local Handle Vars, dùng để "lưu" một handle vào handle. (handle là unit, timer, item, destructable,... xem list trong
Jass Craft sẽ rõ handle là gì) trong này lưu unit a vào timer t dưới cái "tên" là "Knockback_Unit"
SHReal cũng là func của Local Handle Vars, dùng để lưu một real vào handle. Trong này là lưu "khoảng cách" di chuyển (dist / tick) dưới tên "Knockback_Distance". Chú ý: ta lưu khoảng cách MỖI LẦN MOVE unit a, nên nó sẽ bằng <Tổng khoảng cách> / <biến đếm>, ở đây biến đếm là 25.
Tương tự ta lưu góc knock angle dưới tên "Knockback_Angle" và biến đếm tick dưới tên "Knockback_Tick"
Sau đó ta chạy timer t với 0.04 duration, có lặp lại và "callback func" là function KnockbackE. "callback func" là func khi timer "hết" sẽ gọi.
Cuối cùng là null timer, null handle nói chung, để tránh leak local
Dưới đây ta có func KnockbackE (đặt ở trên func Knockback)
Mã:
function KnockbackE takes nothing returns nothing
local timer t = GetExpiredTimer()
//Get data from "t"
local unit a = GHUnit( t, "Knockback_Unit" ) //use GHUnit to get stored unit
local real dist = GHReal( t, "Knockback_Distance" )
local real angle = GHReal( t, "Knockback_Angle" )
local integer tick = GHInt( t, "Knockback_Tick" )
local location loc
local location loc2
if tick == 0 then
//null data, use:
call FHL( t )
//or:
//call SHHandle( t, "Knockback_Unit" , null )
//call SHReal( t, "Knockback_Distance" , 0. )
//call SHReal( t, "Knockback_Angle" , 0. )
//call SHInt( t, "Knockback_Tick" , 0 )
call DestroyTimer(t)
set t = null
return
endif
call SHInt( t, "Knockback_Tick" , tick - 1 ) //decrease tick
set loc = GetUnitLoc(a)
set loc2 = PolarProjectionBJ( loc , dist, angle )
call AddSpecialEffectLocBJ( loc2, "Abilities\\Spells\\Human\\FlakCannons\\FlakTarget.mdl" )
call DestroyEffect( GetLastCreatedEffectBJ() )
call SetUnitPositionLoc( a, loc2 )
call RemoveLocation(loc)
set loc = null
call RemoveLocation(loc2)
set loc2 = null
set t = null
endfunction
Ở func KnockbackE, GetExpiredTimer() là timer t (ở func Knockback) mà ta đã chạy với func callback là func KnockbackE
Ta "lấy" các thứ đã "lưu" với timer t: unit a, real dist, real angle, integer tick dưới các tên "Knockback_Unit", "Knockback_Distance", "Knockback_Angle", "Knockback_Tick". Khi muốn lấy unit ta dùng func
GHUnit, real thì dùng
GHReal, integer thì dùng
GHInt (các func ở trong Local Handle Vars)
ta có một
if kiểm tra biến đếm. Nếu biến đếm == 0, vậy ta sẽ "null" dữ liệu, sử dụng func FHL( t ) với t là timer hoặc có thể "lưu" với giá trị "null" (với handle thì là null, real là 0. , integer là 0 )
sau đó dùng DestroyTimer để xóa timer này, tránh leak, và cuối cùng null t (là biến local, loại handle) => hết
if
Sau khi kiểm tra, thấy biến đếm chưa về 0, ta sẽ lưu biến đếm với giá trị đã giảm 1, call SHInt( t, "Knockback_Tick" , tick - 1 )
Tiếp theo là đặt loc, loc2, tạo effect, move unit rồi remove location để "tẩy" leak thôi. Nhớ là t, loc, loc2 là biến local nên cũng phải "null".
-----
Vậy, kết luận ta có:
khi gọi func Knockback, 1 timer sẽ đc tạo ra, các "data", dữ liệu, như unit bị knock, khoảng cách và góc knock, biến đếm, sẽ đc lưu vào timer (sử dụng: SHHandle, SHReal, SHInt,...)
khi timer "expired" (timer bị 'hết") thì tại callback func, ta lấy các dữ liệu ra bằng cách dùng: GHUnit, GHReal, GHInt,... với GetExpiredTimer() (trong biến
t)
Sau đó kiểm tra biến đếm (tick), nếu nó bằng 0 thì ta sẽ xóa dữ liệu (dùng FHL hoặc "lưu lần nữa" các giá trị "null") và xóa timer. Nếu chưa bằng 0, ta tiến hành tạo effect, move unit bình thường.
----
Chú ý: trong map demo, Tom đã "sửa" cái script Local Handle Vars này một chút,, SetHandle = SH, GetHandle = GH, FlushHandleLocal = FHL (viết tắt) và đặt vào library ::)
========================================================
BJ = Blizzard.j là các func do Blizzard Entertainment viết, dựa trên các "native" (coi như là các func cũng đc, nhg nó là "gốc")
Các BJ này phần lớn chỉ làm mỗi việc là "gọi" một native khác -> việc gọi gián tiếp này sẽ phần nào làm "chậm" code.
Ví dụ:
Mã:
function SetUnitAbilityLevelSwapped takes integer abilcode, unit whichUnit, integer level returns integer
return SetUnitAbilityLevel(whichUnit, abilcode, level)
endfunction
BJ trên ngoài việc gọi native
SetUnitAbilityLevel, việc này là ko cần thiết, nên ta cứ gọi luôn SetUnitAbilityLevel => đó là anti-BJ
Nhưng có một số BJ thì đúng là "đc việc", ví dụ:
Mã:
function RAbsBJ takes real a returns real
if (a >= 0) then
return a
else
return -a
endif
endfunction
đó là hàm lấy "giá trị tuyệt đối", đây ko thể thay = 1 native nào đc, nên cứ dùng thôi.
------
Oài, trả lời hơi muộn, a Rex lại nói mất rồi

, mà thôi kệ

Và CSData của Vexorian hay system của Cohadar thì cần dùng struct, nếu Dragon chưa biết struct thì Tom sẽ chỉ ::)