Cleanup + fixes

This commit is contained in:
Federico Cecchetto 2021-12-22 22:25:41 +01:00
parent 8d12e08bf5
commit 8c3a73c5d2
6 changed files with 89 additions and 72 deletions

View File

@ -61,9 +61,9 @@ namespace gui
void show_notifications() void show_notifications()
{ {
static auto window_flags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoSavedSettings | static const auto window_flags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoSavedSettings |
ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav |
ImGuiWindowFlags_NoMove; ImGuiWindowFlags_NoMove;
notifications.access([](std::vector<notification_t>& notifications_) notifications.access([](std::vector<notification_t>& notifications_)
{ {
@ -77,13 +77,8 @@ namespace gui
continue; continue;
} }
const auto title = i->title.size() <= 34 const auto title = utils::string::truncate(i->title, 34, "...");
? i->title const auto text = utils::string::truncate(i->text, 34, "...");
: i->title.substr(0, 31) + "...";
const auto text = i->text.size() <= 34
? i->text
: i->text.substr(0, 31) + "...";
ImGui::SetNextWindowSizeConstraints(ImVec2(250, 50), ImVec2(250, 50)); ImGui::SetNextWindowSizeConstraints(ImVec2(250, 50), ImVec2(250, 50));
ImGui::SetNextWindowBgAlpha(0.6f); ImGui::SetNextWindowBgAlpha(0.6f);
@ -101,6 +96,11 @@ namespace gui
}); });
} }
void menu_checkbox(const std::string& name, const std::string& menu)
{
ImGui::Checkbox(name.data(), &enabled_menus[menu]);
}
void gui_draw() void gui_draw()
{ {
show_notifications(); show_notifications();
@ -117,9 +117,9 @@ namespace gui
{ {
if (ImGui::BeginMenu("Windows")) if (ImGui::BeginMenu("Windows"))
{ {
ImGui::Checkbox("Asset list", &enabled_menus["asset_list"]); menu_checkbox("Asset list", "asset_list");
ImGui::Checkbox("Entity list", &enabled_menus["entity_list"]); menu_checkbox("Entity list", "entity_list");
ImGui::Checkbox("Console", &enabled_menus["console"]); menu_checkbox("Console", "console");
ImGui::EndMenu(); ImGui::EndMenu();
} }
@ -177,7 +177,7 @@ namespace gui
utils::hook::detour wnd_proc_hook; utils::hook::detour wnd_proc_hook;
LRESULT wnd_proc_stub(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) LRESULT wnd_proc_stub(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{ {
if (toggled && ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) if (wParam != VK_ESCAPE && toggled && ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam))
{ {
return TRUE; return TRUE;
} }

View File

@ -16,7 +16,8 @@ namespace asset_list
namespace namespace
{ {
bool shown_assets[game::XAssetType::ASSET_TYPE_COUNT]; bool shown_assets[game::XAssetType::ASSET_TYPE_COUNT];
std::string filter_buffer{}; std::string asset_type_filter{};
std::string assets_name_filter{};
void enum_assets(const game::XAssetType type, const std::function<void(game::XAssetHeader)>& callback, const bool includeOverride) void enum_assets(const game::XAssetType type, const std::function<void(game::XAssetHeader)>& callback, const bool includeOverride)
{ {
@ -37,18 +38,21 @@ namespace asset_list
{ {
ImGui::Begin("Asset list", &gui::enabled_menus["asset_list"]); ImGui::Begin("Asset list", &gui::enabled_menus["asset_list"]);
ImGui::InputText("asset type", &filter_buffer); ImGui::InputText("asset type", &asset_type_filter);
ImGui::BeginChild("asset type list");
for (auto i = 0; i < game::XAssetType::ASSET_TYPE_COUNT; i++) for (auto i = 0; i < game::XAssetType::ASSET_TYPE_COUNT; i++)
{ {
const auto name = game::g_assetNames[i]; const auto name = game::g_assetNames[i];
const auto type = static_cast<game::XAssetType>(i); const auto type = static_cast<game::XAssetType>(i);
if (utils::string::find_lower(name, filter_buffer)) if (utils::string::find_lower(name, asset_type_filter))
{ {
ImGui::Checkbox(name, &shown_assets[type]); ImGui::Checkbox(name, &shown_assets[type]);
} }
} }
ImGui::EndChild();
ImGui::End(); ImGui::End();
} }
@ -65,25 +69,21 @@ namespace asset_list
ImGui::SetNextWindowSizeConstraints(ImVec2(500, 500), ImVec2(1000, 1000)); ImGui::SetNextWindowSizeConstraints(ImVec2(500, 500), ImVec2(1000, 1000));
ImGui::Begin(name, &shown_assets[type]); ImGui::Begin(name, &shown_assets[type]);
static char filter[0x200]{}; ImGui::InputText("asset name", &assets_name_filter);
ImGui::InputText("asset name", filter, IM_ARRAYSIZE(filter)); ImGui::BeginChild("assets list");
enum_assets(type, [type](const game::XAssetHeader header) enum_assets(type, [type](const game::XAssetHeader header)
{ {
const auto asset = game::XAsset{type, header}; const auto asset = game::XAsset{type, header};
const auto* const asset_name = game::DB_GetXAssetName(&asset); const auto* const asset_name = game::DB_GetXAssetName(&asset);
if (!utils::string::find_lower(asset_name, filter)) if (utils::string::find_lower(asset_name, assets_name_filter) && ImGui::Button(asset_name))
{
return;
}
if (ImGui::Button(asset_name))
{ {
gui::copy_to_clipboard(asset_name); gui::copy_to_clipboard(asset_name);
} }
}, true); }, true);
ImGui::EndChild();
ImGui::End(); ImGui::End();
} }
} }

View File

@ -96,8 +96,8 @@ namespace gui_console
{ {
std::string text{}; std::string text{};
const auto history = game_console::get_output(); const auto output = game_console::get_output();
for (const auto& line : history) for (const auto& line : output)
{ {
if (utils::string::find_lower(line, filter)) if (utils::string::find_lower(line, filter))
{ {
@ -116,17 +116,17 @@ namespace gui_console
void on_frame() void on_frame()
{ {
auto* open = &gui::enabled_menus["console"]; if (!gui::enabled_menus["console"])
if (!*open)
{ {
return; return;
} }
auto filtered_text = get_filtered_text(); const auto filtered_text = get_filtered_text();
static auto input_text_flags = ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_CallbackCompletion | const float footer_height_to_reserve = ImGui::GetStyle().ItemSpacing.y + ImGui::GetFrameHeightWithSpacing();
ImGuiInputTextFlags_CallbackHistory; static const auto input_text_flags = ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_CallbackCompletion |
ImGuiInputTextFlags_CallbackHistory;
ImGui::Begin("Console", open); ImGui::Begin("Console", &gui::enabled_menus["console"]);
if (ImGui::BeginPopup("Options")) if (ImGui::BeginPopup("Options"))
{ {
@ -157,7 +157,6 @@ namespace gui_console
ImGui::SameLine(); ImGui::SameLine();
ImGui::InputText("Filter", &filter); ImGui::InputText("Filter", &filter);
const float footer_height_to_reserve = ImGui::GetStyle().ItemSpacing.y + ImGui::GetFrameHeightWithSpacing();
ImGui::BeginChild("console_scroll", ImVec2(0, -footer_height_to_reserve), false); ImGui::BeginChild("console_scroll", ImVec2(0, -footer_height_to_reserve), false);
ImGui::Text(filtered_text.data(), ImVec2(-1, -1)); ImGui::Text(filtered_text.data(), ImVec2(-1, -1));

View File

@ -19,8 +19,6 @@ namespace entity_list
{ {
namespace namespace
{ {
game::dvar_t* sv_running = nullptr;
enum entity_type enum entity_type
{ {
type_any, type_any,
@ -282,17 +280,13 @@ namespace entity_list
utils::concurrency::container<data_t> data_; utils::concurrency::container<data_t> data_;
unsigned int selected_entity{}; unsigned int selected_entity{};
bool set_field_window{}; bool set_field_window{};
bool selected_fields_window{};
int selected_type = game::SCRIPT_INTEGER; int selected_type = game::SCRIPT_INTEGER;
bool is_sv_running() std::string field_filter{};
{ std::string field_name_buffer{};
if (!sv_running) std::string field_value_buffer{};
{ std::string vector_input[3]{};
return false;
}
return sv_running->current.enabled;
}
bool verify_entity(unsigned int id) bool verify_entity(unsigned int id)
{ {
@ -597,13 +591,6 @@ namespace entity_list
void show_set_field_window(data_t& data) void show_set_field_window(data_t& data)
{ {
static char name[0x100]{};
static char value[0x100]{};
static char x[0x100]{};
static char y[0x100]{};
static char z[0x100]{};
ImGui::SetNextWindowSizeConstraints(ImVec2(300, 300), ImVec2(300, 300)); ImGui::SetNextWindowSizeConstraints(ImVec2(300, 300), ImVec2(300, 300));
ImGui::Begin("Set entity field", &set_field_window); ImGui::Begin("Set entity field", &set_field_window);
ImGui::SetWindowSize(ImVec2(300, 300)); ImGui::SetWindowSize(ImVec2(300, 300));
@ -619,16 +606,16 @@ namespace entity_list
ImGui::TreePop(); ImGui::TreePop();
} }
ImGui::InputText("name", name, IM_ARRAYSIZE(name)); ImGui::InputText("name", &field_name_buffer);
if (selected_type == game::SCRIPT_VECTOR) if (selected_type == game::SCRIPT_VECTOR)
{ {
ImGui::InputText("x", x, IM_ARRAYSIZE(x)); ImGui::InputText("x", &vector_input[0]);
ImGui::InputText("y", y, IM_ARRAYSIZE(y)); ImGui::InputText("y", &vector_input[1]);
ImGui::InputText("z", z, IM_ARRAYSIZE(z)); ImGui::InputText("z", &vector_input[2]);
} }
else else
{ {
ImGui::InputText("value", value, IM_ARRAYSIZE(value)); ImGui::InputText("value", &field_value_buffer);
} }
if (ImGui::Button("set", ImVec2(300, 0))) if (ImGui::Button("set", ImVec2(300, 0)))
@ -637,16 +624,18 @@ namespace entity_list
{ {
const scripting::vector vector const scripting::vector vector
{ {
static_cast<float>(atof(x)), static_cast<float>(atof(vector_input[0].data())),
static_cast<float>(atof(y)), static_cast<float>(atof(vector_input[1].data())),
static_cast<float>(atof(z)) static_cast<float>(atof(vector_input[2].data()))
}; };
set_entity_field_vector(data, selected_entity, name, vector); set_entity_field_vector(data, selected_entity,
field_name_buffer, vector);
} }
else else
{ {
set_entity_field(data, selected_entity, name, value, selected_type); set_entity_field(data, selected_entity, field_name_buffer,
field_value_buffer, selected_type);
} }
} }
@ -664,6 +653,7 @@ namespace entity_list
} }
ImGui::Checkbox("Auto update", &data.auto_update); ImGui::Checkbox("Auto update", &data.auto_update);
ImGui::Checkbox("Field list", &selected_fields_window);
auto interval = static_cast<int>(data.interval.count()); auto interval = static_cast<int>(data.interval.count());
if (data.auto_update && ImGui::SliderInt("Interval", &interval, 0, 1000 * 30)) if (data.auto_update && ImGui::SliderInt("Interval", &interval, 0, 1000 * 30))
@ -748,11 +738,23 @@ namespace entity_list
} }
ImGui::Separator(); ImGui::Separator();
ImGui::BeginChild("entity list");
for (const auto& info : data.entity_info) for (const auto& info : data.entity_info)
{ {
if (ImGui::TreeNode(utils::string::va("Entity num %i id %i", info.num, info.id))) if (ImGui::TreeNode(utils::string::va("Entity num %i id %i", info.num, info.id)))
{ {
ImGui::Text("Info");
const auto num_str = utils::string::va("%i", info.num);
ImGui::Text("Entity num");
ImGui::SameLine();
if (ImGui::Button(num_str))
{
gui::copy_to_clipboard(num_str);
}
ImGui::Text("Commands"); ImGui::Text("Commands");
if (ImGui::Button("Set field")) if (ImGui::Button("Set field"))
@ -805,22 +807,28 @@ namespace entity_list
} }
} }
ImGui::EndChild();
ImGui::End(); ImGui::End();
}
void show_selected_fields_window(data_t& data)
{
ImGui::SetNextWindowSizeConstraints(ImVec2(500, 500), ImVec2(1000, 1000)); ImGui::SetNextWindowSizeConstraints(ImVec2(500, 500), ImVec2(1000, 1000));
ImGui::Begin("Selected fields"); ImGui::Begin("Selected fields", &selected_fields_window);
ImGui::InputText("field name", &field_filter);
ImGui::BeginChild("field list");
static char field_filter[0x100]{};
ImGui::InputText("field name", field_filter, IM_ARRAYSIZE(field_filter));
for (auto& field : data.selected_fields) for (auto& field : data.selected_fields)
{ {
if (utils::string::find_lower(field.first, field_filter) && if (utils::string::find_lower(field.first, field_filter) &&
ImGui::Checkbox(field.first.data(), &field.second)) ImGui::Checkbox(field.first.data(), &field.second))
{ {
data.force_update = true; data.force_update = true;
} }
} }
ImGui::EndChild();
ImGui::End(); ImGui::End();
} }
@ -833,7 +841,7 @@ namespace entity_list
data_.access([](data_t& data) data_.access([](data_t& data)
{ {
if (!is_sv_running()) if (!game::CL_IsCgameInitialized())
{ {
selected_entity = 0; selected_entity = 0;
data.entity_info = {}; data.entity_info = {};
@ -841,6 +849,12 @@ namespace entity_list
} }
show_entity_list_window(data); show_entity_list_window(data);
if (selected_fields_window)
{
show_selected_fields_window(data);
}
if (selected_entity && set_field_window) if (selected_entity && set_field_window)
{ {
show_set_field_window(data); show_set_field_window(data);
@ -854,11 +868,6 @@ namespace entity_list
public: public:
void post_unpack() override void post_unpack() override
{ {
scheduler::on_game_initialized([]()
{
sv_running = game::Dvar_FindVar("sv_running");
});
gui::on_frame(on_frame); gui::on_frame(on_frame);
scheduler::loop(update_entity_list, scheduler::pipeline::server, 0ms); scheduler::loop(update_entity_list, scheduler::pipeline::server, 0ms);
} }

View File

@ -197,4 +197,11 @@ namespace utils::string
{ {
return to_lower(a).find(to_lower(b)) != std::string::npos; return to_lower(a).find(to_lower(b)) != std::string::npos;
} }
std::string truncate(const std::string& text, const size_t length, const std::string& end)
{
return text.size() <= length
? text
: text.substr(0, length - end.size()) + end;
}
} }

View File

@ -100,4 +100,6 @@ namespace utils::string
std::string replace(std::string str, const std::string& from, const std::string& to); std::string replace(std::string str, const std::string& from, const std::string& to);
bool find_lower(const std::string& a, const std::string& b); bool find_lower(const std::string& a, const std::string& b);
std::string truncate(const std::string& text, int length, const std::string& end);
} }