Yardım Boss Skill Bug

  • Konuyu açan Konuyu açan random
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 3
  • Gösterim Gösterim 123
Konu sahibi bu konuda soru soruyor. Sorusu ile ilgili bilgisi olanların yanıtlamasını bekliyor.

random

Üye
Üye
Mesaj
153
Çözümler
2
Beğeni
36
Puan
474
Ticaret Puanı
0
Merhaba,
videodan da izlediğiniz gibi boss skill kullanarak karakteri ittiriyor. Bu işlem client tarafında gerçekleşemezsek server tarafında karakter ittirilmiş gibi algılanıyor. Bu bugu yapmak için duvar kenarına gidip hareketsiz kalmak gerekiyor.
Bu yöntem kötüye kullanım için kullanılabiliyor. Server taraflı bu sorun nasıl düzeltilir.

 
Çözüm
Merhaba,
videodan da izlediğiniz gibi boss skill kullanarak karakteri ittiriyor. Bu işlem client tarafında gerçekleşemezsek server tarafında karakter ittirilmiş gibi algılanıyor. Bu bugu yapmak için duvar kenarına gidip hareketsiz kalmak gerekiyor.
Bu yöntem kötüye kullanım için kullanılabiliyor. Server taraflı bu sorun nasıl düzeltilir.


char.cpp aç ve ara


C++:
Genişlet Daralt Kopyala
bool CHARACTER::Goto(long x, long y)
{

Altına Ekle:


C++:
Genişlet Daralt Kopyala
    if (IsPC())
    {
        LPSECTREE_MAP pkSectreeMap = SECTREE_MANAGER::instance().GetMap(GetMapIndex());



        LPSECTREE tree = pkSectreeMap->Find(x, y);
        DWORD dwAttr = tree->GetAttribute(x, y);

        if (IS_SET(dwAttr, ATTR_BLOCK))
            return false;
    }
...
Merhaba,
videodan da izlediğiniz gibi boss skill kullanarak karakteri ittiriyor. Bu işlem client tarafında gerçekleşemezsek server tarafında karakter ittirilmiş gibi algılanıyor. Bu bugu yapmak için duvar kenarına gidip hareketsiz kalmak gerekiyor.
Bu yöntem kötüye kullanım için kullanılabiliyor. Server taraflı bu sorun nasıl düzeltilir.


char.cpp aç ve ara


C++:
Genişlet Daralt Kopyala
bool CHARACTER::Goto(long x, long y)
{

Altına Ekle:


C++:
Genişlet Daralt Kopyala
    if (IsPC())
    {
        LPSECTREE_MAP pkSectreeMap = SECTREE_MANAGER::instance().GetMap(GetMapIndex());



        LPSECTREE tree = pkSectreeMap->Find(x, y);
        DWORD dwAttr = tree->GetAttribute(x, y);

        if (IS_SET(dwAttr, ATTR_BLOCK))
            return false;
    }

Tekrar Ara:


C++:
Genişlet Daralt Kopyala
bool CHARACTER::Sync(long x, long y)
{
    if (!GetSectree())
        return false;

Altına Ekle:


C++:
Genişlet Daralt Kopyala
    if (IsPC())
    {
        LPSECTREE_MAP pkSectreeMap = SECTREE_MANAGER::instance().GetMap(GetMapIndex());



        LPSECTREE tree = pkSectreeMap->Find(x, y);
        DWORD dwAttr = tree->GetAttribute(x, y);

        if (IS_SET(dwAttr, ATTR_BLOCK))
            return false;
    }

Deneme yapma fırsatım olmadı. Böyle dener misin
 
Çözüm
char.cpp aç ve ara


C++:
Genişlet Daralt Kopyala
bool CHARACTER::Goto(long x, long y)
{

Altına Ekle:


C++:
Genişlet Daralt Kopyala
    if (IsPC())
    {
        LPSECTREE_MAP pkSectreeMap = SECTREE_MANAGER::instance().GetMap(GetMapIndex());



        LPSECTREE tree = pkSectreeMap->Find(x, y);
        DWORD dwAttr = tree->GetAttribute(x, y);

        if (IS_SET(dwAttr, ATTR_BLOCK))
            return false;
    }

Tekrar Ara:


C++:
Genişlet Daralt Kopyala
bool CHARACTER::Sync(long x, long y)
{
    if (!GetSectree())
        return false;

Altına Ekle:


C++:
Genişlet Daralt Kopyala
    if (IsPC())
    {
        LPSECTREE_MAP pkSectreeMap = SECTREE_MANAGER::instance().GetMap(GetMapIndex());



        LPSECTREE tree = pkSectreeMap->Find(x, y);
        DWORD dwAttr = tree->GetAttribute(x, y);

        if (IS_SET(dwAttr, ATTR_BLOCK))
            return false;
    }

Deneme yapma fırsatım olmadı. Böyle dener misin

Çözüldü gibi :) Teşekkür ederim. Tek ben değil pek çok kişinin teşekkür etmesi gerek bence çünkü çoğu serverde bu hata mevcut. :)
 
Son düzenleme:
@xenfero

kod core verdiyor :/ tam olarak nasıl olduğu tespit edemedim ama


C++:
Genişlet Daralt Kopyala
#1  0x006288ae in CHARACTER::Sync (this=0x29364800, x=-2146459648, y=-2145819648) at char.cpp:2572
        pkSectreeMap = <optimized out>
        tree = 0xffffffd8
        dwAttr = <optimized out>
        new_tree = <optimized out>
#2  0x006bf4bb in CInputMain::Move (this=<optimized out>, ch=0x29364800, data=0x2f618bc0 "\a") at input_main.cpp:1580
        pack = {bHeader = 18 '\022', bFunc = 141 '\215', bArg = 179 '\263', bRot = 68 'D', dwVID = 78, lX = 12313836, lY = 552336400, dwTime = 4294947100,
          dwDuration = 552336400}
        pinfo = 0x2f618bc0
#3  0x006c3476 in CInputMain::Analyze (this=0x2f273778, d=0x2f273700, bHeader=7 '\a', c_pData=0x2f618bc0 "\a") at input_main.cpp:3404
        ch = 0xffffffd8
        iExtraLen = 0
#4  0x006b23be in CInputProcessor::Process (this=0x2f273778, lpDesc=0x2f273700, c_pvOrig=0x2f618bc0, iBytes=16, r_iBytesProceed=@0xffffb27c: 0)
    at input.cpp:94
        iExtraPacketSize = <optimized out>
        c_pszName = 0x2f6ffe65 "Move"
        bHeader = <optimized out>
        c_pData = 0x2f618bc0 "\a"
        iLastPacketLen = 0
        bLastHeader = <optimized out>
        iPacketLen = <optimized out>
#5  0x0068e1c5 in DESC::ProcessInput (this=0x2f273700) at desc.cpp:358
        bytes_read = 16
        iBytesProceed = 0
#6  0x007a6134 in io_loop (fdw=0x212461a0) at main.cpp:774
        iRet = -40
        num_events = 2
        event_idx = 1
        d = 0x2f273700
#7  0x007a5e2d in idle () at main.cpp:692
        pta = {tv_sec = 1746480612, tv_usec = 18612}
        process_time_count = 0
        now = {tv_sec = 1746480612, tv_usec = 18584}
        passed_pulses = <optimized out>
        t = 25329058

Şu şekilde güncelleyip null controlleri ekledim çözüm oldu mu olmadı mı bilemedim. Zira hataya baktığımda bu eklediğimiz koddan kaynaklandı ama aynı hatayı tekrar almayı başramadım. Ama yine de şöyle düzenledim fikrin nedir.

C++:
Genişlet Daralt Kopyala
    if (IsPC())
    {
        LPSECTREE_MAP pkSectreeMap = SECTREE_MANAGER::instance().GetMap(GetMapIndex());
        if (!pkSectreeMap)
        {
            sys_err("SECTREE::IsPC: Invalid map index (%d)", GetMapIndex());
            return false;
        }

        LPSECTREE tree = pkSectreeMap->Find(x, y);
        if (!tree)
        {
            sys_err("SECTREE::IsPC: Sectree not found for coordinates (%ld, %ld)", x, y);
            return false;
        }

        DWORD dwAttr = tree->GetAttribute(x, y);
        if (IS_SET(dwAttr, ATTR_BLOCK))
        {
            return false;
        }
    }
 
Son düzenleme:
Geri
Üst