Custom location system (#1567)
This commit is contained in:
parent
c35c7fdff9
commit
e5a33e2b32
@ -11,6 +11,8 @@
|
|||||||
#include "services/tunables/tunables_service.hpp"
|
#include "services/tunables/tunables_service.hpp"
|
||||||
#include "services/vehicle/vehicle_control_service.hpp"
|
#include "services/vehicle/vehicle_control_service.hpp"
|
||||||
#include "thread_pool.hpp"
|
#include "thread_pool.hpp"
|
||||||
|
#include "util/teleport.hpp"
|
||||||
|
#include "services/squad_spawner/squad_spawner.hpp"
|
||||||
|
|
||||||
|
|
||||||
namespace big
|
namespace big
|
||||||
@ -21,6 +23,8 @@ namespace big
|
|||||||
command->refresh();
|
command->refresh();
|
||||||
|
|
||||||
register_script_patches();
|
register_script_patches();
|
||||||
|
teleport::fetch_saved_locations();
|
||||||
|
g_squad_spawner_service.fetch_squads();
|
||||||
|
|
||||||
while (g_running)
|
while (g_running)
|
||||||
{
|
{
|
||||||
|
@ -8,6 +8,97 @@
|
|||||||
|
|
||||||
namespace big::teleport
|
namespace big::teleport
|
||||||
{
|
{
|
||||||
|
struct telelocation
|
||||||
|
{
|
||||||
|
std::string name;
|
||||||
|
float x, y, z;
|
||||||
|
};
|
||||||
|
|
||||||
|
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(telelocation, name, x, y, z);
|
||||||
|
|
||||||
|
inline std::map<std::string, std::vector<telelocation>> all_saved_locations;
|
||||||
|
|
||||||
|
inline std::filesystem::path get_telelocations_file_path()
|
||||||
|
{
|
||||||
|
return g_file_manager->get_project_file("telelocations.json").get_path();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool fetch_saved_locations()
|
||||||
|
{
|
||||||
|
all_saved_locations.clear();
|
||||||
|
|
||||||
|
auto path = get_telelocations_file_path();
|
||||||
|
std::ifstream file(path, std::ios::binary);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!file.is_open())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
nlohmann::json j;
|
||||||
|
file >> j;
|
||||||
|
all_saved_locations = j.get<std::map<std::string, std::vector<telelocation>>>();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (const std::exception& e)
|
||||||
|
{
|
||||||
|
LOG(WARNING) << "Failed fetching saved locations: " << e.what() << '\n';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool save_new_location(const std::string& category, telelocation t)
|
||||||
|
{
|
||||||
|
const auto& pair = all_saved_locations.insert({category, {t}});
|
||||||
|
if (!pair.second)
|
||||||
|
{
|
||||||
|
pair.first->second.push_back(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto path = get_telelocations_file_path();
|
||||||
|
|
||||||
|
std::ofstream file_out(path, std::ofstream::trunc | std::ofstream::binary);
|
||||||
|
if (!file_out.is_open())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
nlohmann::json j = all_saved_locations;
|
||||||
|
file_out << j.dump(4);
|
||||||
|
file_out.close();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool delete_saved_location(const std::string& category, const std::string& location_name)
|
||||||
|
{
|
||||||
|
auto path = get_telelocations_file_path();
|
||||||
|
|
||||||
|
const auto& it = all_saved_locations.find(category);
|
||||||
|
if (it == all_saved_locations.end())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
std::erase_if(it->second, [location_name](telelocation t) {
|
||||||
|
return t.name == location_name;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!it->second.size())
|
||||||
|
{
|
||||||
|
all_saved_locations.erase(category);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::ofstream file_out(path, std::ofstream::trunc | std::ofstream::binary);
|
||||||
|
if (!file_out.is_open())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
nlohmann::json j = all_saved_locations;
|
||||||
|
file_out << j.dump(4);
|
||||||
|
file_out.close();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
inline bool teleport_player_to_coords(player_ptr player, Vector3 coords)
|
inline bool teleport_player_to_coords(player_ptr player, Vector3 coords)
|
||||||
{
|
{
|
||||||
Entity ent;
|
Entity ent;
|
||||||
|
@ -141,5 +141,91 @@ namespace big
|
|||||||
ImGui::Text(std::vformat("IPL_POSITION"_T,
|
ImGui::Text(std::vformat("IPL_POSITION"_T,
|
||||||
std::make_format_args(selected_ipl.location.x, selected_ipl.location.y, selected_ipl.location.z))
|
std::make_format_args(selected_ipl.location.x, selected_ipl.location.y, selected_ipl.location.z))
|
||||||
.data());
|
.data());
|
||||||
|
|
||||||
|
ImGui::SeparatorText("Custom Locations");
|
||||||
|
|
||||||
|
ImGui::BeginGroup();
|
||||||
|
static std::string new_location_name;
|
||||||
|
static std::string category = "Default";
|
||||||
|
static teleport::telelocation deletion_telelocation;
|
||||||
|
|
||||||
|
if (!std::string(deletion_telelocation.name).empty())
|
||||||
|
ImGui::OpenPopup("##deletelocation");
|
||||||
|
|
||||||
|
if (ImGui::BeginPopupModal("##deletelocation"))
|
||||||
|
{
|
||||||
|
ImGui::Text("Are you sure you want to delete %s?", deletion_telelocation.name);
|
||||||
|
|
||||||
|
if (ImGui::Button("Yes"))
|
||||||
|
{
|
||||||
|
teleport::delete_saved_location(category, deletion_telelocation.name);
|
||||||
|
deletion_telelocation.name = "";
|
||||||
|
ImGui::CloseCurrentPopup();
|
||||||
|
}
|
||||||
|
ImGui::SameLine();
|
||||||
|
if (ImGui::Button("No"))
|
||||||
|
{
|
||||||
|
deletion_telelocation.name = "";
|
||||||
|
ImGui::CloseCurrentPopup();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::EndPopup();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::PushItemWidth(300);
|
||||||
|
components::input_text_with_hint("Category", "Category", &category);
|
||||||
|
components::input_text_with_hint("Location name", "New location", &new_location_name);
|
||||||
|
ImGui::PopItemWidth();
|
||||||
|
|
||||||
|
components::button("Save current location", [] {
|
||||||
|
teleport::save_new_location(category, {new_location_name, self::pos.x, self::pos.y, self::pos.z});
|
||||||
|
});
|
||||||
|
|
||||||
|
ImGui::BeginGroup();
|
||||||
|
components::small_text("Categories");
|
||||||
|
if (ImGui::BeginListBox("##categories", ImVec2(250, 150)))
|
||||||
|
{
|
||||||
|
for (auto& l : teleport::all_saved_locations | std::ranges::views::keys)
|
||||||
|
{
|
||||||
|
if (ImGui::Selectable(l.data(), l == category))
|
||||||
|
{
|
||||||
|
category = l;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ImGui::EndListBox();
|
||||||
|
}
|
||||||
|
ImGui::EndGroup();
|
||||||
|
ImGui::SameLine();
|
||||||
|
ImGui::BeginGroup();
|
||||||
|
components::small_text("Locations");
|
||||||
|
if (ImGui::BeginListBox("##telelocations", ImVec2(250, 150)))
|
||||||
|
{
|
||||||
|
if (teleport::all_saved_locations.find(category) != teleport::all_saved_locations.end())
|
||||||
|
{
|
||||||
|
for (const auto& l : teleport::all_saved_locations.at(category))
|
||||||
|
{
|
||||||
|
if (ImGui::Selectable(l.name.data()))
|
||||||
|
{
|
||||||
|
if (GetAsyncKeyState(VK_SHIFT) & 0x8000)
|
||||||
|
{
|
||||||
|
deletion_telelocation = l;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
g_fiber_pool->queue_job([l] {
|
||||||
|
teleport::teleport_player_to_coords(g_player_service->get_self(), {l.x, l.y, l.z});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::EndListBox();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImGui::IsItemHovered())
|
||||||
|
ImGui::SetTooltip("Shift click to delete");
|
||||||
|
|
||||||
|
ImGui::EndGroup();
|
||||||
|
|
||||||
|
ImGui::EndGroup();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -103,6 +103,8 @@ namespace big
|
|||||||
}
|
}
|
||||||
ImGui::EndCombo();
|
ImGui::EndCombo();
|
||||||
}
|
}
|
||||||
|
if(ImGui::IsItemHovered())
|
||||||
|
ImGui::SetTooltip("Shift click to delete");
|
||||||
|
|
||||||
ImGui::SeparatorText("Squad Details");
|
ImGui::SeparatorText("Squad Details");
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user