• 제품
  • 특징
  • Mod Master
  • 다운로드
  • 게임
  • 블로그
  • 요금

SKSE 플러그인용 주소 라이브러리

저자:meh321마지막 업데이트:2024-02-14 09:19:5421.1M2.3MB

The Elder Scrolls V: Skyrim Special Edition SKSE 플러그인용 주소 라이브러리-1-라고패스트 모드마스터

모드 소개

SKSE DLL 플러그인을 버전에 관계없이 쉽게 사용할 수 있도록 헤더 파일과 데이터베이스가 포함되어 있습니다.
중요해! 이것은 이제 특별 버전(1.5.x) 및 기념일 버전(1.6.x) 두 가지 버전으로 나뉜다. 주소를 가리키는 ID는 두 버전 사이에 일치하지 않습니다. 게임 실행 파일은 너무 다르며 일치할 수 없습니다. 해당 함수 내의 코드와 일치하더라도 어쨌든 다릅니다.

설명

일반 MOD 사용자의 경우: 파일 섹션에서 "올인원" 패키지를 다운로드하고 설치합니다. 모드 관리자를 사용하거나 수동으로 수행할 수 있습니다. . bin 파일은 여기에 있어야 합니다.
데이터/SKSE/플러그인/
이것의 나머지 부분을 읽을 필요가 없습니다.

skse dll 플러그인 작성자의 경우:
이것은 modder 리소스(헤더 파일)입니다. 오프셋을 저장하는 데이터베이스를 로드할 수 있으므로 dll 플러그인은 다시 컴파일할 필요가 없이 버전 독립적일 수 있습니다. 헤더 파일은 파일의 선택적 섹션에서 다운로드할 수 있습니다. 기념일 버전의 경우 헤더 파일은 versiondb.h 대신 versionlibdb.h라고 불립니다! 만약 당신이 commonlib를 사용하고 있다면, 이 모든 것이 이미 내장되어 있으며 여기에서 아무것도 필요하지 않습니다.


사용 방법

가장 빠른 방법:
스포일러:  
표시


# 'versiondb.h' 포함

void * MyAddress = NULL;
서명 없는 긴 긴 myoffset = 0;

bool InitializeOffsets ()
{
//스택에서 할당하므로 이 함수를 종료할 때 해제됩니다.
//전체 데이터베이스를 로드하고 이유 없이 메모리를 사용할 필요가 없습니다.
버전 db db;

//현재 실행 가능 버전으로 데이터베이스를 로드합니다.
if (! db.Load ())
{
_FATALERROR ("현재 실행 파일의 버전 데이터베이스를 로드하지 못했습니다!");

}
아니면
{
//"SkyrimSE.exe", "1.5.97.0"
_MESSAGE("%s version %s for loaded database. ", db.GetModuleName (). c_str (), db.GetLoadedVersionString (). c_str ());
}

//이 주소에는 이미 모듈의 기본 주소가 포함되어 있으므로 우리는 이 주소를 직접 사용할 수 있습니다.
MyAddress=db.FindAddressById(123);
if (MyAddress== NULL)
{
_FATALERROR("주소를 찾을 수 없습니다! ");
false 반환;
}

//이 간격띄우기에는 기본 주소가 포함되지 않습니다. 실제 주소는 modulebase + MyOffset입니다.
if (! db.FindOffsetById(123, MyOffset))
{
_FATALERROR ("내 물건의 간격띄우기를 찾을 수 없다!");

}

//모든 것이 성공적이었습니다.
참으로 돌아가다;
}



이제 여러분은 "123"값이 무엇인지 궁금해하고 있습니다. 이것은 주소의 ID입니다. 다른 버전 데이터베이스는 주소에 대해 동일한 ID를 가지지만 다른 값을 가리킬 수 있습니다. 특정 버전의 모든 ID 및 값 쌍의 목록을 가져오려면 다음을 수행합니다.

스포일러:  
표시


# 'versiondb.h' 포함

부울 덤프 SpecificVersion ()
{
버전 db db;

//실행 파일 버전에 관계없이 버전 1.5.62.0의 데이터베이스를 로드하십시오.
if (! db.Load(1,5,62,0))
{
_FATALERROR ("1.5.62.0 데이터베이스를 로드하지 못했습니다!");
false 반환;
}

//offsets-1.5.62.0.txt라는 파일을 작성합니다. 여기서 각 행은 ID와 offset입니다.
db.Dump("offsets-1.5.62.0.txt ");
_MESSAGE('1.5.62.0에 대한 덤핑 오프셋');
참으로 돌아가다;
}



1,5,62,0 대신 반전하고 익숙한 버전을 넣어라. 먼저 /Data/SKSE/plugins 디렉토리에 해당 데이터베이스 파일이 있어야 합니다.

이것을 호출한 후에 "offsets-1.5.62.0.txt"라는 새 파일이 메인 skyrim 디렉토리에 있어야 하거나 파일 이름으로 넣은 모든 것이 있어야 합니다. 각 행의 형식은 다음과 같습니다.
소진수 ID<tab>육각 간격띄우기<newline>

예를 들어 1.5.62.0에 주소 142f4def8 (플레이어 캐릭터 정적 포인터)가 있으면 버전과 독립적이어야 한다면 다음과 같습니다.
1. 간격띄우기 파일에서 2f4def8을 검색합니다. 왜냐하면 이것은 기본 140000000 없는 간격띄우기이기 때문입니다.
2. ID가 517014 (소수점!)
3. 이 주소를 실행 시 dll에 넣으려면 다음을 수행하십시오.


void * addressOf142F4DEF8 = db.FindAddressById(517014);


그리고 여기 있어요.

versiondb 구조는 다음과 같은 기능을 가지고 있습니다.
스포일러:  
표시


bool Dump(const std:: string & path); //현재 로드된 데이터베이스를 파일로 덤프
bool 로드(int major, int minor, int revision, int build); //data/SKSE/plugins 디렉토리에 db-major-minor-revision-build.bin이 있는 경우 특정 버전을 로드합니다.
bool Load (); //현재 응용 프로그램의 버전 로드
void Clear (); //현재 로드된 데이터베이스 지우기
void GetLoadedVersion(int & major, int & minor, int & revision, int & build) const; //우리가 지금 로드한 데이터베이스 파일의 버전을 가져오기
bool GetExecutableVersion(int & major, int & minor, int & revision, int & build) const; //현재 실행 중인 응용 프로그램의 버전 가져오기
const std:: string & GetModuleName () const; //현재 로드된 데이터베이스 모듈의 이름을 얻으면 "SkyrimSE.exe"가 표시되어야 합니다.
const std:: string & GetLoadedVersionString () const; //현재 로드된 버전을 문자열으로 가져오기 (예: "1.5.62.0")
const std::map<unsigned long long, unsigned long long>& GetOffsetMap () const; //수동으로 반복해야 할 경우 간격띄우기 ID의 맵을 가져와
void*FindAddressById(서명 없는 긴 긴 ID) const; //ID로 주소를 찾으면 이미 기본 주소가 포함되고 올바른 주소가 됩니다. 찾을 수 없으면 null을 반환합니다!
bool FindOffsetById(서명 없는 긴 긴 ID, 서명 없는 긴 긴 & result) const; //ID로 간격띄우기를 찾으면, 기준을 포함하지 않고 간격띄우기가 됩니다.
bool FindIdByAddress(void * ptr, unsigned long long & result) const; //주소별로 ID를 찾으면 주소를 ID로 변환하기 위해 역검색을 시도합니다.
bool FindIdByOffset (서명 없는 긴 긴 오프셋, 서명 없는 긴 긴 & result) const; //간격띄우기로 ID를 찾으면 역검색을 시도하여 간격띄우기를 ID로 변환합니다.



여러분이 알아야 하고 명심해야 할 사항:

1. 데이터베이스 파일의 모든 (또는 모든) 플러그인을 포함할 수 있지만 파일 크기가 상당히 증가할 수 있습니다(약 2.5mb). 지금까지 이 mod를 종속성으로 표시하는 것이 일반적이다.

2. 시작할 때 데이터베이스를 항상 한 번만 로드하고 필요한 주소를 초기화/캐시하고 로드하도록 해야 합니다. 언로드는 버전 db 구조가 삭제되거나 손실되는 것을 의미합니다 (스택에 할당된 경우). 이렇게 하면 게임 런타임 중에 불필요한 메모리를 사용하지 않는다. 게임 플레이 중에 데이터베이스를 로드할 필요가 없습니다. Commonlib를 사용하면 각 dll 대신 한 번만 로드되기 때문에 이것은 논쟁의 여지가 됩니다.

3. 데이터베이스에는 함수, 글로벌 변수, RTTI, vtables 및 그 데이터베이스에 대한 참조가 있을 수 있는 다른 모든 주소가 포함되어 있습니다. 함수 중간이나 글로벌 중간에 있는 주소는 포함되지 않습니다. 함수 중간에 주소가 필요하다면 함수 기본 주소를 찾아서 추가 간격띄우기를 스스로 추가해야 합니다. 또한 rdata에서 참조되는 함수 주위의 정렬과 같은 쓸모없는 물건도 포함되지 않고, pdata 섹션은 폐기되고, rdata에서 생성된 일부 컴파일러의 seh 정보는 폐기됩니다.

4. 데이터베이스가 성공적으로 로드되었는지 확인하려면 항상 결과를 확인하십시오 (bool load return true) 및 질의된 주소가 실제로 유효한 결과(null이 아닌) 를 반환했는지 확인해야 합니다. 로드가 실패하면 파일이 가장 가능성이 없거나 버전이 잘못되었음을 의미합니다 (예: ae에서 se 헤더를 사용하려고 시도합니다). 쿼리가 실패하면 주소가 해당 버전에서 찾을 수 없다는 것을 의미합니다. 이것은 게임 코드가 충분히 변경되어 주소가 해당 버전에 더 이상 유효하지 않거나 데이터베이스 자체가 올바른 주소를 감지하지 못했다는 것을 의미할 수 있습니다. 이러한 일 중 하나가 발생하면 플러그인 초기화에 실패하여 skse에게 올바르게 로드하지 않았음을 알려야 합니다. 또는 수동으로 오류 메시지를 표시합니다.

5. dll 플러그인을 게시하기 전에 게임의 모든 버전에 주소가 존재하는지 확인하려면 가장 좋습니다. 데이터베이스 파일의 각 버전을 로드하고 각 버전에서 동일한 주소 ID를 질의하여 존재하는지 확인하려면 다음과 같습니다.
스포일러:  
표시


bool LoadAll (std:: 벡터<VersionDb*>전체 (D)
{
정적 int 버전 [] = {3, 16, 23, 39, 50, 53, 62, 73, 80, 97, -1};
for (int i=0; version[i] > = 0; i ++)
{
VersionDb * db = new VersionDb ();
if (! db-> Load(1, 5, 버전 [i], 0))
{
db 삭제;
false 반환;
}
all.push_back(db);
}
참으로 돌아가다;
}

bool existensinall (std:: 벡터<VersionDb*>모든, 서명이 없는 긴 긴 ID)
{
서명 없는 긴 긴 결과 = 0;

{
if (! db-> FindOffsetById(id, result))

}
참으로 돌아가다;
}

void FreeAll(std:: vector<VersionDb*>전체 (D)
{
for(자동 db:all)
db 삭제;
all.clear ();
}

부울 IsOk ()
{
std:: 벡터<VersionDb*>모두;
if (! LoadAll (all))
{
_FATALERROR ("현재 실행 파일에 대해 하나 이상의 버전 데이터베이스를 로드하지 못했습니다!");
FreeAll (all);
false 반환;
}

if (! existensinall(all, 517014))
{
_FATALERROR("517014는 데이터베이스의 모든 버전에 존재하지 않습니다! ");


}

FreeAll (all);
//좋아!
참으로 돌아가다;
}



이렇게 하면 dll mod가 모든 버전에서 작동하거나 일부 버전에서 작동하지 않는 경우 mod 페이지에 작성할 수 있습니다.

6. 때로는 게임 버전을 실행하는 것에 따라 다른 일을 해야 합니다. 이 코드 조각을 사용하여 이렇게 할 수 있습니다.
스포일러:  
표시


int major = 0, minor = 0, revision = 0, build = 0;
if (! db.GetExecutableVersion(major, minor, revision, build))
{
_FATALERROR ("뭔가 잘못되었어!");
false 반환;
}

//실행 게임은 1.5.x 및 최소 1.5.39.0 버전입니다.
if (major == 1&&minor == 5&&revision > = 39)
{
//물건...?
}



7. 기억하십시오: 디버그 모드에서 skse dll을 컴파일하면 데이터베이스의 로드 시간은 약 14 초일 수 있습니다! 릴리스 모드에서는 약 0.2초입니다. 이것은 표준 라이브러리 컨테이너가 이 모드(std map) 에서 매우 느리기 때문입니다.


권한

네가 원하는 대로 하라.
본 도구는 타사 [bufftool]에서 제공합니다.주의 아이콘

지금 모드를 다운로드하세요

LagoFast를 설치하고 The Elder Scrolls V: Skyrim Special Edition을(를) 시작한 후 좋아하는 모드로 플레이해 보세요.