[AMXX] Loạt TUT từ cơ bản đến nâng cao

Thảo luận trong 'Counter Strike' bắt đầu bởi buiducduy111, 23/9/12.

  1. buiducduy111

    buiducduy111 Dragon Quest

    Tham gia ngày:
    3/5/11
    Bài viết:
    1,257
    Loạt tut sẽ được xây dựng từ cơ bản đến nâng cao.

    Điều kiện cần:
    - Phải có tool Amxmodx hay Pawm studio (Phần mềm để lập trình đó)
    - Phải biết cài đặt, sử dụng plugin, complie từ sma-> amxx file (Bạn học để viết plugin, viết xong ko biết cài in game thì làm gì =)))



    Các TUT sẽ được update : (Cứ mò trong page theo link là có TUT =)) )

    Bài 1. Cách khai báo http://forums.gamevn.com/showpost.php?p=22151972
    Bài 2. Cấu trúc cơ bản http://forums.gamevn.com/showpost.php?p=22151972
    Bài 3. Đăng kí 1 câu lệnh trong gamehttp://forums.gamevn.com/showpost.php?p=22151972
    Bài 4. Mảng và string http://forums.gamevn.com/showpost.php?p=22156071
    Bài 5. Thực thể http://forums.gamevn.com/showpost.php?p=22168610
    Bài 6. Phân tích 1 plugin nhỏ http://forums.gamevn.com/showpost.php?p=22210686
     
    Chỉnh sửa cuối: 7/10/12
  2. ngochai9a7

    ngochai9a7 Dragon Quest

    Tham gia ngày:
    5/1/12
    Bài viết:
    1,450
    Yeah, cuối cùng cũng có TUT AMXX \m/
    Mà sao bác Duy không post bên topic AMX nhỉ

    ---------- Post added at 19:16 ---------- Previous post was at 19:04 ----------

    Mong lần này có thật nhiều tut hay \m/
     
  3. buiducduy111

    buiducduy111 Dragon Quest

    Tham gia ngày:
    3/5/11
    Bài viết:
    1,257
    BÀI 1. CÁCH KHAI BÁO

    Khai báo là 1 bước hết sức quan trọng trong lập trình. Giống như làm toán, bạn thường “Gọi x là…, Gọi y là…” để thầy giáo biết x là cái gì, y là cái gì.
    Trong Amxmodx (Amxx) các cấu trúc đều gần như giống hệt như C hay C++

    1.Các kiểu dữ liệu cơ bản
    - Integer : là kiểu số nguyên . Ví dụ như : -1, 1, 2, 3,4…. Là các số nguyên (Giống trong toán nhỉ =))
    - Float : là kiểu số thập phân . Ví dụ như : -0,5 ; 5,4 là các số thập phân
    -Bool : Cái kiểu này chỉ có thể là true (đúng) hay false (sai)

    2. Cách khai báo
    -Đối với kiểu số là nguyên.
    PHP:
    // cách thứ 1
    new a,b,c  // Khai báo 3 biến a,b,c. Sauk hi khai báo , bạn có thể dung các biến này thoải mái
    a=// cho a=1
    b=// cho b = 2
    c=// cho c = 4

    // Cách thứ 2
    new a=1
    new b=2
    new c=4

    // mà cũng có thể
    New a=1,b=2,c=3
    -Đối với kiểu thập phân
    Bạn khai báo giống hệt phần số nguyên nhưng thêm Float: vào trước biến

    PHP:
    new Float:a=1.0 // 1 khi đã khai báo kiểu Float,  dù 1.0=1 thì bạn cũng phải viết a=1.0
     
    -Đối với kiểu bool
    PHP:
    new bool:a
    a
    =true // gán a là true
    Chú ý : Khi bắt đầu code, bạn nên xác định đúng kiểu số mà bạn muốn khai báo nhé, nếu không trình complie nó sẽ báo warning
    Khi khai báo thôi mà không có thêm gì thì mặc định
    -Số nguyên là 0
    -Thập phân là 0.0
    -Boo l là false

    3. Một số phép toán cơ bản
    Trong Pawm (ngôn ngữ lập trình amxx) nói chung và hầu hết các ngôn ngữ lập trình nói riêng có 1 điều khá là thú vị là : KHÔNG BAO GIỜ CÓ KIỂU CỘNG SỐ THẬP PHÂN VỚI SỐ NGUYÊN

    Ví dụ thế này
    PHP:
    new // a là kiểu số nguyên
    new Float:// b là kiểu thập phân
    new a+// không được đâu nha
    1 số phép toán cơ bản
    a.Phép cộng/Trừ
    Bạn cứ dung dấu cộng/trừ như toán bình thường thôi
    b.Phép nhân
    Phép nhân trong mọi loại lập trình không phải là “x” đâu nhé, mà là *
    c.Phép chia
    Bạn dung dấu “/” nhé
    d. 1 số cái phi toán học =))
    PHP:
    new // nếu không thêm gì thì mặc định thì a=0
    a+=// Cộng a thêm 1 đơn vị => a=1
    a-=// trừ của a đi 1 đơn vị => a=0
    a*=// Nhân đôi số a, tức là a=a*2
    a/=// Chia đôi số a, tức là a=a/2 
    e. Lấy phần dư của 1 phép chia, bạn dùng dấu % nhé
    PHP:
    new a,b
    a
    =4
    b
    =3
    new phandu
    phandu 
    4%// ở đây phandu = 1 do 4 chia 3 dư 1 đúng không nào, dễ chưa
    KẾT THÚC TUT NÀY :D
    AI CÓ GÌ HỎI KHÔNG?

    ---------- Post added at 19:55 ---------- Previous post was at 19:49 ----------

    BÀI 2. CẤU TRÚC CƠ BẢN


    Có những bài toán bạn phải chia ra nhiều trường hợp, nếu thế này ……, nếu thế kia……, hay bạn cần tính tổng (xích ma) của 1 loạt số theo quy luật như 1+2+3+4+5…..+5000 (5000 số) (Trong FX 570ES có đó nha) hay bạn cần phải làm 1 việc nào đó lặp đi lặp lại cho đến khi thu được kết quả…. Tất cả điều đó bạn sẽ được học ở Topic này
    O.Các phép so sánh, logic
    Có vài phép so sánh mình muốn các bạn nhớ
    .
    a,Bằng : == . VD: a==b
    b,Lớn hơn >, nhỏ hơn < . VD:a>b
    c,Lớn hơn học bằng >=, nhỏ hơn hoặc bằng <=
    d,Khác bằng !=. VD:a!=b
    e,Phủ định ! . VD !(a==1) (tức là phủ định của a=1 tức là a khác 1)
    f.Và && . VD (a==1 && b==2) (a=1 và b=2)
    g,Hoặc ||
    h.Tồn tại 1 phần tử &. VD: a=214141, nếu mình dùng a&2, mà trong a có số 2 kìa :D, thì nó trả về đúng, nếu không có thì sai :D
    I,Loại đi 1 phần từ &~. VD: a=214141, nếu mình dùng a&~2 thì số 2 trong a sẽ biến mất và trở thành : 14141

    I.IF (nếu , thì)

    Cấu trúc:

    Rút gọn
    PHP:
    if (điều kiên// nếu điều kiện đúng
    {
        
    //lệnh 1
        // 2
        // 3….
    }
    Đầy đủ
    PHP:
    if (điều kiên// nếu điều kiện đúng
    {
        
    //lệnh 1
        // 2,3,4….
    }
    else 
    // nếu điều kiện sai sẽ chạy đoạn sau
    {
        
    //lệnh 1
        // 2,3,4….
    }

    Đọc đoạn code dưới đây bạn sẽ biết dung thế nào
    PHP:
    new a,b
    a
    =1
    if (a==1)  // nếu a=1 thì sẽ cho b=1
    {
        
    b=1
    }
    else 
    // nếu a khác 1 thì sẽ cho b=2
    {
        
    b=2
    }

    //Nhưng do sau cái điều kiện , bạn chỉ thấy có 1 dòng lệnh nên cũng có thể làm thế này
    if (a==1)  b=1
    else b=2

     
    Code trên cũng có thể viết theo hướng khác
    PHP:
    new a,b
    a
    =1
    if (a!=1)  b=// nếu a không bằng 1
    else b=1

     
    II.Vòng lặp có giới hạn
    Cấu trúc
    PHP:
    new i
    for (i=số ban đầuđiều kiện tăng cho ilệnh khi điều kiện đúng)
    {
        
    //Code here

    }
    Ví dụ nhé
    PHP:
    new a
    for (new 1i<45i+=1// ở đây mình khai báo biến I gộp vào đây, nếu I nhỏ hơn 45 thì I sẽ được công thêm 1 đơn vị, mà thường chỗ i+=1, nên cho là i++, 2 cái này tương đương :D
    {
        
    a+=// Cộng a thêm I đơn vị
    }
    III.Vòng lặp vô hạn
    Cấu trúc
    PHP:
    while (điều kiện)
    {
        
    //Code here
    }
    IV.Switch
    Cái này bạn học cũng được mà không cũng không sao, bản chất của nó là IF thôi :D Mình thiết nghĩ, nếu bạn là newbie hãy học những công cuc ở trên trước

    Chú ý rất quan trọng là trong Pawm, a khác A , tức là nó phân biệt chữ hoa , chữ thường, nếu vì 1 lý do nào đó bạn ko thể compile mà bạn không thể tìm ra bắt cứ lỗi sai nào thì hãy kiểm tra xem bạn có viết nhầm chữ thường thành chữ hoa không nhé

    _HẾT_
    CÓ AI HỎI GÌ KHÔNG


    ---------- Post added at 19:55 ---------- Previous post was at 19:49 ----------

    BÀI 3. TẠO 1 CÂU LỆNH TRONG GAME

    Có bao giờ bạn mở console (~) lên và gõ 1 vài lệnh để Bá đạo không =)), chắc có nhỉ, ai chơi CS mà không biết console thì thôi đấy

    OK, bài học này các bạn sẽ biết đăng kí 1 câu lệnh như thế, có nghĩa là bạn có thể tự tạo ra 1 câu lệnh.
    Chúng ta bắt đầu nhé.

    Trong amxx có 1 function (hàm/chức năng) cho phép bạn làm thế đó là (cái này mình đã cắt mấy thứ đằng sau, mình thấy nó không cần thiết cho các bạn mới học, để đơn giản bạn có thể nhơ như sau)
    1. register_clcmd(”Tên lệnh”, ”Đường dẫn tới func plubic”)
    Cái này giúp bạn đăng kí lệnh cho client, hiểu nôm na là bạn gõ mấy chữ cái vào mà nó không hiện ra ở dưới đó

    2. register_concmd(”Tên lệnh”, ”Đường dẫn tới func plubic”)
    Cái này giúp bạn đăng kí lệnh cho cả server, hiểu nôm na là khi bạn gõ mấy chữ đầu tiên, nó sẽ hiện ra ở bên dưới (như kiểu tìm kiếm của google)

    Chúng ta xét 1 ví dụ nho nhỏ nhé (rất rất cụ thể đó, bạn hãy đọc kĩ nhé)

    PHP:
    #include <amxmodx> // Khai báo thư viện
    #include <fun>
    //tất cả thư viện nằm trong foder include đó


    public plugin_init() // public này sẽ tự động chạy khi server connect (hiểu nôm na là bạn vừa loading xong). Đây là nơi lý tưởng để đăng kí.  Ví dụ bạn muốn đăng kí 1 lớp học thêm, thì bạn phải đăng kí khi vừa mở chứ làm sao mà đợi nó học 5-6 tháng mới đăng kí đúng không :D
    {
        
    register_concmd(”full_health”,”cmd_set_health”)


    public 
    cmd_set_health(id// Plublic này sẽ được gọi khi 1 player gõ lệnh “full_health” , đơn giản chưa, còn tên public bạn đã đăng kí bên trên rồi.  Còn id chính là playerid.  
    //Bạn có hiểu id là gì không?. Trên thực tế  , hầu hiện tất cả mọi thứ đều tồn tại dưới dạng THỰC THỂ như cái ô tô hay cái máy bay trên map ,ent id  là 1 con số (1 id), như bạn mua phiếu ở lớp học thêm, số của bạn là 78 thì mình có thể nói id của bạn là 78. và player là 1 dạng thực thể đặc biệt và id của nó là từ 1->32. như vậy id ở đây là những số nguyên trong đoạn từ 1-32. 
    // Ví dụ : bạn là thằng player có id là 8, thì khi bạn gõ lệnh “full_health” cái id trong public cmd_set_health(id) sẽ là 8 đó :D . Dễ không nào
    {
        
    client_print(idprint_chat“Ban da set mau thanh 250”)
        
    // client_print là hàm để in 1 thông báo ra màn hình
            // print_chat là in ra màn hình theo kiểu CHAT
        // print_chat có thể thay bằng print_center (in giữa màn hình), client_console (in trong console)
        
    set_user_health(id250)
        
    // đây là lệnh trong fun.inc giúp bạn set máu cho player, do đó thư viện mình đã phải khai báo thư viện fun
        // trong đó id là player id đã đươc giải thích ở trên rôi :D
    }
     
  4. kungfulon

    kungfulon Fire in the hole! Lão Làng GVN Sorcerer

    Tham gia ngày:
    1/5/11
    Bài viết:
    2,535
    ...................................................................
    [spoil]
    [/spoil]
     
    Chỉnh sửa cuối: 23/9/12
  5. thinhbox

    thinhbox Fire in the hole!

    Tham gia ngày:
    18/5/07
    Bài viết:
    2,725
    Nơi ở:
    Cloud 9th - Melbourne
    ^ bỏ vào tag code php được không dạ ~:>
    nhìn xanh trắng vs đen buồn ngủ quá ="=! ~:>
     
  6. kungfulon

    kungfulon Fire in the hole! Lão Làng GVN Sorcerer

    Tham gia ngày:
    1/5/11
    Bài viết:
    2,535
    Tống nốt phần forward rồi bỏ sau, mà bò thì học cái này làm giề=))
     
  7. thinhbox

    thinhbox Fire in the hole!

    Tham gia ngày:
    18/5/07
    Bài viết:
    2,725
    Nơi ở:
    Cloud 9th - Melbourne
    ^ đọc vào lấy tí kn còn trùi dập newbie không lo mi sửa mồm 3:-o
    nói thế chứ dạo này hứng pascal nên dù éo liên quan gì cũng đọc tý :">
     
  8. kungfulon

    kungfulon Fire in the hole! Lão Làng GVN Sorcerer

    Tham gia ngày:
    1/5/11
    Bài viết:
    2,535
    Param chính là 1 biến, chúng ta có thể chỉnh sửa nó ngay trong func.
    Nếu thêm const vào trước param thì nó sẽ trở thành 1 hằng.
    Param id <-- tên param thường gặp nhất, 95% các func sử dụng tên param này để chỉ số thứ tự của 1 player.
    Như bài HD về native, chúng ta đã call func:

    PHP:
    client_print(idprint_center"Hello World!")
    // client_print(PlayerId, Target, const Format[], any:...)
    Điều này có nghĩa là dòng chữ "Hello World!" sẽ được print ra giữa màn hình của thằng player có thứ tự là id.

    ---------- Post added at 20:43 ---------- Previous post was at 20:32 ----------

    Tính thi quốc gia hay sao mà hứng=))

    ---------- Post added at 21:00 ---------- Previous post was at 20:43 ----------

    VÒNG LẶP FOR & VÒNG LẶP WHILE
    [spoil]1. VÒNG LẶP FOR
    Vòng lặp for sử dụng để lặp trong 1 khoảng xác định (số lần lặp xác định).
    Cú pháp:
    PHP:
    for(<biến đếm> = <giá trị đầu>;<điều kiện lặp>;<biểu thức biến thiên của biến đếm>)
    Trong đó:
    điều kiện lặp: là điều kiện để vòng lặp được thực hiện, nếu điều kiện trả về giá trị TRUE thì lặp, ngược lại thì vòng lặp kết thúc.
    biểu thức biến thiên của biến đếm: là biểu thức thể hiện sự biến thiên nhất định của biến đếm trong mỗi lần lặp (++, --, +=, -=,...)
    Ví dụ:
    PHP:
    for(new 1<= 32i++)
    {
          
    // Lệnh
    }

    //Biến i sẽ chạy từ 1 -> 32 theo chiều tăng dần (i++), khi i vượt quá 32 thì vòng lặp kết thúc.
    2. VÒNG LẶP WHILE
    Vòng lặp while sử dụng để lặp với số lần chưa biết.
    Cú pháp:
    PHP:
    while (điều kiện lặp)
    {
          
    // Lệnh
    }
    hoặc:
    PHP:
    do
    {
          
    // Lệnh
    }
    while (
    điều kiện lặp)
    Vòng lặp while sẽ chạy liên tục cho đến khi điều kiện lặp trả về giá trị FALSE, vì vậy hãy cẩn thận đừng để xuất hiện vòng lặp vô tận.
    VD:
    PHP:
    new 1;
    while (
    10)
    {
         
    i++
    }

    //Biến i sẽ cộng thêm 1 cho đến khi i vượt quá 10.
    [/spoil]
     
  9. buiducduy111

    buiducduy111 Dragon Quest

    Tham gia ngày:
    3/5/11
    Bài viết:
    1,257
    Làm sao mà làm được cái kiểu, ấn vào nó dẫn luôn đến post người đó nhỉ :4cool_doubt:
     
  10. kungfulon

    kungfulon Fire in the hole! Lão Làng GVN Sorcerer

    Tham gia ngày:
    1/5/11
    Bài viết:
    2,535
    Mã:
    http://forums.gamevn.com/showpost.php?p=<postid>
     
  11. Giazzrian

    Giazzrian C O N T R A

    Tham gia ngày:
    6/1/11
    Bài viết:
    1,880
    Nơi ở:
    BMT/HCM
    cứ viết đi rồi tống sang kia. viết nhanh chứ kéo page lười mò lắm =))
     
  12. Orpheus

    Orpheus ♥ ♡ ToMaTo TasTe Kiss ♡ ♥ Moderator

    Tham gia ngày:
    30/3/09
    Bài viết:
    4,066
    Nơi ở:
    Kingdom Hearts
    [​IMG]
    mỗi post 1 tut thôi ~
    >1 tut/post người đọc kéo mỏi tay và khó tìm ~
     
  13. theanh11a5

    theanh11a5 - NOW ON - Moderator

    Tham gia ngày:
    8/10/09
    Bài viết:
    5,126
    Tớ mời mò mẫm làm thử,copy-paste cái code của kungfulon thôi,compile thì bình thường ko thấy lỗi gì cả,nhưng cho vào game thì chẳng thấy gì khác.:6cool_surrender:
    Mã:
    #include <amxmodx>
    
    public plugin_natives()
    {
         register_native("NativeName", "CallbackFunc", 1)
    }
    
    public CallbackFunc(id)
    {
         client_print(id, print_center, "Wellcome to CS1.6 Mod!")
    } 
     
  14. kungfulon

    kungfulon Fire in the hole! Lão Làng GVN Sorcerer

    Tham gia ngày:
    1/5/11
    Bài viết:
    2,535
    Vì cái native đó đâu có đc gọi:|
     
  15. theanh11a5

    theanh11a5 - NOW ON - Moderator

    Tham gia ngày:
    8/10/09
    Bài viết:
    5,126
    Vậy kungfulon sửa lại cho tớ tí đi,cái này mới bắt đầu vào nên vẫn chưa rõ lắm.:6cool_smile:
     
  16. kungfulon

    kungfulon Fire in the hole! Lão Làng GVN Sorcerer

    Tham gia ngày:
    1/5/11
    Bài viết:
    2,535
    PHP:
    #include <amxmodx>

    native NativeName(id)

    public 
    plugin_natives()
    {
         
    register_native("NativeName""CallbackFunc"1)
    }

    public 
    CallbackFunc(id)
    {
         
    client_print(idprint_console"Wellcome to CS1.6 Mod!")
    }

    public 
    client_putinserver(id)
    {
         
    NativeName(id)
    }
    Khi client kết nối vô server xong thì dòng chữ trên sẽ đc print vào console của client.
     
  17. buiducduy111

    buiducduy111 Dragon Quest

    Tham gia ngày:
    3/5/11
    Bài viết:
    1,257
    Thực ra cái đăng kí native này chủ yếu để plugin khác muốn dùng func thôi mà
     
  18. dias

    dias Mega Man

    Tham gia ngày:
    17/1/10
    Bài viết:
    3,226
    Nơi ở:
    SEOUL
    Ta nghi ngờ không lâu nữa sẽ có người cạnh tranh server với ta đấy =))
     
  19. thinhbox

    thinhbox Fire in the hole!

    Tham gia ngày:
    18/5/07
    Bài viết:
    2,725
    Nơi ở:
    Cloud 9th - Melbourne
    Code là chuyện lâu dài. Sắp tới thử vài cái buff máu và ammor thử
     
  20. buiducduy111

    buiducduy111 Dragon Quest

    Tham gia ngày:
    3/5/11
    Bài viết:
    1,257

Chia sẻ trang này