fix #3406 & refactor bounds check (#3419)

* Revert "change DragInt to SliderInt (#3378)"

This reverts outfit changes from commit c8dd29075c.

* Revert "Redesigned outfit editor (#3376)"

This reverts commit 5c6f7ae8c5.

* fix components text and draw should not be -1
This commit is contained in:
lonelybud 2024-07-25 00:57:06 +05:30 committed by GitHub
parent 7e326d129e
commit 21929ee421
3 changed files with 22 additions and 34 deletions

View File

@ -38,20 +38,20 @@ namespace big::outfit
{7, "OUTFIT_WRIST"_T.data()}};
};
inline void check_bounds_drawable(outfit_t* item)
inline void check_bounds_drawable(outfit_t* item, const int lower)
{
if(item->drawable_id > item->drawable_id_max)
item->drawable_id = item->drawable_id_max;
if(item->drawable_id < 0)
item->drawable_id = 0;
if(item->drawable_id < lower)
item->drawable_id = lower;
}
inline void check_bounds_texture(outfit_t* item)
inline void check_bounds_texture(outfit_t* item, const int lower)
{
if(item->texture_id > item->texture_id_max)
item->texture_id = item->texture_id_max;
if(item->texture_id < 0)
item->texture_id = 0;
if(item->texture_id < lower)
item->texture_id = lower;
}
// usually each update increases 1//

View File

@ -106,17 +106,14 @@ namespace big
for (auto& item : components.items)
{
ImGui::SetNextItemWidth(120);
if (item.drawable_id_max <= 0)
ImGui::BeginDisabled();
if (ImGui::SliderInt(std::format("{} [0,{}]##1", item.label, item.drawable_id_max).c_str(), &item.drawable_id, 0, item.drawable_id_max))
if (ImGui::InputInt(std::format("{} [0,{}]##1", item.label, item.drawable_id_max).c_str(), &item.drawable_id))
{
//outfit::check_bounds_drawable(&item); // The game does this on its own, but seems to crash if we call OOB values to fast. (-1 is not a valid scenario)
outfit::check_bounds_drawable(&item, 0); // The game does this on it's own but seems to crash if we call OOB values to fast.
g_fiber_pool->queue_job([item] {
PED::SET_PED_COMPONENT_VARIATION(self::ped, item.id, item.drawable_id, 0, PED::GET_PED_PALETTE_VARIATION(self::ped, item.id));
});
}
if (item.drawable_id_max <= 0)
ImGui::EndDisabled();
}
ImGui::EndGroup();
@ -126,17 +123,14 @@ namespace big
for (auto& item : components.items)
{
ImGui::SetNextItemWidth(120);
if (item.texture_id_max <= 0)
ImGui::BeginDisabled();
if (ImGui::SliderInt(std::format("{} {} [0,{}]##2", item.label, "OUTFIT_TEX"_T, item.texture_id_max).c_str(), &item.texture_id, 0, item.texture_id_max))
if (ImGui::InputInt(std::format("{} {} [0,{}]##2", item.label, "OUTFIT_TEX"_T, item.texture_id_max).c_str(), &item.texture_id))
{
//outfit::check_bounds_drawable(&item); // The game does this on its own, but seems to crash if we call OOB values to fast. (-1 is not a valid scenario)
outfit::check_bounds_texture(&item, 0); // The game does this on it's own but seems to crash if we call OOB values to fast.
g_fiber_pool->queue_job([item] {
PED::SET_PED_COMPONENT_VARIATION(self::ped, item.id, item.drawable_id, item.texture_id, PED::GET_PED_PALETTE_VARIATION(self::ped, item.id));
});
}
if (item.texture_id_max <= 0)
ImGui::EndDisabled();
}
ImGui::EndGroup();
@ -146,11 +140,10 @@ namespace big
for (auto& item : props.items)
{
ImGui::SetNextItemWidth(120);
if (item.drawable_id_max <= 0)
ImGui::BeginDisabled();
if (ImGui::SliderInt(std::format("{} [0,{}]##3", item.label, item.drawable_id_max).c_str(), &item.drawable_id, -1, item.drawable_id_max))
if (ImGui::InputInt(std::format("{} [0,{}]##3", item.label, item.drawable_id_max).c_str(), &item.drawable_id))
{
//outfit::check_bounds_drawable(&item); // The game does this on its own, but seems to crash if we call OOB values to fast. (-1 is only used here as a magic number to signal the removal of the prop.)
outfit::check_bounds_drawable(&item, -1); // The game does this on it's own but seems to crash if we call OOB values to fast.
g_fiber_pool->queue_job([item] {
if (item.drawable_id == -1)
PED::CLEAR_PED_PROP(self::ped, item.id, 1);
@ -158,8 +151,6 @@ namespace big
PED::SET_PED_PROP_INDEX(self::ped, item.id, item.drawable_id, 0, TRUE, 1);
});
}
if (item.drawable_id_max <= 0)
ImGui::EndDisabled();
}
ImGui::EndGroup();
@ -169,17 +160,14 @@ namespace big
for (auto& item : props.items)
{
ImGui::SetNextItemWidth(120);
if (item.texture_id_max <= 0)
ImGui::BeginDisabled();
if (ImGui::SliderInt(std::format("{} {} [0,{}]##4", item.label, "OUTFIT_TEX"_T, item.texture_id_max).c_str(), &item.texture_id, 0, item.texture_id_max))
if (ImGui::InputInt(std::format("{} {} [0,{}]##4", item.label, "OUTFIT_TEX"_T, item.texture_id_max).c_str(), &item.texture_id))
{
//outfit::check_bounds_drawable(&item); // The game does this on its own, but seems to crash if we call OOB values to fast. (-1 is not a valid scenario)
outfit::check_bounds_texture(&item, -1); // The game does this on it's own but seems to crash if we call OOB values to fast.
g_fiber_pool->queue_job([item] {
PED::SET_PED_PROP_INDEX(self::ped, item.id, item.drawable_id, item.texture_id, TRUE, 1);
});
}
if (item.texture_id_max <= 0)
ImGui::EndDisabled();
}
ImGui::EndGroup();

View File

@ -88,7 +88,7 @@ namespace big
for (auto& item : components.items)
{
ImGui::SetNextItemWidth(120);
ImGui::SliderInt(std::format("{} [0,{}]##1", item.label, item.drawable_id_max).c_str(), outfit::get_component_drawable_id_address(slot, item.id), 0, item.drawable_id_max);
ImGui::InputInt(std::format("{} [0,{}]##1", item.label, item.drawable_id_max).c_str(), outfit::get_component_drawable_id_address(slot, item.id));
}
ImGui::EndGroup();
@ -98,7 +98,7 @@ namespace big
for (auto& item : components.items)
{
ImGui::SetNextItemWidth(120);
ImGui::SliderInt(std::format("{} {} [0,{}]##2", item.label, "OUTFIT_TEX"_T, item.texture_id_max).c_str(), outfit::get_component_texture_id_address(slot, item.id), 0, item.texture_id_max);
ImGui::InputInt(std::format("{} {} [0,{}]##2", item.label, "OUTFIT_TEX"_T, item.texture_id_max).c_str(), outfit::get_component_texture_id_address(slot, item.id));
}
ImGui::EndGroup();
@ -108,7 +108,7 @@ namespace big
for (auto& item : props.items)
{
ImGui::SetNextItemWidth(120);
ImGui::SliderInt(std::format("{} [0,{}]##3", item.label, item.drawable_id_max).c_str(), outfit::get_prop_drawable_id_address(slot, item.id), 0, item.drawable_id_max);
ImGui::InputInt(std::format("{} [0,{}]##3", item.label, item.drawable_id_max).c_str(), outfit::get_prop_drawable_id_address(slot, item.id));
}
ImGui::EndGroup();
@ -118,7 +118,7 @@ namespace big
for (auto& item : props.items)
{
ImGui::SetNextItemWidth(120);
ImGui::SliderInt(std::format("{} {} [0,{}]##4", item.label, "OUTFIT_TEX"_T, item.texture_id_max).c_str(), outfit::get_prop_texture_id_address(slot, item.id), 0, item.texture_id_max);
ImGui::InputInt(std::format("{} {} [0,{}]##4", item.label, "OUTFIT_TEX"_T, item.texture_id_max).c_str(), outfit::get_prop_texture_id_address(slot, item.id));
}
ImGui::EndGroup();
}