berkmenoo 1
berkmenoo
mavzermete 1
mavzermete
Mt2Hizmet 1
Mt2Hizmet
xranzei 1
xranzei
Bvural41 1
Bvural41
noisiv 1
noisiv
Manwe Work 1
Manwe Work
Hikaye Ekle

Metin2 Hile İstek Metin2 GF SendItemPickupPacket

  • Konuyu başlatan Konuyu başlatan BlackMask11
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 11
  • Görüntüleme Görüntüleme 829

HERAKLES Otomatik Avlı kalıcı sunucu. 19 Haziran'da açılıyor. Atius & Wizard güvencesiyle hemen kayıt ol, ön kayıt ödülleri aktif. HEMEN TIKLA!

Merhabalar, Metin2 için geliştirmiş olduğum range pickup özelliğinde böyle bir engelle karşılaştım. İlk defa görüyorum yardım edebilecek olan var mı ? Fonksiyonları alta bırakıyorum.


Ekran görüntüsü 2026-02-20 031904.png



C++:
inline bool SendPickupCall(DWORD vId)
{
    if (vId == 0 || vId == 0xFFFFFFFF)
        return false;

    DWORD clientBase = (DWORD)GetModuleHandleA("metin2client.exe");
    if (!clientBase) return false;

    // CNetworkStream instance'ını al (metin2client.exe+2C43994)
    uintptr_t netInstance = 0;
    if (!ReadPtr<uintptr_t>(clientBase, 0x2C43994, netInstance))
        return false;

    if (!netInstance)
        return false;

    // Call adresi: metin2client.exe+242C5C0
    DWORD callAddr = clientBase + 0x242C5C0;

    __asm
    {
        mov ecx, netInstance    // this pointer
        push vId                // parametre: item VID
        call callAddr           // SendPickupCall'ı çağır
    }

    return true;
}

// ==================================================
// RANGE PICKUP - IŞINLAN + TOPLA (STATE 2 YOK)
// ==================================================

void ProcessRangePickup()
{
    if (!C_RangePickup) return;

    static DWORD lastPickup = 0;
    DWORD now = GetTickCount();
    if (now - lastPickup < (DWORD)C_PickupSpeed) return;

    // 1. En yakın itemi bul
    GroundItem target = GetClosestGroundItem();
    if (target.vid == 0) return;

    // 2. Oyuncu pozisyonunu al
    float origX = 0, origY = 0, origZ = 0;
    if (!GetPlayerPosition(origX, origY, origZ)) return;

    // 3. Mesafe kontrolü (Range)
    float dx = origX - target.x;
    float dy = origY - target.y;
    float dist = sqrtf(dx * dx + dy * dy);

    if (dist > C_PickupRange) return;

    DWORD clientBase = (DWORD)GetModuleHandleA(NULL);
    if (!clientBase) return;

    // 4. CharacterManager ve local player pointer'larını al
    uintptr_t charManager = 0;
    ReadProcessMemory(GetCurrentProcess(), (LPCVOID)(clientBase + 0x02C43284), &charManager, 4, NULL);

    uintptr_t localPlayer = 0;
    ReadProcessMemory(GetCurrentProcess(), (LPCVOID)(charManager + 0xC), &localPlayer, 4, NULL);

    if (!localPlayer) return;

    // 5. İtemin yanına ışınlan (KOORDİNATLARI DEĞİŞTİR)
    WriteProcessMemory(GetCurrentProcess(), (LPVOID)(localPlayer + 0x2F4), &target.x, sizeof(float), NULL);
    WriteProcessMemory(GetCurrentProcess(), (LPVOID)(localPlayer + 0x2F8), &target.y, sizeof(float), NULL);
    // Z koordinatını değiştirme (isteğe bağlı)

    // 6. SUNUCUYA TOPLAMA PAKETİ GÖNDER (SendPickupCall)
    SendPickupCall(target.vid);

    // 7. Sunucunun işlemesi için KISA bekle (ÇOK ÖNEMLİ)
    Sleep(30);

    // 8. ESKİ KOORDİNATLARA GERİ DÖN
    WriteProcessMemory(GetCurrentProcess(), (LPVOID)(localPlayer + 0x2F4), &origX, sizeof(float), NULL);
    WriteProcessMemory(GetCurrentProcess(), (LPVOID)(localPlayer + 0x2F8), &origY, sizeof(float), NULL);

    lastPickup = now;
}

DWORD WINAPI RangePickupThread(LPVOID lpParam)
{
    while (true)
    {
        // Bot kapalıysa bekle (CPU yormasın)
        if (!C_RangePickup)
        {
            Sleep(100);
            continue;
        }

        // Toplama fonksiyonunu çağır
        ProcessRangePickup();

        // Fonksiyonun içinde zaten lastPickup/C_PickupSpeed kontrolü olduğu için
        // burada çok küçük bir bekleme yeterlidir.
        Sleep(50);
    }
    return 0;
}
 

En Çok Reaksiyon Alan Mesajlar

Sorun muhtemelen yanlış yere teleport yapıyorsun.
Metin2 adres yapısından kaynaklanıyor.
Client y koordinat = -18.000
server y koordinat = 18.000
minimap y koordinat = 180 ( bunu kullanmıyoruz ama adres çeşitliliğini anlamak için )

player ve hedefin y koordinat negatif ama server pozitif göndermek zorundasın . State fonksiyonunda negatif koordinat verirsen seni yanlış yere teleport yapmak ister. Belki map dışına o yüzden bu uyarıyı alıyorsun . Tüm hareket işlemlerinde y pozitif göndermek zorundasın
Dostum yapanlar var anlayan birisi konuya destek olsa beyler bizimlede paylaşırsan çok seviniriz kardeşim başarılar dilerim inşallah yaparsın
 
Merhabalar, Metin2 için geliştirmiş olduğum range pickup özelliğinde böyle bir engelle karşılaştım. İlk defa görüyorum yardım edebilecek olan var mı ? Fonksiyonları alta bırakıyorum.


Ekli dosyayı görüntüle 168192


C++:
inline bool SendPickupCall(DWORD vId)
{
    if (vId == 0 || vId == 0xFFFFFFFF)
        return false;

    DWORD clientBase = (DWORD)GetModuleHandleA("metin2client.exe");
    if (!clientBase) return false;

    // CNetworkStream instance'ını al (metin2client.exe+2C43994)
    uintptr_t netInstance = 0;
    if (!ReadPtr<uintptr_t>(clientBase, 0x2C43994, netInstance))
        return false;

    if (!netInstance)
        return false;

    // Call adresi: metin2client.exe+242C5C0
    DWORD callAddr = clientBase + 0x242C5C0;

    __asm
    {
        mov ecx, netInstance    // this pointer
        push vId                // parametre: item VID
        call callAddr           // SendPickupCall'ı çağır
    }

    return true;
}

// ==================================================
// RANGE PICKUP - IŞINLAN + TOPLA (STATE 2 YOK)
// ==================================================

void ProcessRangePickup()
{
    if (!C_RangePickup) return;

    static DWORD lastPickup = 0;
    DWORD now = GetTickCount();
    if (now - lastPickup < (DWORD)C_PickupSpeed) return;

    // 1. En yakın itemi bul
    GroundItem target = GetClosestGroundItem();
    if (target.vid == 0) return;

    // 2. Oyuncu pozisyonunu al
    float origX = 0, origY = 0, origZ = 0;
    if (!GetPlayerPosition(origX, origY, origZ)) return;

    // 3. Mesafe kontrolü (Range)
    float dx = origX - target.x;
    float dy = origY - target.y;
    float dist = sqrtf(dx * dx + dy * dy);

    if (dist > C_PickupRange) return;

    DWORD clientBase = (DWORD)GetModuleHandleA(NULL);
    if (!clientBase) return;

    // 4. CharacterManager ve local player pointer'larını al
    uintptr_t charManager = 0;
    ReadProcessMemory(GetCurrentProcess(), (LPCVOID)(clientBase + 0x02C43284), &charManager, 4, NULL);

    uintptr_t localPlayer = 0;
    ReadProcessMemory(GetCurrentProcess(), (LPCVOID)(charManager + 0xC), &localPlayer, 4, NULL);

    if (!localPlayer) return;

    // 5. İtemin yanına ışınlan (KOORDİNATLARI DEĞİŞTİR)
    WriteProcessMemory(GetCurrentProcess(), (LPVOID)(localPlayer + 0x2F4), &target.x, sizeof(float), NULL);
    WriteProcessMemory(GetCurrentProcess(), (LPVOID)(localPlayer + 0x2F8), &target.y, sizeof(float), NULL);
    // Z koordinatını değiştirme (isteğe bağlı)

    // 6. SUNUCUYA TOPLAMA PAKETİ GÖNDER (SendPickupCall)
    SendPickupCall(target.vid);

    // 7. Sunucunun işlemesi için KISA bekle (ÇOK ÖNEMLİ)
    Sleep(30);

    // 8. ESKİ KOORDİNATLARA GERİ DÖN
    WriteProcessMemory(GetCurrentProcess(), (LPVOID)(localPlayer + 0x2F4), &origX, sizeof(float), NULL);
    WriteProcessMemory(GetCurrentProcess(), (LPVOID)(localPlayer + 0x2F8), &origY, sizeof(float), NULL);

    lastPickup = now;
}

DWORD WINAPI RangePickupThread(LPVOID lpParam)
{
    while (true)
    {
        // Bot kapalıysa bekle (CPU yormasın)
        if (!C_RangePickup)
        {
            Sleep(100);
            continue;
        }

        // Toplama fonksiyonunu çağır
        ProcessRangePickup();

        // Fonksiyonun içinde zaten lastPickup/C_PickupSpeed kontrolü olduğu için
        // burada çok küçük bir bekleme yeterlidir.
        Sleep(50);
    }
    return 0;
}
hesap ban yemiş hocam farklı bir ban yöntemi tr de ticaret yapamaz chat kullanamaz saldırı yapamaz mob hasar alamaz kısacası sadece npc gibi oluyor karakteriniz.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst