Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- namespace PackageData {
- int endCall = 0xA51280;
- int endBack = 0x8CAB59;
- int packageFunc = 0x40E4F0;
- int jumpPackage = 0x6A9E95;
- void InitPlugin() {
- void * packageCodeStart;
- _asm
- {
- mov packageCodeStart, offset packageStart
- jmp packageEnd
- packageStart :
- call packageFunc
- cmp esi, 0
- je packageOrig
- push eax
- push esi
- call DecidePackage
- add esp, 8
- packageOrig:
- jmp jumpPackage
- packageEnd :
- }
- WriteRelJump(0x6A9E90, (UInt32)packageCodeStart);
- void * endPackageCodeStart;
- _asm
- {
- mov endPackageCodeStart, offset endPackageStart
- jmp endPackageEnd
- endPackageStart :
- push eax
- push ecx
- push edx
- mov eax, [edi]
- mov EndActorID, eax
- mov eax, [edi + 4]
- mov EndPackID, eax
- call PackageEnded
- pop edx
- pop ecx
- pop eax
- //endPackageOrig:
- call endCall
- jmp endBack
- endPackageEnd :
- }
- WriteRelJump(0x8CAB54, (UInt32)endPackageCodeStart);
- }
- UInt32 DecidePackage(int ActorID, int PackageID){
- if (s_PackageData && ActorID != 0) return s_PackageData->DecidePackage(ActorID, PackageID);
- else return PackageID;
- }
- UInt32 Packages::DecidePackage(int ActorID, int PackageID){
- if (Data.size() == 0 || ActorID == 0) return PackageID;
- s_dataLock.Enter();
- ActorPackages* Overrides = GetActor((TESForm*)ActorID);
- if (Overrides != NULL){
- UInt32 pickedPack = 0;
- Flags pickedFlags = Flags(0, 0);
- for (ActorPackages::iterator itr = Overrides->begin(); itr != Overrides->end(); ++itr){
- if (itr->second.first >= pickedFlags.first){
- pickedPack = itr->first;
- pickedFlags = itr->second;
- //_MESSAGE("Package[%lu] Priority[%lu] Flag[%lu]", pickedPack, pickedFlags.first, pickedFlags.second);
- }
- }
- int pid = Forms::GameGetForm(pickedPack);
- TESForm* FormRef = pid == 0 ? NULL : (TESForm*)pid;
- if (FormRef && FormRef->formType == kFormType_Package){
- if (pickedFlags.second == 1 || IsValidPackage(pid, ActorID)){
- //_MESSAGE("Override Picked -- Package[%lu] Priority[%lu] Flag[%lu]", pid, pickedFlags.first, pickedFlags.second);
- PackageID = pid;
- }
- }
- }
- s_dataLock.Leave();
- return PackageID;
- }
- bool Packages::IsValidPackage(int PackageID, int ActorID) {
- int IsValid = 0;
- int FuncAddr = 0x05E1F40;
- _asm
- {
- mov ecx, PackageID
- push ActorID
- call FuncAddr
- mov IsValid, eax
- }
- return IsValid != 0;
- }
- int EndPackID = 0;
- int EndActorID = 0;
- void PackageEnded(){
- if (s_PackageData && EndPackID != 0 && EndActorID != 0)
- s_PackageData->PackageEnded();
- EndPackID = 0;
- EndActorID = 0;
- }
- void Packages::PackageEnded(){
- if (Data.size() == 0) return;
- TESForm* ActorRef = LookupFormByID(EndActorID);
- TESForm* PackageRef = LookupFormByID(EndPackID);
- if (ActorRef && PackageRef){
- s_dataLock.Enter();
- ActorPackages* ActorPacks = GetActor(ActorRef);
- if (ActorPacks != NULL){
- // Remove
- ActorPackages::iterator PacksItr = ActorPacks->find(PackageRef->formID);
- if (PacksItr != ActorPacks->end()) ActorPacks->erase(PackageRef->formID);
- // Cleanup
- if (Data[ActorRef->formID].size() == 0)
- Data.erase(ActorRef->formID);
- }
- s_dataLock.Leave();
- }
- EndPackID = 0;
- EndActorID = 0;
- }
- } // PackageData
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement