def ApplyItemSaveGameData(caller: unrealsdk.UObject, function: unrealsdk.UFunction, params: unrealsdk.FStruct) -> bool: inv_manager = caller.GetPawnInventoryManager() is_local = caller.IsLocalPlayerController() for idx, saved_item in enumerate(params.SaveGame.ItemData): if saved_item.bEquipped: if caller.Role == 3: # ROLE_Authority ServerSetItemSaveGameData(caller, idx, saved_item.DefinitionData, saved_item.Quantity, saved_item.bEquipped, saved_item.Mark) continue if is_local: inv_manager.ClientAddItemToBackpack( expand_item_definition_data(saved_item.DefinitionData), saved_item.Quantity, saved_item.Mark, False, 14) if is_local: caller.UnloadableDlcItemData = list( params.SaveGame.UnloadableDlcItemData) caller.ServerItemSaveGameDataCompleted() return False
def ApplyDLCInventorySaveGameData(caller: unrealsdk.UObject, function: unrealsdk.UFunction, params: unrealsdk.FStruct) -> bool: """ It doesn't seem like this is actually called anywhere, but better safe than sorry. """ if not caller.IsLocalPlayerController(): caller.ServerItemSaveGameDataCompleted() return False inv_manager = caller.GetPawnInventoryManager() for idx, saved_item in enumerate(params.ItemData): if saved_item.bEquipped: ServerSetItemSaveGameData(caller, idx, saved_item.DefinitionData, saved_item.Quantity, saved_item.bEquipped, saved_item.Mark) continue inv_manager.ClientAddItemToBackpack( expand_item_definition_data(saved_item.DefinitionData), saved_item.Quantity, saved_item.Mark, False, 14) for idx, saved_weap in enumerate(params.WeaponData): if saved_weap.QuickSlot != 0: ServerSetWeaponSaveGameData(caller, idx, saved_weap.DefinitionData, saved_weap.QuickSlot, saved_weap.Mark) continue inv_manager.ClientAddWeaponToBackpack( expand_weapon_definition_data(saved_weap.DefinitionData), saved_weap.Mark, False, 14) inv_manager.UpdateBackpackInventoryCount() caller.ServerItemSaveGameDataCompleted() return False
def ApplyWeaponSaveGameData(caller: unrealsdk.UObject, function: unrealsdk.UFunction, params: unrealsdk.FStruct) -> bool: """ We need to call `FixupSavedWeapons` at the start here, but it uses an out argument. If we block `ValidateWeaponDefinition` and `IsLocalPlayerController`, so they return false, this function will do nothing except make that call for us """ unrealsdk.RunHook( "WillowGame.WillowPlayerController.IsLocalPlayerController", __name__, Block) unrealsdk.RunHook( "WillowGame.WillowPlayerController.ValidateWeaponDefinition", __name__, Block) caller.ApplyWeaponSaveGameData(params.SaveGame) unrealsdk.RemoveHook( "WillowGame.WillowPlayerController.IsLocalPlayerController", __name__) unrealsdk.RemoveHook( "WillowGame.WillowPlayerController.ValidateWeaponDefinition", __name__) # Now we can recreate the call like normal inv_manager = caller.GetPawnInventoryManager() is_local = caller.IsLocalPlayerController() for idx, saved_weap in enumerate(params.SaveGame.WeaponData): if saved_weap.QuickSlot != 0: if caller.Role == 3: # ROLE_Authority ServerSetWeaponSaveGameData(caller, idx, saved_weap.WeaponDefinitionData, saved_weap.QuickSlot, saved_weap.Mark) continue if is_local: inv_manager.ClientAddWeaponToBackpack( expand_weapon_definition_data(saved_weap.WeaponDefinitionData), saved_weap.Mark, False, 14) if is_local: caller.UnloadableDlcWeaponData = list( params.SaveGame.UnloadableDlcWeaponData) caller.ServerItemSaveGameDataCompleted() return False
def GeneratePlayerSaveGame(caller: unrealsdk.UObject, function: unrealsdk.UFunction, params: unrealsdk.FStruct) -> bool: # This hook is also called when you load into any map, after the load hook # It doesn't break anything so might as well let it new_save = SaveManager(caller.SaveGameName) existing_save = SaveManager(caller.SaveGameName) existing_save.load() for item in get_all_items_and_weapons(caller.GetPawnInventoryManager()): if item.Class.Name == "WillowWeapon" and not item.CanBeSaved(): continue new_save.add_item(item.DefinitionData, item.Class.Name == "WillowWeapon", existing_save) new_save.write() return True