- Katılım
- 21 Şub 2021
- Konular
- 3
- Mesajlar
- 5
- Online süresi
- 1d 3h
- Reaksiyon Skoru
- 0
- Altın Konu
- 0
- TM Yaşı
- 5 Yıl 3 Ay 13 Gün
- Başarım Puanı
- 40
- MmoLira
- 309
- DevLira
- 3
ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!
Warspear Online'da varlıkların nasıl depolandığını sonunda çözdüm. EntityList dizi olarak değil, node yapısıyla tutuluyor ve Array of Byte (AoB) taramasıyla varlıkları bulabiliyorum. Ancak bunu programatik olarak nasıl uygulayacağımdan emin değilim. Aşağıda bulduğum pattern ve karşılık gelen offsetler var. Bu patterni kullanarak varlıkları dinamik olarak nasıl bulabilir ve farmbotum için değerlerini okuyabilirim?
Amacım: Karakterimin otomatik olarak yaratıklara saldırıp altın toplamasını sağlayacak bir sistem yapmak.
4D 00 75 00 74 00 61 00 6E 00 74 00 20 00 6F 00
66 00 20 00 43 00 6C 00 6F 00 61 00 63 00 61 00
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? 25 24 00 00 25 24 00 00
64 00 00 00 64 00 00 00 ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
Pattern:
4D 00 75 00 74 00 61 00 6E 00 74 00 20 00 6F 00
66 00 20 00 43 00 6C 00 6F 00 61 00 63 00 61 00 // İlk 2 satır (offset 0x0 ile 0x32) - 32-byte UTF-16 yaratık adı
... [wildcard byte'ları] ...
25 24 00 00 25 24 00 00 // Offset 0x184-0x191 - İlk 4 byte: Mevcut HP, sonraki 4 byte: Max HP
64 00 00 00 64 00 00 00 // Offset 0x192-0x200 - İlk 4 byte: Mevcut Mana, sonraki 4 byte: Max Mana
... [wildcard byte'ları] ...
// Ek bilgiler:
// 13. ve 15. byte'lar Position (13=xPos, 15=yPos)
// 9. byte Status : // (1=Meşgul, 0=Boşta)
Bu kodu yazdım, ancak yalnızca statik değerleri okuyor. Otomatik farm sistemi için dinamik olarak varlık verilerini okumam gerekiyor.
#include <iostream>
#include <vector>
#include <string>#includee <thread>
##include<chrono>
##include<iomanip>
#include <cstdlib>#include_t readUIn#includet std::vect#include_t>& arr, size_t offset) {
return arr[offset] |
(arr[offset + 1] << 8) |
(arr[offset + 2] << 16) |
(arr[offset + 3] << 24);
}
int main() {
std::vector<uint8_t> arr(0x1A1, 0x00);
// UTF-16LE formatında Mob'un adı
std::wstring mobNameStr = L"Mutant of Cloaca";
for (size_t i = 0; i < mobNameStr.size() && i < 16; ++i) {
arr[i * 2] = mobNameStr & 0xFF;
arr[i * 2 + 1] = (mobNameStr >> 8) & 0xFF;
}
// CurrHP & MaxHP (9253 = 0x2425)
arr[0x184] = 0x25; arr[0x185] = 0x24; arr[0x186] = 0x00; arr[0x187] = 0x00;
arr[0x188] = 0x25; arr[0x189] = 0x24; arr[0x18A] = 0x00; arr[0x18B] = 0x00;
// Mana değerleri (100 = 0x64)
arr[0x192] = 0x64; arr[0x193] = 0x00; arr[0x194] = 0x00; arr[0x195] = 0x00;
arr[0x196] = 0x64; arr[0x197] = 0x00; arr[0x198] = 0x00; arr[0x199] = 0x00;
// Status & Position
arr[0x19A] = 0x01; // Durum: Meşgul
arr[0x19E] = 0x0C; // xPos: 12
arr[0x1A0] = 0x22; // yPos: 34
// ----------------------------------------------------------------
if (arr.size() < 0x1A1) {
std::cerr << "Yetersiz buffer boyutu! En az 0x1A1 (" << 0x1A1 << ") byte gereklidir.\n";
return 1;
}
while (true) {
system("cls");
std::wstring mobName;
for (int i = 0; i < 32; i += 2) {
wchar_t ch = arr | (arr[i + 1] << 8);
if (ch == 0) break;
mobName += ch;
}
// Mob özelliklerini oku
uint32_t currentHP = readUInt32(arr, 0x184);
uint32_t maxHP = readUInt32(arr, 0x188);
uint32_t currentMana = readUInt32(arr, 0x192);
uint32_t maxMana = readUInt32(arr, 0x196);
uint8_t status = arr[0x19A];
uint8_t xPos = arr[0x19E];
uint8_t yPos = arr[0x1A0];
// Mob bilgileri
std::wcout << L"Yaratık Adı : " << mobName << std::endl;
std::cout << "Mevcut HP : " << currentHP << std::endl;
std::cout << "Max HP : " << maxHP << std::endl;
std::cout << "Mevcut Mana : " << currentMana << std::endl;
std::cout << "Max Mana : " << maxMana << std::endl;
std::cout << "Durum : " << (int)status << " (" << (status == 1 ? "Meşgul" : "Boşta") << ")" << std::endl;
std::cout << "Pozisyon : " "xPos : "<< (int)xPos << " yPos : "<< (int)yPos << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(200));
}
return 0;
}
Bu şekilde patternden statik okuma yapabiliyorum fakat benim verdiğim patterndeki değerleri okutabiliyorum cheat engine ile bu patterni arattığımda bulunduğum alanda bu patterne ait mobdan kaç tane varsa hepsi Cheat Enginede gözüküyor örnek bu patterni arattığımda bulunduğum Alanda 5 tane var ve hepsini gösteriyor.
C++ ile bunu nasıl koda dökebilirim yani bu 5 mob'u kendisi tarayıp ve ona gidecek Oto Saldırı kısmına henüz geçmedim ilk defa AoB kullanıyorum o yüzden burayı yaptıktan sonra geçeceğim.
Amacım: Karakterimin otomatik olarak yaratıklara saldırıp altın toplamasını sağlayacak bir sistem yapmak.
4D 00 75 00 74 00 61 00 6E 00 74 00 20 00 6F 00
66 00 20 00 43 00 6C 00 6F 00 61 00 63 00 61 00
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? 25 24 00 00 25 24 00 00
64 00 00 00 64 00 00 00 ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
Pattern:
4D 00 75 00 74 00 61 00 6E 00 74 00 20 00 6F 00
66 00 20 00 43 00 6C 00 6F 00 61 00 63 00 61 00 // İlk 2 satır (offset 0x0 ile 0x32) - 32-byte UTF-16 yaratık adı
... [wildcard byte'ları] ...
25 24 00 00 25 24 00 00 // Offset 0x184-0x191 - İlk 4 byte: Mevcut HP, sonraki 4 byte: Max HP
64 00 00 00 64 00 00 00 // Offset 0x192-0x200 - İlk 4 byte: Mevcut Mana, sonraki 4 byte: Max Mana
... [wildcard byte'ları] ...
// Ek bilgiler:
// 13. ve 15. byte'lar Position (13=xPos, 15=yPos)
// 9. byte Status : // (1=Meşgul, 0=Boşta)
Bu kodu yazdım, ancak yalnızca statik değerleri okuyor. Otomatik farm sistemi için dinamik olarak varlık verilerini okumam gerekiyor.
#include <iostream>
#include <vector>
#include <string>#includee <thread>
##include<chrono>
##include<iomanip>
#include <cstdlib>#include_t readUIn#includet std::vect#include_t>& arr, size_t offset) {
return arr[offset] |
(arr[offset + 1] << 8) |
(arr[offset + 2] << 16) |
(arr[offset + 3] << 24);
}
int main() {
std::vector<uint8_t> arr(0x1A1, 0x00);
// UTF-16LE formatında Mob'un adı
std::wstring mobNameStr = L"Mutant of Cloaca";
for (size_t i = 0; i < mobNameStr.size() && i < 16; ++i) {
arr[i * 2] = mobNameStr & 0xFF;
arr[i * 2 + 1] = (mobNameStr >> 8) & 0xFF;
}
// CurrHP & MaxHP (9253 = 0x2425)
arr[0x184] = 0x25; arr[0x185] = 0x24; arr[0x186] = 0x00; arr[0x187] = 0x00;
arr[0x188] = 0x25; arr[0x189] = 0x24; arr[0x18A] = 0x00; arr[0x18B] = 0x00;
// Mana değerleri (100 = 0x64)
arr[0x192] = 0x64; arr[0x193] = 0x00; arr[0x194] = 0x00; arr[0x195] = 0x00;
arr[0x196] = 0x64; arr[0x197] = 0x00; arr[0x198] = 0x00; arr[0x199] = 0x00;
// Status & Position
arr[0x19A] = 0x01; // Durum: Meşgul
arr[0x19E] = 0x0C; // xPos: 12
arr[0x1A0] = 0x22; // yPos: 34
// ----------------------------------------------------------------
if (arr.size() < 0x1A1) {
std::cerr << "Yetersiz buffer boyutu! En az 0x1A1 (" << 0x1A1 << ") byte gereklidir.\n";
return 1;
}
while (true) {
system("cls");
std::wstring mobName;
for (int i = 0; i < 32; i += 2) {
wchar_t ch = arr | (arr[i + 1] << 8);
if (ch == 0) break;
mobName += ch;
}
// Mob özelliklerini oku
uint32_t currentHP = readUInt32(arr, 0x184);
uint32_t maxHP = readUInt32(arr, 0x188);
uint32_t currentMana = readUInt32(arr, 0x192);
uint32_t maxMana = readUInt32(arr, 0x196);
uint8_t status = arr[0x19A];
uint8_t xPos = arr[0x19E];
uint8_t yPos = arr[0x1A0];
// Mob bilgileri
std::wcout << L"Yaratık Adı : " << mobName << std::endl;
std::cout << "Mevcut HP : " << currentHP << std::endl;
std::cout << "Max HP : " << maxHP << std::endl;
std::cout << "Mevcut Mana : " << currentMana << std::endl;
std::cout << "Max Mana : " << maxMana << std::endl;
std::cout << "Durum : " << (int)status << " (" << (status == 1 ? "Meşgul" : "Boşta") << ")" << std::endl;
std::cout << "Pozisyon : " "xPos : "<< (int)xPos << " yPos : "<< (int)yPos << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(200));
}
return 0;
}
Bu şekilde patternden statik okuma yapabiliyorum fakat benim verdiğim patterndeki değerleri okutabiliyorum cheat engine ile bu patterni arattığımda bulunduğum alanda bu patterne ait mobdan kaç tane varsa hepsi Cheat Enginede gözüküyor örnek bu patterni arattığımda bulunduğum Alanda 5 tane var ve hepsini gösteriyor.
C++ ile bunu nasıl koda dökebilirim yani bu 5 mob'u kendisi tarayıp ve ona gidecek Oto Saldırı kısmına henüz geçmedim ilk defa AoB kullanıyorum o yüzden burayı yaptıktan sonra geçeceğim.
