디아블로 2 싱글 플레이 환경에서의 PlugY 플러그인 구성 및 매개변수 최적화

PlugY 아키텍처 및 로컬 환경 통합

디아블로 2 싱글 플레이 환경은 기본적으로 제한된 인벤토리 크기와 래더(Ladder) 전용 기능의 부재라는 기술적 제약이 존재합니다. PlugY 플러그인은 게임 클라이언트의 메모리 패치와 DLL 인젝션을 통해 이러한 제약을 해제하고, 로컬 환경에서 다중 페이지 스태시(보관함), 스탯/스킬 초기화, 그리고 서버 종속 이벤트 트리거를 활성화합니다.

자동화 스크립트를 통한 설치 및 디렉터리 구성

수동 파일 복사 과정에서 발생할 수 있는 경로 오류를 방지하기 위해, PowerShell 스크립트를 사용하여 아카이브를 다운로드하고 게임 루트 디렉터리에 자동으로 압축을 해제합니다.

# PlugY 리소스 다운로드 및 디렉터리 구조 초기화
$releaseUrl = "http://plugy.free.fr/PlugY_The_Survival_Kit_v11.02.zip"
$targetArchive = ".\PlugY_Package.zip"
$gameRootDir = "C:\Games\Diablo II"

Invoke-WebRequest -Uri $releaseUrl -OutFile $targetArchive
Expand-Archive -Path $targetArchive -DestinationPath $gameRootDir -Force

# 실행 파일 패치 프로세스 호출
$patcherExecutable = Join-Path -Path $gameRootDir -ChildPath "PlugY_Install.exe"
Start-Process -FilePath $patcherExecutable -ArgumentList "-auto" -Wait

메모리 패치 모듈 및 INI 매개변수 재정의

PlugY의 핵심 동작 방식은 PlugY.ini 파일의 키-값 쌍을 파싱하여 게임 실행 시 메모리 주소에 패치를 적용하는 것입니다. 아래의 스크립트는 다중 스태시와 스탯 재할당 모듈을 활성화하기 위한 구성 파일을 프로그래밍 방식으로 생성합니다.

# 핵심 기능 활성화를 위한 INI 매개변수 매핑
$coreModules = @"
[LAUNCHING]
Param=
Library=PlugY.dll

[GENERAL]
ActivePlugin=1
ActiveLogFile=0

[STASH]
ActiveBigStash=1
ActiveMultiPageStash=1
NbPagesPerIndex=10
ActiveSharedStash=1
MaxPersonnalPages=0

[STATS POINTS]
ActiveStatsUnassignment=1
KeyUsed=17

[SKILLS POINTS]
ActiveSkillsUnassignment=1
"@

$iniTargetPath = Join-Path -Path $gameRootDir -ChildPath "PlugY\PlugY.ini"
$coreModules | Out-File -FilePath $iniTargetPath -Encoding ASCII

위 설정에서 KeyUsed=17은 단축키를 Alt(18)에서 Ctrl(17)로 재매핑한 것입니다. MaxPersonnalPages=0은 개인 스태시 페이지의 하드코딩된 제한을 무제한으로 설정하는 매개변수입니다.

래더 전용 이벤트 및 우버 퀘스트 트리거 설정

싱글 플레이에서는 기본적으로 비활성화된 월드 이벤트(World Event)와 우버 퀘스트(Uber Quest)는 특정 메모리 플래그를 조작하여 로컬에서 강제로 트리거할 수 있습니다. 해시 테이블을 사용하여 고급 이벤트 매개변수를 동적으로 주입합니다.

# 월드 이벤트 및 우버 퀘스트 트리거 구성
$advancedTriggers = @{
    "WORLD EVENT" = @{
        "ActiveWorldEvent" = 1
        "ShowCounterInAllDifficulty" = 0
        "ItemsToSell" = "The Stone of Jordan"
        "MonsterID" = 333
        "OwnSOJSoldChargeFor" = 100
    }
    "UBER QUEST" = @{
        "ActiveUberQuest" = 1
        "UberMephistoX" = 25130
        "UberDiabloX" = 25139
        "UberBaalX" = 25140
    }
}

foreach ($section in $advancedTriggers.Keys) {
    Add-Content -Path $iniTargetPath -Value "`n[$section]"
    foreach ($param in $advancedTriggers[$section].Keys) {
        $val = $advancedTriggers[$section][$param]
        Add-Content -Path $iniTargetPath -Value "$param=$val"
    }
}

MonsterID=333은 슈퍼 디아블로의 내부 엔티티 ID를 참조하며, UberMephistoXUberDiabloX는 트리스트럼(Tristram) 맵 내에서의 스폰 좌표 벡터를 정의합니다.

클라이언트 렌더링 및 언어 팩 오버라이드

창 모드 렌더링과 다국어 문자열 테이블 오버라이드는 [WINDOWED][LANGUAGE] 섹션을 통해 제어됩니다. 이는 GDI/GDI+ 렌더링 파이프라인과 문자열 리소스 포인터를 재할당합니다.

# 렌더링 및 지역화 설정 추가
$uiAndLocaleConfig = @"

[WINDOWED]
ActiveWindowed=1
RemoveBorder=1
WindowedResize=0

[LANGUAGE]
ActiveChangeLanguage=1
SelectedLanguage=KOR
AvailableLanguages=ENG|ESP|DEU|FRA|POR|ITA|JPN|KOR|SIN|CHI|POL|RUS
"@

Add-Content -Path $iniTargetPath -Value $uiAndLocaleConfig

프로세스 안정성 및 세이브 데이터 무결성 관리

메모리 패치 방식의 플러그인은 예기치 않은 프로세스 종료나 접근 위반(Access Violation) 발생 시 세이브 파일 손상을 유발할 수 있습니다. 이를 방지하기 위해 자동 백업 모듈을 활성화하여 I/O 스트림을 관리하고, 캐릭터 데이터의 스냅샷을 주기적으로 디스크에 기록합니다.

# 세이브 파일 무결성 관리 모듈 설정
$backupConfig = @"

[SAVEFILE]
ActiveAutoBackup=1
MaxBackupPerCharacter=15
"@
Add-Content -Path $iniTargetPath -Value $backupConfig

태그: diablo2 PlugY INI-Configuration PowerShell-Automation game-modding

7월 15일 03:35에 게시됨