logo
pl
Polski

Biblioteka adresów dla wtyczek SKSE

Twórca: meh321
Zaktualizowano:2020-02-24 19:31:54
2.8MB
mcafee
Uwierzytelnianie
Zaufane przez 200,000,000+ użytkowników

O tym modzie

Zawiera plik nagłówka i bazę danych, aby łatwo uczynić wersję wtyczek SKSE DLL niezależną.
WAŻNY!Teraz jest ona podzielona na dwie wersje: Edycję Specjalną (1.5.x) i Edycję Rocznicową (1.6.x). Identyfikatory wskazujące adresy nie będą się zgadzać między tymi dwiema wersjami (plik wykonywalny gry jest zbyt różny, aby go dopasować, a nawet gdyby pasował, kod w tych funkcjach i tak byłby inny).

Opis

Dla zwykłych użytkowników moda:Pobierz i zainstaluj pakiet „wszystko w jednym” z sekcji plików. Możesz użyć menedżera modów lub zrobić to ręcznie. Pliki .bin powinny znaleźć się tutaj:
Dane/SKSE/Wtyczki/
Nie ma potrzeby, abyś czytał resztę tego tekstu.

Dla autorów wtyczek DLL SKSE:
To zasób moddera (plik nagłówkowy). Możesz załadować bazę danych przechowującą przesunięcia, dzięki czemu Twoja wtyczka DLL będzie niezależna od wersji bez konieczności ponownej kompilacji. Plik nagłówkowy można pobrać z opcjonalnej sekcji plików. W przypadku Anniversary Edition plik nagłówkowy nazywa się versionlibdb.h zamiast versiondb.h! Jeśli używasz CommonLib, wszystko to jest już wbudowane i nie potrzebujesz niczego więcej.


Jak używać

Najszybszy sposób:
Spoiler:
Pokazywać


#include "versiondb.h"

void * MójAdres = NULL;
unsigned long long MyOffset = 0;

bool InitializeOffsets()
{
// Przydziel na stosie, tak aby został on rozładowany po wyjściu z tej funkcji.
// Nie ma potrzeby ładowania całej bazy danych i wykorzystywania pamięci bez powodu.
WersjaDb baza danych;

// Załaduj bazę danych z aktualną wersją pliku wykonywalnego.
jeśli (!db.Load())
{
_FATALERROR("Nie udało się załadować bazy danych wersji dla bieżącego pliku wykonywalnego!");
zwróć fałsz;
}
w przeciwnym razie
{
// "SkyrimSE.exe", "1.5.97.0"
_MESSAGE("Załadowano bazę danych dla %s wersji %s.", db.GetModuleName().c_str(), db.GetLoadedVersionString().c_str());
}

// Ten adres zawiera już adres bazowy modułu, więc możemy użyć tego adresu bezpośrednio.
MójAdres = db.FindAddressById(123);
jeśli (MójAdres == NULL)
{
_FATALERROR("Nie znaleziono adresu!");
zwróć fałsz;
}

// To przesunięcie nie uwzględnia adresu bazowego. Rzeczywisty adres to ModuleBase + MyOffset.
jeśli (!db.FindOffsetById(123, MyOffset))
{
_FATALERROR("Nie udało się znaleźć przesunięcia dla mojej rzeczy!");
zwróć fałsz;
}

// Wszystko przebiegło pomyślnie.
zwróć wartość true;
}



Teraz zastanawiasz się, co to za wartość „123”. To identyfikator adresu. Różne bazy danych wersji będą miały ten sam identyfikator adresu, ale może on wskazywać na różne wartości. Aby uzyskać listę wszystkich par identyfikatorów i wartości dla konkretnej wersji, wykonaj następujące czynności:

Spoiler:
Pokazywać


#include "versiondb.h"

bool DumpSpecificVersion()
{
WersjaDb baza danych;

// Spróbuj załadować bazę danych w wersji 1.5.62.0 bez względu na uruchomioną wersję wykonywalną.
jeśli (!db.Load(1, 5, 62, 0))
{
_FATALERROR("Nie udało się załadować bazy danych dla wersji 1.5.62.0!");
zwróć fałsz;
}

// Zapisz plik o nazwie offsets-1.5.62.0.txt, w którym każdy wiersz będzie zawierał identyfikator i przesunięcie.
db.Dump("offsets-1.5.62.0.txt");
_MESSAGE("Zrzucone przesunięcia dla 1.5.62.0");
zwróć wartość true;
}



Zamiast 1, 5, 62, 0 wpisz wersję, którą cofasz i z którą jesteś zaznajomiony. Najpierw musisz mieć odpowiedni plik bazy danych w katalogu /Data/SKSE/Plugins.

Po wywołaniu tej komendy w głównym katalogu Skyrim powinien pojawić się nowy plik o nazwie „offsets-1.5.62.0.txt” lub innej, którą podasz jako nazwę pliku. Będzie on miał format, w którym każda linia będzie wyglądać następująco:
Identyfikator dziesiętnyPrzesunięcie szesnastkowe

Na przykład, jeśli masz adres 142F4DEF8 (statyczny wskaźnik postaci gracza) w wersji 1.5.62.0 i chcesz, aby był niezależny od wersji, wykonaj następujące czynności:
1. Wyszukaj 2F4DEF8 w pliku offsetów. Ponieważ jest to offset bez podstawy 140000000
2. Sprawdź, czy ID wynosi 517014 (liczba dziesiętna!)
3. Jeśli chcesz, aby ten adres znajdował się w bibliotece DLL w czasie wykonywania, wykonaj następujące czynności:


void* addressOf142F4DEF8 = db.FindAddressById(517014);


I tak to wygląda.

Struktura VersionDb ma następujące funkcje:
Spoiler:
Pokazywać


bool Dump(const std::string& path); // Zrzuć aktualnie załadowaną bazę danych do pliku
bool Load(int major, int minor, int revision, int build); // Załaduj określoną wersję, jeśli plik db-major-minor-revision-build.bin znajduje się w katalogu Data/SKSE/Plugins
bool Load(); // Załaduj wersję dla bieżącej aplikacji
void Clear(); // Wyczyść aktualnie załadowaną bazę danych
void GetLoadedVersion(int& major, int& minor, int& revision, int& build) const; // Pobierz wersję pliku bazy danych, którą aktualnie załadowaliśmy
bool GetExecutableVersion(int& major, int& minor, int& revision, int& build) const; // Pobierz wersję aktualnie wykonywanej aplikacji
const std::string& GetModuleName() const; // Pobierz nazwę aktualnie załadowanego modułu bazy danych, powinno to być „SkyrimSE.exe”
const std::string& GetLoadedVersionString() const; // Pobierz aktualnie załadowaną wersję jako ciąg znaków, np. „1.5.62.0”
stała std::map& GetOffsetMap() const; // Pobierz mapę ID do przesunięcia, jeśli musisz ją ręcznie powtórzyć
void* FindAddressById(unsigned long long id) const; // Znajdź adres po ID, adres będzie zawierał bazę i będzie poprawnym adresem. Zwróci NULL, jeśli nie zostanie znaleziony!
bool FindOffsetById(unsigned long long id, unsigned long long& result) const; // Znajdź przesunięcie według ID, będzie to po prostu przesunięcie bez uwzględnienia podstawy.
bool FindIdByAddress(void* ptr, unsigned long long& result) const; // Znajdź ID według adresu, spowoduje to próbę odwrotnego wyszukiwania w celu konwersji adresu na ID
bool FindIdByOffset(unsigned long long offset, unsigned long long& result) const; // Znajdź ID według przesunięcia, spowoduje to próbę odwrotnego wyszukiwania w celu konwersji przesunięcia na ID



Rzeczy, które powinieneś wiedzieć i o których powinieneś pamiętać:

1. Możesz dołączyć dowolny (lub wszystkie) pliki bazy danych do swojej wtyczki, ale może to znacznie zwiększyć rozmiar pliku (o około 2,5 MB). Do tej pory powszechnie oznaczano ten mod jako zależność.

2. ZAWSZE należy ładować bazę danych tylko raz podczas uruchamiania, inicjalizować/buforować potrzebne adresy i pozwolić jej się rozładować. Rozładowanie oznacza jedynie usunięcie lub utratę struktury VersionDb (jeśli została przydzielona na stosie). Dzięki temu unikniesz niepotrzebnego zużycia pamięci podczas gry. Nie ma potrzeby utrzymywania bazy danych w stanie załadowanym podczas rozgrywki. To bezcelowe, jeśli używasz biblioteki CommonLib, ponieważ ładuje ona bazę tylko raz, a nie dla każdej biblioteki DLL.

3. Baza danych zawiera adresy funkcji, zmiennych globalnych, RTTI, tabel wirtualnych i wszystkiego innego, co może się do niej odwoływać. Nie zawiera adresów znajdujących się pomiędzy funkcjami ani pomiędzy zmiennymi globalnymi. Jeśli potrzebujesz adresu w środku funkcji, powinieneś wyszukać adres bazowy funkcji i samodzielnie dodać dodatkowe przesunięcie. Nie zawiera również zbędnych elementów, takich jak wyrównanie wokół funkcji (do których odwołuje się rdata), odrzucenie sekcji pdata i odrzucenie niektórych informacji SEH wygenerowanych przez kompilator z rdata.

4. Zawsze należy sprawdzać wynik, aby upewnić się, że baza danych została załadowana pomyślnie (funkcja „bool” zwróciła wartość true) i że adresy, do których wysłano zapytanie, rzeczywiście zwróciły prawidłowy wynik (nie NULL). Jeśli ładowanie się nie powiedzie, oznacza to, że plik najprawdopodobniej nie miał wersji lub był w złej wersji (np. próbowano użyć nagłówka SE w AE). Jeśli zapytanie się nie powiedzie, oznacza to, że adresu nie można znaleźć w tej wersji. Może to oznaczać, że kod gry uległ wystarczającej zmianie, przez co adres nie jest już prawidłowy dla tej wersji, LUB że sama baza danych nie wykryła prawidłowego adresu. Jeśli wystąpi którykolwiek z tych problemów, należy nie zainicjować wtyczki, aby poinformować SKSE o nieprawidłowym załadowaniu. Można również ręcznie wyświetlić komunikat o błędzie.

5. Najlepiej byłoby również sprawdzić, czy adres istnieje we wszystkich wersjach gry przed opublikowaniem wtyczki DLL. W tym celu załaduj każdą wersję pliku bazy danych i wyszukaj w każdej z nich ten sam identyfikator adresu, aby upewnić się, że istnieje:
Spoiler:
Pokazywać


bool ZaładujWszystko(std::wektor& Wszystko)
{
statyczna int wersje[] = { 3, 16, 23, 39, 50, 53, 62, 73, 80, 97, -1 };
dla (int i = 0; wersje[i] >= 0; i++)
{
VersionDb * db = nowa VersionDb();
jeśli (!db->Load(1, 5, wersje[i], 0))
{
usuń bazę danych;
zwróć fałsz;
}
all.push_back(db);
}
zwróć wartość true;
}

bool ExistsInAll(std::vector& wszystko, unsigned long long id)
{
unsigned long long wynik = 0;
dla (auto db : all)
{
jeśli (!db->FindOffsetById(id, wynik))
zwróć fałsz;
}
zwróć wartość true;
}

void FreeAll(std::vector& Wszystko)
{
dla (auto db : all)
usuń bazę danych;
wszystko.wyczyść();
}

wartość logiczna IsOk()
{
std::vectorWszystko;
jeśli (!LoadAll(wszystko))
{
_FATALERROR("Nie udało się załadować jednej lub więcej wersji baz danych dla bieżącego pliku wykonywalnego!");
FreeAll(wszystko);
zwróć fałsz;
}

jeśli (!ExistsInAll(wszystko, 517014))
{
_FATALERROR("517014 nie istnieje we wszystkich wersjach bazy danych!");
FreeAll(wszystko);
zwróć fałsz;
}

FreeAll(wszystko);
// OK!
zwróć wartość true;
}



W ten sposób możesz mieć pewność, że Twój mod DLL będzie działał we wszystkich wersjach. Jeśli nie działa w niektórych wersjach, możesz napisać o tym na stronie moda.

6. Czasami trzeba zrobić coś innego w zależności od wersji gry. Możesz to zrobić za pomocą tego fragmentu kodu:
Spoiler:
Pokazywać


int major = 0, minor = 0, revision = 0, build = 0;
jeśli (!db.GetExecutableVersion(główna, poboczna, rewizja, kompilacja))
{
_FATALERROR("Coś poszło nie tak!");
zwróć fałsz;
}

// Gra działa w wersji 1.5.x i ma co najmniej wersję 1.5.39.0
jeśli (główna == 1 i poboczna == 5 i rewizja >= 39)
{
// Rzeczy ... ?
}



7. Pamiętaj: jeśli kompilujesz bibliotekę DLL SKSE w trybie debugowania, czas ładowania bazy danych może wynieść około 14 sekund! W trybie release jest to około 0,2 sekundy. Wynika to z faktu, że kontenery bibliotek standardowych są bardzo powolne w tym trybie (mapa std).


Uprawnienia

Rób co chcesz.

Najlepsze mody do Multiverse Loot Hunter

Odkryj najlepsze mody do Multiverse Loot Hunter, które wprowadzają nowe funkcje, ulepszoną grafikę i ekscytujące sposoby przekształcenia rozgrywki.

Odblokuj pełny potencjał Multiverse Loot Hunter z Xmod — odkryj dziś te najlepsze mody!

mcafee
Uwierzytelnianie
Zaufane przez 200,000,000+ użytkowników

Potrzebujesz pomocy z pobieraniem lub instalacją? Dołącz do naszej społeczności Discord po wsparcie!

logo
Język

Rozwiązania dla graczy

Zasoby

Wzmacniacz

Śledź nas na

discordfacebooktwitteryoutube
dc@xmodhub.com or cathy@business.xmodhub.com
Discord: catherine_79237
Regulamin
Polityka prywatności
Wsparcie

Larvas Limited

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