Bitfield ve Bitfield ile visible check [VALORANT]

Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

R7flex

Banned
Katılım
7 Haz 2020
Mesajlar
3,314
Beğeniler
1,740
Bu kullanıcıyla herhangi bir iş veya ticaret yapmak istiyorsanız, forumdan uzaklaştırıldığını sakın unutmayın.
Bitfield nedir?
Bir bit alanı, yapı içindeki herhangi bir tek bitin veya bit grubunun ayarlanabilmesi veya denetlenebilmesi için belirli amaçlar için tahsis edilmiş bir veya daha fazla bitişik bitten oluşan bir veri yapısıdır.

C++ bitfield'lar, yapılar (struct) veya birleşimler (union) içinde tanımlanabilir. Yapı veya birleşim içindeki bitfield'ların boyutu, kullanılacak bit sayısına göre belirlenir. Bitfield'lar, int, unsigned int, char, unsigned char veya bool gibi tamsayı türlerine atanabilir.

Örneğin, aşağıdaki kod parçasında bir Araba yapısı (struct) ve bu yapının bir bitfield kullanarak nasıl tanımlanabileceği gösterilmektedir:

C++:
#include <iostream>

struct Araba {
  unsigned int hiz : 4; // 4 bitlik bir alan
  unsigned int yakit : 3; // 3 bitlik bir alan
  bool otomatikVites : 1; // 1 bitlik bir alan
};

int main() {
  Araba araba;
  araba.hiz = 7;
  araba.yakit = 2;
  araba.otomatikVites = true;

  std::cout << "Hız: " << araba.hiz << std::endl;
  std::cout << "Yakıt: " << araba.yakit << std::endl;
  std::cout << "Otomatik Vites: " << araba.otomatikVites << std::endl;

  return 0;
}

Bu yapıyı VALORANT üzerinde nasıl lehimize kullanıcaz?
İlk öncelikle VALORANT üzerinde kullanıcağımız structa göz atalım:
C++:
struct USkinnedMeshComponent : UMeshComponent {
    char pad_590[0x8]; // 0x590(0x08)
    struct USkeletalMesh* SkeletalMesh; // 0x598(0x08)
    struct TWeakObjectPtr<struct USkinnedMeshComponent> MasterPoseComponent; // 0x5a0(0x08)
    struct TArray<enum class ESkinCacheUsage> SkinCacheUsage; // 0x5a8(0x10)
    struct TArray<struct FVertexOffsetUsage> VertexOffsetUsage; // 0x5b8(0x10)
    char pad_5C8[0xf8]; // 0x5c8(0xf8)
    struct UPhysicsAsset* PhysicsAssetOverride; // 0x6c0(0x08)
    int32_t ForcedLodModel; // 0x6c8(0x04)
    int32_t MinLodModel; // 0x6cc(0x04)
    char pad_6D0[0xc]; // 0x6d0(0x0c)
    float StreamingDistanceMultiplier; // 0x6dc(0x04)
    char pad_6E0[0x8]; // 0x6e0(0x08)
    struct TArray<struct FSkelMeshComponentLODInfo> LODInfo; // 0x6e8(0x10)
    char pad_6F8[0x24]; // 0x6f8(0x24)
    enum class EVisibilityBasedAnimTickOption VisibilityBasedAnimTickOption; // 0x71c(0x01)
    char pad_71D[0x1]; // 0x71d(0x01)
    char pad_71E_0 : 3; // 0x71e(0x01)
    char bOverrideMinLod : 1; // 0x71e(0x01)
    char bUseBoundsFromMasterPoseComponent : 1; // 0x71e(0x01)
    char bForceWireframe : 1; // 0x71e(0x01)
    char bDisplayBones : 1; // 0x71e(0x01)
    char bDisableMorphTarget : 1; // 0x71e(0x01)
    char bHideSkin : 1; // 0x71f(0x01) --- 0x71f alanın başladığı yer -> 0
    char bPerBoneMotionBlur : 1; // 0x71f(0x01) -> 1
    char bComponentUseFixedSkelBounds : 1; // 0x71f(0x01) -> 2
    char bConsiderAllBodiesForBounds : 1; // 0x71f(0x01) -> 3
    char bSyncAttachParentLOD : 1; // 0x71f(0x01) -> 4
    char bCanHighlightSelectedSections : 1; // 0x71f(0x01) -> 5
    char bRecentlyRendered : 1; // 0x71f(0x01) -> 6 (kullanıcağımız yer)
    char bForceNonRenderedAnimUpdateRate : 1; // 0x71f(0x01)
    char bCastCapsuleDirectShadow : 1; // 0x720(0x01)
    ...... //devam ediyor...
Burda 0x71f'in başladığıda yere dikkat edin ve aynı offsetle 7 tane 1 bit var işte bitfield dediğimiz şey budur.
Biz oyun içi visible check (görünürlülük kontrolü) yapmak için kullanıcaz
ilk bitimiz bHideSkin -> 0'dan başlarsak bRecentlyRendered 6. yerimiz oluyor.


C++:
BYTE bRecentlyRendered = read<BYTE>(mesh + 0x71f); // bitfieldı okuduk
std::int32_t extract_bit = bRecentlyRendered & (1 << 6) // burda sırası 6 olduğu için AND işlemi uyguladık
bool visible = extract_bit != 0; // sıfıra eşit değilse true döndürüyor başka bir sayı ise false döndürüyor

Örnek Video:


UYARI: Duvar arkasına geçince ufak bir tolerans var UnrealEngine ile alakalıdır.
Yanlışım varsa düzeltin.
 
Taşağına kurban dayı eline sağlık böle konular uc dışı pek göremiyorduk eyw.
 
Bu kullanıcıyla herhangi bir iş veya ticaret yapmak istiyorsanız, forumdan uzaklaştırıldığını sakın unutmayın.
std::int32_t extract_bit = bRecentlyRendered & (1 << 6) // burda sırası 6 olduğu için AND işlemi uyguladık

1 << 6
1 << olan kısmı neye göre belirliyoruz ve ya static mi ?
byte mask hocam sırasına göre belirliyoruz 0 dan başlayarak valorantda böyle kullandım.
0 1 2 3 4 5 diye sayın
 
ne lan :D Bari doğru araştırsaydın be krşm
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

  Şuanda konuyu görüntüleyen kullanıcılar


Üst Alt