forked from juso40/bl2sdk_Mods
-
Notifications
You must be signed in to change notification settings - Fork 0
/
betterspawns.py
152 lines (132 loc) · 6.15 KB
/
betterspawns.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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
import unrealsdk
from . import bl2tools
import json
import os
def _get_map_name() -> str:
return unrealsdk.GetEngine().GetCurrentWorldInfo().GetStreamingPersistentMapName().lower()
class Spawns:
def __init__(self, path: str):
self.PATH: str = path
self.spawnpoints_path: str = os.path.join(self.PATH, "spawnpoint.json")
self.b_load_travel: bool = True
self.b_load_tp: bool = True
self.set_location_counter: int = 0
self.filename: str = ""
def Enable(self):
def hk_save_game(
caller: unrealsdk.UObject,
function: unrealsdk.UFunction,
params: unrealsdk.FStruct
) -> bool:
map_name: str = unrealsdk.GetEngine().GetCurrentWorldInfo().GetStreamingPersistentMapName().lower()
# Only save the spawn location if we are not in main menu
# And only save after we have set the spawn location
if map_name != "menumap" and not (self.b_load_tp and self.b_load_travel):
self.filename = params.Filename
self.save_spawn_station(
unrealsdk.GetEngine().GetCurrentWorldInfo().GRI.ActiveRespawnCheckpointTeleportActor
)
return True
def hk_load_save(
caller: unrealsdk.UObject,
function: unrealsdk.UFunction,
params: unrealsdk.FStruct
) -> bool:
if params.bIsInitialSpawn or params.bIsClassChange:
# We only want to set the spawn location on the first time the player spawns
self.b_load_travel = True
self.b_load_tp = True
self.set_location_counter = 0
pc = bl2tools.get_player_controller()
self.filename = pc.GetSaveGameNameFromid(pc.GetCachedSaveGame().SaveGameId)
return True
def hk_spawn_travel(
caller: unrealsdk.UObject,
function: unrealsdk.UFunction,
params: unrealsdk.FStruct
) -> bool:
map_name: str = _get_map_name()
if map_name in ("loader", "fakeentry"):
return True
# This only happens when the player used a normal travels station, not a FTStation
if self.b_load_travel:
self.b_load_travel = False
self.set_spawn_location(bl2tools.get_player_controller())
return False
return True
def hk_spawn_tp(
caller: unrealsdk.UObject,
function: unrealsdk.UFunction,
params: unrealsdk.FStruct
) -> bool:
map_name: str = _get_map_name()
if map_name in ("loader", "fakeentry"):
return True
# This only happens when the player used a normal travels station, not a FTStation
if self.b_load_tp:
self.b_load_tp = False
self.set_spawn_location(bl2tools.get_player_controller())
return True
unrealsdk.RegisterHook(
"WillowGame.WillowSaveGameManager.SaveGame",
"SaveGame_HookBSABT",
hk_save_game
)
unrealsdk.RegisterHook(
"WillowGame.WillowPlayerController.ShouldLoadSaveGameOnSpawn",
"LoadSaveBSABT",
hk_load_save
)
unrealsdk.RegisterHook(
"WillowGame.WillowPlayerController.ClientSetPawnLocation",
"TravelHookBSABT",
hk_spawn_travel
)
unrealsdk.RegisterHook(
"WillowGame.WillowPlayerController.StopTeleporterSound",
"SpawnHookBSABT",
hk_spawn_tp
)
def Disable(self):
unrealsdk.RemoveHook("WillowGame.WillowSaveGameManager.SaveGame", "SaveGame_HookBSABT")
unrealsdk.RemoveHook("WillowGame.WillowPlayerController.ShouldLoadSaveGameOnSpawn", "OnSpawn_HookBSABT")
unrealsdk.RemoveHook("WillowGame.WillowPlayerController.ClientSetPawnLocation", "TravelHookBSABT")
unrealsdk.RemoveHook("WillowGame.WillowPlayerController.StopTeleporterSound", "SpawnHookBSABT")
def save_spawn_station(self, station: unrealsdk.UObject):
my_spawn_dict = {}
if os.path.exists(self.spawnpoints_path):
# Load the existing spawnpoints
with open(self.spawnpoints_path, "r") as file:
try:
my_spawn_dict = json.load(file)
except Exception:
unrealsdk.Log("Error loading spawnpoint.json")
# Add the new spawnpoint
with open(self.spawnpoints_path, "w") as file:
exit_pos = station.ExitPoints[0].Location
exit_rot = station.ExitPoints[0].Rotation
my_spawn_dict[self.filename] = {
"MapName": _get_map_name(),
"SaveStation": bl2tools.get_obj_path_name(station),
"Position": (exit_pos.X, exit_pos.Y, exit_pos.Z),
"Rotation": (exit_rot.Pitch, exit_rot.Yaw, 0)
}
json.dump(my_spawn_dict, file, indent=4)
def set_spawn_location(self, pc: unrealsdk.UObject):
# Only if the spawnpoint file exists we can set the spawn location
if os.path.exists(self.spawnpoints_path):
with open(self.spawnpoints_path, "r") as file:
try:
my_spawn_dict = json.load(file)
# Check if the current map has is the same as the saved map
if _get_map_name() != my_spawn_dict[self.filename]["MapName"]:
return
last_save_station = unrealsdk.FindObject("Object", my_spawn_dict[self.filename]["SaveStation"])
gri = unrealsdk.GetEngine().GetCurrentWorldInfo().GRI
gri.ActiveRespawnCheckpointTeleportActor = last_save_station
pc.Pawn.Location = tuple(my_spawn_dict[self.filename]["Position"])
pc.Rotation = tuple(my_spawn_dict[self.filename]["Rotation"])
except Exception:
unrealsdk.Log("Could not load the spawnpoint.json")
else:
unrealsdk.Log(f"{self.spawnpoints_path} did not exist yet.")