Browse Source

Вынесение SF из AsiBase

master
Тим 11 months ago
commit
f5f9f18ea0
3 changed files with 238 additions and 0 deletions
  1. 30
    0
      CMakeLists.txt
  2. 97
    0
      sampfuncs.cpp
  3. 111
    0
      sampfuncs.h

+ 30
- 0
CMakeLists.txt View File

@@ -0,0 +1,30 @@
cmake_minimum_required(VERSION 2.8)

project(SAMPFUNCS)

IF(NOT CMAKE_BUILD_TYPE)
SET( CMAKE_BUILD_TYPE MinSizeRel ... FORCE )
ENDIF(CMAKE_BUILD_TYPE)

ADD_DEFINITIONS(-DWIN32=1)

find_program(CCACHE_FOUND ccache)
if(CCACHE_FOUND)
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
endif(CCACHE_FOUND)

aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} ${PROJECT_NAME}_LIST)

add_definitions("-ffunction-sections -fexec-charset=CP1251 -pipe -w")
set(CMAKE_SHARED_LINKER_FLAGS "-static -Wl,--gc-sections -ffast-math")

add_library(${PROJECT_NAME} STATIC ${${PROJECT_NAME}_LIST})

set_target_properties(${PROJECT_NAME} PROPERTIES
CXX_STANDARD 17
CXX_STANDARD_REQUIRED YES
CXX_EXTENSIONS NO
)

target_link_libraries(${PROJECT_NAME})

+ 97
- 0
sampfuncs.cpp View File

@@ -0,0 +1,97 @@
#include "sampfuncs.h"

SF *SF::self = nullptr;

SF::SF() {
lib = LoadLibraryA( "SAMPFUNCS.asi" );
_SF = new origSF();

_Log = std::bind(
(void ( * )( origSF *, const char *, ... ))GetProcAddress( lib, "?Log@SAMPFUNCS@@QAAXPBDZZ" ), _SF,
std::placeholders::_1 );
_Log_str = std::bind(
(void ( * )( origSF *, const std::string & ))GetProcAddress(
lib, "?Log@SAMPFUNCS@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z" ),
_SF, std::placeholders::_1 );
_LogConsole = std::bind(
(void ( * )( origSF *, const char *, ... ))GetProcAddress( lib, "?LogConsole@SAMPFUNCS@@QAAXPBDZZ" ),
_SF, std::placeholders::_1 );
_LogFile = std::bind(
(void ( * )( origSF *, const char *, ... ))GetProcAddress( lib, "?LogFile@SAMPFUNCS@@QAAXPBDZZ" ), _SF,
std::placeholders::_1 );
execConsoleCommand = std::bind( (void ( * )( origSF *, std::string ))GetProcAddress(
lib, "?execConsoleCommand@SAMPFUNCS@@QAEXV?$basic_string@DU?$char_"
"traits@D@std@@V?$allocator@D@2@@std@@@Z" ),
_SF, std::placeholders::_1 );
getAPIVersion = std::bind(
(unsigned ( * )( origSF * ))GetProcAddress( lib, "?getAPIVersion@SAMPFUNCS@@QAEIXZ" ), _SF );
getConsoleCommands = std::bind( (std::vector<stCommandInfo>( * )( origSF * ))GetProcAddress(
lib, "?getConsoleCommands@SAMPFUNCS@@QAE?AV?$vector@UstCommandInfo@@"
"V?$allocator@UstCommandInfo@@@std@@@std@@XZ" ),
_SF );
getSFVersion =
std::bind( (unsigned ( * )( origSF * ))GetProcAddress( lib, "?getSFVersion@SAMPFUNCS@@QAEIXZ" ), _SF );
isConsoleOpened =
std::bind( (bool ( * )( origSF * ))GetProcAddress( lib, "?isConsoleOpened@SAMPFUNCS@@QAE_NXZ" ), _SF );
registerConsoleCommand = std::bind( (void ( * )( origSF *, std::string, CommandProc ))GetProcAddress(
lib, "?registerConsoleCommand@SAMPFUNCS@@QAEXV?$basic_string@DU?$"
"char_traits@D@std@@V?$allocator@D@2@@std@@P6GX0@Z@Z" ),
_SF, std::placeholders::_1, std::placeholders::_2 );
setConsoleCommandDescription =
std::bind( (void ( * )( origSF *, std::string, std::string ))GetProcAddress(
lib, "?setConsoleCommandDescription@SAMPFUNCS@@QAEXV?$basic_string@DU?$char_traits@D@"
"std@@V?$allocator@D@2@@std@@0@Z" ),
_SF, std::placeholders::_1, std::placeholders::_2 );
unregisterConsoleCommand = std::bind( (void ( * )( origSF *, std::string ))GetProcAddress(
lib, "?unregisterConsoleCommand@SAMPFUNCS@@QAEXV?$basic_string@"
"DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z" ),
_SF, std::placeholders::_1 );
}

SF::~SF() { delete _SF; }


SF *SF::Instance() {
if ( !self ) self = new SF();
return self;
}

void SF::DeleteInstance() {
if ( !self ) return;
delete self;
self = nullptr;
}

bool SF::isLoaded() { return lib != 0 && lib != reinterpret_cast<HMODULE>(-1); }

void SF::Log( const char *Text, ... ) {
if ( !isLoaded() ) return;
va_list ap;
va_start( ap, Text );
vsprintf( format, Text, ap );
va_end( ap );
_Log( format );
}

void SF::Log( const std::string &Text ) {
if ( !isLoaded() ) return;
_Log_str( Text );
}

void SF::LogConsole( const char *Text, ... ) {
if ( !isLoaded() ) return;
va_list ap;
va_start( ap, Text );
vsprintf( format, Text, ap );
va_end( ap );
_LogConsole( format );
}

void SF::LogFile( const char *Text, ... ) {
if ( !isLoaded() ) return;
va_list ap;
va_start( ap, Text );
vsprintf( format, Text, ap );
va_end( ap );
_LogFile( format );
}

+ 111
- 0
sampfuncs.h View File

@@ -0,0 +1,111 @@
#ifndef SF_H
#define SF_H

#include <vector>
#include <map>
#include <string>
#include <windows.h>
#include <functional>
#include <regex>

typedef void(__stdcall *CommandProc) (std::string params);
struct stCommandInfo
{
enum CommandType { NOPE, SCRIPT, PLUGIN };

stCommandInfo(std::string n, CommandType t, void* o){
name = n;
type = t;
owner = o;
}

std::string name;
CommandType type;
void *owner;
};

/// Болванка для скармливания некоторым функциям SF.
class origSF
{
public:
void *pPlugin;
};

/// Класс для взаимодействия с консолью SF.
class SF
{
SF();
~SF();
static SF *self;
public:
static SF *Instance();
static void DeleteInstance();
/// \return \b bool -> проверка, что SF загружен в игру.
bool isLoaded();

/**
* \brief Логирование в консоль и в файл.
* \param[in] format Формат строки.
* \param[in] args Аргументы для форматирования строки.
*/
void Log(const char*, ...);
/**
* \brief Логирование в консоль и в файл.
* \param[in] string Строка.
*/
void Log(const std::string &);
/**
* \brief Логирование только консоль.
* \param[in] format Формат строки.
* \param[in] args Аргументы для форматирования строки.
*/
void LogConsole(const char*, ...);
/**
* \brief Логирование только в файл
* \param[in] format Формат строки.
* \param[in] args Аргументы для форматирования строки.
*/
void LogFile(const char*, ...);

/// \return \b unsigned -> Возвращает версию SFAPI.
std::function<unsigned()> getAPIVersion;
/// \return \b unsigned -> Возвращает версию SF.
std::function<unsigned()> getSFVersion;

/// \param[in] command Выполняет команду. Аргументы передаются вместе с командой.
std::function<void(std::string)> execConsoleCommand;
/// \return Возвращает вектор команд.
std::function<std::vector<stCommandInfo>()> getConsoleCommands;
/**
* \brief Регистрация новой команды в консоле SF.
* \param[in] command Команда.
* \param[in] proc Функция, которая будет вызываться при вводе команды.
*/
std::function<void(std::string, CommandProc)> registerConsoleCommand;
/**
* \brief Задает описание команде.
* \param[in] command Команда.
* \param [in] description Описание.
*/
std::function<void(std::string, std::string)> setConsoleCommandDescription;
/**
* \brief Удаление команды из консоли SF.
* \param[in] command Команда.
*/
std::function<void(std::string)> unregisterConsoleCommand;

/// \return \b bool -> Проверяет, открыта ли консоль.
std::function<bool()> isConsoleOpened;

private:
HMODULE lib = 0;
origSF *_SF;
char format[102400];

std::function<void(const char*)> _Log;
std::function<void(const std::string &)> _Log_str;
std::function<void(const char*)> _LogConsole;
std::function<void(const char*)> _LogFile;
};

#endif // SF_H

Loading…
Cancel
Save