logo
es
Español

Biblioteca de direcciones para SKSE Plugins

Creador: meh321
Actualizado:2020-02-24 19:31:54
2.8MB
mcafee
Autenticación
Confiado por 200,000,000+ usuarios

Acerca de este mod

Contiene un archivo de cabecera y una base de datos para hacer que los complementos SKSE DLL sean fácilmente independientes.
¡IMPORTANTE!Ahora está dividido en dos versiones: Edición Especial (1.5.x) y Edición Aniversario (1.6.x). Los ID que apuntan a las direcciones no coincidirán entre ambas versiones (el ejecutable del juego es demasiado diferente para coincidir, e incluso si coincidieran, el código dentro de esas funciones también es diferente).

Descripción

Para usuarios habituales del mod:Descarga e instala el paquete "todo en uno" desde la sección de archivos. Puedes usar el administrador de mods o hacerlo manualmente. Los archivos .bin deben ir aquí:
Datos/SKSE/Complementos/
No es necesario que leas el resto de esto.

Para los autores de complementos DLL de SKSE:
Este es un recurso para modders (un archivo de encabezado). Puedes cargar una base de datos que almacena las compensaciones para que tu plugin DLL sea independiente de la versión sin necesidad de recompilarlo. El archivo de encabezado se puede descargar desde la sección opcional de archivos. Para la Edición Aniversario, el archivo de encabezado se llama versionlibdb.h en lugar de versiondb.h. Si usas CommonLib, todo esto ya está integrado y no necesitas nada más.


Cómo utilizar

La forma más rápida:
Spoiler:
Espectáculo


#include "versiondb.h"

void * MiDirección = NULL;
unsigned long long MyOffset = 0;

bool InicializarDesplazamientos()
{
// Asignar en la pila para que se descargue cuando salgamos de esta función.
// No es necesario tener toda la base de datos cargada y utilizando memoria sin ningún motivo.
VersiónDb db;

// Cargar la base de datos con la versión ejecutable actual.
si (!db.Load())
{
_FATALERROR("¡Error al cargar la base de datos de versiones para el ejecutable actual!");
devuelve falso;
}
demás
{
// "SkyrimSE.exe", "1.5.97.0"
_MESSAGE("Base de datos cargada para %s versión %s.", db.GetModuleName().c_str(), db.GetLoadedVersionString().c_str());
}

// Esta dirección ya incluye la dirección base del módulo por lo que podemos usar la dirección directamente.
MiDirección = db.FindAddressById(123);
si (MiDirección == NULL)
{
_FATALERROR("¡No se pudo encontrar la dirección!");
devuelve falso;
}

// Este desplazamiento no incluye la dirección base. La dirección real sería ModuleBase + MyOffset.
si (!db.FindOffsetById(123, MyOffset))
{
_FATALERROR("¡No se pudo encontrar el desplazamiento para mi cosa!");
devuelve falso;
}

//Todo salió bien.
devuelve verdadero;
}



Ahora te estarás preguntando qué es ese valor "123". Es el ID de una dirección. Las bases de datos de diferentes versiones tendrán el mismo ID para una dirección, pero puede apuntar a valores diferentes. Para obtener una lista de todos los pares de ID y valor de una versión específica, haz lo siguiente:

Spoiler:
Espectáculo


#include "versiondb.h"

bool DumpSpecificVersion()
{
VersiónDb db;

// Intente cargar la base de datos de la versión 1.5.62.0 independientemente de la versión ejecutable que se esté ejecutando.
si (!db.Load(1, 5, 62, 0))
{
_FATALERROR("¡Error al cargar la base de datos para 1.5.62.0!");
devuelve falso;
}

// Escribe un archivo llamado offsets-1.5.62.0.txt donde cada línea es el ID y el desplazamiento.
db.Dump("offsets-1.5.62.0.txt");
_MESSAGE("Desplazamientos volcados para 1.5.62.0");
devuelve verdadero;
}



En lugar de 1, 5, 62 o 0, escriba la versión que está revirtiendo y con la que está familiarizado. Primero debe tener el archivo de base de datos correspondiente en el directorio /Data/SKSE/Plugins.

Después de ejecutar esto, debería aparecer un nuevo archivo en el directorio principal de Skyrim llamado "offsets-1.5.62.0.txt" o como lo hayas nombrado. Tendrá el formato de cada línea:
Identificación decimalDesplazamiento hexagonal

Por ejemplo, si tiene una dirección 142F4DEF8 (puntero estático del personaje del jugador) en 1.5.62.0 que desea que sea independiente de la versión, haría lo siguiente:
1. Busque 2F4DEF8 en el archivo de desplazamientos. Este es el desplazamiento sin la base 140000000.
2. Verifica que el ID sea 517014 (¡decimal!)
3. Si desea esta dirección en su DLL en tiempo de ejecución, haga lo siguiente:


vacío* direcciónOf142F4DEF8 = db.FindAddressById(517014);


Y ahí lo tienes.

La estructura VersionDb tiene las siguientes funciones:
Spoiler:
Espectáculo


bool Dump(const std::string& path); // Vuelca la base de datos cargada actualmente en un archivo
bool Load(int major, int minor, int revision, int build); // Cargar una versión específica si db-major-minor-revision-build.bin existe en el directorio Data/SKSE/Plugins
bool Load(); // Cargar la versión de la aplicación actual
void Clear(); // Limpiar la base de datos cargada actualmente
void GetLoadedVersion(int& major, int& minor, int& revision, int& build) const; // Obtener la versión del archivo de base de datos que hemos cargado en este momento
bool GetExecutableVersion(int& major, int& minor, int& revision, int& build) const; // Obtener la versión de la aplicación que se está ejecutando actualmente
const std::string& GetModuleName() const; // Obtener el nombre del módulo de base de datos cargado actualmente, esto debería mostrar "SkyrimSE.exe"
const std::string& GetLoadedVersionString() const; // Obtener la versión cargada actualmente como cadena, p. ej. "1.5.62.0"
constante std::mapa& GetOffsetMap() const; // Obtenga el mapa de ID a desplazar si necesita iterarlo manualmente
void* FindAddressById(unsigned long long id) const; // Buscar la dirección por ID; esto ya incluirá la base y será la dirección correcta. Devolverá NULL si no se encuentra.
bool FindOffsetById(unsigned long long id, unsigned long long& result) const; // Buscar el desplazamiento por ID, este solo será el desplazamiento sin la base incluida.
bool FindIdByAddress(void* ptr, unsigned long long& result) const; // Buscar ID por dirección, esto intentará una búsqueda inversa para convertir la dirección en ID
bool FindIdByOffset(unsigned long long offset, unsigned long long& result) const; // Buscar ID por desplazamiento, esto intentará una búsqueda inversa para convertir el desplazamiento en ID



Cosas que debes saber y tener en cuenta:

1. Puedes incluir cualquiera (o todos) los archivos de la base de datos con tu plugin, pero esto podría aumentar considerablemente el tamaño del archivo (unos 2,5 MB). Hasta ahora, se ha usado comúnmente marcar este mod como una dependencia.

2. Siempre debes cargar la base de datos solo una vez al iniciar, inicializar/almacenar en caché las direcciones que necesites y dejar que se descargue. Descargar solo significa que la estructura VersionDb se elimina o se pierde (si se asignó en la pila). Esto asegurará que no uses memoria innecesaria durante la ejecución del juego. No es necesario mantener la base de datos cargada durante el juego. Esto es irrelevante si usas CommonLib, ya que solo la carga una vez en lugar de por cada DLL.

3. La base de datos contiene direcciones de funciones, variables globales, RTTI, tablas virtuales y cualquier otro elemento que pueda hacer referencia a ella. No contiene direcciones que se encuentren entre funciones o variables globales. Si necesita una dirección entre funciones, debe buscar la dirección base de la función y añadir el desplazamiento adicional usted mismo. Tampoco contiene elementos innecesarios como la alineación alrededor de funciones (que se referencian en rdata); la sección pdata se descarta y se descarta parte de la información SEH generada por el compilador a partir de rdata.

4. Siempre debe verificar el resultado para asegurarse de que la base de datos se cargó correctamente (bool Load devolvió verdadero) y que las direcciones consultadas devolvieron un resultado válido (no NULL). Si falla la carga, probablemente significa que faltaba el archivo o que la versión era incorrecta (por ejemplo, al intentar usar el encabezado SE en AE). Si la consulta falla, significa que no se pudo encontrar la dirección en esa versión. Esto podría significar que el código del juego cambió lo suficiente como para que la dirección ya no sea válida para esa versión, o que la base de datos no detectó la dirección correcta. Si ocurre alguna de estas situaciones, debe hacer que falle la inicialización del complemento para informar a SKSE de que la carga no fue correcta. O bien, mostrar manualmente un mensaje de error.

5. También sería recomendable comprobar que la dirección exista en todas las versiones del juego antes de publicar el complemento DLL. Para ello, cargue cada versión del archivo de base de datos y consulte el mismo ID de dirección en cada una para comprobar su existencia:
Spoiler:
Espectáculo


bool CargarTodo(std::vector& todo)
{
static int versiones[] = { 3, 16, 23, 39, 50, 53, 62, 73, 80, 97, -1 };
para (int i = 0; versiones[i] >= 0; i++)
{
VersionDb * db = nueva VersionDb();
si (!db->Load(1, 5, versiones[i], 0))
{
eliminar base de datos;
devuelve falso;
}
todo.push_back(db);
}
devuelve verdadero;
}

bool ExisteEnTodos(std::vector& todos, unsigned long long id)
{
unsigned long long resultado = 0;
para (auto db : todos)
{
si (!db->FindOffsetById(id, resultado))
devuelve falso;
}
devuelve verdadero;
}

void FreeAll(std::vector& todo)
{
para (auto db : todos)
eliminar base de datos;
todo.clear();
}

bool IsOk()
{
std::vectortodo;
si (!CargarTodo(todos))
{
_FATALERROR("¡Error al cargar una o más bases de datos de versiones para el ejecutable actual!");
FreeAll(todos);
devuelve falso;
}

si (!ExisteEnTodos(todos, 517014))
{
_FATALERROR("517014 no existe en todas las versiones de la base de datos!");
FreeAll(todos);
devuelve falso;
}

FreeAll(todos);
// ¡De acuerdo!
devuelve verdadero;
}



De esta manera puedes estar seguro de que tu mod DLL funcionará en todas las versiones, o si no funciona en algunas versiones puedes escribirlo en tu página de mod.

6. A veces tendrás que hacer algo diferente según la versión del juego. Puedes hacerlo con este fragmento de código:
Spoiler:
Espectáculo


int mayor = 0, menor = 0, revisión = 0, compilación = 0;
si (!db.GetExecutableVersion(mayor, menor, revisión, compilación))
{
_FATALERROR("¡Algo salió mal!");
devuelve falso;
}

// El juego en ejecución es 1.5.x y al menos la versión 1.5.39.0
si (mayor == 1 y menor == 5 y revisión >= 39)
{
// Cosa ... ?
}



7. Tenga en cuenta que si compila su DLL de SKSE en modo de depuración, el tiempo de carga de la base de datos puede ser de unos 14 segundos. En modo de lanzamiento, este tiempo es de unos 0,2 segundos. Esto se debe a que los contenedores de la biblioteca estándar son muy lentos en ese modo (mapa estándar).


Permisos

Haz lo que quieras.

Mods principales para Multiverse Loot Hunter

Explora los mejores mods para Multiverse Loot Hunter que aportan nuevas funciones, gráficos mejorados y formas emocionantes de transformar tu experiencia de juego.

¡Desbloquea todo el potencial de Multiverse Loot Hunter con Xmod — explora estos mods principales hoy mismo!

mcafee
Autenticación
Confiado por 200,000,000+ usuarios

¿Necesitas ayuda con la descarga o instalación? Únete a nuestra comunidad de Discord para soporte!

logo
Idioma

Soluciones de juego

Recursos

Fogonadura

Síguenos en

discordfacebooktwitteryoutube
dc@xmodhub.com or cathy@business.xmodhub.com
Discord: catherine_79237
Términos y condiciones
Política de privacidad
Soporte

Larvas Limited

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