Browse Source

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

master
Тим 8 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 @@
1
+cmake_minimum_required(VERSION 2.8)
2
+
3
+project(SAMPFUNCS)
4
+
5
+IF(NOT CMAKE_BUILD_TYPE)
6
+   SET( CMAKE_BUILD_TYPE MinSizeRel ... FORCE )
7
+ENDIF(CMAKE_BUILD_TYPE)
8
+
9
+ADD_DEFINITIONS(-DWIN32=1)
10
+
11
+find_program(CCACHE_FOUND ccache)
12
+if(CCACHE_FOUND)
13
+	set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
14
+	set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
15
+endif(CCACHE_FOUND)
16
+
17
+aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} ${PROJECT_NAME}_LIST)
18
+
19
+add_definitions("-ffunction-sections -fexec-charset=CP1251 -pipe -w")
20
+set(CMAKE_SHARED_LINKER_FLAGS "-static -Wl,--gc-sections -ffast-math")
21
+
22
+add_library(${PROJECT_NAME} STATIC ${${PROJECT_NAME}_LIST})
23
+
24
+set_target_properties(${PROJECT_NAME} PROPERTIES
25
+    CXX_STANDARD 17
26
+    CXX_STANDARD_REQUIRED YES
27
+    CXX_EXTENSIONS NO
28
+)
29
+
30
+target_link_libraries(${PROJECT_NAME})

+ 97
- 0
sampfuncs.cpp View File

@@ -0,0 +1,97 @@
1
+#include "sampfuncs.h"
2
+
3
+SF *SF::self = nullptr;
4
+
5
+SF::SF() {
6
+	lib = LoadLibraryA( "SAMPFUNCS.asi" );
7
+	_SF = new origSF();
8
+
9
+	_Log = std::bind(
10
+		(void ( * )( origSF *, const char *, ... ))GetProcAddress( lib, "?Log@SAMPFUNCS@@QAAXPBDZZ" ), _SF,
11
+		std::placeholders::_1 );
12
+	_Log_str = std::bind(
13
+		(void ( * )( origSF *, const std::string & ))GetProcAddress(
14
+			lib, "?Log@SAMPFUNCS@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z" ),
15
+		_SF, std::placeholders::_1 );
16
+	_LogConsole = std::bind(
17
+		(void ( * )( origSF *, const char *, ... ))GetProcAddress( lib, "?LogConsole@SAMPFUNCS@@QAAXPBDZZ" ),
18
+		_SF, std::placeholders::_1 );
19
+	_LogFile = std::bind(
20
+		(void ( * )( origSF *, const char *, ... ))GetProcAddress( lib, "?LogFile@SAMPFUNCS@@QAAXPBDZZ" ), _SF,
21
+		std::placeholders::_1 );
22
+	execConsoleCommand = std::bind( (void ( * )( origSF *, std::string ))GetProcAddress(
23
+										lib, "?execConsoleCommand@SAMPFUNCS@@QAEXV?$basic_string@DU?$char_"
24
+											 "traits@D@std@@V?$allocator@D@2@@std@@@Z" ),
25
+									_SF, std::placeholders::_1 );
26
+	getAPIVersion = std::bind(
27
+		(unsigned ( * )( origSF * ))GetProcAddress( lib, "?getAPIVersion@SAMPFUNCS@@QAEIXZ" ), _SF );
28
+	getConsoleCommands = std::bind( (std::vector<stCommandInfo>( * )( origSF * ))GetProcAddress(
29
+										lib, "?getConsoleCommands@SAMPFUNCS@@QAE?AV?$vector@UstCommandInfo@@"
30
+											 "V?$allocator@UstCommandInfo@@@std@@@std@@XZ" ),
31
+									_SF );
32
+	getSFVersion =
33
+		std::bind( (unsigned ( * )( origSF * ))GetProcAddress( lib, "?getSFVersion@SAMPFUNCS@@QAEIXZ" ), _SF );
34
+	isConsoleOpened =
35
+		std::bind( (bool ( * )( origSF * ))GetProcAddress( lib, "?isConsoleOpened@SAMPFUNCS@@QAE_NXZ" ), _SF );
36
+	registerConsoleCommand = std::bind( (void ( * )( origSF *, std::string, CommandProc ))GetProcAddress(
37
+											lib, "?registerConsoleCommand@SAMPFUNCS@@QAEXV?$basic_string@DU?$"
38
+												 "char_traits@D@std@@V?$allocator@D@2@@std@@P6GX0@Z@Z" ),
39
+										_SF, std::placeholders::_1, std::placeholders::_2 );
40
+	setConsoleCommandDescription =
41
+		std::bind( (void ( * )( origSF *, std::string, std::string ))GetProcAddress(
42
+					   lib, "?setConsoleCommandDescription@SAMPFUNCS@@QAEXV?$basic_string@DU?$char_traits@D@"
43
+							"std@@V?$allocator@D@2@@std@@0@Z" ),
44
+				   _SF, std::placeholders::_1, std::placeholders::_2 );
45
+	unregisterConsoleCommand = std::bind( (void ( * )( origSF *, std::string ))GetProcAddress(
46
+											  lib, "?unregisterConsoleCommand@SAMPFUNCS@@QAEXV?$basic_string@"
47
+												   "DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z" ),
48
+										  _SF, std::placeholders::_1 );
49
+}
50
+
51
+SF::~SF() { delete _SF; }
52
+
53
+
54
+SF *SF::Instance() {
55
+	if ( !self ) self = new SF();
56
+	return self;
57
+}
58
+
59
+void SF::DeleteInstance() {
60
+	if ( !self ) return;
61
+	delete self;
62
+	self = nullptr;
63
+}
64
+
65
+bool SF::isLoaded() { return lib != 0 && lib != reinterpret_cast<HMODULE>(-1); }
66
+
67
+void SF::Log( const char *Text, ... ) {
68
+	if ( !isLoaded() ) return;
69
+	va_list ap;
70
+	va_start( ap, Text );
71
+	vsprintf( format, Text, ap );
72
+	va_end( ap );
73
+	_Log( format );
74
+}
75
+
76
+void SF::Log( const std::string &Text ) {
77
+	if ( !isLoaded() ) return;
78
+	_Log_str( Text );
79
+}
80
+
81
+void SF::LogConsole( const char *Text, ... ) {
82
+	if ( !isLoaded() ) return;
83
+	va_list ap;
84
+	va_start( ap, Text );
85
+	vsprintf( format, Text, ap );
86
+	va_end( ap );
87
+	_LogConsole( format );
88
+}
89
+
90
+void SF::LogFile( const char *Text, ... ) {
91
+	if ( !isLoaded() ) return;
92
+	va_list ap;
93
+	va_start( ap, Text );
94
+	vsprintf( format, Text, ap );
95
+	va_end( ap );
96
+	_LogFile( format );
97
+}

+ 111
- 0
sampfuncs.h View File

@@ -0,0 +1,111 @@
1
+#ifndef SF_H
2
+#define SF_H
3
+
4
+#include <vector>
5
+#include <map>
6
+#include <string>
7
+#include <windows.h>
8
+#include <functional>
9
+#include <regex>
10
+
11
+typedef void(__stdcall *CommandProc) (std::string params);
12
+struct stCommandInfo
13
+{
14
+	enum CommandType { NOPE, SCRIPT, PLUGIN };
15
+
16
+	stCommandInfo(std::string n, CommandType t, void* o){
17
+		name = n;
18
+		type = t;
19
+		owner = o;
20
+	}
21
+
22
+	std::string					name;
23
+	CommandType					type;
24
+	void                        *owner;
25
+};
26
+
27
+/// Болванка для скармливания некоторым функциям SF.
28
+class origSF
29
+{
30
+public:
31
+	void *pPlugin;
32
+};
33
+
34
+/// Класс для взаимодействия с консолью SF.
35
+class SF
36
+{
37
+	SF();
38
+	~SF();
39
+	static SF *self;
40
+public:
41
+	static SF *Instance();
42
+	static void DeleteInstance();
43
+	/// \return \b bool -> проверка, что SF загружен в игру.
44
+	bool isLoaded();
45
+
46
+	/**
47
+	 * \brief Логирование в консоль и в файл.
48
+	 * \param[in] format Формат строки.
49
+	 * \param[in] args Аргументы для форматирования строки.
50
+	 */
51
+	void Log(const char*, ...);
52
+	/**
53
+	 * \brief Логирование в консоль и в файл.
54
+	 * \param[in] string Строка.
55
+	 */
56
+	void Log(const std::string &);
57
+	/**
58
+	 * \brief Логирование только консоль.
59
+	 * \param[in] format Формат строки.
60
+	 * \param[in] args Аргументы для форматирования строки.
61
+	 */
62
+	void LogConsole(const char*, ...);
63
+	/**
64
+	 * \brief Логирование только в файл
65
+	 * \param[in] format Формат строки.
66
+	 * \param[in] args Аргументы для форматирования строки.
67
+	 */
68
+	void LogFile(const char*, ...);
69
+
70
+	/// \return \b unsigned -> Возвращает версию SFAPI.
71
+	std::function<unsigned()> getAPIVersion;
72
+	/// \return \b unsigned -> Возвращает версию SF.
73
+	std::function<unsigned()> getSFVersion;
74
+
75
+	/// \param[in] command Выполняет команду. Аргументы передаются вместе с командой.
76
+	std::function<void(std::string)> execConsoleCommand;
77
+	/// \return Возвращает вектор команд.
78
+	std::function<std::vector<stCommandInfo>()> getConsoleCommands;
79
+	/**
80
+	 * \brief Регистрация новой команды в консоле SF.
81
+	 * \param[in] command Команда.
82
+	 * \param[in] proc Функция, которая будет вызываться при вводе команды.
83
+	 */
84
+	std::function<void(std::string, CommandProc)> registerConsoleCommand;
85
+	/**
86
+	 * \brief Задает описание команде.
87
+	 * \param[in] command Команда.
88
+	 * \param [in] description Описание.
89
+	 */
90
+	std::function<void(std::string, std::string)> setConsoleCommandDescription;
91
+	/**
92
+	 * \brief Удаление команды из консоли SF.
93
+	 * \param[in] command Команда.
94
+	 */
95
+	std::function<void(std::string)> unregisterConsoleCommand;
96
+
97
+	/// \return \b bool -> Проверяет, открыта ли консоль.
98
+	std::function<bool()> isConsoleOpened;
99
+
100
+private:
101
+	HMODULE lib = 0;
102
+	origSF *_SF;
103
+	char format[102400];
104
+
105
+	std::function<void(const char*)> _Log;
106
+	std::function<void(const std::string &)> _Log_str;
107
+	std::function<void(const char*)> _LogConsole;
108
+	std::function<void(const char*)> _LogFile;
109
+};
110
+
111
+#endif // SF_H

Loading…
Cancel
Save