bool BSStringT::Set(const char * src) { if (!src) { FormHeap_Free(m_data); m_data = 0; m_bufLen = 0; m_dataLen = 0; return true; } UInt32 srcLen = strlen(src); // realloc if needed if(srcLen > m_bufLen) { FormHeap_Free(m_data); m_data = (char *)FormHeap_Allocate(srcLen + 1); m_bufLen = m_data ? srcLen : 0; } if(m_data) { strcpy_s(m_data, m_bufLen + 1, src); m_dataLen = srcLen; } else { m_dataLen = 0; } return m_data != NULL; }
TESForm * AddItemHealthPercentOwner(TESObjectREFR* thisObj, UInt32 refID, SInt32 NumItems, float Health, TESForm* pOwner, UInt32 Rank) { if (!thisObj) return NULL; TESForm * pForm = LookupFormByID(refID); if (!pForm) return NULL; TESHealthForm* pHealth = DYNAMIC_CAST(pForm, TESForm, TESHealthForm); if (!pHealth && (Health != -1.0)) { _MESSAGE("\t\tInventoryInfo\t\tAddItemHealthPercentOwner:\tInvalid refID:%#10X, no health attribute", thisObj->refID); return NULL; } TESScriptableForm* pScript = DYNAMIC_CAST(pForm, TESForm, TESScriptableForm); if (pScript && !pScript->script) pScript = NULL; // Only existing scripts matter ExtraHealth* pXHealth = NULL; ExtraOwnership* pXOwner = NULL; ExtraRank* pXRank = NULL; ExtraCount* pXCount = NULL; ExtraDataList* pExtraDataList = NULL; ExtraScript * pXScript = NULL; if (!(1.0 == Health) || pOwner || Rank || pScript) { pExtraDataList = ExtraDataList::Create(); if (!(1.0 == Health)) { pXHealth = ExtraHealth::Create(); if (!pExtraDataList->Add(pXHealth)) FormHeap_Free(pXHealth); else pXHealth->health = pHealth->GetHealth() * Health; } if (pOwner) { pXOwner = ExtraOwnership::Create(); if (!pExtraDataList->Add(pXOwner)) FormHeap_Free(pXOwner); else pXOwner->owner = pOwner; } if (Rank) { pXRank = ExtraRank::Create(); if (!pExtraDataList->Add(pXRank)) FormHeap_Free(pXRank); else pXRank->rank = Rank; } if (pScript) { pXScript = ExtraScript::Create(pForm, true); if (!pExtraDataList->Add(pXScript)) FormHeap_Free(pXScript); } } thisObj->AddItem(pForm, pExtraDataList, NumItems); return pForm; }
void SetEnchantment(TESForm* baseForm, BaseExtraList * extraData, EnchantmentItem * enchantment, float maxCharge) { if(baseForm && (baseForm->formType == TESObjectWEAP::kTypeID || baseForm->formType == TESObjectARMO::kTypeID)) { if(!enchantment) { // Null form, remove enchantment and it's extraData ExtraEnchantment* extraEnchant = static_cast<ExtraEnchantment*>(extraData->GetByType(kExtraData_Enchantment)); if(extraEnchant) extraData->Remove(kExtraData_Enchantment, extraEnchant); PersistentFormManager::GetSingleton()->DecRefEnchantment(extraEnchant->enchant); FormHeap_Free(extraEnchant); } else { // Non-null form, accept Enchantment if(maxCharge > 0xFFFF) // Charge exceeds uint16 clip it maxCharge = 0xFFFF; ExtraEnchantment* extraEnchant = static_cast<ExtraEnchantment*>(extraData->GetByType(kExtraData_Enchantment)); if(extraEnchant) { PersistentFormManager::GetSingleton()->DecRefEnchantment(extraEnchant->enchant); extraEnchant->enchant = enchantment; PersistentFormManager::GetSingleton()->IncRefEnchantment(extraEnchant->enchant); extraEnchant->maxCharge = (UInt16)maxCharge; } else { ExtraEnchantment* extraEnchant = ExtraEnchantment::Create(); extraEnchant->enchant = enchantment; extraEnchant->maxCharge = (UInt16)maxCharge; extraData->Add(kExtraData_Enchantment, extraEnchant); } } } }
void VMClassInfo::Release(void) { if(!InterlockedDecrement(&refCount)) { CALL_MEMBER_FN(this, Destroy)(); FormHeap_Free(this); } }
BSString::~BSString() { if (m_data) { FormHeap_Free(m_data); m_data = nullptr; } }
bool ArchiveManager::ExtractArchiveFile( const char* InPath, const char* OutPath, bool AppendFilePath /*= false*/ ) { bool Result = false; if (InPath) { std::string Path(InPath); SME::StringHelpers::MakeLower(Path); if (Path.find("data\\") != -1) Path = Path.substr(Path.find("data\\") + 5); if (_FILEFINDER->FindFile(Path.c_str()) == 2) { ArchiveFile* ArchiveFileStream = CS_CAST(_FILEFINDER->GetFileStream(Path.c_str(), false, 0x50000), NiBinaryStream, ArchiveFile); if (ArchiveFileStream) { UInt32 FileSize = ArchiveFileStream->GetFileSize(); std::string ArchiveFilePath = ArchiveFileStream->fileName; std::string ArchiveFileName = ArchiveFilePath.substr(ArchiveFilePath.rfind("\\") + 1); std::string FileOut = OutPath; if (AppendFilePath) FileOut += "\\" + ArchiveFilePath; DeleteFile(FileOut.c_str()); // delete file as BSFile::Ctor doesn't create it anew BSFile* TempFile = BSFile::CreateInstance(FileOut.c_str(), NiFile::kFileMode_WriteOnly, FileSize); SME_ASSERT(TempFile); void* Buffer = FormHeap_Allocate(FileSize); ZeroMemory(Buffer, FileSize); if (!ArchiveFileStream->DirectRead(Buffer, FileSize)) { BGSEECONSOLE_MESSAGE("ArchiveManager::ExtractArchiveFile - Couldn't read file %s from archive %s", ArchiveFileStream->fileName, ArchiveFileStream->parentArchive->fileName); } else { if (!TempFile->DirectWrite(Buffer, FileSize)) { BGSEECONSOLE_MESSAGE("ArchiveManager::ExtractArchiveFile - Couldn't write to file %s", TempFile->fileName); } else Result = true; } TempFile->Flush(); TempFile->DeleteInstance(); ArchiveFileStream->DeleteInstance(); FormHeap_Free(Buffer); } } } return Result; }
void CreateEnchantment(TESForm* baseForm, BaseExtraList * extraData, float maxCharge, VMArray<EffectSetting*> effects, VMArray<float> magnitudes, VMArray<UInt32> areas, VMArray<UInt32> durations) { if(baseForm && (baseForm->formType == TESObjectWEAP::kTypeID || baseForm->formType == TESObjectARMO::kTypeID)) { EnchantmentItem * enchantment = NULL; if(effects.Length() > 0 && magnitudes.Length() == effects.Length() && areas.Length() == effects.Length() && durations.Length() == effects.Length()) { tArray<MagicItem::EffectItem> effectItems; effectItems.Allocate(effects.Length()); UInt32 j = 0; for(UInt32 i = 0; i < effects.Length(); i++) { EffectSetting * magicEffect = NULL; effects.Get(&magicEffect, i); if(magicEffect) { // Only add effects that actually exist magnitudes.Get(&effectItems[j].magnitude, i); areas.Get(&effectItems[j].area, i); durations.Get(&effectItems[j].duration, i); effectItems[j].mgef = magicEffect; j++; } } effectItems.count = j; // Set count to existing count if(baseForm->formType == TESObjectWEAP::kTypeID) enchantment = CALL_MEMBER_FN(PersistentFormManager::GetSingleton(), CreateOffensiveEnchantment)(&effectItems); else enchantment = CALL_MEMBER_FN(PersistentFormManager::GetSingleton(), CreateDefensiveEnchantment)(&effectItems); FormHeap_Free(effectItems.arr.entries); } if(enchantment) { if(maxCharge > 0xFFFF) // Charge exceeds uint16 clip it maxCharge = 0xFFFF; ExtraEnchantment* extraEnchant = static_cast<ExtraEnchantment*>(extraData->GetByType(kExtraData_Enchantment)); if(extraEnchant) { PersistentFormManager::GetSingleton()->DecRefEnchantment(extraEnchant->enchant); extraEnchant->enchant = enchantment; PersistentFormManager::GetSingleton()->IncRefEnchantment(extraEnchant->enchant); extraEnchant->maxCharge = (UInt16)maxCharge; } else { ExtraEnchantment* extraEnchant = ExtraEnchantment::Create(); extraEnchant->enchant = enchantment; extraEnchant->maxCharge = (UInt16)maxCharge; extraData->Add(kExtraData_Enchantment, extraEnchant); } } } }
// Assumes there is only one such Item in the container TESForm * SetFirstItemWithHealthAndOwnershipByRefID(TESObjectREFR* thisObj, UInt32 refID, SInt32 NumItems, float Health, TESForm* pOwner, UInt32 Rank) { if (!thisObj) return NULL; if ((Health == -1.0) && (pOwner == NULL) && (Rank == 0)) return NULL; // Nothing to modify! ExtraContainerChanges* pXContainerChanges = static_cast<ExtraContainerChanges*>(thisObj->extraDataList.GetByType(kExtraData_ContainerChanges)); if (!pXContainerChanges) return AddItemHealthPercentOwner(thisObj, refID, NumItems, Health, pOwner, Rank); if (!pXContainerChanges->GetEntryDataList()) return AddItemHealthPercentOwner(thisObj, refID, NumItems, Health, pOwner, Rank); ExtraContainerInfo info(pXContainerChanges->GetEntryDataList()); ExtraContainerChanges::EntryData* pEntryData = info.GetRefID(refID); if (!pEntryData) return AddItemHealthPercentOwner(thisObj, refID, NumItems, Health, pOwner, Rank); ExtraContainerChanges::ExtendDataList* pExtendList = pEntryData->extendData; if (!pExtendList) return AddItemHealthPercentOwner(thisObj, refID, NumItems, Health, pOwner, Rank); if (!pEntryData) return AddItemHealthPercentOwner(thisObj, refID, NumItems, Health, pOwner, Rank); bool Done = false; TESHealthForm* pHealth = DYNAMIC_CAST(thisObj->baseForm, TESForm, TESHealthForm); ExtraHealth* pXHealth = NULL; ExtraOwnership* pXOwner = NULL; ExtraRank* pXRank = NULL; ExtraCount* pXCount = NULL; ExtraDataList* pExtraDataList = NULL; pEntryData->countDelta = NumItems; SInt32 n = 0; pExtraDataList = pExtendList->GetNthItem(n); // Only one will be set, the first one pXHealth = (ExtraHealth*)pExtraDataList->GetByType(kExtraData_Health); pXCount = (ExtraCount*)pExtraDataList->GetByType(kExtraData_Count); pXOwner = (ExtraOwnership*)pExtraDataList->GetByType(kExtraData_Ownership); pXRank = (ExtraRank*)pExtraDataList->GetByType(kExtraData_Rank); if (!pXHealth) { if (Health != -1.0) { pXHealth = ExtraHealth::Create(); if (!pExtraDataList->Add(pXHealth)) FormHeap_Free(pXHealth); else pXHealth->health = Health; } } else if (Health != -1.0) if (Health==pHealth->health) pExtraDataList->Remove(pXHealth); else pXHealth->health = Health; if (!pXOwner) { if (pOwner) { pXOwner = ExtraOwnership::Create(); if (!pExtraDataList->Add(pXOwner)) FormHeap_Free(pXOwner); else pXOwner->owner = pOwner; } } else if (pOwner) pXOwner->owner = pOwner; else pExtraDataList->Remove(pXOwner); if (!pXRank) { if (Rank) { pXRank = ExtraRank::Create(); if (!pExtraDataList->Add(pXRank)) FormHeap_Free(pXRank); else pXRank->rank = Rank; } } else if (Rank) pXRank->rank = Rank; else pExtraDataList->Remove(pXRank); if (pXCount) pXCount->count = NumItems; return pEntryData->type; }
void VMIdentifier::Destroy(void) { CALL_MEMBER_FN(this, Destroy_Internal)(); FormHeap_Free(this); }
void TESFile::DeleteInstance(bool ReleaseMemory) { thisCall<UInt32>(0x00487E60, this); if (ReleaseMemory) FormHeap_Free(this); }
void BSString::DeleteInstance(bool ReleaseMemory) { Clear(); if (ReleaseMemory) FormHeap_Free(this); }
void FormCrossReferenceData::DeleteInstance() { FormHeap_Free(this); }
void NiFree(void* p) { FormHeap_Free(p); }