-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathMapModule.cpp
69 lines (60 loc) · 2.26 KB
/
MapModule.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include "pch.h"
#include "MapModule.h"
#include <GWCA/Managers/GameThreadMgr.h>
#include <GWCA/Managers/MapMgr.h>
#include <future>
#include <payloads/MapPayload.h>
#include <json.hpp>
#include <queue>
namespace Daybreak::Modules::MapModule {
std::queue<std::promise<MapPayload>*> PromiseQueue;
std::mutex GameThreadMutex;
GW::HookEntry GameThreadHook;
volatile bool initialized = false;
MapPayload GetPayload() {
auto isLoaded = GW::Map::GetIsMapLoaded();
auto instanceType = GW::Map::GetInstanceType();
auto instanceTime = GW::Map::GetInstanceTime();
auto mapInfo = GW::Map::GetCurrentMapInfo();
auto isInCinematic = GW::Map::GetIsInCinematic();
auto region = GW::Map::GetRegion();
auto mapId = GW::Map::GetMapID();
MapPayload mapPayload;
mapPayload.Campaign = static_cast<uint32_t>(mapInfo->campaign);
mapPayload.Continent = static_cast<uint32_t>(mapInfo->continent);
mapPayload.Region = mapInfo->region;
mapPayload.InstanceType = (uint32_t)instanceType;
mapPayload.IsLoaded = isLoaded;
mapPayload.Timer = instanceTime;
mapPayload.Id = (uint32_t)mapId;
return mapPayload;
}
void EnsureInitialized() {
GameThreadMutex.lock();
if (!initialized) {
GW::GameThread::RegisterGameThreadCallback(&GameThreadHook, [&](GW::HookStatus*) {
while (!PromiseQueue.empty()) {
auto promise = PromiseQueue.front();
PromiseQueue.pop();
try {
auto payload = GetPayload();
promise->set_value(payload);
}
catch (...) {
MapPayload payload;
promise->set_value(payload);
}
}
});
initialized = true;
}
GameThreadMutex.unlock();
}
void GetMapInfo(const httplib::Request&, httplib::Response& res) {
auto response = std::promise<MapPayload>();
EnsureInitialized();
PromiseQueue.emplace(&response);
json responsePayload = response.get_future().get();
res.set_content(responsePayload.dump(), "text/json");
}
}