logo
tr
Türkçe

SKSE Eklentileri için Adres Kütüphanesi

Oluşturan: meh321
Güncellendi:2020-02-24 19:31:54
2.8MB
mcafee
Doğrulama
200,000,000+ Kullanıcı tarafından güveniliyor

Bu Mod Hakkında

SKSE DLL eklentileri sürümünü kolayca bağımsız hale getirmek için başlık dosyası ve bir veritabanı içerir.
ÖNEMLİ!Bu sürüm artık 2 versiyona ayrıldı: Özel Sürüm (1.5.x) ve Yıldönümü Sürümü (1.6.x). Adreslere işaret eden kimlikler bu 2 versiyon arasında eşleşmeyecektir (oyunun çalıştırılabilir dosyası eşleşmeyecek kadar farklıdır ve eşleşseler bile bu işlevlerdeki kodlar yine de farklıdır).

Tanım

Düzenli mod kullanıcıları için:"All-in-one" paketini dosyalar bölümünden indirip kurun. Mod yöneticisini kullanabilir veya manuel olarak kurabilirsiniz. .bin dosyaları şuraya yerleştirilmelidir:
Veri/SKSE/Eklentiler/
Geri kalanını okumanıza gerek yok.

SKSE DLL eklentisi yazarları için:
Bu bir modder kaynağıdır (bir başlık dosyası). DLL eklentinizin yeniden derlenmesine gerek kalmadan sürümden bağımsız olabilmesi için ofsetleri depolayan bir veritabanı yükleyebilirsiniz. Başlık dosyası, dosyaların isteğe bağlı bölümünden indirilebilir. Yıldönümü Sürümü için başlık dosyası versiondb.h yerine versionlibdb.h olarak adlandırılır! CommonLib kullanıyorsanız, tüm bunlar zaten yerleşiktir ve buradan herhangi bir şeye ihtiyacınız yoktur.


Nasıl kullanılır

En hızlı yol:
Spoiler:
Göstermek


#include "versiondb.h"

void * Adresim = NULL;
imzasız uzun uzun MyOffset = 0;

bool InitializeOffsets()
{
// Yığın üzerinde tahsis edin, böylece bu fonksiyondan çıktığımızda boşaltılacaktır.
// Tüm veritabanının yüklenip gereksiz yere hafızayı tüketmesine gerek yok.
SürümDb db;

// Veritabanını geçerli yürütülebilir sürümle yükle.
eğer (!db.Load())
{
_FATALERROR("Geçerli yürütülebilir dosya için sürüm veritabanı yüklenemedi!");
false döndür;
}
başka
{
// "SkyrimSE.exe", "1.5.97.0"
_MESSAGE("%s sürümü %s için veritabanı yüklendi.", db.GetModuleName().c_str(), db.GetLoadedVersionString().c_str());
}

// Bu adres zaten modülün taban adresini içerdiğinden adresi doğrudan kullanabiliriz.
Adresim = db.AdresiKimliğeGöreBul(123);
eğer (Adresim == NULL)
{
_FATALERROR("Adres bulunamadı!");
false döndür;
}

// Bu ofset taban adresini içermez. Gerçek adres ModuleBase + MyOffset olacaktır.
eğer (!db.FindOffsetById(123, MyOffset))
{
_FATALERROR("Şeyim için ofset bulunamadı!");
false döndür;
}

// Her şey başarılıydı.
doğruyu döndür;
}



Şimdi şu "123" değerinin ne olduğunu merak ediyorsunuz. Bu, bir adresin ID'sidir. Farklı sürüm veritabanları bir adres için aynı ID'ye sahip olacaktır, ancak farklı değerlere işaret edebilir. Belirli bir sürüme ait tüm ID ve değer çiftlerinin listesini almak için şunu yapın:

Spoiler:
Göstermek


#include "versiondb.h"

bool DumpSpecificVersion()
{
SürümDb db;

// Çalıştırılabilir sürümden bağımsız olarak 1.5.62.0 sürümünün veritabanını yüklemeyi deneyin.
eğer (!db.Load(1, 5, 62, 0))
{
_FATALERROR("1.5.62.0 için veritabanı yüklenemedi!");
false döndür;
}

// Her satırın ID ve offset değerini belirttiği offsets-1.5.62.0.txt adında bir dosya yazın.
db.Dump("offsets-1.5.62.0.txt");
_MESSAGE("1.5.62.0 için ofsetler boşaltıldı");
doğruyu döndür;
}



1, 5, 62, 0 yerine, tersine çevirdiğiniz ve aşina olduğunuz sürümü girin. Öncelikle /Data/SKSE/Plugins dizininde ilgili veritabanı dosyasına sahip olmalısınız.

Bunu çağırdıktan sonra ana Skyrim dizininde "offsets-1.5.62.0.txt" veya dosya adı olarak ne yazarsanız o adlı yeni bir dosyanız olacak. Her satır şu formatta olacak:
Ondalık KimlikHex Ofset

Örneğin, 1.5.62.0'da sürümden bağımsız hale getirmek istediğiniz 142F4DEF8 adresiniz (oyuncu karakteri statik işaretçisi) varsa şunu yaparsınız:
1. Ofset dosyasında 2F4DEF8'e bakın. Çünkü bu, taban 140000000 olmadan ofsettir.
2. ID'nin 517014 (ondalık!) olduğunu görün.
3. Bu adresi çalışma zamanında DLL'nizde görmek istiyorsanız şunu yapın:


void* addressOf142F4DEF8 = db.FindAddressById(517014);


İşte karşınızda.

VersionDb yapısının aşağıdaki işlevleri vardır:
Spoiler:
Göstermek


bool Dump(const std::string& path); // Şu anda yüklenen veritabanını dosyaya dök
bool Load(int major, int minor, int revision, int build); // Data/SKSE/Plugins dizininde db-major-minor-revision-build.bin varsa belirli bir sürümü yükleyin
bool Load(); // Geçerli uygulama için sürümü yükle
void Clear(); // Şu anda yüklenen veritabanını temizle
void GetLoadedVersion(int& major, int& minor, int& revision, int& build) const; // Şu anda yüklediğimiz veritabanı dosyasının sürümünü alın
bool GetExecutableVersion(int& major, int& minor, int& revision, int& build) const; // Şu anda çalışan uygulamanın sürümünü al
const std::string& GetModuleName() const; // Şu anda yüklü olan veritabanı modülünün adını alın, bu "SkyrimSE.exe"yi göstermelidir
const std::string& GetLoadedVersionString() const; // Şu anda yüklenen sürümü dize olarak al, örneğin "1.5.62.0"
sabit std::harita& GetOffsetMap() const; // Manuel olarak yinelemeniz gerekirse, ofsetlenecek ID'nin haritasını alın
void* FindAddressById(unsigned long long id) const; // Adresi kimliğe göre bul, bu zaten taban adresi içerecek ve doğru adres olacak. Bulunamazsa NULL döndürecek!
bool FindOffsetById(unsigned long long id, unsigned long long& result) const; // ID'ye göre ofseti bul, bu sadece taban dahil edilmeden ofset olacaktır.
bool FindIdByAddress(void* ptr, unsigned long long& result) const; // Adrese göre ID'yi bul, bu adresi ID'ye dönüştürmek için ters aramayı deneyecektir
bool FindIdByOffset(unsigned long long offset, unsigned long long& result) const; // Kimliği ofsete göre bul, bu, ofseti kimliğe dönüştürmek için ters bir arama yapmayı deneyecektir



Bilmeniz ve aklınızda bulundurmanız gerekenler:

1. Eklentinize veritabanı dosyalarından herhangi birini (veya tamamını) ekleyebilirsiniz, ancak bu, dosya boyutunu önemli ölçüde artırabilir (yaklaşık 2,5 MB). Şimdiye kadar bu modu bir bağımlılık olarak işaretlemek yaygındı.

2. Veritabanını HER ZAMAN başlangıçta yalnızca bir kez yüklemeli, ihtiyacınız olan adresleri başlatıp önbelleğe almalı ve boşaltılmasını beklemelisiniz. Boşaltma, yalnızca VersionDb yapısının silinmesi veya kaybolması anlamına gelir (yığında ayrılmışsa). Bu, oyun sırasında gereksiz miktarda bellek kullanmamanızı sağlar. Oyun sırasında veritabanını yüklü tutmanıza gerek yoktur. CommonLib kullanıyorsanız bu bir sorun teşkil etmez çünkü veritabanını her DLL için yüklemek yerine yalnızca bir kez yükler.

3. Veritabanı, fonksiyonların, genel değişkenlerin, RTTI'ların, sanal tabloların ve bunlara referans olabilecek diğer her şeyin adreslerini içerir. Fonksiyonların veya genel değişkenlerin ortasında bulunan adresleri içermez. Fonksiyonun ortasında bir adrese ihtiyacınız varsa, fonksiyon taban adresini bulup ek ofseti kendiniz eklemelisiniz. Ayrıca, rdata'da referans verilen fonksiyonların etrafındaki hizalama gibi gereksiz bilgiler de içermez. pdata bölümü atılır ve rdata'dan derleyici tarafından oluşturulan bazı SEH bilgileri atılır.

4. Veritabanının başarıyla yüklendiğinden (bool Load true döndürdü) ve sorgulanan adreslerin gerçekten geçerli bir sonuç (NULL değil) döndürdüğünden emin olmak için sonucu her zaman kontrol etmelisiniz. Yüklenemiyorsa, büyük olasılıkla dosya eksik veya yanlış sürümdedir (örneğin, AE'de SE başlığını kullanmaya çalışılmıştır). Sorgu başarısız olursa, adres o sürümde bulunamamıştır. Bu, oyun kodunun adresin artık o sürüm için geçerli olmayacak kadar değiştiği veya veritabanının doğru adresi algılayamadığı anlamına gelebilir. Bunlardan herhangi biri olursa, SKSE'ye doğru yükleme yapmadığınızı bildirmek için eklenti başlatma işlemini başarısız kılmalısınız. Veya manuel olarak bir hata mesajı göstermelisiniz.

5. DLL eklentinizi yayınlamadan önce, adresin oyunun tüm sürümlerinde mevcut olduğundan emin olmanız da en iyisi olacaktır. Bunu yapmak için, veritabanı dosyasının her sürümünü yükleyin ve her birinde aynı adres kimliğini sorgulayarak mevcut olduğundan emin olun:
Spoiler:
Göstermek


bool LoadAll(std::vektör& Tümü)
{
statik int sürümleri[] = { 3, 16, 23, 39, 50, 53, 62, 73, 80, 97, -1 };
int i = 0; sürümler[i] >= 0; i++) için
{
SürümVeritabanı * db = yeni SürümVeritabanı();
eğer (!db->Load(1, 5, sürümler[i], 0))
{
veritabanını sil;
false döndür;
}
tüm.geri_itme(db);
}
doğruyu döndür;
}

bool ExistsInAll(std::vector& hepsi, imzasız uzun uzun id)
{
imzasız uzun uzun sonuç = 0;
(otomatik db : hepsi için)
{
eğer (!db->FindOffsetById(id, sonuç))
false döndür;
}
doğruyu döndür;
}

void FreeAll(std::vektör& Tümü)
{
(otomatik db : hepsi için)
veritabanını sil;
her şeyi.temizle();
}

bool IsOk()
{
std::vektörTümü;
eğer (!LoadAll(all))
{
_FATALERROR("Geçerli yürütülebilir dosya için bir veya daha fazla sürüm veritabanı yüklenemedi!");
FreeAll(tümü);
false döndür;
}

eğer (!ExistsInAll(all, 517014))
{
_FATALERROR("517014 veritabanının tüm sürümlerinde mevcut değil!");
FreeAll(tümü);
false döndür;
}

FreeAll(tümü);
// Tamam!
doğruyu döndür;
}



Bu şekilde DLL modunuzun tüm versiyonlarda çalışacağından emin olabilirsiniz veya bazı versiyonlarda çalışmıyorsa bunu mod sayfanıza yazabilirsiniz.

6. Bazen, çalışan oyun sürümüne bağlı olarak farklı bir şey yapmanız gerekebilir. Bunu şu kod parçasıyla yapabilirsiniz:
Spoiler:
Göstermek


int major = 0, minor = 0, revizyon = 0, build = 0;
if (!db.GetExecutableVersion(major, minor, revizyon, build))
{
_FATALERROR("Bir şeyler ters gitti!");
false döndür;
}

// Çalışan oyun 1.5.x ve en azından 1.5.39.0 sürümüdür
eğer (büyük == 1 ve küçük == 5 ve revizyon >= 39)
{
// Şey ... ?
}



7. Lütfen unutmayın: SKSE DLL'nizi hata ayıklama modunda derlerseniz, veritabanının yükleme süresi yaklaşık 14 saniye olabilir! Sürüm modunda ise bu süre yaklaşık 0,2 saniyedir. Bunun nedeni, standart kütüphane kapsayıcılarının bu modda (std map) çok yavaş olmasıdır.


İzinler

İstediğini yap.

Multiverse Loot Hunter için En İyi Modlar

Multiverse Loot Hunter için en iyi modları keşfedin; yeni özellikler, geliştirilmiş görseller ve oyun deneyiminizi dönüştürmenin heyecan verici yollarını sunar.

Xmod ile Multiverse Loot Hunter’in tüm potansiyelini açığa çıkarın — bu en iyi modları bugün keşfedin!

mcafee
Doğrulama
200,000,000+ Kullanıcı tarafından güveniliyor

İndirme veya kurulumda sorun mu yaşıyorsunuz? Destek almak için Discord topluluğumuza katılın!

logo
Dil

Oyun Çözümleri

Kaynaklar

Ortaklar

Bizi takip edin

discordfacebooktwitteryoutube
dc@xmodhub.com or cathy@business.xmodhub.com
Discord: catherine_79237
Şartlar ve Koşullar
Gizlilik Politikası
Destek

Larvas Limited

Room 1201, 12/F Tai Sang Bank Building 130-132 Des Voeux Road Central HK