
    aAX                     b	   % S SK r S SKJrJr  SSKJrJrJrJr  SSK	J
r
Jr  \\ R                  \ R                  \ R                  /\4   r0 r\\\4   \S'   S\S\\/\4   4S	 jrS
\ R                  S\ R                  S\ R                  S\4S jr\" S5      r \" S5      S
\ R                  S\ R                  S\ R                  S\4S j5       r\" S5      S
\ R                  S\ R                  S\ R                  S\4S j5       r\" S5      S
\ R                  S\ R                  S\ R                  S\4S j5       r \" S5      S
\ R                  S\ R                  S\ R                  S\4S j5       r\" S5      S
\ R                  S\ R                  S\ R                  S\4S j5       rS
\ R                  S\S\ R                  S\S\S\SS4S jrS
\ R                  S\S\ R                  S\S\SS4S  jr \" S!5      S
\ R                  S\ R                  S\ R                  S\4S" j5       rS#\S$\ R                  SS4S% jr \" S&5      S
\ R                  S\ R                  S\ R                  S\4S' j5       r!S(q"\\S)'   \" S*5      S
\ R                  S\ R                  S\ R                  S\4S+ j5       r#S
\ R                  S\ R                  S\ R                  S\4S, jr$\ RJ                  " S-\&\$5        \ RJ                  " S.\&\$5         \" S/5      \" S05      S
\ R                  S\ R                  S\ R                  S\4S1 j5       5       r' \" S25      S
\ R                  S\ R                  S\ R                  S\4S3 j5       r(\" S45      S
\ R                  S\ R                  S\ R                  S\4S5 j5       r) \" S65      \" S75      S
\ R                  S\ R                  S\ R                  S\4S8 j5       5       r*\" S95      S
\ R                  S\ R                  S\ R                  S\4S: j5       r+\" S;5      S
\ R                  S\ R                  S\ R                  S\4S< j5       r,S=q-\\S>'   S=q.\\S?'   S@\SS4SA jr/\" SB5      S
\ R                  S\ R                  S\ R                  S\4SC j5       r0g)D    N)CallableDict   )DefDataTupleexpand_item_definition_dataexpand_weapon_definition_dataget_all_items_and_weapons)
STASH_NAMESaveManagerAllHookshookreturnc                 0   ^  S[         S[         4U 4S jjnU$ )N_funcr   c                    > U [         T'   U $ N)r   )r   r   s    \Z:\mnt\Skyabridged\SteamLibrary\steamapps\common\Borderlands 2\sdk_mods\SanitySaver\hooks.py	decoratorhook.<locals>.decorator   s        )SDKHook)r   r   s   ` r   r   r      s     W  r   callerfunctionparamsc                     g)zWJust a small helper for a few places we need to unconditionally block a function call. F r   r   r   s      r   Blockr      s    r   	_mementosz?WillowGame.WillowPlayerController.ApplyDLCInventorySaveGameDatac           	         U R                  5       (       d  U R                  5         gU R                  5       n[        UR                  5       H  u  pEUR
                  (       a:  [        U UUR                  UR                  UR
                  UR                  5        MP  UR                  [        UR                  5      UR                  UR                  SS5        M     [        UR                  5       Hu  u  pFUR                  S:w  a/  [        U UUR                  UR                  UR                  5        MD  UR                  [!        UR                  5      UR                  SS5        Mw     UR#                  5         U R                  5         g)zSIt doesn't seem like this is actually called anywhere, but better safe than sorry. F   r   )IsLocalPlayerControllerServerItemSaveGameDataCompletedGetPawnInventoryManager	enumerateItemData	bEquippedServerSetItemSaveGameDataDefinitionDataQuantityMarkClientAddItemToBackpackr   
WeaponData	QuickSlotServerSetWeaponSaveGameDataClientAddWeaponToBackpackr   UpdateBackpackInventoryCount)r   r   r   inv_manageridx
saved_item
saved_weaps          r   ApplyDLCInventorySaveGameDatar6   &   sN    ))++..0002K$V__5%))##$$ ++'
(A(ABOO	
 6& %V%6%671$'))$$ --)**C*CDOO		
 8" ,,.
**,r   z7WillowGame.WillowPlayerController.ApplyItemSaveGameDatac           	      J   U R                  5       nU R                  5       n[        UR                  R                  5       H  u  pVUR
                  (       aJ  U R                  S:X  a8  [        U UUR                  UR                  UR
                  UR                  5        M`  U(       d  Mi  UR                  [        UR                  5      UR                  UR                  SS5        M     U(       a$  [        UR                  R                  5      U l        U R                  5         g)N   Fr!   )r$   r"   r%   SaveGamer&   r'   Roler(   r)   r*   r+   r,   r   listUnloadableDlcItemDatar#   )r   r   r   r2   is_localr3   r4   s          r   ApplyItemSaveGameDatar>   Z   s    002K--/H$V__%=%=>{{a)--''((OO 8//+J,E,EF## ?* '+FOO,Q,Q'R$
**,r   z9WillowGame.WillowPlayerController.ApplyWeaponSaveGameDatac                 >   [         R                  " S[        [        5        [         R                  " S[        [        5        U R	                  UR
                  5        [         R                  " S[        5        [         R                  " S[        5        U R                  5       nU R                  5       n[        UR
                  R                  5       H  u  pVUR                  S:w  a?  U R                  S:X  a-  [        U UUR                  UR                  UR                  5        MT  U(       d  M]  UR!                  [#        UR                  5      UR                  SS5        M     U(       a$  [%        UR
                  R&                  5      U l        U R)                  5         g)z
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
z9WillowGame.WillowPlayerController.IsLocalPlayerController:WillowGame.WillowPlayerController.ValidateWeaponDefinitionr   r8   Fr!   )	unrealsdkRunHook__name__r   ApplyWeaponSaveGameDatar9   
RemoveHookr$   r"   r%   r-   r.   r:   r/   WeaponDefinitionDatar+   r0   r   r;   UnloadableDlcWeaponDatar#   )r   r   r   r2   r=   r3   r5   s          r   rD   rD   {   s=    QS[]bcRT\^cd
""6??3TV^_UW_` 002K--/H$V__%?%?@1${{a+33((OO 811-j.M.MN	 A& )-foo.U.U)V&
**,r   z;WillowGame.WillowPlayerController.ServerSetItemSaveGameDatac                     [        XR                  UR                  UR                  UR                  UR
                  5        gNF)r(   Indexr)   r*   r'   r+   r   s      r   ServerSetItemSaveGameData_HookrK      s1    fllF4I4I6??\b\l\lntnynyzr   z=WillowGame.WillowPlayerController.ServerSetWeaponSaveGameDatac                 p    [        XR                  UR                  UR                  UR                  5        grI   )r/   rJ   r)   r.   r+   r   s      r    ServerSetWeaponSaveGameData_HookrM      s*    f6K6KVM]M]_e_j_jkr   r3   def_dataquantityequippedmarkc                    U R                  UR                  R                  5      nUc  g U R                  5       nSUl        UR                  [        U5      US5        X6l        UR                  U5        UR                  Xt5        g )Nr!   F)
SpawnItemDefinitionInventoryClassGetInventoryPawnItemLocationInitializeFromDefinitionDatar   r*   SetMarkGiveTo)r   r3   rN   rO   rP   rQ   iteminv_pawns           r   r(   r(      su    <<//>>?D|&&(HD%%#H-
 MLLKK#r   slotc                 4   U R                  UR                  R                  5      nUc  g U R                  5       nSUl        UR                  [        U5      US5        UR                  U5        SUl        X6R                  l
        UR                  XcS:g  5        g )Nr!   Fr   )rS   WeaponTypeDefinitionrU   rV   rW   rX   r   rY   
StoredAmmo
InvManagerPendingQuickSlotrZ   )r   r3   rN   r]   rQ   weapr\   s          r   r/   r/      s    <<55DDED|&&(HD%%%h/
 	LLDO+/(KK!)$r   z8WillowGame.WillowPlayerController.GeneratePlayerSaveGamec                 \   [        U R                  5      n[        U R                  5      nUR                  5         [        U R	                  5       5       HE  nUR
                  R                  S:X  a  UR                  5       (       d  M4  UR                  XT5        MG     UR                  5         gNWillowWeaponT)
r   SaveGameNameloadr	   r$   ClassName
CanBeSavedadd_existing_itemwrite)r   r   r   new_saveexisting_saver[   s         r   GeneratePlayerSaveGamerp      s     6../H 3 34M)&*H*H*JK::??n,T__5F5F""47 L
 NNr   	save_namesavegamec                    [        U 5      n[        U 5      nUR                  5         UR                   HS  nUb  UR                  c  M  UR	                  UR                  SU5        UR                  UR                  S5      Ul        MU     UR                   HS  nUb  UR                  c  M  UR	                  UR                  SU5        UR                  UR                  S5      Ul        MU     UR                  5         g )NFT)	r   rh   r&   r)   update_itemfix_definition_datar-   rF   rm   )rq   rr   rn   ro   r[   rc   s         r   fix_playersavegame_datarv     s    9%H	*M!!<4..6T00%G+??@S@SUZ[	 " ##<444<T66mL$1$E$E%%%
!	 $ NNr   z9WillowGame.WillowPlayerController.ApplyPlayerSaveGameDatac                     U R                  UR                  R                  5      nUc  g[        X2R                  5        gNT)GetSaveGameNameFromidr9   
SaveGameIdrv   r   r   r   rq   s       r   ApplyPlayerSaveGameDatar|     s6     ,,V__-G-GHII7r   T_inital_launchz>WillowGame.WillowPlayerPawnDataManager.LoadPlayerPawnDataAsyncc                    [         (       a  Sq g[        R                  " 5       R                  5       R	                  5       S:w  a  g[
        R                  5         [        R                  " 5       R                  S   R                  R                  UR                  R                  R                  5      nUc  g[        X2R                  R                  5        g)NFTmenumapr   )r}   rA   	GetEngineGetCurrentWorldInfoGetStreamingPersistentMapName_memento_save_managerclearGamePlayersActorry   Payloadr9   rz   rv   r{   s       r   LoadPlayerPawnDataAsyncr   +  s    
 ~002PPRV__ !##%11!4::PP**I I~~'>'>?r   c                 t    Sq [        R                  " S[        5        [        R                  " S[        5        g)NF)WillowGame.FrontendGFxMovie.LaunchNewGame*WillowGame.FrontendGFxMovie.LaunchSaveGameT)r}   rA   rE   __file__r   s      r   LaunchNewSaveGamer   E  s,    NDhOExPr   r   r   zWillowGame.WillowItem.OnCreatez WillowGame.WillowWeapon.OnCreatec                    U R                   R                  S:X  a  [        U R                  5      nO[	        U R                  5      nU H:  n[        U[        R                  5      (       d  M$  [        R                  " U5        M<     gre   )	ri   rj   r   r)   r   
isinstancerA   UObject	KeepAlive)r   r   r   	all_partsparts        r   OnCreater   \  si     ||N*1&2G2GH	/0E0EF	$	 1 122D!  r   z&WillowGame.WillowInventoryStorage.Openc                 f  ^
^^ U R                   (       a  gU R                  R                  5       nUc  gUR                  5       nXR                  :X  a  UR
                  nSnOKXR                  :X  a	  [        nSnO3XR                  UR                  4;   a  g[        R                  " S5        g[        XV5      m[        XV5      m
T
R                  5         UR                  U 5         / mS[        R                  S[        R                   S[        R"                  S[$        4U
UU4S jjn[        R&                  " S	[(        [*        5        [        R&                  " S
[(        U5        [        R&                  " S[(        U5        U R-                  5         [        R.                  " S	[(        5        [        R.                  " S
[(        5        [        R.                  " S[(        5        TR1                  5         SU l         T H4  u  pU	(       a  U R3                  USS5        M!  U R5                  USS5        M6      g)NFT2[SanitySaver] Could not identify opened container!r   r   r   r   c                    > UR                   S:H  nTR                  UR                  UT5        TR                  TR	                  UR                  U5      U45        g)NValidateWeaponDefinitionF)rj   rt   r)   appendru   )r   r   r   	is_weaponro   inv_listrn   s       r   ValidateItemWeaponDefinition*Open.<locals>.ValidateItemWeaponDefinition  sW    MM%??	V22I}M..v/D/DiPR[\	
 r   z/WillowGame.WillowPlayerController.OnChestOpenedz8WillowGame.WillowPlayerController.ValidateItemDefinitionr@   )ChestIsOpenOuterGetOwningPlayerControllerr$   TheBankrg   TheStashr
   
TheGrinder
TheMailBoxrA   Logr   rh   OnChestOpenedr   	UFunctionFStructboolrB   rC   r   OpenrE   rm   AddWeaponFromDefAddItemFromDef)r   r   r   PCr2   rq   is_bankr   rN   r   ro   r   rn   s             @@@r   r   r   v  s    
	/	/	1B	z,,.K $$$OO		''	'		**K,B,BC	CJK9.H	3MV$ HY->-> )J]J] gpgxgx   ~B   GSXYPRZ\xyRT\^z{
KKMJHUSU]^UW_`NNF'##HeU;!!(E59	  (
 r   z'WillowGame.WillowInventoryStorage.Closec                     U R                   R                  5       nUR                  5       nXR                  :X  a  UR                  nSnOKXR
                  :X  a	  [        nSnO3XR                  UR                  4;   a  g[        R                  " S5        g[        XV5      n[        XV5      nUR                  5         U R                   H%  n	U	R                  n
U
c  M  UR                  X5        M'     UR!                  5         g)NTFr   )r   r   r$   r   rg   r   r
   r   r   rA   r   r   rh   TheChest	Inventoryrl   rm   )r   r   r   r   r2   rq   r   rn   ro   
chest_datar[   s              r   Closer     s    		/	/	1B,,.K $$$OO		''	'		**K,B,BC	CJK9.H	3Moo
##<""47	 & NNr   z WillowGame.WillowItem.GetMementoz"WillowGame.WillowWeapon.GetMementoc                 .    [         R                  U 5        grx   )r   add_new_itemr   s      r   
GetMementor     s     &&v.r   z/WillowGame.WillowPickup.CreatePickupFromMementoc                     UR                   nUR                  [        R                  UR                  UR
                  R                  S:H  5      SS5        [        R                  U5        g)a!  
We actually want to overwrite this function:
`WillowGame.PopulationFactoryWillowInventory.CreateInventoryPickup`

This function gets called directly by that one, passing the item reference in. It also happens
to be the only thing calling this, so we're safe to hook this unconditionally.
rf   NFT)InventoryThisPickupIsForrX   r   ru   r)   ri   rj   remove_item)r   r   r   r[   s       r   CreatePickupFromMementor   
  s_     **D%%11JJOO~-	
 	 %%d+r   z=WillowGame.PopulationFactoryWillowAIPawn.CreateSavedInventoryc                 `   S[         R                  S[         R                  S[         R                  S[        4S jnS[         R                  S[         R                  S[         R                  S[        4S jn[         R
                  " S[        U5        [         R
                  " S[        U5        g	)
a  
Again we can't call the create from memento functions directly, so next best thing is to hook a
function where we can grab the item reference from directly.

We also can't re-call this function ourselves to do the traditional form of temporary hooks -
the `PopulatedAIPawnMemento` arg eventually references an item serial - so instead we hook a
third function that's called later, after all our calls are done.
r   r   r   r   c                     U R                  [        R                  U R                  U R                  R
                  S:H  5      S S5        [        R                  U 5        g)Nrf   FT)rX   r   ru   r)   ri   rj   r   r   s      r   rZ   $CreateSavedInventory.<locals>.GiveTo,  sT    ++!55%%!!^3 	
 	))&1r   c                 p    [         R                  " S[        5        [         R                  " S[        5        g)NEngine.Inventory.GiveTo?WillowGame.WillowAIPawn.SavedInventoryAddedFromPopulationSystemT)rA   rE   r   r   s      r   'SavedInventoryAddedFromPopulationSystemECreateSavedInventory.<locals>.SavedInventoryAddedFromPopulationSystem9  s(    6A^`hir   r   r   T)rA   r   r   r   r   rB   r   )r   r   r   rZ   r   s        r   CreateSavedInventoryr   "  s    y(( I4G4G QZQbQb gk 	8I8I U^UhUh r{  sD  sD   IM 
 /6BWYa  dK  Lr   F_SHOULD_VENDORS_REROLL_ignore_next_featured_itemshould_rerollc                     U q g r   )r   )r   s    r   update_vendor_rerollingr   K  s    *r   z/WillowGame.WillowVendingMachine.SetFeaturedItemc                 Z    [         (       a  [        (       a  gSqU R                  5         Sqg)NTF)r   r   ResetInventoryr   s      r   SetFeaturedItemr   P  s0     "!%?%?
 "&
!&r   )1rA   typingr   r   helpersr   r   r   r	   save_managerr
   r   r   r   r   r   r   r   str__annotations__r   r   r   r6   r>   rD   rK   rM   intr(   r/   rp   rv   r|   r}   r   r   rB   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>r      s    !1 1 1
I%%y':':I<M<MNPTT
U!$sG|
 !s x	7 23 )## y/B/B IL]L] bf 
 $K0 
 GH0)*;*; 0yGZGZ 0dmdudu 0z~ 0 I0f ?@)"3"3 y?R?R \e\m\m rv  A@ AB)I$5$5 )ATAT )^g^o^o )tx ) C)X CD9+<+< 	H[H[ enevev {  E
 EFY->-> )J]J] gpgxgx   ~B  G
$i&7&7 $c $YM^M^ $jm $y} $  FI $  NR $&%	(9(9 % %yO`O` %hk %sv %{ %. @A9#4#4 	@S@S ]f]n]n sw  B$s i6G6G D 0 ABI$5$5 ATAT ^g^o^o tx  C   FGI$5$5 ATAT ^g^o^o tx  H2i// 9;N;N XaXiXi nr  
  =xIZ [ 	  >J[ \ &'()
Y&& 
)2E2E 
yO`O` 
ei 
 * (
  ./T"" Ti.A.A T9K\K\ Tae T 0Tn /0)## y/B/B IL]L] bf  1H  ()*+y(( I4G4G QZQbQb gk  , *
 78I$5$5 ATAT ^g^o^o tx  9. EF!2!2 i>Q>Q [d[l[l qu  GH  %  $#( D (+4 +D +
 78I-- 9L9L V_VgVg lp  9r   