示例#1
0
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 CSEHallOfFameFemaleNPC::Initialize( UInt32 FormID )
		{
			CSEHallOfFameEntry::Initialize(FormID);

			TESNPC* NPC = CS_CAST(Instance, TESForm, TESNPC);
			SME_ASSERT(NPC);

			SME::MiscGunk::ToggleFlag(&NPC->actorFlags, TESActorBaseData::kNPCFlag_Female, true);
		}
		void CSEHallOfFameStaff::Initialize( UInt32 FormID )
		{
			CSEHallOfFameEntry::Initialize(FormID);

			TESObjectWEAP* Weapon = CS_CAST(Instance, TESForm, TESObjectWEAP);
			SME_ASSERT(Weapon);

			Weapon->weaponType = TESObjectWEAP::kWeaponType_Staff;
		}
		void CSEHallOfFameEntry::Initialize( UInt32 FormID )
		{
			Instance = TESForm::CreateInstance(FormType);
			Instance->SetFormID(FormID);
			Instance->SetEditorID(Name);

			TESFullName* Name = CS_CAST(Instance, TESForm, TESFullName);
			if (Name)
			{
				Name->name.Set(Title);
			}

			TESObject* Object = CS_CAST(Instance, TESForm, TESObject);
			SME_ASSERT(Object);

			_DATAHANDLER->AddTESObject(Object);
			Instance->SetFromActiveFile(false);
		}
		void CSEHallOfFameScript::Initialize( UInt32 FormID )
		{
			Script* Form = CS_CAST(TESForm::CreateInstance(FormType), TESForm, Script);

			Form->SetFormID(FormID);
			Form->SetEditorID(Name);
			Form->SetFromActiveFile(false);
			Form->SetText(Title);

			_DATAHANDLER->scripts.AddAt(Form, eListEnd);
		}
bool TESLeveledList::WalkForCircularPath( std::string& Output, TESLeveledList* Check, TESLeveledList* Against )
{
	bool Result = true;
	
	TESForm* CheckBase = CS_CAST(Check, TESLeveledList, TESForm);
	TESForm* CheckAgainstBase = CS_CAST(Against, TESLeveledList, TESForm);
	SME_ASSERT(CheckBase && CheckAgainstBase);	

	for (TESLeveledList::LevListT::Iterator Itr = Check->levList.Begin(); Itr.Get() && Itr.End() == false; ++Itr)
	{
		TESForm* Item = Itr->form;
		TESLeveledList* Inner = CS_CAST(Item, TESForm, TESLeveledList);

		if (Item->formID == CheckAgainstBase->formID)
		{
			// the source lev list is an item
			Output += CheckBase->GetEditorID();
			Output += " >";
			Output += CheckAgainstBase->GetEditorID();

			Result = false;
			break;
		}
		else if (Inner)
		{
			std::string TempStr = Output + CheckBase->GetEditorID();
			TempStr += " >";
			
			// recurse
			if (WalkForCircularPath(TempStr, Inner, Against) == false)
			{
				Output = TempStr;
				Result = false;
				break;
			}
		}
	}

	return Result;
}
		void CSEHallOfFameShadeMe::Initialize( UInt32 FormID )
		{
			CSEHallOfFameEntry::Initialize(FormID);

			TESObjectREFR* shadeMeRef = CS_CAST(TESForm::CreateInstance(TESForm::kFormType_REFR), TESForm, TESObjectREFR);
			TheGreatEye = shadeMeRef;

			shadeMeRef->SetBaseForm(TESForm::LookupByEditorID(Name));
			shadeMeRef->SetFormID(0x99);
			shadeMeRef->SetEditorID("TheShadeMeRef");
			shadeMeRef->SetFromActiveFile(false);
			shadeMeRef->SetPersistent(true);
		}
		bool IRenderWindowOSDLayer::Helpers::ResolveReference(UInt32 FormID, TESObjectREFR*& OutRef)
		{
			TESForm* Form = TESForm::LookupByFormID(FormID);

			if (Form)
			{
				SME_ASSERT(Form->formType == TESForm::kFormType_ACHR || Form->formType == TESForm::kFormType_ACRE || Form->formType == TESForm::kFormType_REFR);

				OutRef = CS_CAST(Form, TESForm, TESObjectREFR);
				return (Form->IsDeleted() == false);
			}
			else
				return false;
		}
		void GlobalCopyBuffer::Add(TESForm* Form)
		{
			SME_ASSERT(Form);

			if (Form->IsReference())
			{
				TESObjectREFR* Ref = CS_CAST(Form, TESForm, TESObjectREFR);
				if (Ref->baseForm)
				{
					if (Ref->baseForm->formType == TESForm::kFormType_Door ||
						Ref->baseForm == TESForm::LookupByEditorID("DoorMarker"))
					{
						return;
					}
				}
			}

			FormList.push_back(new TESFormWrapper(Form));
		}