Ark Server API 3.54
Serverside plugin support for Ark Survival Evolved.
Loading...
Searching...
No Matches
ArkBaseApi.cpp
Go to the documentation of this file.
1#include "ArkBaseApi.h"
2
3#include <filesystem>
4
5#include <Tools.h>
6
8#include "../Offsets.h"
9#include "../PDBReader/PDBReader.h"
10#include "../PluginManager/PluginManager.h"
11#include "../Hooks.h"
12#include "../Commands.h"
13#include "Logger/Logger.h"
14#include "HooksImpl.h"
15#include "ApiUtils.h"
16
17namespace API
18{
19 constexpr float api_version = 3.55f;
20
22 : commands_(std::make_unique<ArkApi::Commands>()),
23 hooks_(std::make_unique<Hooks>()),
24 api_utils_(std::make_unique<ArkApi::ApiUtils>())
25 {
26 }
27
29 {
30 Log::GetLog()->info("-----------------------------------------------");
31 Log::GetLog()->info("ARK: Server Api V{:.2f}", GetVersion());
32 Log::GetLog()->info("Loading...\n");
33
34 PdbReader pdb_reader;
35
36 std::unordered_map<std::string, intptr_t> offsets_dump;
37 std::unordered_map<std::string, BitField> bitfields_dump;
38
39 try
40 {
41 const std::string current_dir = Tools::GetCurrentDir();
42
43 const std::wstring dir = Tools::Utf8Decode(current_dir);
44 pdb_reader.Read(dir + L"/ShooterGameServer.pdb", &offsets_dump, &bitfields_dump);
45 }
46 catch (const std::exception& error)
47 {
48 Log::GetLog()->critical("Failed to read pdb - {}", error.what());
49 return false;
50 }
51
52 Offsets::Get().Init(move(offsets_dump), move(bitfields_dump));
53
55
56 Log::GetLog()->info("API was successfully loaded");
57 Log::GetLog()->info("-----------------------------------------------\n");
58
59 return true;
60 }
61
63 {
64 return api_version;
65 }
66
68 {
69 return "ArkApi";
70 }
71
72 std::unique_ptr<ArkApi::ICommands>& ArkBaseApi::GetCommands()
73 {
74 return commands_;
75 }
76
77 std::unique_ptr<ArkApi::IHooks>& ArkBaseApi::GetHooks()
78 {
79 return hooks_;
80 }
81
82 std::unique_ptr<ArkApi::IApiUtils>& ArkBaseApi::GetApiUtils()
83 {
84 return api_utils_;
85 }
86
88 {
89 GetCommands()->AddConsoleCommand("plugins.load", &LoadPluginCmd);
90 GetCommands()->AddConsoleCommand("plugins.unload", &UnloadPluginCmd);
91 GetCommands()->AddRconCommand("plugins.load", &LoadPluginRcon);
92 GetCommands()->AddRconCommand("plugins.unload", &UnloadPluginRcon);
93 }
94
96 {
97 TArray<FString> parsed;
98 cmd->ParseIntoArray(parsed, L" ", true);
99
100 if (parsed.IsValidIndex(1))
101 {
102 const std::string plugin_name = parsed[1].ToString();
103
104 try
105 {
106 PluginManager::Get().LoadPlugin(plugin_name);
107 }
108 catch (const std::exception& error)
109 {
110 Log::GetLog()->warn("({}) {}", __FUNCTION__, error.what());
111 return FString::Format("Failed to load plugin - {}", error.what());
112 }
113
114 Log::GetLog()->info("Loaded plugin - {}", plugin_name.c_str());
115
116 return "Successfully loaded plugin";
117 }
118
119 return "Plugin not found";
120 }
121
123 {
124 TArray<FString> parsed;
125 cmd->ParseIntoArray(parsed, L" ", true);
126
127 if (parsed.IsValidIndex(1))
128 {
129 const std::string plugin_name = parsed[1].ToString();
130
131 try
132 {
133 PluginManager::Get().UnloadPlugin(plugin_name);
134 }
135 catch (const std::exception& error)
136 {
137 Log::GetLog()->warn("({}) {}", __FUNCTION__, error.what());
138 return *FString::Format("Failed to unload plugin - {}", error.what());
139 }
140
141 Log::GetLog()->info("Unloaded plugin - {}", plugin_name.c_str());
142
143 return L"Successfully unloaded plugin";
144 }
145
146 return L"Plugin not found";
147 }
148
149 // Command Callbacks
150 void ArkBaseApi::LoadPluginCmd(APlayerController* player_controller, FString* cmd, bool /*unused*/)
151 {
152 auto* shooter_controller = static_cast<AShooterPlayerController*>(player_controller);
154 }
155
156 void ArkBaseApi::UnloadPluginCmd(APlayerController* player_controller, FString* cmd, bool /*unused*/)
157 {
158 auto* shooter_controller = static_cast<AShooterPlayerController*>(player_controller);
160 }
161
162 // RCON Command Callbacks
163 void ArkBaseApi::LoadPluginRcon(RCONClientConnection* rcon_connection, RCONPacket* rcon_packet, UWorld* /*unused*/)
164 {
165 FString reply = LoadPlugin(&rcon_packet->Body);
166 rcon_connection->SendMessageW(rcon_packet->Id, 0, &reply);
167 }
168
170 UWorld* /*unused*/)
171 {
172 FString reply = UnloadPlugin(&rcon_packet->Body);
173 rcon_connection->SendMessageW(rcon_packet->Id, 0, &reply);
174 }
175} // namespace API
int Id
Definition: Other.h:181
FString Body
Definition: Other.h:183
std::string GetApiName() override
Definition: ArkBaseApi.cpp:67
std::unique_ptr< ArkApi::IApiUtils > & GetApiUtils() override
Definition: ArkBaseApi.cpp:82
static void LoadPluginCmd(APlayerController *, FString *, bool)
Definition: ArkBaseApi.cpp:150
std::unique_ptr< ArkApi::IHooks > & GetHooks() override
Definition: ArkBaseApi.cpp:77
std::unique_ptr< ArkApi::IApiUtils > api_utils_
Definition: ArkBaseApi.h:39
void RegisterCommands() override
Definition: ArkBaseApi.cpp:87
float GetVersion() override
Definition: ArkBaseApi.cpp:62
std::unique_ptr< ArkApi::ICommands > & GetCommands() override
Definition: ArkBaseApi.cpp:72
static FString LoadPlugin(FString *cmd)
Definition: ArkBaseApi.cpp:95
static void UnloadPluginRcon(RCONClientConnection *, RCONPacket *, UWorld *)
Definition: ArkBaseApi.cpp:169
std::unique_ptr< ArkApi::ICommands > commands_
Definition: ArkBaseApi.h:37
bool Init() override
Definition: ArkBaseApi.cpp:28
static void UnloadPluginCmd(APlayerController *, FString *, bool)
Definition: ArkBaseApi.cpp:156
static void LoadPluginRcon(RCONClientConnection *, RCONPacket *, UWorld *)
Definition: ArkBaseApi.cpp:163
std::unique_ptr< ArkApi::IHooks > hooks_
Definition: ArkBaseApi.h:38
static FString UnloadPlugin(FString *cmd)
Definition: ArkBaseApi.cpp:122
void Init(std::unordered_map< std::string, intptr_t > &&offsets_dump, std::unordered_map< std::string, BitField > &&bitfields_dump)
Definition: Offsets.cpp:43
static Offsets & Get()
Definition: Offsets.cpp:37
void Read(const std::wstring &path, std::unordered_map< std::string, intptr_t > *offsets_dump, std::unordered_map< std::string, BitField > *bitfields_dump)
Definition: PDBReader.cpp:44
static PluginManager & Get()
std::shared_ptr< Plugin > & LoadPlugin(const std::string &plugin_name) noexcept(false)
Load plugin by it's name.
void UnloadPlugin(const std::string &plugin_name) noexcept(false)
Unload plugin by it's name. Plugin must free all used resources.
FORCEINLINE void SendServerMessage(AShooterPlayerController *player_controller, FLinearColor msg_color, const T *msg, Args &&... args)
Sends server message to the specific player. Using fmt::format.
Definition: ArkApiUtils.h:52
static const FColor Green
Definition: ColorList.h:13
int32 ParseIntoArray(TArray< FString > &OutArray, const TCHAR *pchDelim, bool InCullEmpty=true) const
Definition: FString.h:2560
static FString Format(const T *format, Args &&... args)
Formats text using fmt::format.
Definition: FString.h:1633
static std::shared_ptr< spdlog::logger > & GetLog()
Definition: Logger.h:22
Definition: TArray.h:268
FORCEINLINE bool IsValidIndex(int32 Index) const
Definition: TArray.h:600
constexpr float api_version
Definition: ArkBaseApi.cpp:19
std::string GetCurrentDir()
Definition: Tools.cpp:7
std::wstring Utf8Decode(const std::string &str)
Converts an UTF8 string to a wide Unicode String.
Definition: Tools.cpp:56
IApiUtils & GetApiUtils()
Definition: ApiUtils.cpp:99
void InitHooks()
Definition: HooksImpl.cpp:31
STL namespace.
void SendMessageW(int Id, int Type, FString *OutGoingMessage)
Definition: Other.h:174