Merge pull request #445 from harlanx/auto_teleport

Add teleportation automation on custom teleport
This commit is contained in:
Taiga 2022-08-24 01:10:27 -06:00 committed by GitHub
commit 0768b3fbb4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 76 additions and 25 deletions

View File

@ -17,15 +17,19 @@
namespace cheat::feature namespace cheat::feature
{ {
CustomTeleports::CustomTeleports() : Feature(), CustomTeleports::CustomTeleports() : Feature(),
NF(f_Enabled, "Custom Teleport", "CustomTeleports", false), NF(f_Enabled, "Custom Teleport", "CustomTeleports", false),
NF(f_Next, "Teleport Next", "CustomTeleports", Hotkey(VK_OEM_6)), NF(f_Next, "Teleport Next", "CustomTeleports", Hotkey(VK_OEM_6)),
NF(f_Previous, "Teleport Previous", "CustomTeleports", Hotkey(VK_OEM_4)), NF(f_Previous, "Teleport Previous", "CustomTeleports", Hotkey(VK_OEM_4)),
NF(f_Interpolate, "Custom Teleport", "CustomTeleports", false), NF(f_Auto, "Auto Teleport", "CustomTeleports", false),
NF(f_Speed, "Interpolation Speed", "CustomTeleports", 10.0f), NF(f_DelayTime, "Delay time (in s)", "CustomTeleports", 20),
dir(util::GetCurrentPath() / "teleports") NF(f_Interpolate, "Interpolate Teleport", "CustomTeleports", false),
NF(f_Speed, "Interpolation Speed", "CustomTeleports", 10.0f),
dir(util::GetCurrentPath() /= "teleports"),
nextTime(0)
{ {
f_Next.value().PressedEvent += MY_METHOD_HANDLER(CustomTeleports::OnNext); f_Next.value().PressedEvent += MY_METHOD_HANDLER(CustomTeleports::OnNext);
f_Previous.value().PressedEvent += MY_METHOD_HANDLER(CustomTeleports::OnPrevious); f_Previous.value().PressedEvent += MY_METHOD_HANDLER(CustomTeleports::OnPrevious);
events::GameUpdateEvent += MY_METHOD_HANDLER(CustomTeleports::OnGameUpdate);
} }
const FeatureGUIInfo& CustomTeleports::GetGUIInfo() const const FeatureGUIInfo& CustomTeleports::GetGUIInfo() const
@ -79,16 +83,19 @@ namespace cheat::feature
} }
} }
Teleport CustomTeleports::SerializeFromJson(std::string json, bool fromfile) std::optional<Teleport> CustomTeleports::SerializeFromJson(std::string json, bool fromfile)
{ {
nlohmann::json j; nlohmann::json j;
try { j = nlohmann::json::parse(json);} try { j = nlohmann::json::parse(json); }
catch (nlohmann::json::parse_error &e) catch (nlohmann::json::parse_error& e)
{ {
LOG_ERROR("Invalid JSON Format"); LOG_ERROR("Invalid JSON Format");
LOG_ERROR("Failed to parse JSON: %s", e.what()); LOG_ERROR("Failed to parse JSON: %s", e.what());
return std::nullopt;
} }
std::string teleportName; std::string teleportName;
teleportName = j["name"]; teleportName = j["name"];
if (j["name"].is_null() && fromfile) if (j["name"].is_null() && fromfile)
{ {
@ -98,7 +105,8 @@ namespace cheat::feature
std::string description; std::string description;
if (j["description"].is_null()) description = ""; if (j["description"].is_null()) description = "";
else description = j["description"]; else description = j["description"];
return Teleport_(teleportName, {j["position"][0], j["position"][1], j["position"][2]}, description); return Teleport_(teleportName, { j["position"][0], j["position"][1], j["position"][2] }, description);
} }
void CustomTeleports::ReloadTeleports() void CustomTeleports::ReloadTeleports()
@ -113,7 +121,8 @@ namespace cheat::feature
std::ifstream ifs(file.path()); std::ifstream ifs(file.path());
std::string json; std::string json;
std::getline(ifs, json); std::getline(ifs, json);
SerializeTeleport(SerializeFromJson(json, true)); auto t = SerializeFromJson(json, true);
if(t.has_value()) SerializeTeleport(t.value());
} }
} }
} }
@ -188,10 +197,35 @@ namespace cheat::feature
void CustomTeleports::OnPrevious() void CustomTeleports::OnPrevious()
{ {
if (f_Auto) return;
OnTeleportKeyPressed(false); OnTeleportKeyPressed(false);
} }
void CustomTeleports::OnNext() void CustomTeleports::OnNext()
{ {
if (f_Auto) return;
OnTeleportKeyPressed(true);
}
void CustomTeleports::OnGameUpdate()
{
if (!f_Enabled || !f_Auto)
return;
auto currentTime = util::GetCurrentTimeMillisec();
if (currentTime < nextTime)
return;
auto loadingManager = GET_SINGLETON(MoleMole_LoadingManager);
if (loadingManager == nullptr || !app::MoleMole_LoadingManager_IsLoaded(loadingManager, nullptr))
return;
auto camera = app::Camera_get_main(nullptr);
if (camera == nullptr) return;
if (!app::Behaviour_get_isActiveAndEnabled(reinterpret_cast<app::Behaviour*>(camera), nullptr))
return;
nextTime = currentTime + (int64_t)f_DelayTime * 1000;
OnTeleportKeyPressed(true); OnTeleportKeyPressed(true);
} }
@ -260,26 +294,35 @@ namespace cheat::feature
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("Load from JSON")) if (ImGui::Button("Load from JSON"))
{ {
selectedIndex = -1; if (!JSONBuffer_.empty()) {
UpdateIndexName(); auto t = SerializeFromJson(JSONBuffer_, false);
SerializeTeleport(SerializeFromJson(JSONBuffer_, false)); if (t.has_value()) {
JSONBuffer_ = ""; selectedIndex = -1;
UpdateIndexName();
SerializeTeleport(t.value());
}
JSONBuffer_.clear();
}
} }
ImGui::InputTextMultiline("JSON input", &JSONBuffer_, ImVec2(0, 50), ImGuiInputTextFlags_AllowTabInput); ImGui::InputTextMultiline("JSON input", &JSONBuffer_, ImVec2(0, 50), ImGuiInputTextFlags_AllowTabInput);
ConfigWidget("Teleport Next", f_Next, true, "Press to teleport next of selected"); ConfigWidget("Teleport Next", f_Next, true, "Press to teleport next of selected.");
ConfigWidget("Teleport Previous", f_Previous, true, "Press to teleport previous of selected"); ConfigWidget("Teleport Previous", f_Previous, true, "Press to teleport previous of selected.");
ConfigWidget("Enable", f_Enabled, ConfigWidget("Enable", f_Enabled,
"Enable teleport-through-list functionality\n" "Enable teleport-through-list functionality.\n"
"Usage:\n" "Usage:\n"
"1. Put Checkmark to the teleports you want to teleport using hotkey\n" "1. Put Checkmark to the teleports you want to teleport using hotkey\n"
"2. Single click the teleport (with checkmark) to select where you want to start\n" "2. Single click the teleport (with checkmark) to select where you want to start\n"
"3. You can now press Next or Previous Hotkey to Teleport through the Checklist\n" "3. You can now press Next or Previous Hotkey to Teleport through the Checklist\n"
"Initially it will teleport the player to the selection made\n" "Initially it will teleport the player to the selection made\n"
"Note: Double click or click the arrow to open teleport details"); "Note: Double click or click the arrow to open teleport details");
ConfigWidget("Enable Interpolation", f_Interpolate, "Enable interpolation between teleports when using keybinds"); ConfigWidget("Enable Interpolation", f_Interpolate, "Enable interpolation between teleports when using keybinds."); ImGui::SameLine(); ImGui::SetNextItemWidth(300.0f);
ConfigWidget("Interpolation Speed", f_Speed, 0.1f, 0.1f, 99.0f, ConfigWidget("Interpolation Speed", f_Speed, 0.1f, 0.1f, 99.0f,
"Interpolation speed.\n recommended setting below or equal to 0.1."); "Interpolation speed.\n recommended setting below or equal to 0.1.");
ConfigWidget("Auto Teleport", f_Auto, "Enable automatic forward teleporation between teleports"); ImGui::SameLine(); ImGui::SetNextItemWidth(300.0f);
ConfigWidget("Delay Time (s)", f_DelayTime, 1, 0, 60, "Delay (in s) between teleport.\n"
"Note: This is not fully tested detection-wise.\nNot recommended with low values.");
if (ImGui::Button("Delete Checked")) if (ImGui::Button("Delete Checked"))
{ {
@ -396,9 +439,12 @@ namespace cheat::feature
if (ImGui::Button(("Select##Button" + stringIndex).c_str())) if (ImGui::Button(("Select##Button" + stringIndex).c_str()))
{ {
selectedIndex = index; auto isChecked = checkedIndices.find(index) != checkedIndices.end();
selectedByClick = true; if (isChecked) {
UpdateIndexName(); selectedIndex = index;
selectedByClick = true;
UpdateIndexName();
}
} }
ImGui::TableNextColumn(); ImGui::TableNextColumn();
@ -432,7 +478,7 @@ namespace cheat::feature
void CustomTeleports::DrawStatus() void CustomTeleports::DrawStatus()
{ {
ImGui::Text("Custom Teleport\n[%s]", selectedIndexName); ImGui::Text("Custom Teleport\n[%s|%s]", f_Auto ? "Auto" : "Manual", selectedIndexName);
} }
CustomTeleports &CustomTeleports::GetInstance() CustomTeleports &CustomTeleports::GetInstance()

View File

@ -4,6 +4,7 @@
#include <cheat-base/cheat/Feature.h> #include <cheat-base/cheat/Feature.h>
#include <cheat-base/config/Config.h> #include <cheat-base/config/Config.h>
#include <cheat-base/thread-safe.h>
#include <set> #include <set>
namespace cheat::feature namespace cheat::feature
@ -27,9 +28,11 @@ namespace cheat::feature
public: public:
config::Field<config::Toggle<Hotkey>> f_Enabled; config::Field<config::Toggle<Hotkey>> f_Enabled;
config::Field<config::Toggle<Hotkey>> f_Interpolate; config::Field<config::Toggle<Hotkey>> f_Interpolate;
config::Field<config::Toggle<Hotkey>> f_Auto;
config::Field<float> f_Speed; config::Field<float> f_Speed;
config::Field<Hotkey> f_Next; config::Field<Hotkey> f_Next;
config::Field<Hotkey> f_Previous; config::Field<Hotkey> f_Previous;
config::Field<int> f_DelayTime;
static CustomTeleports& GetInstance(); static CustomTeleports& GetInstance();
const FeatureGUIInfo& GetGUIInfo() const override; const FeatureGUIInfo& GetGUIInfo() const override;
@ -38,12 +41,13 @@ namespace cheat::feature
Teleport Teleport_(std::string name, app::Vector3 position, std::string description); Teleport Teleport_(std::string name, app::Vector3 position, std::string description);
void SerializeTeleport(Teleport t); void SerializeTeleport(Teleport t);
void ReloadTeleports(); void ReloadTeleports();
Teleport SerializeFromJson(std::string json, bool fromfile); std::optional<Teleport> SerializeFromJson(std::string json, bool fromfile);
void DrawMain() override; void DrawMain() override;
virtual bool NeedStatusDraw() const override; virtual bool NeedStatusDraw() const override;
void DrawStatus() override; void DrawStatus() override;
void OnGameUpdate();
std::vector<Teleport> Teleports; std::vector<Teleport> Teleports;
std::filesystem::path dir; std::filesystem::path dir;
@ -55,6 +59,7 @@ namespace cheat::feature
int selectedIndex = -1; int selectedIndex = -1;
std::string selectedName; std::string selectedName;
std::string selectedIndexName; std::string selectedIndexName;
SafeValue<int64_t> nextTime;
CustomTeleports(); CustomTeleports();
void TeleportTo(app::Vector3 position, bool interpolate); void TeleportTo(app::Vector3 position, bool interpolate);
void OnTeleportKeyPressed(bool next); void OnTeleportKeyPressed(bool next);