#include "DrawVariable.hpp" #include "core/frontend/widgets/imgui_bitfield.hpp" #include "types/script/scrVector.hpp" namespace YimMenu { void DrawSavedVariableEdit(const SavedVariableBase& var, void* value) { if (!value) return ImGui::TextDisabled("Invalid"); switch (var.type) { case VariableType::INT: { ImGui::SetNextItemWidth(200.f); ImGui::InputScalar("Value", ImGuiDataType_S32, static_cast(value)); break; } case VariableType::INT64: { ImGui::SetNextItemWidth(200.f); ImGui::InputScalar("Value", ImGuiDataType_S64, static_cast(value)); break; } case VariableType::BITSET: { ImGui::SetNextItemWidth(200.f); ImGui::Bitfield("Value", static_cast(value)); break; } case VariableType::BOOL: { ImGui::Checkbox("Value", static_cast(value)); break; } case VariableType::FLOAT: { ImGui::SetNextItemWidth(200.f); ImGui::InputScalar("Value", ImGuiDataType_Float, static_cast(value)); break; } case VariableType::VECTOR: { auto vectorPtr = (rage::scrVector*)value; ImGui::PushItemWidth(100.f); ImGui::InputScalar("X", ImGuiDataType_Float, &vectorPtr->x); ImGui::SameLine(); ImGui::InputScalar("Y", ImGuiDataType_Float, &vectorPtr->y); ImGui::SameLine(); ImGui::InputScalar("Z", ImGuiDataType_Float, &vectorPtr->z); ImGui::PopItemWidth(); break; } case VariableType::STRING: { ImGui::SetNextItemWidth(200.f); ImGui::InputText("Value", static_cast(value), 255); break; } } } void DrawSavedVariablePreview(const SavedVariableBase& var, void* value) { if (!value) { ImGui::Selectable("Invalid", false, ImGuiSelectableFlags_Disabled); return; } switch (var.type) { case VariableType::INT: { ImGui::Selectable(std::to_string(*static_cast(value)).c_str(), false, ImGuiSelectableFlags_Disabled); break; } case VariableType::INT64: { ImGui::Selectable(std::to_string(*static_cast(value)).c_str(), false, ImGuiSelectableFlags_Disabled); break; } case VariableType::BITSET: { std::ostringstream bitset; bitset << HEX(*static_cast(value)); ImGui::Selectable(bitset.str().c_str(), false, ImGuiSelectableFlags_Disabled); break; } case VariableType::BOOL: { ImGui::Selectable(*static_cast(value) ? "True" : "False", false, ImGuiSelectableFlags_Disabled); break; } case VariableType::FLOAT: { ImGui::Selectable(std::to_string(*static_cast(value)).c_str(), false, ImGuiSelectableFlags_Disabled); break; } case VariableType::VECTOR: { auto vectorPtr = (rage::scrVector*)value; std::ostringstream vector; vector << "X: " << std::fixed << std::setprecision(2) << vectorPtr->x << " Y: " << vectorPtr->y << " Z: " << vectorPtr->z; ImGui::Selectable(vector.str().c_str(), false, ImGuiSelectableFlags_Disabled); break; } case VariableType::STRING: { ImGui::Selectable(static_cast(value), false, ImGuiSelectableFlags_Disabled); break; } } } void DrawSavedVariable(SavedVariableBase& var) { ImGui::SetNextItemWidth(175.0f); ImGui::InputScalar("Index", ImGuiDataType_U32, &var.base); ImGui::SameLine(); ImGui::SetNextItemWidth(100.0f); ImGui::Combo("##var_type", (int*)&var.type, "Int\0Int64\0Bitset\0Bool\0Float\0Vector\0String\0"); for (int i = 0; i < var.appendages.size(); i++) { auto& item = var.appendages[i]; switch (item.type) { case VariableAppendage::Type::OFFSET: ImGui::SetNextItemWidth(100.f); ImGui::InputScalar(std::format("At##{}{}", i, (int)item.type).c_str(), ImGuiDataType_S32, &item.offset); ImGui::SameLine(); ImGui::SetNextItemWidth(100.f); ImGui::InputScalar(std::format("Size##{}{}", i, (int)item.type).c_str(), ImGuiDataType_S32, &item.size); break; case VariableAppendage::Type::PLAYER_ID: ImGui::SetNextItemWidth(100.f); ImGui::InputScalar(std::format("Size##{}{}", i, (int)item.type).c_str(), ImGuiDataType_S32, &item.size); break; } } if (ImGui::Button("Add Offset")) var.appendages.push_back({VariableAppendage::Type::OFFSET, 0LL, 0ULL}); ImGui::SameLine(); if (ImGui::Button("Add Read Player Id")) var.appendages.push_back({VariableAppendage::Type::PLAYER_ID, 0LL, 0ULL}); if (var.appendages.size() > 0) { ImGui::SameLine(); if (ImGui::Button("Remove Offset")) { var.appendages.pop_back(); } } ImGui::SameLine(); if (ImGui::Button("Clear")) { var.base = 0; var.appendages.clear(); } } }