Advertisement
Guest User

Untitled

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