/* * * * * * * * * * * * * * * * 
 * 	 ______     __  __     ______     __  __     ______     ______     __  __    
 *	/\  __ \   /\ \/\ \   /\  == \   /\ \_\ \   /\  __ \   /\  ___\   /\ \/ /    
 *	\ \ \/\ \  \ \ \_\ \  \ \  __<   \ \  __ \  \ \  __ \  \ \ \____  \ \  _"-.  
 *	 \ \_____\  \ \_____\  \ \_____\  \ \_\ \_\  \ \_\ \_\  \ \_____\  \ \_\ \_\ 
 *	  \/_____/   \/_____/   \/_____/   \/_/\/_/   \/_/\/_/   \/_____/   \/_/\/_/ 
 *
 *  - Version : 3L
 *  - By Oubliette
 * * * * * * * * * * * * * * * */

#include "main.h"
#include "oubhack_iluashared.h"
#include "oubhack_iluainterface.h"

ILuaShared::ILuaShared( PDWORD_PTR* pdwClass ){

	this->base = pdwClass;

}

template <typename T> T ILuaShared::GetFunction( PDWORD_PTR* pdwClass, unsigned int uiIndex ){

	PDWORD_PTR pdwVMT = *pdwClass;

	return (T)pdwVMT[ uiIndex ];

}

PDWORD_PTR* ILuaShared::GetBase( ){

	return this->base;

}

/* ========================================
	Name : ILuaShared::Init
	Returns : void* 
=========================================== */

void* ILuaShared::Init( void* a1 , bool a2, void* a3, void* a4 ){

	return this->GetFunction< InitFn >( this->base, INDEX_LUASHARED_INIT )( this->base, a1, a2, a3, a4 );

}

/* ========================================
	Name : ILuaShared::Shutdown
	Returns : void* 
=========================================== */

void* ILuaShared::Shutdown( void ){

	return this->GetFunction< ShutdownFn >( this->base, INDEX_LUASHARED_SHUTDOWN )( this->base );

}

/* ========================================
	Name : ILuaShared::DumpStats
	Returns : void* 
=========================================== */

void* ILuaShared::DumpStats( void ){

	return this->GetFunction< DumpStatsFn >( this->base, INDEX_LUASHARED_DUMPSTATS )( this->base );

}

/* ========================================
	Name : ILuaShared::CreateLuaInterface
	Returns : PDWORD_PTR* 
=========================================== */

PDWORD_PTR* ILuaShared::CreateLuaInterface( unsigned char ucIndex, bool something ){

	return this->GetFunction< CreateLuaInterfaceFn >( this->base, INDEX_LUASHARED_CREATELUAINTERFACE )( this->base, ucIndex, something );

}


/* ========================================
	Name : ILuaShared::CloseLuaInterface
	Returns : void* 
=========================================== */

void* ILuaShared::CloseLuaInterface( PDWORD_PTR* ucIndex ){

	return this->GetFunction< CloseLuaInterfaceFn >( this->base, INDEX_LUASHARED_CLOSELUAINTERFACE )( this->base, ucIndex );

}

/* ========================================
	Name : ILuaShared::GetLuaInterface
	Returns : PDWORD_PTR* 
=========================================== */

PDWORD_PTR* ILuaShared::GetLuaInterface( unsigned char ucIndex ){

	return this->GetFunction< GetLuaInterfaceFn >( this->base, INDEX_LUASHARED_GETLUAINTERFACE )( this->base, ucIndex );

}

/* ========================================
	Name : ILuaShared::LoadFile
	Returns : void* 
=========================================== */

void* ILuaShared::LoadFile( const std::string& a1, const std::string& a2, bool a3, bool a4 ){

	return this->GetFunction< LoadFileFn >( this->base, INDEX_LUASHARED_LOADFILE )( this->base, a1, a2, a3, a4 );

}

/* ========================================
	Name : ILuaShared::GetCache
	Returns : void* 
=========================================== */

void* ILuaShared::GetCache( const std::string& a1 ){

	return this->GetFunction< GetCacheFn >( this->base, INDEX_LUASHARED_GETCACHE )( this->base, a1 );

}

/* ========================================
	Name : ILuaShared::MountLua
	Returns : void* 
=========================================== */

void* ILuaShared::MountLua( const char* ccLua ){

	return this->GetFunction< MountLuaFn >( this->base, INDEX_LUASHARED_MOUNTLUA )( this->base, ccLua );

}

/* ========================================
	Name : ILuaShared::MoutLuaAdd
	Returns : void* 
=========================================== */

void* ILuaShared::MoutLuaAdd( const char* a1, const char* a2 ){

	return this->GetFunction< MountLuaAddFn >( this->base, INDEX_LUASHARED_MOUNTLUAADD )( this->base, a1, a2 );

}

/* ========================================
	Name : ILuaShared::UnMountLua
	Returns : void* 
=========================================== */

void* ILuaShared::UnMountLua( const char* ccLua ){

	return this->GetFunction< UnMountLuaFn >( this->base, INDEX_LUASHARED_UNMOUNTLUA )( this->base, ccLua );

}

/* ========================================
	Name : ILuaShared::SetFileContents
	Returns : void* 
=========================================== */

void* ILuaShared::SetFileContents( const char* a1, const char* a2 ){

	return this->GetFunction< SetFileContentsFn >( this->base, INDEX_LUASHARED_SETFILECONTENTS )( this->base, a1, a2 );

}

/* ========================================
	Name : ILuaShared::SetLuaFindHook
	Returns : void* 
=========================================== */

void* ILuaShared::SetLuaFindHook( void* a1 ){

	return this->GetFunction< SetLuaFindHookFn >( this->base, INDEX_LUASHARED_SETLUAFINDHOOK )( this->base, a1 );

}

/* ========================================
	Name : ILuaShared::FindScripts
	Returns : void* 
=========================================== */

void* ILuaShared::FindScripts( const std::string& a1, const std::string& a2, std::vector< std::string, std::allocator< std::string > >& a3 ){

	return this->GetFunction< FindScriptsFn >( this->base, INDEX_LUASHARED_FINDSCRIPTS )( this->base, a1, a2, a3 );

}