Quản lý chỉ lệnh-Hướng dẫn và chia sẻ

Thảo luận trong 'Võ Lâm Truyền Kỳ phiên bản 3D' bắt đầu bởi KatherineHaAnh, 6/1/14.

  1. KatherineHaAnh

    KatherineHaAnh Legend of Zelda

    Tham gia ngày:
    13/3/03
    Bài viết:
    1,114
    Cái topic ban đầu của bác superkhung là nơi khai mào ra cách viết quản lý chỉ lệnh cho VLTK3D cũng khá dài và mọi người lội page để tìm chỉ lệnh cũng hơi khó nên mình mở topic mới để tập hợp lại một số kinh nghiệm của mọi người chia sẻ trên đó tại đây cho dễ tìm.
    Đầu tiên là cách thiết lập chỉ lệnh thế nào?
    Vào game chọn Hệ thống (ESC)>Quản lý chỉ lệnh

    [​IMG]

    Bấm vào tạo mới, đặt tên cho chỉ lệnh theo ý bạn muốn, ví dụ là Vanhoa
    Phần miêu tả bạn có thể gõ cái gì bạn muốn để ghi nhớ chỉ lệnh này dùng để làm gì
    Các bạn chọn một icon mình thích cho chỉ lệnh này, ở đây mình chọn hình ông phật (chắc là skill gì đó của Thiếu lâm :2cool_burn_joss_sti)
    Phần chỉ lệnh là nơi bạn sẽ viết các câu lệnh để thực hiện điều mình muốn. Các viết thế nào xin mời xem tiếp các bài sau :5cool_big_smile:
    Kéo chỉ lệnh xuống thanh phím tắt để chuẩn bị spam thôi :2cool_hell_boy:

    Bài 1: Các câu cơ bản
    Bài 2: Cách sử dụng hàm, biến toàn cục và hàm biến cho đối tượng
    Bài 3: Biết mình
    Bài 4: Thi triển chiêu thức với OnAddOnUseSkill
    Bài 5: Kiểm tra trạng thái buff với GetBuffList
    Bài 6: Nâng cao về buff với GetBuffList và GetLogicFrameCount
    Bài 7: Kiểm tra cooldown của skill với GetSkillCDProgress
    Bài 8: Buff Stack, tiếp tục nâng cao của GetBuffList
    Bài 9: Ngắt skill và GetSkillPrepareState()
    Bài 10: Cừu hận
    Bài 11: Buff và nguồn gốc của buff
     
    Chỉnh sửa cuối: 23/1/14
  2. viitamiin

    viitamiin Donkey Kong

    Tham gia ngày:
    7/8/13
    Bài viết:
    387
    mới đầu nhìn vào cứ tưởng bác làm thành 1 cái bảng addon tổng hợp các macro của các phái :3cool_shame:
     
  3. KatherineHaAnh

    KatherineHaAnh Legend of Zelda

    Tham gia ngày:
    13/3/03
    Bài viết:
    1,114
    Phần tiếp theo mình xin hướng dẫn tiếp về cách viết chỉ lệnh :5cool_big_smile: Để cho game nó hiểu rằng đây là một chỉ lệnh thì bạn phải có dòng đầu tiên là /script sau đó hậu xét.
    Để viết được chỉ lệnh thì các bạn cần hiểu về cấu trúc câu lệnh theo ngôn ngữ LUA (LUA syntax), ai biết C thì chắc cũng ok vì nó giống nhau :1cool_look_down: các lệnh hay được sử dụng bao gồm.
    Điều kiện rẽ nhánh:
    if [condition] then
    .....
    elseif [condition] then
    ......
    else
    ......
    end


    Vòng lặp:
    for x,y in pairs(table) do
    ..........
    end

    dùng để duyệt một bảng x dòng y cột

    Toán tử:
    >: Lớn hơn
    <: Nhỏ hơn
    ==: bằng
    >=: Lớn hơn hoặc bằng
    <=: Nhỏ hơn hoặc bằng
    ~=: Khác
    and: và
    or: hoặc
    not: không

    Đại khái là với chừng này syntax các bạn cũng có thể xử lý được một chỉ lệnh ngon lành cho mình rồi :4cool_beauty:

    - - - Updated - - -

    Có rồi nhưng cứ từ từ, cái đấy sẽ để sau cùng :2cool_burn_joss_sti
     
  4. herosf2006

    herosf2006 Mega Man GVN Veteran

    Tham gia ngày:
    19/3/08
    Bài viết:
    3,448
    Nơi ở:
    Đà Nẵng
    :8cool_amazed: share cái thank sexy cooldown cho ta đã nào
     
  5. davil_sp

    davil_sp Youtube Master Race

    Tham gia ngày:
    18/4/11
    Bài viết:
    11
    Bác KatherineHaAnh cho mình xin cái hàm check kiếm khí của 7tu :2cool_burn_joss_sti
     
  6. boylove67

    boylove67 Youtube Master Race

    Tham gia ngày:
    5/5/05
    Bài viết:
    82
  7. WingZeroCustom

    WingZeroCustom Mr & Ms Pac-Man

    Tham gia ngày:
    11/10/03
    Bài viết:
    132
    hay, đánh dấu theo dõi cái nhé, tks bác chủ
     
  8. KatherineHaAnh

    KatherineHaAnh Legend of Zelda

    Tham gia ngày:
    13/3/03
    Bài viết:
    1,114
    Xong phần syntax để viết chỉ lệnh mình sẽ giới thiệu tiếp đến các hàm (functions) và biến (variables) để có thể lấy được thông tin từ game và ra lệnh sử dụng skill.
    Hàm và biến ở trong game chia ra 2 loại: Hàm và biến toàn cục và hàm (global functions and variables), biến cho các đối tượng (object functions and variables).

    Hàm toàn cục các bạn có thể gọi không cần gắn với một đối tượng nào. Ví dụ:
    GetClientPlayer()
    GetPlayer(dwID)
    GetNpc(dwID)
    GetItem(dwID)

    Hàm gắn với một đối tượng thì bắt buộc phải xác định đối tượng trước khi gọi hàm, ví du hàm gắn với đối tượng có tên là player thì sẽ gọi như sau:
    player.GetPet()
    player.CancelBuff(nIndex)
    player.GetTarget()

    Muốn sử dụng hàm thì các bạn phải truyền vào tham số (parameter) cần thiết, hàm sẽ thực hiện một chức năng nào đó (cast skill) hoặc trả về một giá trị nào đó (return value). Cái này ai có kiến thức về lập trình đều biết rồi. Mình sẽ nói cụ thể khi giới thiệu từng hàm :5cool_big_smile: Danh sách các hàm API do Kingsoft cung cấp có thể tìm được tại đây. Khuyến cáo là phải biết tiếng Tàu hoặc thành thạo một công cụ dịch nào đó như là Google Translate chẳng hạn :2cool_burn_joss_sti

    Về biến số thì chủ yếu là dành cho đối tượng, cách truy xuất vào biến số của đối tượng cũng tương tự như hàm, ví dụ đối tượng là player sẽ có các biến:
    player.szName
    player.nCurrentMana
    player.bOnHorse
    player.dwForceID

    danh sách các biến cũng có thể tìm hiểu ở link các hàm API kia :4cool_beauty:
     
  9. KatherineHaAnh

    KatherineHaAnh Legend of Zelda

    Tham gia ngày:
    13/3/03
    Bài viết:
    1,114
    Bây giờ thì bắt tay vào để bắt đầu viết chỉ lệnh thôi, đảm bảo các bạn đã sẵn sàng tra cứu các thông tin cần thiết tại link ở trên nhé :4cool_beauty:
    Chỉ lệnh viết ra là để tương tác giữa người chơi và quái thôi nhé, không tương tác được giữa người chơi và người chơi đâu nên ở đây mình chỉ giới thiệu các bạn lấy ra 2 đối tượng là: Người chơi đang điều khiển char và đối tượng đang bị người chơi focus vào :6cool_smile:
    Để lấy được đối tượng là người chơi, các bạn sử dụng hàm GetClientPlayer(), hàm này không có tham số và trả về giá trị là đối tượng người chơi (client player). Nếu chúng ta tạo một biến đặt tên là me để chưa đối tượng này thì chúng ta sẽ có câu lệnh:
    me=GetClientPlayer()
    Kể từ bây giờ, mọi thông tin về char các bạn đang chơi có thể truy xuất và ra lệnh dưới dạng
    me.szName
    me.GetOTActionState()
    Một số thông tin mà các bạn cần nhớ để viết chỉ lệnh:
    dwID: id của nhân vật
    dwForceID: id của môn phái ví dụ (Vạn hoa là 2, Thuần dưong là 4, Đường Môn là 7..)
    szName: Tên nhân vật
    nCurrentLife: Máu hiện tại
    nMaxLife: Cả cây HP
    nCurrentMana: Nội lực hiện tại
    nMaxMana: Cả cây nội lực
    nCurrentEnergy: Thần cơ của ĐM
    nMaxEnergy:
    nCurrentRage: Kiếm khí của TK
    nMaxRage:
    nAccumulateValue: Kiếm khí của Thuần Dương và Thiền định của Thiếu Lâm. Chú ý giá trị, nửa ô khí bằng 1 điểm nAccumulateValue và 1 điểm thiền định bằng 1 điểm nAccumulateValue.
    nCurrentSunEnergy: Nhật của Minh Giáo
    nSunPowerValue: Mãn Nhật
    nCurrentMoonEnergy: Nguyệt
    nMoonPowerValue: Mãn Nguyệt
    dwPetID: id của pet Ngũ Độc
    bOnHorse: trang thái trên ngựa
    bFightState: trạng thái chiến đấu
    bCanUseBigSword: trạng thái có thể sử dụng kiếm to của Tàng Kiếm
    nMoveState: trạng thái di chuyển của char ví dụ (MOVE_STATE.ON_STAND là đứng yên, MOVE_STATE.ON_DEATH là đang nằm ngủ :2cool_burn_joss_sti)
    Áp dụng những biến số này vào các bạn có thể tạo ra các điều kiện để thi triển chiêu thức. Ví dụ:
    - Nếu số ô khí của Thuần Dương bằng 5 thì thi triển chiêu Lưỡng Nghi Hóa Hình
    if me.nAccumulateValue==10 then ............
    - Nếu lượng mana xuống dưới 40% thì Vạn hoa sẽ thi triển Bích Thủy Hạo Thiên
    if me.nCurrentMana/me.nMaxMana < 0.4 then ..............
    Tất nhiên chúng ta mới chỉ biết check điều kiện, thi triển chiêu thức thế nào thì chờ hồi sau sẽ rõ :5cool_big_smile:

    Để lấy thông tin về một đối tượng nào đó ta dùng hàm GetTargetHandle(dwType,dwID) với tham số các bạn phải đưa vào là loại target và id của target. Để lấy thông tin này ta lại dùng hàm gắn với một đối tượng là GetTarget(). Nói thì dài nhưng đại loại là cần lấy target mà ta đang ngắm vào thì sẽ viết như sau:
    target=GetTargetHandle(me.GetTarget())
    Sau khi lấy được đối tượng vào biến target rồi ta cũng có thể truy xuất được thông tin về đối tượng như:
    target.nCurrentLife: lượng máu hiện tại
    target.nMoveState: trạng thái của đối tượng
    target.szName: Tên đối tượng
     
    Chỉnh sửa cuối: 7/1/14
  10. AnndyW

    AnndyW Youtube Master Race

    Tham gia ngày:
    29/1/12
    Bài viết:
    53
    quá hoành tráng, để lưu lại đọc chơi, trước h mình toàn sài câu lệnh điều kiện và các hàm khai báo sẵn để viết chứ chả hiểu mấy về các khái niệm trên :5cool_big_smile:
     
  11. herosf2006

    herosf2006 Mega Man GVN Veteran

    Tham gia ngày:
    19/3/08
    Bài viết:
    3,448
    Nơi ở:
    Đà Nẵng
    :4cool_beauty: viết xong dẫn link lên page 1 hoặc sửa bài trực tiếp cho page 1 luôn đi lão

    những bạn cảm thấy hay có thể khích lệ lão bằng cách ấn vào nút rep

    ==============^ hình ngôi sao cảnh sát, và chọn hài lòng về bài viết này :3cool_shame:
     
  12. KatherineHaAnh

    KatherineHaAnh Legend of Zelda

    Tham gia ngày:
    13/3/03
    Bài viết:
    1,114
    Để nhân vật thi triển một chiêu thức thì Kingsoft cung cấp một hàm toàn cục là OnAddOnUseSkill(nSkillID,nSkillLevel)
    Hàm này có 2 tham số
    nSkillID: là id của chiêu thức mà các bạn muốn thi triển. Có thể xem bằng cách giữ Ctrl và rê chuột vào skill trong bảng skill để thấy ID
    nSkillLevel: là level của skill này, tham số này có thể bỏ không điền hoặc có thể dùng một hàm gắn với đối tượng là GetSkillLevel(nSkillID) để lấy level của skill gắn với đối tượng nào đó, thường thì là của chính player.
    Ví dụ Vạn Hoa muốn thi triển Bích Thủy Hạo Thiên, chiêu này có ID là 131 ta sẽ viết như sau:
    OnAddOnUseSkill(131,me.GetSkillLevel(131))
    Thuần dương muốn đánh Lưỡng Nghi Hóa Hình, chiêu có ID là 301
    OnAddOnUseSkill(301,me.GetSkillLevel(301))
    Để kết hợp với phần trên mình đã viết thì câu lệnh sẽ là thế này.
    if me.nAccumulateValue==10 then OnAddOnUseSkill(301,me.GetSkillLevel(301))
    if me.nCurrentMana/me.MaxMana < 0.4 then OnAddOnUseSkill(131,me.GetSkillLevel(131))

    Sử dụng hàm có sẵn của Kingsoft tương đối dài dòng trong khi số lượng ký tự của chỉ lệnh chỉ giới hạn là 1024 ký tự nên các bạn nên viết lại một hàm ngắn gọn hơn để sử dụng skill.
    PHP:
    function use(nSkillID)
    me=GetClientPlayer()
    OnAddOnUseSkill(nSkillID,me.GetSkillLevel(nSkillID))
    end
    Từ giờ trở đi, các bạn chỉ cần dùng hàm này để gọi chiêu thức ví dụ: use(131), use(301). Chỉ cần một lần dài dòng, sau đó sẽ là gọn ghẽ :4cool_beauty:
     
    Chỉnh sửa cuối: 7/1/14
  13. KatherineHaAnh

    KatherineHaAnh Legend of Zelda

    Tham gia ngày:
    13/3/03
    Bài viết:
    1,114
    Đến đây các bạn đã có thể hình dung được các dùng một điều kiện để xuất chiêu tương ứng rồi :5cool_big_smile: Tuy nhiên, việc chỉ lệnh có hoàn hảo hay không phần lớn phụ thuộc vào các điều kiện mà các bạn đưa vào. Với việc sử dụng trí tuệ của người chơi thì các bạn nhận định và xử lý các điều kiện là vô cùng phong phú, máy tính thì không được thông minh như các bạn nên các điều kiện nó có thể thực hiện được là tương đối nghèo nàn, vì vậy nếu ai có định viết chỉ lệnh thì cố gắng tìm cách tối giản các điều kiện để đưa về trường hợp máy tính có xử lý được :1cool_look_down:
    Mình xin giới thiệu một số điều kiện cơ bản mà chúng ta vẫn hay nhìn thấy.
    Loại thứ nhất là trạng thái trên người các bạn. Ví dụ, Thuần dương khi cắm khí trường Phá Thương Khung để nhận được thêm 10% sát thương lúc thi triển chiêu thức, vậy khi không có khí trường thì ta phải cắm khí trường ngay. Ví dụ thứ 2, giả sử Thuần Dương đang cầm thần binh Lưu Tình, trong khi đánh có khả năng sẽ xuất hiện buff Lưu Tình trên nhân vật, buff này có tác dụng là cứ thi triển Lưỡng Nghi Hóa Hình trúng mục tiêu thì sẽ đầy ngay 5 ô khí, vậy rõ ràng là chúng ta phải đánh Lưỡng Nghi Hóa Hình liên tục khi có trạng thái này trên nhân vật :4cool_beauty:
    Kingsoft cũng rất tốt bụng khi đã cung cấp cho chúng ta một hàm để kiểm tra các trạng thái trên người chúng ta là hàm gắn với một đối tượng: GetBuffList()
    Hàm này không có tham số và kết quả trả về là một bảng liệt kê các buff đang có trên người đối tượng.
    Ví dụ: sử dụng cú pháp sau tBuffList=me.GetBuffList() sẽ trả về biến tBuffList một bảng chứa tất các các buff và debuff đang có trên người của người chơi :4cool_doubt: Trong cái bảng này có nhiều thông tin nhưng có một cột có tên là dwID sẽ chứa id của buff đang hiện hữu trên nhân vật, nếu id này trùng với id của buff chúng ta muốn tìm kiếm có nghĩa là buff đó đang có trên người chúng ta.
    Vậy việc để check xem một buff chúng ta quan tâm có trong danh sách đó hay không thì ta sẽ sử dụng vòng lặp mình đã giới thiệu ở trên để duyệt cái bảng này và trả về kết quả.
    Các tốt nhất để làm việc này là chúng ta tạo một hàm có tên là Checkbuff(dwBuffID) chẳng hạn với tham số các bạn đưa vào là id của buff chúng ta cần kiểm tra. Cách lấy id của buff cũng tương tự như của skill, giữ Ctrl và rê chuột qua buff ở trên thanh trạng thái nhân vật lúc nó xuất hiện :5cool_big_smile:
    PHP:
    function CheckBuff(dwBuffID)
    me=GetClientPlayer()
    tBuffList=me.GetBuffList()
    for 
    z,x in pairs(tBuffList) do
    if 
    x.dwID==dwBuffID then return true end
    end
    return false
    end
    Sau khi viết hàm này xong ta có thể thực hiện được điều kiện mong muốn ở trên bằng câu lệnh sau:
    Nếu không có buff Phá Thương Khung (buff id 375) sẽ thực hiện cắm khí trường Phá Thương Khung (skill id 359)
    if not CheckBuff(375) then use(359) end
    Nếu có buff Lưu Tình (buff id 1916) sẽ đánh chiêu Lưỡng Nghi Hóa Hình (skill id 301)
    if CheckBuff(1916) then use(301) end

    Loại điều kiện thứ 2 các bạn hay check là trạng thái trên mục tiêu của các bạn. Cách làm cũng tương tự như là check trên người chơi, chỉ có điều đối tượng ở đây không phải là người chơi nữa mà là target của chúng ta. Ví dụ: Vạn Hoa muốn kiểm tra trên người mục tiêu phải có đủ các debuff Thương Dương Chỉ, Chung Linh Dục Tú và Lan Thôi Ngọc Chiết thì mới thi triển Ngọc Thạch Câu Phần.
    Có thể viết một hàm để kiểm tra debuff trên người target như sau:
    PHP:
    function CheckTargetDebuff(dwDebuffID)
    me=GetClientPlayer()
    target=GetTargetHandle(me.GetTarget())
    tDebufList=target.GetBuffList()
    for 
    z,x in pairs(tBuffList) do
    if 
    x.dwID==dwDebuffID then return true end
    end
    return false
    end
    Sau khi có hàm này thì chúng ta thực hiện check như sau: Thương Dương Chỉ (debuff id 666), Lan Thôi Ngọc Chiết (debuff id 711), Chung Linh Dục Tú (debuff id 714), Ngọc Thạch Câu Phần (skill id 182)
    if CheckTargetDebuff(666) and CheckTargetDebuff(711) and CheckTargetDebuff(714) then use(182) end
    sau câu lệnh này là Bùm Ngọc Thạch Câu Phần gây nổ dame của tất cả các debuff trên người đối phương luôn :2cool_burn_joss_sti
     
    Chỉnh sửa cuối: 7/1/14
  14. KatherineHaAnh

    KatherineHaAnh Legend of Zelda

    Tham gia ngày:
    13/3/03
    Bài viết:
    1,114
    Đọc xong phần trên không ít người lầm bầm chửi "DCM, ngu vl, nhỡ mấy debuff của Vạn Hoa ở trên nó chỉ còn vài giây cũng đánh Ngọc Thạch Câu Phần cho nó phí à :6cool_what:". Đương nhiên là rất phí nên ông Kingsoft cũng cung cấp thêm một ít thông tin để chúng ta có thể xem thêm trong cái bảng BuffList mỗi buff nó còn bao nhiêu giây :2cool_burn_joss_sti Tuy nhiên, muốn nhanh là cứ phải từ từ, học nhiều quá một lúc rất dễ tẩu hỏa nhập ma nên bài này mình mới giới thiệu các bạn cách sử dụng nâng cao của cái hàm GetBuffList() mà Kingsoft nó đã cung cấp :5cool_big_smile:
    Trong cái bảng BuffList nó có một cái cột có tên là nEndFrame cho chúng ta biết đến frame nào trong game thì cái buff đó sẽ hết, theo công thức mà chúng ta đã học thời phổ thông trung học thì muốn biết thời gian còn lại của buff chúng ta sẽ lấy frame buff kết thúc trừ đi frame hiện tại chia cho số frame sẽ có trong 1s. Thông qua cái bảng bufflist thì mới biết mỗi cái frame buff kết thúc, vậy muốn giải được bài toán khó này thì phải đi tìm frame hiện tại và số frame diễn ra trong 1s :9cool_too_sad: Rà soát mãi mới thấy ông Kingsoft giấm dúi ra 1 hàm và một cái hằng số có tên: GetLogicFrameCount()GLOBAL.GAME_FPS, google translate ra thì cũng thấy GetLogicFrameCount() cho ra frame hiện tại của game, còn GLOBAL.GAME_FPS thì cho ra số frame trên giây cơ bản của game (nó bằng 16 nên bác nào lười type có thể đánh thẳng 16 cho giá trị này :4cool_doubt:). Có đầy đủ dữ kiện rồi, ta bước vào giải toán thôi.
    PHP:
    function BuffLastingTime(target,buffID)
    for 
    z,x in pairs(target.GetBuffList()) do
    if 
    x.dwID==buffID then return (x.nEndFrame-GetLogicFrameCount())/GLOBAL.GAME_FPS end
    end
    return 0
    end
    Có hàm này rồi bây giờ ta nâng cấp câu lệnh trên ngay lập tức để đảm bảo không gặp trường hợp ngớ ngẩn như đã bị chửi nữa :5cool_big_smile:
    if BuffLastingTime(666)>10 and BuffLastingTime(711)>10 and BuffLastingTime(714)>10 then use(182) end
    Với debuff mỗi loại lớn hơn 10s thì lương dmg mà Ngọc Thạch Câu Phần gây ra cũng là kha khá rồi đấy :2cool_burn_joss_sti
     
  15. KatherineHaAnh

    KatherineHaAnh Legend of Zelda

    Tham gia ngày:
    13/3/03
    Bài viết:
    1,114
    Vẫn lại là mấy anh Vạn Hoa quá khích chửi mình rằng:
    - Macro mà cứ làm như đánh bằng tay ấy, làm sao để cả 3 buff trên người boss đều có thời gian còn lại là 10 thế kia :4cool_doubt:
    - Dạ, thế bình thường các anh đánh bằng tay thế nào ạ? :5cool_sweat:
    - Thì nhìn Ngọc Thạch Câu Phần sắp cooldown xong thì bắt đầu đánh mấy chiêu Chung Linh Dục Tú, Lan Thôi Ngọc Chiết, Thương Dương chỉ chứ còn sao nữa :8cool_amazed:
    - Dạ, vâng, thế thì có hàng cho các anh đây. Em sẽ cung cấp một hàm để check xem skill các anh muốn còn cooldown bao lâu nhé :3cool_shame:
    - Tốt, thế thì làm đi :6cool_what:
    vài phút sau:
    - Allo, Kingsoft hả, cho tôi hỏi làm sao để check xem cooldown của một skill còn bao lâu?
    - Về giở bí kíp trang 1001 xem hàm GetSkillCDProgress nhé

    Bí kíp trang 1001: GetSkillCDProgress(dwSkillID,dwSkillLevel) là hàm nhận vào 2 tham số là id của skill và level của skill sau đó trả ra 3 biến như sau:
    bCool: cho biết skill có cooldown hay ko
    nLeft: cho biết số frame còn lại
    nTotal: tổng cooldown time tính bằng frame của skill.
    Vậy để có được thời gian cooldown còn lại của một skill nào đó phải xây dựng hàm sau:
    PHP:
    function CooldownTime(dwSkillID)
    me=GetClientPlayer()
    bCool,nLeft,nTotal=me.GetSkillCDProgress(dwSkillID,me.GetSkillLevel(dwSkillID))
    return 
    nLeft/GLOBAL.GAME_FPS
    end
    bây giờ có thể cung cấp cho các anh Vạn Bông nhà mình câu lệnh như sau để tối ưu dame rồi
    if CooldownTime(182)<7 and BuffLastingTime(target,711)<10 then use(190)
    if CooldownTime(182)<5 and BuffLastingTime(target,714)<10 then use(189)
    if CooldownTime(182)<2 and BuffLastingTime(target,666)<10 then use(180)

    Các anh Vạn Bông đừng chửi em nữa nhé, tội nghiệp, em cũng Vạn Bông đây mà :9cool_too_sad:
     
  16. uglydauhu

    uglydauhu Youtube Master Race

    Tham gia ngày:
    7/1/14
    Bài viết:
    35
    Bác HaAnh cho mình hỏi. Trong khai báo functions có thể gán thêm cái chỉ lệnh "time",và "stack" vào trong hàm như thế có thể tiết kiện được 1 đống ký tự. đồng thời cũng có thể đơn giản hóa được chỉ lệnh đó bác :9cool_haha:
     
  17. KatherineHaAnh

    KatherineHaAnh Legend of Zelda

    Tham gia ngày:
    13/3/03
    Bài viết:
    1,114
    Chưa hiểu ý của bạn lắm nhưng ở đây là mình đang viết làm sao để mọi người có khả năng đọc và hiểu được code chứ nếu để viết chỉ lệnh cho tiết kiệm thì không nên dùng tên hàm và tên biến dài lê thê như mình dùng đâu :5cool_sweat:, cứ đặt là A, B, C là được rồi, viết cho mình dùng thì miễn sao nó chạy thôi. Bản thân các hàm trên nếu ai biết lập trình có thể viết lại cho nó gọn hơn nữa đấy :5cool_big_smile:
     
  18. uglydauhu

    uglydauhu Youtube Master Race

    Tham gia ngày:
    7/1/14
    Bài viết:
    35
    function cb(mb,id,stk,time)
    r=false
    s=0
    l=0
    for z,x in pairs(mb.GetBuffList() or {}) do
    if x.dwID==id then
    r=true
    s=x.nStackNum
    l=(x.nEndFrame-GetLogicFrameCount())/16
    end
    end
    if r==true and s>=stk and l>=time then return true else return false end
    end

    Bữa mới lụm được cái hàm này bên post DM, bác này viết gọn nhưng mình đọc chẳng hiểu gì cả :5cool_sweat:
     
  19. KatherineHaAnh

    KatherineHaAnh Legend of Zelda

    Tham gia ngày:
    13/3/03
    Bài viết:
    1,114
    Cái hàm này dùng để check xem một buff có hay ko, nếu có thì stack của nó có lớn hơn tham số đưa vào hay ko và thời gian còn lại của nó có nhiều hơn thời gian đưa vào hay không. Theo như mình nghĩ thì cái hàm này có tác dụng với riêng DM để check Hóa Huyết Tiêu :5cool_sweat:, có nhiều phái không nhât thiết phải check nhiều điều kiện như vậy. Tuy nhiên, quan điểm của mình ở đây là hướng dẫn chức năng của từng hàm, còn việc ứng dụng đối với mọi người thế nào là do mọi người lựa chọn, hàm mình đưa ra chỉ mang tính chất minh họa và đặc biệt là cực kỳ dài dòng vì đặt tên hàm và tên biến nó có chút ý nghĩa :2cool_burn_joss_sti Tất nhiên nếu cuối cùng mọi người làm theo cách của mình mà nhét nó vào một addon thì không cần phải quan tâm hàm viết hết bao nhiêu ký tự đâu :4cool_beauty:
     
  20. KatherineHaAnh

    KatherineHaAnh Legend of Zelda

    Tham gia ngày:
    13/3/03
    Bài viết:
    1,114
    Em lại xin chào cả nhà, một trong những vấn đề đau đầu với mấy anh Vạn Bông nhà em làm thế nào để duy trì buff stack trên người mình và người đối thủ. Ví dụ, kình khí Phệ Cốt cộng dồn 5 tầng trên người đối phương sẽ tăng thêm 10% dmg nội hỗn nguyên mà đối phương phải nhận. Kình khí Tứ Du trên người mình sẽ tăng 10% dmg nội cơ bản của mình :6cool_what: Chính vì thế việc kiểm tra và duy trì được các buff này stack đủ 5 tầng là rất quan trọng với một Vạn Bông theo dps :4cool_beauty:
    Để giải quyết việc này thì chúng ta lại quay lại với hàm GetBuffList một lần nữa, trong cái bảng BuffList mà chúng ta đã từng vọc 2 trường dwID và nEndFrame trước đây lại có thêm một trường nữa đáng quan tâm là trường nStackNum, trường này cho chúng ta biết số tầng cộng dồn của một buff đang có trên người đối tượng :9cool_haha:
    Và như thường lệ thì sẽ phải viết một hàm để lấy nó ra cho bà con cùng xài. Ví dụ đặt tên hàm là GetBuffStack(target, dwBuffID) truyên vào 2 tham số là đối tượng muốn lấy buffstack và id của buff muốn lấy.
    PHP:
    function GetBuffStack(target,dwBuffID)
    for 
    z,x in pairs(target.GetBuffList()) do
    if 
    x.dwID==dwBuffID then return x.nStackNum end
    end
    return 0
    end
    Với hàm này bây giờ mấy anh Vạn Bông có thể tự tin duy trì kình khí Phệ Cốt (buff id 886) và Tứ Du (buff id 1239) trên người đối phương và người mình được rồi được rồi
    if GetBuffStack(target,886)<5 then use(180) end --bắn Thương Dương Chỉ
    if GetBuffStack(me,1239)<5 then use(179) end -- bắn Dương Minh Chỉ
    Mình chơi Vạn Hoa nên các ví dụ có ưu tiên nhà Vạn Bông một chút, tuy nhiên, nếu các phái khác có thắc mắc gì thì cứ hỏi, mình sẽ giải đáp trong hiểu biết của mình :5cool_big_smile:
     

Chia sẻ trang này