Thảo luận Code và thuật toán cho Phbot

Thảo luận trong 'Thư Viện - Kho Lưu Trữ' bắt đầu bởi Knight Raider, 4/11/08.

Trạng thái chủ đề:
Không mở trả lời sau này.
  1. Knight Raider

    Knight Raider Legend of Zelda

    Tham gia ngày:
    26/3/04
    Bài viết:
    1,072
    Nơi ở:
    Nhà không số, phố không tên
    Bây giờ trong box này 4 người đã có soure của Phbot, nhưng mỗi người lại làm độc lập với nhau, lúc trước tôi và HS có thảo luận vài thứ nhưng mỗi người lúc rảnh lúc bận khác nhau nên ko được nhiều. Topic này tôi mở ra để tập trung code lại, nếu thấy ổn thì có thể giữ nguyên hoặc bổ xung thêm. Những vấn đề cần giải quyết có thể post vào để mọi người cùng thảo luận tìm hướng giải quyết. Hy vọng HS, holy, HCM có thời gian thì up những gì mình làm được để phbot dùng cho VN nhanh chóng được phát triển.

    Theo tôi để tiện, nên post code theo khung như sau:
    Mã:
    Tên modul:
    Code kèm chú thích:
    Sau đây là 2 phần tôi làm được và đã thêm vào phbot7.
    I - Auto PT:
    Tạo 1 check box trong frm có tên là chkautoformpt, sau đó thêm đoạn code dưới đây vào frmMain.frm, nếu muốn đếm số người trong PT tạo thêm 1 textbox có tên là textpt.
    Mã:
    Private Sub Chkautoformpt_Click()
    InjectPacket "7069", "00000000000000000400015A0C005068626F74204175746F5054", True, False ' [COLOR="Red"]Đoạn số Hex bên trong mặc định là pt ko share, tên PT là "Phbot auto Party"[/COLOR]
    frmMain.Textpt.Text = 1 [COLOR="Red"]' gán giá trị 1 vào textpt[/COLOR]
    End Sub
    Trong modul Party.bas thêm 2 đoạn code:
    1. Đồng ý PT.
    Mã:
    Public Function acceptpt(sData As String)
    Dim ID As String
    Dim Tag As String
    Dim i As Integer
    
    ID = Mid(sData, 1, 14) ' [COLOR="Red"]Tách lấy ID của người xin gia nhập PT[/COLOR]
    Tag = Mid(sData, 15, 2) '[COLOR="Red"]Tách lấy 2 số để nhận biết có người xin PT[/COLOR]
    If frmMain.Chkautoformpt.value = 0 Then Exit Function
    If Tag = "00" Then
        InjectPacket "306E", ID & "0001", True, False
        i = frmMain.Textpt.Text
        i = i + 1 ' Tăng số người trong PT lên 1
        frmMain.Textpt.Text = i
    End If
    End Function
    2. Đăng kí lại PT nếu người thứ 2 hoặc người thứ 4 thoát khỏi PT:
    Mã:
    Public Function reformpt(sData As String)
    Dim Tag As String
    Dim i As Integer
    
    Tag = Mid(sData, 1, 2) ' [COLOR="Red"]tách 2 số để kiểm tra trạng thái PT[/COLOR]
    If Tag = "01" Then ' [COLOR="Red"]01: người thứ 2 vào rồi out ra luôn[/COLOR]
        InjectPacket "7069", "00000000000000000400015A0C005068626F74204175746F5054", True, False
    End If
    If Tag = "03" And frmMain.Textpt.Text <= 4 Then ' [COLOR="Red"]03: đăng kí lại khi người thứ 4 thoát khỏi PT.[/COLOR]
        InjectPacket "7069", "00000000000000000400015A0C005068626F74204175746F5054", True, False
        i = frmMain.Textpt.Text
        i = i - 1
        frmMain.Textpt.Text = i
    End If
    End Function
    
    Trong PacketParser.bas thêm vào:
    Mã:
    Case Is = "706D"        '[COLOR="Red"]accept PT[/COLOR]
                 Call acceptpt(sData)
    Case Is = "3864"        '[COLOR="Red"]reform PT[/COLOR]
                 Call reformpt(sData)
    Các opcode cần thiết trong autoPT:
    7069 (C-> J): Đăng kí PT.
    706D (J->C): chứa thông tin người xin gia nhập PT
    3864 (J->C): chứa thông tin người thoát ra khỏi PT.
    Xong auto PT.

    II - Pet Filter.
    + Trong frmMain tạo textbox tên là petIDtxt để hiển thị ID của pet, đồng thời cũng là điều kiện kiểm tra người chơi có pet hay không.
    + Trong mFunction.bas:
    - Khai báo mảng IPetData chứa các loại Item mà pet sẽ nhặt.
    Mã:
    Public ItemData(50000) As String
    - Bên dưới, trong function LoadText() thêm vào đoạn code:
    Mã:
    Dim File As String
    Dim Data As String
    Dim Tag As String ' [COLOR="Red"]Lưu dữ liệu đọc từ file[/COLOR]
    Dim tag1 As String ' [COLOR="Red"]Tách lấy Item cần thiết[/COLOR]
    Dim Tag2 As String ' [COLOR="Red"]nt[/COLOR]
    Dim i As Integer
    
    File = App.Path & "\Data\item.txt"
    i = 1
    Open App.Path & "\data\pickup.txt" For Output As 2
    Open File For Input As 1
    If Not EOF(1) Then
        Do Until EOF(1)
            Line Input #1, Tag
                tag1 = Mid(Tag, 18, 3)
                If tag1 = "QNO" Or Tag = "QSP" Then ' [COLOR="Red"]QNO và QSP là các item Quest[/COLOR]
                Tag2 = Mid(Tag, 2, 4) '[COLOR="Red"]2byte số Hex của Item[/COLOR]
                Print #2, Tag2
                ' [COLOR="Red"]Các Item khác có thể thêm vào đây[/COLOR]
                ' [COLOR="Red"]Dựa vào tên Item trong file Item.txt để lọc ra kí tự đặc trưng sau đó lưu vào file[/COLOR]
                End If
            Loop
    End If
    Close #1
    Close #2
    File = App.Path & "\Data\pickup.txt"
    i = 1
    Open File For Input As 1
    If Not EOF(1) Then
        Do Until EOF(1)
            Line Input #1, Data
                IPetData(i) = Data ' [COLOR="Red"]Lưu dữ liệu từ file pickup.txt sang mảng IPetData[/COLOR]
                i = i + 1
            Loop
    End If
    Close #1
    frmSplash.pBar.value = 30
    frmSplash.pBar.Refresh
    frmSplash.lblStatus.Caption = "Loading IPetData.."
    - Trong Pet.bas thêm 2 đoạn code:
    1. Lấy petID:
    Mã:
    Public Function getpetid(sData As String)
    Dim Tag As String
    Tag = Mid(sData, 1, 8) '[COLOR="Red"]Tách lấy 4byte là ID của pet[/COLOR]
    frmMain.petidtxt.Text = Tag
    End Function
    
    2. Kiểm tra Item rơi ra, xem có đúng với Item cần nhặt hay ko
    Mã:
    Public Function checkitem(sData As String)
    Dim itemtype As String
    Dim ItemID As String
    Dim i As Integer
    
    If frmMain.petidtxt.Text = "" Then Exit Function ' [COLOR="Red"]Nếu petidtxt trông thì thoát luôn[/COLOR].
    ItemID = Mid(sData, 9, 8) ' [COLOR="Red"]4byte ID của Item[/COLOR]
    itemtype = Mid(sData, 1, 4) ' [COLOR="Red"]2byte kiểm tra Item thuộc loại nào[/COLOR]
    For i = 1 To 200
        If IPetData(i) = itemtype Then
        InjectPacket "70C5", frmMain.petidtxt.Text & "08" & ItemID, True, False
        Exit For
        End If
    Next i
    End Function
    - Trong PacketParser.bas thêm vào 2 đoạn code:
    Mã:
    Case Is = "30C8"
                 Call getpetid(sData)
    Case Is = "3015"
                 Call checkitem(sData)
    - Các opcode cần thiết trong phần này:
    70C5 (C->J): điều khiển pet nhặt.
    30C8 (J->C): chứa ID của pet, ko có pet sẽ ko có opcode này
    3015 (J->C): chứa ID của Item rơi ra.

    Đây là toàn bộ những gì tôi đã thêm vào Phbot vừa rồi, còn vài cái nữa đang nghiên kíu tiếp nhưng chưa hoàn thiện.
    Phần auto PT nếu được có thể phát triển lên PT 8 và tùy ý đặt tên PT.
    Phần Pet Filter, cần thêm lựa chọn cho người dùng, sau đó trích Item cần thiết vào file txt ở ngoài hoặc load trực tiếp vào mảng.

    Mục tiêu cần đạt đến bây giờ là phải sửa lại phần target, tiếp đến là thoát khỏi các vị trí bị vướng, sau đó là buff.
    Phần target tôi mới chỉ xem qua và chưa có cách giải quyết tối ưu, phần vướng vật cản, tôi và HS có thảo luận qua, nếu ai có quan tâm đến vấn đề này có thể thảo luận thêm. Phần buff chưa động đến do 2 vấn đề trên cần phải giải quyết trước :|.
    Hy vọng thành viên trong team hoặc các mem quan tâm đến cái này đóng góp thêm.
    Thk mọi người đã đọc :-*
     
  2. ToBeLove

    ToBeLove Mario & Luigi

    Tham gia ngày:
    5/5/08
    Bài viết:
    730
    Nơi ở:
    Thái Dương
    KR tách hộ ae cái PetFilter ra đi KR. Dựa trên những gì có sẵn mình nghĩ đơn giản thôi mà. Bớt chút thời gian tách ra hộ cho ae đỡ cực :x. Chỉ cần có chỗ để thay đổi cổng (Port, Bot) để kết hợp (Proxy+Revbot) hay (Proxy+AutoSelect) là OK lắm rồi.

    Rất tiếc vì phi vụ Phbot này k tham gia được với ae lên đành ngồi chơi chờ kết quả của mọi người vậy =(( sory ::(.
     
  3. Knight Raider

    Knight Raider Legend of Zelda

    Tham gia ngày:
    26/3/04
    Bài viết:
    1,072
    Nơi ở:
    Nhà không số, phố không tên
    Đây là cách thoát khỏi vật cản mà tôi và HSSS đã thảo luận với nhau.
    Chấm xanh là char, chấm đỏ là mob.
    Xc,Yc: tọa độ char tại vị trí kẹt.
    Xm,Ym: tọa độ mob.
    [​IMG]

    Trước hết phải tìm ra sự kiện để nhận biết char đang bị kẹt. Sau khi biết bị kẹt thì so sánh Xc với Xm, nếu khác nhau thì chia ra các trường hợp:
    1. Nếu Xc < Xm thì tạo 1 packet cho char di chuyển đến tọa độ (Xc-i,Yc), với i là 1 số cố định có trước, mục đích là cho char di chuyển sang trái.
    Mã:
    Packet = CreatePacket(frmMain.huntx.Text - i, frmMain.hunty.Text)
    InjectPacket "7021", Packet, True, False 'change
    - Nếu vật cản là khá bé thì chỉ cần inject 1 packet như trên, nhưng nếu vật cản to, có thể cho char di chuyển tiếp lên đến vị trí có tọa độ (Xc-i, Ym).

    2. Nếu Xc>Xm thì cho char di chuyển đến tọa độ mới có dạng (Xc+i,Yc) sau đó tiếp tục đi đến tọa độ (Xc+i,Ym)

    3. Nếu Yc = Ym, tùy theo Xc > hoặc < Xm mà sẽ cho + hoặc - i, thứ tự + và - giống như trên, ở đây tối ví dụ Xc < Xm. Cho char di chuyển đến (Xc, Yc - i), sau đi đi tiếp (Xc + i, Yc -i) hoặc (Xm, Yc - i). Trường hợp Xc > Xm thì thay chỗ nào là + thành -.

    Tạm thời cách giải quyết là như vậy, có thể sẽ kéo theo 1 số vấn đề phát sinh.
    Có thể các bạn ko biết về VB nhưng về có thể giúp team về thuật toán, nhiều người tham gia thì vấn đề được giải quyết nhanh hơn và nếu được có thể code lại để có 1 bot riêng cho vSro. Hy vọng nhiều người tham gia hơn. Thk mọi người đã đọc.
     
  4. _JudaS_

    _JudaS_ Mr & Ms Pac-Man

    Tham gia ngày:
    6/6/08
    Bài viết:
    238
    Nơi ở:
    Đà Nẵng
    Tớ thì mù tịt về IT nhưng có ý tưởng như thế này:

    - Xác định opcode "không thể tấn công khi có vật cản".
    - Làm 1 vùng đệm để nhớ n tọa độ gần nhất (5 tọa độ chẳng hạn).
    - Khi opcode trên được gửi đến thì char sẽ chạy về 1 trong n tọa độ đó (tương tự như cái return).
    - Để tránh việc kẹt tiếp thì mob vừa target ở vị trí kẹt sẽ được bỏ qua, ko attack nữa trừ khi nó tấn công mình.
     
  5. Knight Raider

    Knight Raider Legend of Zelda

    Tham gia ngày:
    26/3/04
    Bài viết:
    1,072
    Nơi ở:
    Nhà không số, phố không tên
    Tạo các điểm sẵn làm cho thời gian tìm lối thoát có thể tăng lên.
    Còn việc con mob char target lúc kẹt, chắc cũng chỉ bỏ qua 1 khoảng thời gian thôi, đề phòng trường hợp kẹt liên tục bỏ qua hết, đến lúc ko có quái target, quái đánh thì đánh lại nhưng vẫn kẹt --> chết :|, ngoài ra nếu đánh chỗ quái bị động mà ko target những còn bị kẹt thì sẽ dẫn đến tình trạng bỏ qua những con đó ko bao giờ đánh, revbot cũng bị cái lỗi này.
     
  6. HCM_Royal

    HCM_Royal Donkey Kong

    Tham gia ngày:
    5/8/08
    Bài viết:
    318
    Attribute VB_Name = "AutoRes"
    Public Function AutoRes(sData As String)
    Dim Tag As String

    Tag = Mid(sData, 1, 2) 'Res type

    Select Case Tag
    Case "04" ' Hoi sinh binh thuong
    If frmMain.cmbHoiSinh.Text = "Hoi sinh Binh Thuong" Then
    InjectPacket "3080", "0101", True, False
    End If
    Case "08" ' Hoi sinh den
    If frmMain.cmbHoiSinh.Text = "Hoi sinh Den" Then
    InjectPacket "3080", "0101", True, False
    End If
    End Select
    ' Bổ sung thêm dòng if ( xác định thêm 1 checkbox)
    InjectPacket "7074", "0105302E000000", True, False
    End Function
    Bổ sung thêm cái dòng đỏ để hủy chiêu sái tự hồi sinh, khi down lv các account có máu nhiều ( vì chiêu này khi hồi sinh tăng máu và def ) con quái nó đánh không bị mỏi tay:D. KR kiểm tra dùm mình nha. Do không có VB nên mình không test được với PHbot. Nhưng đã kiểm tra với chương trình của mình rùi.:hug:
    Nguyên Data Packet : 0700747001000105302E000000

    Còn về các target quái khi bị kẹt :
    - Cách xử lí của ultral : chạy lùi về phía sau và lệch qua 1 bên ( chạy về tọa độ x -a, y -a), sau đó tiếp tục target.
    + Cách này là để né vật cản tốt nhưng lúc nhân vật chạy lùi có thể con quái đã chết do bị ks.Đánh ở những nơi nhiều vật cản thì nó chạy vui lắm. Cách này đang được KR đưa ra đó.
    - Sro-bot : Trong vòng 15s, nếu không kill sẽ bỏ qua, chọn con quái khác.
    + Cách này nếu áp dụng cho thì có nghĩa là sẽ bỏ ID của con quái đi không thèm nhìn mày nữa. Con quái sẽ chết khi nó tấn công nhân vật thôi. Còn không thì nó đứng chơi với mình:wink:
    Đó là 2 cách của 2 bot đi trước, còn PHbot VSRO thì sao ??
     
  7. ghost_ranger1112

    ghost_ranger1112 Youtube Master Race

    Tham gia ngày:
    19/10/08
    Bài viết:
    6
    Vn của tui dow tới 257MB lận! Hixhix!
    Còn về vụ quái kẹt thì ta có thể giải quyết bằng cách chia giai đaọn ra! Khi mà gửi packet để attack con quái trong vòng 15s mà chưa nhận dc octec con quái đã chết thì tọa độ mình đang đứng sẽ được cộng trừ vào! Và sao đó 15s tiếp nếu chưa nhận dc Octec con quái đã chết nữa! Thì nó tự động cho vào danh sách những con quái ko đánh dc. (Cái này trước khi gửi packet tấn công 1 con quái nào đó thì phải có 1 số octec dữ liệu quái xung quanh được gửi tới :P). Cho nên khi đánh ko được thì ta cho nó ignore cái PACKET của con quái đó lun! :devil:
     
  8. Knight Raider

    Knight Raider Legend of Zelda

    Tham gia ngày:
    26/3/04
    Bài viết:
    1,072
    Nơi ở:
    Nhà không số, phố không tên
  9. HCM_Royal

    HCM_Royal Donkey Kong

    Tham gia ngày:
    5/8/08
    Bài viết:
    318
    Thanks KR. Tính nói bác post giùm link VB.
    Mình dùng toàn notepad để đọc source Phbot. dù trình độ thấp kém nhưng cũng hiểu sơ sơ. Tính đi mua cái đĩa VB mà lười quá::(

    Cách của ghost_ranger1112 thì giống cách bỏ quái kẹt của SroBot. Nhưng mình nhận gói ra skill mà không có tác dụng thôi hay bắt gói "không thể tấn công do có vật cản".
    Còn nếu 15s mà không quái không chết thì lỡ tấn công con khổng lồ nhóm thì sao ??
     
  10. kh0ngminh

    kh0ngminh Youtube Master Race

    Tham gia ngày:
    2/2/08
    Bài viết:
    7
    KR có thể upload source Phpbot lên được không
     
  11. ghost_ranger1112

    ghost_ranger1112 Youtube Master Race

    Tham gia ngày:
    19/10/08
    Bài viết:
    6
    Hì nếu như bắt dc octec ko thể tấn công do có vật cản như lời HCM_Royal nói thì mọi chuyện xem ra đơn giản roài! Cố gắng tìm ra gói đó! :hug: như vậy thì cũng giải quyết vấn đề kẹt mob khỏi phải tính theo giây chi cho rắc rối :P
     
  12. HASAMSIEUSAO

    HASAMSIEUSAO _SuperNooB_ Moderator

    Tham gia ngày:
    16/6/07
    Bài viết:
    2,328
    Nơi ở:
    SIEUSAO Land ^^
    Cái này PHBot đã làm đc rất tốt rồi bạn ah, kẹt char ko phải chỉ là "Ko thể tấn công khi có vật cản" đâu
     
  13. Knight Raider

    Knight Raider Legend of Zelda

    Tham gia ngày:
    26/3/04
    Bài viết:
    1,072
    Nơi ở:
    Nhà không số, phố không tên
    Đúng rồi, bị kẹt còn có nhiều lý do, việc tôi đưa thêm con mob vào mục đích chính là có 1 cái để xác định xem char cần phải di chuyển theo hướng nào.
    Còn việc up soure lên hay ko thì có lẽ để HSSS quyết định, vì việc up lên có thể kéo theo vài vấn đề, thuận lợi cũng có mà rắc rối cũng có :|.
     
  14. holydakhoa

    holydakhoa SRO's Giant

    Tham gia ngày:
    25/12/05
    Bài viết:
    141
    Nơi ở:
    none
    Cách lấy tọa độ bất cứ lúc nào trong PHBOT:
    1. Tạo 2 text1, text2 ẩn ngay dưới trainning area.
    2. Bấm đôi vào nút cmdGetHuntArea thêm vào đoạn mã:
    3. Trong PacketParser thêm
    4. Trong phần Attacking.bas, sửa lại 1 chút về chỗ chạy về. Tôi thấy hình như hàm Packet = CreatePacket(frmMain.huntx.Text, frmMain.hunty.Text) có vấn đề, không lấy packet đúng. Nên chủ động từ mình lấy:
    @KR: Việc tách ra như thế nào để có holyreturn chắc KR hiểu...
     
  15. holydakhoa

    holydakhoa SRO's Giant

    Tham gia ngày:
    25/12/05
    Bài viết:
    141
    Nơi ở:
    none
    Cách lấy ID nhân vật bất cứ lúc nào:
    1. Trong frmmain, tạo 1 text ẩn: tên là ID ngay trên PlayerID. Thêm 1 nút cmdGetIDPlayer bên dưới.
    2. Trong PacketParser thêm vào chỗ này:
    3. Thêm frmmain cái này: nhấp đôi vào nút cmdGetIDPlayer:
     
  16. holydakhoa

    holydakhoa SRO's Giant

    Tham gia ngày:
    25/12/05
    Bài viết:
    141
    Nơi ở:
    none
    Cách nhận biết đầu là ID của MOB và của người khác:
    1. Khi gói tin "B045", mob đã được chọn, thì phía sau nó Mid(sData, 11, 2) <> "01" ==> tức là player, và = "01" là MOB.
    2. Mỗi khi được chọn, ở frmmain chỗ Current Selection ID và HP tự động hiện lên, ta có thể sửa lại 1 chỗ, Ở PacketParser, ta có thể thêm hàng này:
    3. Ai viết tiếp chỗ Clear mob khi nó là Player dùm :)
    .
    ___________Auto Merge________________

    .
    Cách lấy Skill nhận vật bất cứ lúc nào:
    1. frmmain: thêm nút cmdGetSkill, listbox tên GetISkillID:
    Thêm đoạn mã cho nút:
    2. Trong PacketParser thêm cái này chỗ 'Client:
    3. Sửa lại 1 chút ở các chỗ add imbue, skill, buff:
    4. Ý định:
    Viết 1 autoskill theo dạng send ngầm.... :), chưa thực hiện :d
     
  17. ghost_ranger1112

    ghost_ranger1112 Youtube Master Race

    Tham gia ngày:
    19/10/08
    Bài viết:
    6
    Cái phBot này phân tích cái opcode này từ packet theo kiểu gì vậy! Chứ cứ nói thế này không thống nhất lẫn nhau gì cả! Sniffing packet mỗi người mỗi khác mà! :D ! Ai có source thì up lên đoạn mã phân tích cái opcode và cái sData đằng sau cho coi với! Sợ phân tích opcode mỗi người mỗi khác ráp lại với nhau chả packet nào ra packet nào :'>
     
  18. HCM_Royal

    HCM_Royal Donkey Kong

    Tham gia ngày:
    5/8/08
    Bài viết:
    318
    Dĩ nhiên là việc phân tích opcode phải được thống nhất chung chứ. Dựa trên analyzer thôi.
    Đầu tiên tôi phân tích nguyên tắc làm việc của PHBot cho bạn :
    - Đầu tiên nuconnect sẽ connect tới server (VN): 222.255.38.18 với cổng : 15779.
    - Nuconnect sẽ mở thêm 2 socket listen:
    + Với bot ( IP : 127.0.0.1 ,cổng 22580)
    + Với game client ( IP : 127.0.0.1 đã chỉnh cổng 15778 trong media.pk2)
    Như vậy : khi có 1 tín hiệu từ server chuyển tới nuconnect, nuconnect sẽ gởi packet tới bot + game. Hoặc ngược lại packet từ bot hay game sẽ được chuyển tới server thông qua nuconnect.
    Tiếp theo là việc phân tích opcode :
    Giả sử có 1 gói tín hiệu như sau gởi tới server: 0700 7470 0100 0105302E000000 (chuỗi này được viết liền)
    được chia ra làm các phần sau :
    - 0700 : độ dài của sdata là 14/2 = 7
    - 7470 : được inverse 70 74, đây là opcode 7074
    - 0100 : được qui định là gởi tới server và Encrypted hay không.
    - sdata : 0105302E000000
     
  19. ghost_ranger1112

    ghost_ranger1112 Youtube Master Race

    Tham gia ngày:
    19/10/08
    Bài viết:
    6
    Chà! Cái analyze của HCM_Roya làm việc tốt quá. Có 1 điếu là tui chưa hiểu là khi mình nhận cái packet từ server gửi đến thì nó gửi dưới dạng chuổi string hay là hex (vì cái packet sniffer của mình nó hiện tới 2 cái lận)! ::) Đây là packet mình đã mã hóa định dạng dưới dạng gì để gửi đến server! Bạn có thể upsource để phân tích packet từ server và mã hóa packet để gửi đến server cho mình tham khảo dc không :p
     
  20. _JudaS_

    _JudaS_ Mr & Ms Pac-Man

    Tham gia ngày:
    6/6/08
    Bài viết:
    238
    Nơi ở:
    Đà Nẵng
    http://forum.gamevn.com/showthread.php?t=326108
    Cái này là do bác mudzot đi đầu. Những người theo sau đều một phần từ đó mà ra cả :D.
     
Trạng thái chủ đề:
Không mở trả lời sau này.

Chia sẻ trang này