89 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
from typing import List, Tuple
 | 
						|
from PyQt6.QtCore import QFileInfo
 | 
						|
import mobase
 | 
						|
from ..basic_game import BasicGame
 | 
						|
from ..basic_features import BasicModDataChecker, GlobPatterns
 | 
						|
 | 
						|
 | 
						|
class SPTGame(BasicGame, mobase.IPluginFileMapper):
 | 
						|
 | 
						|
    Name = "SPT Plugin"
 | 
						|
    Author = "Archon"
 | 
						|
    Version = "1.1.2"
 | 
						|
    GameName = "SPT"
 | 
						|
    GameShortName = "spt"
 | 
						|
    GameBinary = "SPT.Launcher.exe"
 | 
						|
    GameDataPath = "%GAME_PATH%"
 | 
						|
    GameSaveExtension = "json"
 | 
						|
    GameSavesDirectory = "%GAME_PATH%/user/profiles"
 | 
						|
 | 
						|
    def __init__(self):
 | 
						|
        super().__init__()
 | 
						|
        mobase.IPluginFileMapper.__init__(self)
 | 
						|
 | 
						|
    def init(self, organizer: mobase.IOrganizer) -> bool:
 | 
						|
        super().init(organizer)
 | 
						|
        if hasattr(self, '_featureMap'):
 | 
						|
            self._featureMap[mobase.ModDataChecker] = SPTModDataChecker()
 | 
						|
        else:
 | 
						|
            self._register_feature(SPTModDataChecker())
 | 
						|
        return True
 | 
						|
 | 
						|
    def executables(self) -> List[mobase.ExecutableInfo]:
 | 
						|
        execs = super().executables()
 | 
						|
        info = [
 | 
						|
            ["Multiplayer", "SPT.Launcher.exe"],
 | 
						|
        ]
 | 
						|
        gamedir = self.gameDirectory()
 | 
						|
        return [
 | 
						|
            mobase.ExecutableInfo(inf[0], QFileInfo(gamedir, inf[1])) for inf in info
 | 
						|
        ]
 | 
						|
 | 
						|
        """
 | 
						|
        A bat script file to bridge the environment to server and launcher.
 | 
						|
        """
 | 
						|
        workaroundPath = self._gamePath + "/sptvfsbridge.bat"
 | 
						|
 | 
						|
        try:
 | 
						|
            workaround = open(workaroundPath, "rt")
 | 
						|
        except FileNotFoundError:
 | 
						|
            with open(workaroundPath, "wt") as workaround:
 | 
						|
                workaround.write(
 | 
						|
                    """
 | 
						|
@echo off
 | 
						|
setlocal
 | 
						|
 | 
						|
set "launcher_path=SPT.Launcher.exe"
 | 
						|
set "server_path=SPT.Server.exe"
 | 
						|
 | 
						|
REM Launch the server.exe
 | 
						|
start "" "%server_path%"
 | 
						|
 | 
						|
REM Wait for a moment to ensure the server.exe has started
 | 
						|
timeout /t 5 /nobreak >nul
 | 
						|
 | 
						|
REM Launch the launcher.exe
 | 
						|
start "" "%launcher_path%"
 | 
						|
 | 
						|
endlocal
 | 
						|
"""
 | 
						|
                )
 | 
						|
        workaround.close()
 | 
						|
 | 
						|
        execs.append(
 | 
						|
            mobase.ExecutableInfo("Singleplayer", QFileInfo(workaroundPath))
 | 
						|
        )
 | 
						|
        execs.pop(0)
 | 
						|
        return execs
 | 
						|
 | 
						|
    def mappings(self) -> list[mobase.Mapping]:
 | 
						|
        return []
 | 
						|
 | 
						|
class SPTModDataChecker(BasicModDataChecker):
 | 
						|
    def __init__(self, patterns: GlobPatterns = GlobPatterns()):
 | 
						|
        super().__init__(
 | 
						|
            GlobPatterns(
 | 
						|
                valid=["BepInEx", "User"],
 | 
						|
                move={"plugins": "BepInEx/", "patchers": "BepInEx/", "package.json": "User/Mods/", "*.dll": "BepInEx/plugins/", "*": "User/Mods/"},
 | 
						|
            ).merge(patterns),
 | 
						|
        ) |