Advertisement
Guest User

Untitled

a guest
Oct 21st, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.29 KB | None | 0 0
  1. namespace PackageData {
  2.  
  3.     UInt32 DecidePackage(int ActorID, int PackageID){
  4.         if (s_PackageData && ActorID != 0) return s_PackageData->DecidePackage(ActorID, PackageID);
  5.         else return PackageID;
  6.     }
  7.     UInt32 Packages::DecidePackage(int ActorID, int PackageID){
  8.         if (Data.size() == 0 || ActorID == 0) return PackageID;
  9.         s_dataLock.Enter();
  10.         ActorPackages* Overrides = GetActor((TESForm*)ActorID);
  11.         if (Overrides != NULL){
  12.             UInt32 pickedPack = 0;
  13.             Flags pickedFlags = Flags(0, 0);
  14.             for (ActorPackages::iterator itr = Overrides->begin(); itr != Overrides->end(); ++itr){
  15.                 if (itr->second.first >= pickedFlags.first){
  16.                     pickedPack  = itr->first;
  17.                     pickedFlags = itr->second;
  18.                     //_MESSAGE("Package[%lu] Priority[%lu] Flag[%lu]", pickedPack, pickedFlags.first, pickedFlags.second);
  19.                 }
  20.             }
  21.             int pid = Forms::GameGetForm(pickedPack);
  22.             TESForm* FormRef = pid == 0 ? NULL : (TESForm*)pid;
  23.             if (FormRef && FormRef->formType == kFormType_Package){
  24.                 if (pickedFlags.second == 1 || IsValidPackage(pid, ActorID)){
  25.                     //_MESSAGE("Override Picked -- Package[%lu] Priority[%lu] Flag[%lu]", pid, pickedFlags.first, pickedFlags.second);
  26.                     PackageID = pid;
  27.                 }
  28.             }
  29.         }
  30.         s_dataLock.Leave();
  31.         return PackageID;
  32.     }
  33.     bool Packages::IsValidPackage(int PackageID, int ActorID) {
  34.         int IsValid = 0;
  35.         int FuncAddr = 0x05E1F40;
  36.         _asm
  37.         {
  38.             mov ecx, PackageID
  39.                 push ActorID
  40.                 call FuncAddr
  41.                 mov IsValid, eax
  42.         }
  43.         return IsValid != 0;
  44.     }
  45.  
  46.  
  47.     int EndPackID  = 0;
  48.     int EndActorID = 0;
  49.     void PackageEnded(){
  50.         if (s_PackageData && EndPackID != 0 && EndActorID != 0)
  51.             s_PackageData->PackageEnded();
  52.         EndPackID  = 0;
  53.         EndActorID = 0;
  54.     }
  55.     void Packages::PackageEnded(){
  56.         if (Data.size() == 0) return;
  57.  
  58.         TESForm* ActorRef   = LookupFormByID(EndActorID);
  59.         TESForm* PackageRef = LookupFormByID(EndPackID);
  60.         if (ActorRef && PackageRef){
  61.             s_dataLock.Enter();
  62.             ActorPackages* ActorPacks = GetActor(ActorRef);
  63.             if (ActorPacks != NULL){
  64.                 // Remove
  65.                 ActorPackages::iterator PacksItr = ActorPacks->find(PackageRef->formID);
  66.                 if (PacksItr != ActorPacks->end()) ActorPacks->erase(PackageRef->formID);
  67.                 // Cleanup
  68.                 if (Data[ActorRef->formID].size() == 0)
  69.                     Data.erase(ActorRef->formID);
  70.             }
  71.             s_dataLock.Leave();
  72.         }
  73.         EndPackID  = 0;
  74.         EndActorID = 0;
  75.     }
  76.  
  77.     int endCall = 0xA51280;
  78.     int endBack = 0x8CAB59;
  79.     int packageFunc = 0x40E4F0;
  80.     int jumpPackage = 0x6A9E95;
  81.     void InitPlugin() {
  82.         void * packageCodeStart;
  83.         _asm
  84.         {
  85.             mov packageCodeStart, offset packageStart
  86.                 jmp packageEnd
  87.             packageStart :
  88.             call packageFunc
  89.                 cmp esi, 0
  90.                 je packageOrig
  91.                 push eax
  92.                 push esi
  93.                 call DecidePackage
  94.                 add esp, 8
  95.             packageOrig:
  96.             jmp jumpPackage
  97.             packageEnd :
  98.         }
  99.  
  100.         WriteRelJump(0x6A9E90, (UInt32)packageCodeStart);
  101.  
  102.         void * endPackageCodeStart;
  103.         _asm
  104.         {
  105.             mov endPackageCodeStart, offset endPackageStart
  106.                 jmp endPackageEnd
  107.             endPackageStart :
  108.             push eax
  109.                 push ecx
  110.                 push edx
  111.                 mov eax, [edi]
  112.                 mov EndActorID, eax
  113.                 mov eax, [edi + 4]
  114.                 mov EndPackID, eax
  115.                 call PackageEnded
  116.                 pop edx
  117.                 pop ecx
  118.                 pop eax
  119.                 //endPackageOrig:
  120.                 call endCall
  121.                 jmp endBack
  122.             endPackageEnd :
  123.         }
  124.  
  125.         WriteRelJump(0x8CAB54, (UInt32)endPackageCodeStart);
  126.     }
  127.  
  128. } // PackageData
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement