Vài nhận xét về legna - hy vọng giúp các bạn đang dung legna

Thảo luận trong 'TS Online' bắt đầu bởi TuanLinhTTL, 18/3/06.

  1. TuanLinhTTL

    TuanLinhTTL Youtube Master Race

    Tham gia ngày:
    29/7/05
    Bài viết:
    57
    Xin lỗi các bạn cho được đóng góp đôi lời. Bạn mình nhờ xem cái legna này và mình thấy đây là một bản rất hay. Thực sự là hay!
    Về các vấn đề tự động party thì hình như mình thấy legna trong phần BaseFunction cũng có hàm AcceptedParty (uint playerid) cơ mà. Cơ bản mình khôgn hiểu vấn đề ở đây là gì? Tại sao không để các member request và chủ pt thì accept? Còn ở mem thì không chấp nhận accept pt nào cả. Giồng như ở TB đó?
    Về vấn đề phá khôgn cho đi tháp... thì đúng là nan giải. Tuy nhiên, không chỉ legna mà TB cũng có thể làm được điều này. Nếu bạn để requestparty nằm trong Hàm Ontimer thì đúng là pó hand. Lúc này thì bạn sẽ liện tục bị xin party và không sao ngừng lại được. Cái này quá là phiền phức.
    Về vấn đề dis khi đang đánh mà ăn ma thì rõ ràng là lỗi ở đâu đó trong legna chứ không hề ở TS bởi cũng tương tự như vậy khi ở TB đang đánh bị dis không hề có bị dính ma ^^?.
    Thêm nữa về vấn đề dis khi bot gate thì rất đơn giản. Mình mới phát hiện ra ^^. Ở legna đó là do bạn gọi quá nhiều hàm check trong đó có hàm ProcessInventoryAction() khi BattleStop(). Các bạn có thể thấy ở đây nó sẽ check để ăn, contribute hay drop các item bằng cách quét từ đàu đến cuối. Lúc mạng lag hay lúc các bạn để drop hay contribute quá nhiều thì sẽ gây ra lỗi bởi hàm BattleStop() chưa kịp thực hiện xong đã bị gọi hàm BattleStarted(). Một lý do nữa muôn thủa là do thiếu HP, SP giống ở TB. Có thể các bạn đánh 2 turn/trận thì vấn đề này không trầm trọng xong nếu đánh 1 turn thôi - đặc biệt khi SP rơi ra quá ít (luyện đệ ở Trương Bửu ?) thì sẽ nhận thấy vấn đề. Không bao giờ đánh quá được 12 phút. Tôi dám cá với các bạn như vậy. Tôi đã dùng legna và đã bị dis như vậy. Khi tôi bó hết các hàm check khi BattleStop thì mọi chuyện được giải quyết. Bởi lúc này các hàm không bị gọi chồng chéo lên nhau.
    Căn bản không hề có lỗi ở TSonline. Lỗi là ở script của các bạn và ở legna (rất xin lỗi khi phải nói vậy). Tôi xin góp một chút gọi là:
    Cách xử lý của tui như sau:
    Bỏ hết các hàm CheckDis... Để lại tự động ăn (đối vói những con có nguy cơ) . Drop chỉ cho drop những gì rơi ra nhiều nhất không tham drop nhiều (thời gian quét rất lâu). Tốt nhất các bạn nên sử dụng send thay cho drop vừa có tiền vừa đỡ full đồ để đón ngọc TG (Send có thể send khi đang đánh còn drop thì không)
    Cụ thể:
    Tôi vứt Thuốc Bổ huyết thôi và BattleStop của tôi chỉ như thế này:
    public override void BattleStoped()
    {
    FindItemDrop(27066,50);
    }
    Còn hàm ontimer của tôi phức tạp hơn:
    public override void OnTimer()
    {
    TimeCount++;
    CheckParty(); // hàm này tôi tự viết để check pảty và check map ( nhằm đưa mem về cùng 1 mapid khởi đầu)
    if (TimeCount == 600)// 5 phút kiểm tra xem có item nào đã 50 cái và send đến con cụ thể - trong lúc đánh vẫn send được ^^ nên không sợ gây lỗi và legna send rất tuyệt. Hơn TB rất nhiều)
    {
    TimeCount = 0;
    FindItemSend(id con cần send, item id cần send, 50);
    FindItemSend(id con cần send, xxxx, 50);
    }
    }
    Ở đầu tôi khai bào biến TimeCount nữa
    double TimeCount = 0;
    Thế là xong.
    common.cs có những hàm sau:
    void doEatSP(ushort order,int difSp)
    {
    for(byte i = 0;i< 25 ;i++)
    {
    Slot oSlot = (Slot)ts.MyItems;
    if (oSlot.itemid == 0)
    {
    continue;
    }
    Item oItem = (Item)ts.ITEMS[oSlot.itemid.ToString()];
    if(oItem.isSPItem())
    {
    int itemvalue=oItem.getSPValue();
    if (itemvalue > difSp)
    {
    continue;
    }
    byte eatSpAmt = (byte)((difSp - (difSp % itemvalue)) / itemvalue);
    if (eatSpAmt> 0)
    {
    if (eatSpAmt > oSlot.num)
    {
    eatSpAmt = oSlot.num;
    }
    ts.EatItem((byte)(i+1),eatSpAmt,order) ;
    debug(oItem.itemname+" SP "+itemvalue+" at slot "+((byte)(i+1)).ToString()+" decrease"+eatSpAmt ,0xC08008 );
    difSp = difSp - eatSpAmt * itemvalue ;
    }
    }
    }
    }

    void doEatHP(ushort order,int difHp)
    {
    for(byte i = 0;i< 25 ;i++)
    {
    Slot oSlot = (Slot)ts.MyItems;
    if (oSlot.itemid == 0)
    {
    continue;
    }
    Item oItem = (Item)ts.ITEMS[oSlot.itemid.ToString()];
    if(oItem.isHPItem())
    {
    int itemvalue=oItem.getHPValue();
    if (itemvalue > difHp)
    {
    continue;
    }
    byte eatHpAmt = (byte)((difHp - (difHp % itemvalue)) / itemvalue );
    if (eatHpAmt> 0)
    {
    if (eatHpAmt > oSlot.num)
    {
    eatHpAmt = oSlot.num;
    }
    ts.EatItem((byte)(i+1),eatHpAmt,order);
    debug(oItem.itemname + " HP " + itemvalue.ToString() + " at slot " + ((byte)(i+1)).ToString() + " decrease " + eatHpAmt.ToString() ,0xC08008 );
    difHp = difHp - eatHpAmt * itemvalue ;
    }
    }
    }
    }

    void AutoEatFood()
    {
    if (ts.Character.HP < (ts.Character.MAXHP * hpFractionEat))
    {
    doEatHP(0,(int)((ts.Character.MAXHP * hpFraction)-ts.Character.HP));
    }
    if (ts.Character.SP < (ts.Character.MAXSP * spFractionEat))
    {
    doEatSP(0,(int)((ts.Character.MAXSP * spFraction)-ts.Character.SP));
    }
    if (ts.CurrentPartner.HP < (ts.CurrentPartner.MAXHP * hpFractionEat))
    {
    doEatHP((ushort)ts.CurrentPartner.Order,(int)((ts.CurrentPartner.MAXHP * hpFraction)-ts.CurrentPartner.HP));
    }
    if (ts.CurrentPartner.SP < (ts.CurrentPartner.MAXSP * spFractionEat))
    {
    doEatSP((ushort)ts.CurrentPartner.Order,(int)((ts.CurrentPartner.MAXSP * spFraction)-ts.CurrentPartner.SP));
    }
    }

    int get_random(int min,int max)
    {
    System.Random rd=new System.Random();
    int ranNum= rd.Next(min,max);
    return ranNum;
    }

    void FindItemSend(uint playerid,uint Iid,byte num)
    {
    for(byte i=0;i< 25;i++)
    {
    Slot oSlot = (Slot)ts.MyItems;
    if( oSlot.itemid == 0 )
    {
    continue;
    }
    if(oSlot.itemid == Iid && oSlot.num == num)
    {
    ts.SendItemTo(playerid,oSlot.slot,num);
    Item oItem = (Item)ts.ITEMS[oSlot.itemid.ToString()];
    debug("Send " + oItem + " to " + playerid + " amount " + num , 0xC08008);
    }
    }
    }

    void FindItemDrop(uint Iid,byte num)
    {
    for(byte i=0;i< 25;i++)
    {
    Slot oSlot = (Slot)ts.MyItems;
    if( oSlot.itemid == 0 )
    {
    continue;
    }
    if(oSlot.itemid == Iid && oSlot.num == num)
    {
    ts.DropItem(oSlot.slot,num);
    Item oItem = (Item)ts.ITEMS[oSlot.itemid.ToString()];
    debug("Drop " + oItem + " amount " + num , 0xC08008);
    }
    }
    }
    Xin lỗi vì khôgn biết cách cho vao đoạn code.
    Hiện tôi đang viết thêm hàm lấy thời gian nhằm cho phép check thời gian hiện ại ^^ (phục vụ cho tránh thời gian downserver). Nếu có thể sẽ cung cấp cho các bạn.
    Rất chân thành cảm ơn nhóm viết legna. Chúc các bạn dồi dào sức khỏe và phát triển legna hoàn thiện hơn nữa.
     
  2. nmt_l

    nmt_l Donkey Kong

    Tham gia ngày:
    3/9/05
    Bài viết:
    322
    Mình cho nó sent hết, chẳng hạn ở Cl chia ra làm 2 loại Item, 1 là o Tạp hóa, 2 là ở Tiêm thuốc, làm 2 cái acc cho autosell luôn ở 2 chỗ đó, được bao nhiêu cứ 50 nó gửi cho nên gà cũng không cần để Hp, tại có đến 4 loại Hp ở đó, khi chưa đến 50 nó vẫn ăn được. Bỏ bớt cái checkdisconnect đi ở trong scrip của mem là tạm ổn. Chạy khoảng 2h không dis, còn hơn nữa thì không biết vì mỗi lần đi làm về là thấy online trên 2h cả
     

Chia sẻ trang này