-
Notifications
You must be signed in to change notification settings - Fork 104
/
savegamemanager.py
117 lines (99 loc) · 4.38 KB
/
savegamemanager.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import json
import os
import unrealsdk
from .challengemanager import ChallengeManagerInstance
def _get_pc() -> unrealsdk.UObject:
return unrealsdk.GetEngine().GamePlayers[0].Actor
class SaveGameManager:
def __init__(self, module_path: str) -> None:
self.module_path: str = module_path
self.save_file_name: str = ""
self.player_progress: dict = {}
def enable(self) -> None:
self.player_progress = {}
self.try_update_file_name_from_cached_save_game()
self.load()
self.register_hooks()
def disable(self) -> None:
self.save()
self.player_progress = {}
self.remove_hooks()
def register_hooks(self) -> None:
def launch_save_game(
caller: unrealsdk.UFunction,
function: unrealsdk.UFunction,
params: unrealsdk.FStruct,
) -> bool:
"""Player pressed 'CONTINUE'."""
self.load() # Make sure we have the latest save data
return True
def set_pt(
caller: unrealsdk.UFunction,
function: unrealsdk.UFunction,
params: unrealsdk.FStruct
) -> bool:
"""Playthrough Changed."""
self.load(params.InCurrPlaythrough)
return True
def save_game(
caller: unrealsdk.UObject,
function: unrealsdk.UFunction,
params: unrealsdk.FStruct
) -> bool:
"""Save the players stats."""
self.save_file_name = f"{params.Filename.split('.')[0]}.json"
self.save()
return True
def player_loaded_save(
caller: unrealsdk.UObject,
function: unrealsdk.UFunction,
params: unrealsdk.FStruct
) -> bool:
"""Player Loaded Save into game."""
self.save_file_name = f"{params.Filename.split('.')[0]}.json"
self.load()
return True
unrealsdk.RegisterHook("WillowGame.WillowGFxMovie.LaunchSaveGame", str(id(self)), launch_save_game)
unrealsdk.RegisterHook("WillowGame.WillowGameReplicationInfo.SetCurrentPlaythrough", str(id(self)), set_pt)
unrealsdk.RegisterHook("WillowGame.WillowSaveGameManager.SaveGame", str(id(self)), save_game)
unrealsdk.RegisterHook("WillowGame.WillowSaveGameManager.BeginLoadGame", str(id(self)), player_loaded_save)
def remove_hooks(self) -> None:
unrealsdk.RemoveHook("WillowGame.WillowGFxMovie.LaunchSaveGame", str(id(self)))
unrealsdk.RemoveHook("WillowGame.WillowGameReplicationInfo.SetCurrentPlaythrough", str(id(self)))
unrealsdk.RemoveHook("WillowGame.WillowSaveGameManager.SaveGame", str(id(self)))
unrealsdk.RemoveHook("WillowGame.WillowSaveGameManager.BeginLoadGame", str(id(self)))
def try_update_file_name_from_cached_save_game(self) -> bool:
"""Returns True if the file name was updated."""
pc = _get_pc()
save_game = pc.GetCachedSaveGame()
if save_game:
f = pc.GetSaveGameNameFromid(save_game.SaveGameId)
if f:
self.save_file_name = f.split(".")[0] + ".json"
return True
return False
def save(self) -> None:
if not self.save_file_name:
return
try:
with open(os.path.join(self.module_path, self.save_file_name), "r") as file:
self.player_progress = json.load(file)
except FileNotFoundError:
self.player_progress = {} # provide a new dict
ChallengeManagerInstance.save_challenges(self.player_progress)
with open(os.path.join(self.module_path, self.save_file_name), "w") as file:
json.dump(self.player_progress, file, indent=2)
def load(self, new_pt=None) -> None:
if self.save_file_name == "":
if not self.try_update_file_name_from_cached_save_game():
self.player_progress = {}
return
try:
with open(os.path.join(self.module_path, self.save_file_name), "r") as file:
self.player_progress = json.load(file)
except (FileNotFoundError, TypeError):
self.player_progress = {}
if new_pt is not None:
ChallengeManagerInstance.load_challenges(self.player_progress, new_pt)
else:
ChallengeManagerInstance.load_challenges(self.player_progress)