More tests
This commit is contained in:
parent
0e9de1c152
commit
8e1e179d84
@ -117,7 +117,7 @@ namespace Components
|
|||||||
{
|
{
|
||||||
const char* name = Game::DB_GetXAssetNameHandlers[type](asset);
|
const char* name = Game::DB_GetXAssetNameHandlers[type](asset);
|
||||||
|
|
||||||
if (name == "props/icicle_tall_des"s)
|
if (name == "com_pipe_8x128_ceramic"s)
|
||||||
{
|
{
|
||||||
OutputDebugStringA("");
|
OutputDebugStringA("");
|
||||||
}
|
}
|
||||||
|
@ -694,6 +694,8 @@ namespace Components
|
|||||||
return Game::Load_Stream(atStreamStart, buffer, size);
|
return Game::Load_Stream(atStreamStart, buffer, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Utils::Hook LoadStreamHook;
|
||||||
|
|
||||||
DWORD Load_Texture(Game::GfxImageLoadDef** loadDef, Game::GfxImage* image)
|
DWORD Load_Texture(Game::GfxImageLoadDef** loadDef, Game::GfxImage* image)
|
||||||
{
|
{
|
||||||
// if (!(*loadDef)->dataSize)
|
// if (!(*loadDef)->dataSize)
|
||||||
@ -703,6 +705,7 @@ namespace Components
|
|||||||
|
|
||||||
if (FastFiles::Current() == "mp_cargoship_sh" || FastFiles::Current() == "mp_cargoship_sh_load")
|
if (FastFiles::Current() == "mp_cargoship_sh" || FastFiles::Current() == "mp_cargoship_sh_load")
|
||||||
{
|
{
|
||||||
|
LoadStreamHook.Install();
|
||||||
OutputDebugStringA("");
|
OutputDebugStringA("");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -713,6 +716,17 @@ namespace Components
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool LoadStream(bool atStreamStart, void* buffer, int size)
|
||||||
|
{
|
||||||
|
LoadStreamHook.Uninstall();
|
||||||
|
bool result = Game::Load_Stream(atStreamStart, buffer, size);
|
||||||
|
LoadStreamHook.Install();
|
||||||
|
|
||||||
|
OutputDebugStringA(Utils::String::VA("Loading %d bytes from stream %d at %X (%d)\n", size, *(DWORD*)0x16E5578, (DWORD)_ReturnAddress(), atStreamStart & 1));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
void Zones::InstallPatches(int version)
|
void Zones::InstallPatches(int version)
|
||||||
{
|
{
|
||||||
AssetHandler::ClearRelocations();
|
AssetHandler::ClearRelocations();
|
||||||
@ -872,6 +886,8 @@ namespace Components
|
|||||||
|
|
||||||
Utils::Hook(0x4D32A9, Load_GfxImageLoadStruct, HOOK_CALL).Install()->Quick();
|
Utils::Hook(0x4D32A9, Load_GfxImageLoadStruct, HOOK_CALL).Install()->Quick();
|
||||||
Utils::Hook(0x4D32BC, Load_Texture, HOOK_CALL).Install()->Quick();
|
Utils::Hook(0x4D32BC, Load_Texture, HOOK_CALL).Install()->Quick();
|
||||||
|
|
||||||
|
LoadStreamHook.Initialize(Game::Load_Stream, LoadStream, HOOK_JUMP);
|
||||||
}
|
}
|
||||||
|
|
||||||
Zones::~Zones()
|
Zones::~Zones()
|
||||||
|
@ -86,6 +86,7 @@
|
|||||||
|
|
||||||
#include "Utils\IO.hpp"
|
#include "Utils\IO.hpp"
|
||||||
#include "Utils\CSV.hpp"
|
#include "Utils\CSV.hpp"
|
||||||
|
#include "Utils\Chain.hpp"
|
||||||
#include "Utils\Utils.hpp"
|
#include "Utils\Utils.hpp"
|
||||||
#include "Utils\WebIO.hpp"
|
#include "Utils\WebIO.hpp"
|
||||||
#include "Utils\Memory.hpp"
|
#include "Utils\Memory.hpp"
|
||||||
|
151
src/Utils/Chain.hpp
Normal file
151
src/Utils/Chain.hpp
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
namespace Utils
|
||||||
|
{
|
||||||
|
template <typename T>
|
||||||
|
class Chain
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
class Entry
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
std::shared_ptr<T> Object;
|
||||||
|
std::shared_ptr<Entry> Next;
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool HasNext()
|
||||||
|
{
|
||||||
|
return (this->Next.use_count() > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsValid()
|
||||||
|
{
|
||||||
|
return (this->Object.use_count() > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Set(T object)
|
||||||
|
{
|
||||||
|
this->Object = std::shared_ptr<T>(new T());
|
||||||
|
*this->Object.get() = object;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<T> Get()
|
||||||
|
{
|
||||||
|
return this->Object;
|
||||||
|
}
|
||||||
|
|
||||||
|
Entry GetNext()
|
||||||
|
{
|
||||||
|
if (this->HasNext())
|
||||||
|
{
|
||||||
|
return *(this->Next.get());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return Entry();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<Entry> GetNextEntry()
|
||||||
|
{
|
||||||
|
return this->Next;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetNextEntry(std::shared_ptr<Entry> entry)
|
||||||
|
{
|
||||||
|
this->Next = entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
T *operator->()
|
||||||
|
{
|
||||||
|
return (this->Object.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
Entry& operator++ ()
|
||||||
|
{
|
||||||
|
*this = this->GetNext();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Entry operator++ (int)
|
||||||
|
{
|
||||||
|
Entry result = *this;
|
||||||
|
this->operator++();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::mutex Mutex;
|
||||||
|
Entry Object;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void Add(T object)
|
||||||
|
{
|
||||||
|
this->Mutex.lock();
|
||||||
|
|
||||||
|
if (!this->Empty())
|
||||||
|
{
|
||||||
|
// Create new chain entry
|
||||||
|
std::shared_ptr<Entry> currentObject = std::shared_ptr<Entry>(new Entry);
|
||||||
|
*currentObject.get() = this->Object;
|
||||||
|
|
||||||
|
// Add it to the chain
|
||||||
|
this->Object = Entry();
|
||||||
|
this->Object.SetNextEntry(currentObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
this->Object.Set(object);
|
||||||
|
|
||||||
|
this->Mutex.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Remove(std::shared_ptr<T> object)
|
||||||
|
{
|
||||||
|
this->Mutex.lock();
|
||||||
|
|
||||||
|
if (!this->Empty())
|
||||||
|
{
|
||||||
|
if (this->Object.Get().get() == object.get())
|
||||||
|
{
|
||||||
|
this->Object = this->Object.GetNext();
|
||||||
|
}
|
||||||
|
else if(this->Object.HasNext())
|
||||||
|
{
|
||||||
|
for (auto entry = this->Object; entry.IsValid(); ++entry)
|
||||||
|
{
|
||||||
|
auto next = entry.GetNext();
|
||||||
|
|
||||||
|
if (next.IsValid() && next.Get().get() == object.get())
|
||||||
|
{
|
||||||
|
*entry.GetNextEntry().get() = next.GetNext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this->Mutex.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Remove(Entry entry)
|
||||||
|
{
|
||||||
|
if (entry.IsValid())
|
||||||
|
{
|
||||||
|
this->Remove(entry.Get());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Empty()
|
||||||
|
{
|
||||||
|
return !this->Object.IsValid();
|
||||||
|
}
|
||||||
|
|
||||||
|
Entry Begin()
|
||||||
|
{
|
||||||
|
return this->Object;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Clear()
|
||||||
|
{
|
||||||
|
this->Object = Entry();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user