feat: Translation Service (#844)

Co-authored-by: mrwoowoo <github@hiqaq.com>
Co-authored-by: LiamD-Flop <40887493+LiamD-Flop@users.noreply.github.com>
This commit is contained in:
Yimura 2023-02-01 19:46:33 +01:00 committed by GitHub
parent e95e7d1b47
commit 8028db84b3
79 changed files with 1183 additions and 779 deletions

View File

@ -3,7 +3,7 @@ include(FetchContent)
FetchContent_Declare(
gtav_classes
GIT_REPOSITORY https://github.com/Yimura/GTAV-Classes.git
GIT_TAG a4a559be1abd84ffbd4d127c572cce036a8cc5ad
GIT_TAG c6eb3c8c1253b5d9822a79feda7bdc61875cd47c
GIT_PROGRESS TRUE
CONFIGURE_COMMAND ""
BUILD_COMMAND ""

View File

@ -56,6 +56,7 @@
#include "ped/CPed.hpp"
#include "services/notifications/notification_service.hpp"
#include "services/translation_service/translation_service.hpp"
namespace big
{

View File

@ -4,17 +4,17 @@ namespace big
{
void tab_current_profile::tab_brakes()
{
if (ImGui::BeginTabItem("Brakes"))
if (ImGui::BeginTabItem("HANDLING_TAB_BRAKES"_T.data()))
{
ImGui::Text("Brake Force");
ImGui::Text("HANDLING_BRAKE_FORCE"_T.data());
ImGui::DragFloat("##brake force", &g_local_player->m_vehicle->m_handling_data->m_brake_force, .01f, 0.f, 10.f);
ImGui::Text("Brake Bias (1.0 = front, 0.0 = rear, 0.5 = balanced)");
ImGui::Text("HANDLING_BRAKE_BIAS"_T.data());
float fBrakeBias = g_local_player->m_vehicle->m_handling_data->m_brake_bias_front / 2;
if (ImGui::SliderFloat("##brake bias front", &fBrakeBias, 0.f, 1.f))
g_local_player->m_vehicle->m_handling_data->m_brake_bias_front = fBrakeBias * 2;
ImGui::Text("Hand Brake Force");
ImGui::Text("HANDLING_HAND_BRAKE_FORCE"_T.data());
ImGui::DragFloat("##hand brake force", &g_local_player->m_vehicle->m_handling_data->m_handbrake_force, .01f, 0.f, 10.f);
ImGui::EndTabItem();

View File

@ -4,17 +4,17 @@ namespace big
{
void tab_current_profile::tab_gearing()
{
if (ImGui::BeginTabItem("Gearing"))
if (ImGui::BeginTabItem("HANDLING_TAB_GEARING"_T.data()))
{
ImGui::Text("Initial Drive Gears");
ImGui::Text("HANDLING_INITIAL_DRIVE_GEARS"_T.data());
int initial_drive_gears = g_local_player->m_vehicle->m_handling_data->m_initial_drive_gears;
if (ImGui::DragInt("###handling_drive_gears", &initial_drive_gears, .1f, 1, 16))
g_local_player->m_vehicle->m_handling_data->m_initial_drive_gears = initial_drive_gears;
ImGui::Text("Upshift Multiplier");
ImGui::Text("HANDLING_UPSHIFT_MULTIPLIER"_T.data());
ImGui::DragFloat("###handling_upshift", &g_local_player->m_vehicle->m_handling_data->m_upshift, .01f, 0.f, 10.f);
ImGui::Text("Downshift Multiplier");
ImGui::Text("HANDLING_DOWNSHIFT_MULTIPLIER"_T.data());
ImGui::DragFloat("###handling_downshift", &g_local_player->m_vehicle->m_handling_data->m_downshift, .01f, 0.f, 10.f);
ImGui::EndTabItem();

View File

@ -4,15 +4,15 @@ namespace big
{
void tab_current_profile::tab_general()
{
if (ImGui::BeginTabItem("General"))
if (ImGui::BeginTabItem("HANDLING_TAB_GENERAL"_T.data()))
{
ImGui::Text("Gravity");
ImGui::Text("HANDLING_GRAVITY"_T.data());
ImGui::SliderFloat("##Gravity", &g_local_player->m_vehicle->m_gravity, -50.f, 50.f);
ImGui::Text("Mass");
ImGui::Text("HANDLING_MASS"_T.data());
ImGui::SliderFloat("##Mass", &g_local_player->m_vehicle->m_handling_data->m_mass, 0.f, 50000.f);
ImGui::Text("Centre of mass");
ImGui::Text("HANDLING_CENTRE_OF_MASS"_T.data());
float fCenterOfMass[3]
{
g_local_player->m_vehicle->m_handling_data->m_centre_of_mass.x,
@ -26,7 +26,7 @@ namespace big
g_local_player->m_vehicle->m_handling_data->m_centre_of_mass.z = fCenterOfMass[2];
}
ImGui::Text("Buoyancy");
ImGui::Text("HANDLING_BUOYANCY"_T.data());
ImGui::SliderFloat("##buoyancy", &g_local_player->m_vehicle->m_handling_data->m_buoyancy, .01f, 99.f);
ImGui::EndTabItem();

View File

@ -4,15 +4,15 @@ namespace big
{
void tab_current_profile::tab_other()
{
if (ImGui::BeginTabItem("Other"))
if (ImGui::BeginTabItem("HANDLING_TAB_OTHER"_T.data()))
{
ImGui::Text("Acceleration Multiplier");
ImGui::Text("HANDLING_ACCELERATION_MULTIPLIER"_T.data());
ImGui::DragFloat("###handling_acceleration", &g_local_player->m_vehicle->m_handling_data->m_acceleration, 1.f, .01f, 10.f);
ImGui::Text("Downforce Multiplier");
ImGui::Text("HANDLING_DOWNFORCE_MULTIPLIER"_T.data());
ImGui::DragFloat("###handling_downforce", &g_local_player->m_vehicle->m_handling_data->m_downforce_multiplier, 1.f, 0.f, 10.f);
ImGui::Text("Inertia Multiplier");
ImGui::Text("HANDLING_INERTIA_MULTIPLIER"_T.data());
float fInertiaMult[3];
fInertiaMult[0] = g_local_player->m_vehicle->m_handling_data->m_inertia_mult.x;
fInertiaMult[1] = g_local_player->m_vehicle->m_handling_data->m_inertia_mult.y;

View File

@ -4,16 +4,16 @@ namespace big
{
void tab_current_profile::tab_roll_centre_height()
{
if (ImGui::BeginTabItem("Roll Centre Height"))
if (ImGui::BeginTabItem("HANDLING_TAB_ROLL_CENTRE_HEIGHT"_T.data()))
{
ImGui::Text("The point in the transverse vertical plane through any pair of wheel centres\nat which lateral forces apply to the sprung mass without producing suspension roll.");
ImGui::Text("HANDLING_ROLL_CENTRE_HEIGHT_DESCRIPTION"_T.data());
ImGui::Separator();
ImGui::Text("Roll Centre Height Front");
ImGui::Text("HANDLING_ROLL_CENTRE_HEIGHT_FRONT"_T.data());
ImGui::SliderFloat("##roll centre height front", &g_local_player->m_vehicle->m_handling_data->m_roll_centre_height_front, -1.f, 1.f);
ImGui::Text("Roll Centre Height Back");
ImGui::Text("HANDLING_ROLL_CENTRE_HEIGHT_BACK"_T.data());
ImGui::SliderFloat("##roll centre height back", &g_local_player->m_vehicle->m_handling_data->m_roll_centre_height_rear, -1.f, 1.f);
ImGui::EndTabItem();

View File

@ -4,12 +4,12 @@ namespace big
{
void tab_current_profile::tab_rollbars()
{
if (ImGui::BeginTabItem("Rollbars"))
if (ImGui::BeginTabItem("HANDLING_TAB_ROLLBARS"_T.data()))
{
ImGui::Text("Anti-Roll Bar force");
ImGui::Text("HANDLING_ANTI_ROLL_BAR_FORCE"_T.data());
ImGui::SliderFloat("##anti rollbar force", &g_local_player->m_vehicle->m_handling_data->m_anti_rollbar_force, 0.f, 10.f);
ImGui::Text("Anti-Roll Bar Bias front (0 = front, 1 = rear)");
ImGui::Text("HANDLING_ANTI_ROLL_BAR_BIAS_FRONT"_T.data());
float fAntiRollBarBiasFront = g_local_player->m_vehicle->m_handling_data->m_anti_rollbar_bias_front / 2;
if (ImGui::SliderFloat("##anti rollbar bias", &fAntiRollBarBiasFront, 0.f, 1.f))
g_local_player->m_vehicle->m_handling_data->m_anti_rollbar_bias_front = fAntiRollBarBiasFront * 2;

View File

@ -4,9 +4,9 @@ namespace big
{
void tab_current_profile::tab_steering()
{
if (ImGui::BeginTabItem("Steering"))
if (ImGui::BeginTabItem("HANDLING_TAB_STEERING"_T.data()))
{
ImGui::Text("Steering Lock (degrees)");
ImGui::Text("HANDLING_STEERING_LOCK_DEGREES"_T.data());
ImGui::SliderAngle("##steering lock", &g_local_player->m_vehicle->m_handling_data->m_steering_lock, -90.f, 90.f);
ImGui::EndTabItem();

View File

@ -4,27 +4,27 @@ namespace big
{
void tab_current_profile::tab_suspension()
{
if (ImGui::BeginTabItem("Suspension"))
if (ImGui::BeginTabItem("HANDLING_TAB_SUSPENSION"_T.data()))
{
ImGui::Text("Suspension Force (General Suspension Strength)");
ImGui::Text("HANDLING_SUSPENSION_FORCE"_T.data());
ImGui::SliderFloat("##suspension force", &g_local_player->m_vehicle->m_handling_data->m_suspension_force, 0.f, 5.f);
ImGui::Text("Suspension Compression Damp (Higher = Less Compression)");
ImGui::Text("HANDLING_SUSPENSION_COMPRESSION_DAMP"_T.data());
ImGui::SliderFloat("##suspension comp", &g_local_player->m_vehicle->m_handling_data->m_suspension_comp_damp, 0.f, 5.f);
ImGui::Text("Suspension Rebound Damp (Higher = Less Decompression)");
ImGui::Text("HANDLING_SUSPENSION_REBOUND_DAMP"_T.data());
ImGui::SliderFloat("##suspension rebound", &g_local_player->m_vehicle->m_handling_data->m_suspension_rebound_damp, 0.f, 5.f);
ImGui::Text("Suspension Upper Limit (mostly visual)");
ImGui::Text("HANDLING_SUSPENSION_UPPER_LIMIT"_T.data());
ImGui::SliderFloat("##suspension upper", &g_local_player->m_vehicle->m_handling_data->m_suspension_upper_limit, -1.f, 1.f);
ImGui::Text("Suspension Lower Limit (mostly visual)");
ImGui::Text("HANDLING_SUSPENSION_LOWER_LIMIT"_T.data());
ImGui::SliderFloat("##suspension lower", &g_local_player->m_vehicle->m_handling_data->m_suspension_lower_limit, -1.f, 1.f);
ImGui::Text("Suspension Raise (Ride Height)");
ImGui::Text("HANDLING_SUSPENSION_RAISE"_T.data());
ImGui::SliderFloat("##suspension raise", &g_local_player->m_vehicle->m_handling_data->m_suspension_raise, -1.f, 1.f);
ImGui::Text("Suspension Bias Front (Strength Bias, 1 = front, 0 = rear)");
ImGui::Text("HANDLING_SUSPENSION_BAIS_FRONT"_T.data());
float fSuspensionBiasFront = g_local_player->m_vehicle->m_handling_data->m_suspension_bias_front / 2;
if (ImGui::SliderFloat("##suspension bias", &fSuspensionBiasFront, 0.f, 1.f))
g_local_player->m_vehicle->m_handling_data->m_suspension_bias_front = fSuspensionBiasFront * 2;

View File

@ -4,32 +4,32 @@ namespace big
{
void tab_current_profile::tab_traction()
{
if (ImGui::BeginTabItem("Traction"))
if (ImGui::BeginTabItem("HANDLING_TAB_TRACTION"_T.data()))
{
ImGui::Text("Minimum Traction");
ImGui::Text("HANDLING_MINIMUM_TRACTION"_T.data());
ImGui::SliderFloat("##traction curve min", &g_local_player->m_vehicle->m_handling_data->m_traction_curve_min, 0.f, 7.f);
ImGui::Text("Peak Traction before grip is lost");
ImGui::Text("HANDLING_PEAK_TRACTION"_T.data());
ImGui::SliderFloat("##traction curve max", &g_local_player->m_vehicle->m_handling_data->m_traction_curve_max, 0.f, 7.f);
ImGui::Text("Traction Curve (point of grip loss)");
ImGui::Text("HANDLING_TRACTION_CURVE"_T.data());
ImGui::SliderAngle("##traction curve lateral", &g_local_player->m_vehicle->m_handling_data->m_traction_curve_lateral);
ImGui::Text("Traction Height Loss (distance ground and tires)");
ImGui::Text("HANDLING_TRACTION_HEIGHT_LOSS"_T.data());
ImGui::SliderFloat("##traction spring delta max", &g_local_player->m_vehicle->m_handling_data->m_traction_spring_delta_max, 0.f, 2.f);
ImGui::Text("Burnout Multiplier");
ImGui::Text("HANDLING_BURNOUT_MULTIPLIER"_T.data());
ImGui::SliderFloat("##low speed traction loss mult", &g_local_player->m_vehicle->m_handling_data->m_low_speed_traction_loss_mult, 0.f, 10.f);
//ImGui::Text("Camber Stiffness (grip when drifting)");
//ImGui::SliderFloat("##camber stiffness", &g_local_player->m_vehicle->m_handling_data->m_camber_stiffness, -1.f, 1.f);
ImGui::Text("Traction Bias (1.0 = front, 0.0 = rear, 0.5 = balanced)");
ImGui::Text("HANDLING_TRACTION_BIAS"_T.data());
float fTractionBiasFront = g_local_player->m_vehicle->m_handling_data->m_traction_bias_front / 2;
if (ImGui::SliderFloat("##traction bias front", &fTractionBiasFront, 0.01f, .99f))
g_local_player->m_vehicle->m_handling_data->m_traction_bias_front = fTractionBiasFront * 2;
ImGui::Text("Off-Road Traction Loss (1.0 = normal, lower = better)");
ImGui::Text("HANDLING_OFF_ROAD_LOSS"_T.data());
ImGui::SliderFloat("##traction loss mult", &g_local_player->m_vehicle->m_handling_data->m_traction_loss_mult, 0.f, 5.f);
ImGui::EndTabItem();

View File

@ -4,19 +4,19 @@ namespace big
{
void tab_current_profile::tab_transmission()
{
if (ImGui::BeginTabItem("Transmission"))
if (ImGui::BeginTabItem("HANDLING_TAB_TRANSMISSION"_T.data()))
{
ImGui::Text("Drive Bias (1.0 = front, 0.0 = rear, 0.5 = balanced 4WD)");
ImGui::Text("HANDLING_DRIVE_BIAS_FRONT"_T.data());
float fDriveBiasFront = g_local_player->m_vehicle->m_handling_data->m_drive_bias_front / 2;
if (ImGui::SliderFloat("##drive_bias_front", &fDriveBiasFront, 0.f, 1.0f))
g_local_player->m_vehicle->m_handling_data->m_drive_bias_front = fDriveBiasFront * 2;
ImGui::Text("Drive Bias (1.0 = rear, 0.0 = front, 0.5 = balanced 4WD)");
ImGui::Text("HANDLING_DRIVE_BIAS_REAR"_T.data());
float fDriveBiasRear = g_local_player->m_vehicle->m_handling_data->m_drive_bias_rear / 2;
if (ImGui::SliderFloat("##drive_bias_rear", &fDriveBiasRear, 0.f, 1.0f))
g_local_player->m_vehicle->m_handling_data->m_drive_bias_rear = fDriveBiasRear * 2;
ImGui::Text("Transmission Output (force)");
ImGui::Text("HANDLING_TRANSMISSION_OUTPUT"_T.data());
ImGui::SliderFloat("##initial drive force", &g_local_player->m_vehicle->m_handling_data->m_initial_drive_force, 0.01f, 2.f);
ImGui::EndTabItem();

View File

@ -8,19 +8,19 @@ namespace big
{
if (g_local_player == nullptr || g_local_player->m_vehicle == nullptr || g_local_player->m_ped_task_flag & (int)ePedTask::TASK_FOOT)
{
ImGui::Text("Please enter a vehicle.");
ImGui::Text("HANDLING_ENTER_VEHICLE"_T.data());
return;
}
g_handling_service->backup_vehicle();
if (components::button("Save Profile"))
if (components::button("HANDLING_SAVE_PROFILE"_T.data()))
{
ImGui::OpenPopup("Save Handling");
ImGui::OpenPopup("HANDLING_SAVE_HANDLING"_T.data());
}
modal_handling::modal_save_handling();
ImGui::SameLine();
if (components::button("Restore Handling"))
if (components::button("HANDLING_RESTORE_HANDLING"_T.data()))
g_handling_service->restore_vehicle();
ImGui::Separator();

View File

@ -7,17 +7,16 @@ namespace big
{
if (g_local_player == nullptr || g_local_player->m_vehicle == nullptr || g_local_player->m_ped_task_flag & (int)ePedTask::TASK_FOOT)
{
ImGui::Text("Please enter a vehicle.");
ImGui::Text("HANDLING_ENTER_VEHICLE"_T.data());
return;
}
g_handling_service->backup_vehicle();
if (components::button("Reload Profiles"))
if (components::button("HANDLING_RELOAD_PROFILES"_T))
{
g_handling_service->load_files();
}
if (ImGui::ListBoxHeader("##handling_profiles"))
{
for (auto& [name, profile] : g_handling_service->profiles())

View File

@ -10,20 +10,20 @@ namespace big
void modal_handling::modal_save_handling()
{
ImGui::SetNextWindowSize({ 520, 325 }, ImGuiCond_FirstUseEver);
if (ImGui::BeginPopupModal("Save Handling"))
if (ImGui::BeginPopupModal("HANDLING_SAVE_HANDLING"_T.data()))
{
static char name[32];
components::input_text_with_hint("Name", "Name", name, sizeof(name));
components::input_text_with_hint("NAME"_T, "NAME"_T, name, sizeof(name));
if (components::button("Cancel"))
if (components::button("CANCEL"_T))
{
strcpy(name, "");
ImGui::CloseCurrentPopup();
}
ImGui::SameLine();
if (components::button("Save"))
if (components::button("SAVE"_T))
{
g_thread_pool->push([&]
{

View File

@ -12,7 +12,7 @@ namespace big
{
case rage::eEventNetworkType::CEventNetworkRemovedFromSessionDueToComplaints:
{
g_notification_service->push_warning("Kicked", "You have been desync kicked.");
g_notification_service->push_warning("KICKED"_T.data(), "USER_DESYNC_KICKED"_T.data());
break;
}
case rage::eEventNetworkType::CEventNetworkEntityDamage:

View File

@ -26,7 +26,10 @@ namespace big
<< " with Rockstar ID: " << net_player_data->m_gamer_handle_2.m_rockstar_id;
if (g.notifications.player_leave.notify)
g_notification_service->push("Player Left", std::format("{} freeing slot #{} with Rockstar ID: {}", net_player_data->m_name, player->m_player_id, net_player_data->m_gamer_handle_2.m_rockstar_id));
{
g_notification_service->push("PLAYER_LEFT"_T.data(),
std::vformat("PLAYER_LEFT_INFO"_T, std::make_format_args(net_player_data->m_name, player->m_player_id, net_player_data->m_gamer_handle_2.m_rockstar_id)));
}
}
return g_hooking->get_original<hooks::assign_physical_index>()(netPlayerMgr, player, new_index);
@ -45,7 +48,10 @@ namespace big
<< " with Rockstar ID: " << net_player_data->m_gamer_handle_2.m_rockstar_id;
if (g.notifications.player_join.notify)
g_notification_service->push("Player Joined", std::format("{} taking slot #{} with Rockstar ID: {}", net_player_data->m_name, player->m_player_id, net_player_data->m_gamer_handle_2.m_rockstar_id));
{
g_notification_service->push("PLAYER_JOINED"_T.data(),
std::vformat("PLAYER_JOINED_INFO"_T, std::make_format_args(net_player_data->m_name, player->m_player_id, net_player_data->m_gamer_handle_2.m_rockstar_id)));
}
auto id = player->m_player_id;
g_fiber_pool->queue_job([id]
@ -60,7 +66,8 @@ namespace big
if (strcmp(plyr->get_name(), entry->name.data()))
{
g_notification_service->push("Players", std::format("{} changed their name to {}", entry->name, plyr->get_name()));
g_notification_service->push("PLAYERS"_T.data(),
std::vformat("PLAYER_CHANGED_NAME"_T, std::make_format_args(entry->name, plyr->get_name())));
entry->name = plyr->get_name();
g_player_database_service->save();
}

View File

@ -13,7 +13,7 @@ namespace big
if (g.notifications.network_player_mgr_init.log)
LOG(INFO) << "CNetworkPlayerMgr#init got called, we're probably entering a session.";
if (g.notifications.network_player_mgr_init.notify)
g_notification_service->push("Network Player Manager", "Entering session and initializing player data.");
g_notification_service->push("NETWORK_PLAYER_MGR"_T.data(), "NETWORK_PLAYER_MGR_INIT"_T.data());
// set our local spoofed name
if (g.spoofing.spoof_username && g.spoofing.spoof_local_username)
@ -43,7 +43,7 @@ namespace big
if (g.notifications.network_player_mgr_shutdown.log)
LOG(INFO) << "CNetworkPlayerMgr#shutdown got called, we're probably leaving our session.";
if (g.notifications.network_player_mgr_shutdown.notify)
g_notification_service->push("Network Player Manager", "Leaving session and cleaning up player data.");
g_notification_service->push("NETWORK_PLAYER_MGR"_T.data(), "NETWORK_PLAYER_MGR_DESTROY"_T.data());
g_hooking->get_original<hooks::network_player_mgr_shutdown>()(_this);
}

View File

@ -14,7 +14,7 @@ namespace big
CMsgJoinResponse response{};
response.m_status_code = player->block_join_reason;
g_pointers->m_write_join_response_data(&response, ctx->m_join_response_data, 512, &ctx->m_join_response_size);
g_notification_service->push("Block Join", std::format("Blocked {} from joining", player->name));
g_notification_service->push("BLOCK_JOIN"_T.data(), std::vformat("BLOCK_JOIN_INFO"_T, std::make_format_args(player->name)));
return false;
}
else

View File

@ -95,11 +95,12 @@ namespace big
{
if (player)
{
g_notification_service->push_error("Protections", std::format("Blocked invalid transition launch crash from {}", player->get_name()));
g_notification_service->push_error("PROTECTIONS"_T.data(),
std::vformat("REMOTE_CRASH_INVALID_TRANSITION_FROM"_T, std::make_format_args(player->get_name())));
}
else
{
g_notification_service->push_error("Protections", "Blocked invalid transition launch remote crash");
g_notification_service->push_error("PROTECTIONS"_T.data(), "REMOTE_CRASH_INVALID_TRANSITION"_T.data());
}
return true;
@ -109,11 +110,12 @@ namespace big
{
if (player)
{
g_notification_service->push_error("Protections", std::format("Blocked invalid blacklist crash from {}", player->get_name()));
g_notification_service->push_error("PROTECTIONS"_T.data(),
std::vformat("REMOTE_CRASH_INVALID_BLACKLIST_FROM"_T, std::make_format_args(player->get_name())));
}
else
{
g_notification_service->push_error("Protections", "Blocked invalid blacklist remote crash");
g_notification_service->push_error("PROTECTIONS"_T.data(), "REMOTE_CRASH_INVALID_BLACKLIST"_T.data());
}
return true;
}
@ -159,7 +161,8 @@ namespace big
if (player->m_host_migration_rate_limit.exceeded_last_process())
{
session::add_infraction(player, Infraction::TRIED_KICK_PLAYER);
g_notification_service->push_error("Protections", std::format("{} tried to OOM kick you!", player->get_name()));
g_notification_service->push_error("PROTECTIONS"_T.data(),
std::vformat("OOM_KICK"_T, std::make_format_args(player->get_name())));
}
return true;
}
@ -285,7 +288,8 @@ namespace big
{
if (player->block_join)
{
g_notification_service->push("Join Blocker", std::format("Trying to prevent {} from joining...", player->get_name()));
g_notification_service->push("BLOCK_JOIN"_T.data(),
std::vformat("BLOCK_JOIN_PREVENT_PLAYER_JOIN"_T, std::make_format_args(player->get_name())));
return true;
}
break;
@ -342,7 +346,7 @@ namespace big
auto self = g_player_service->get_self();
if (self->get_net_data() && self->get_net_data()->m_gamer_handle_2.m_rockstar_id == handle.m_rockstar_id)
{
g_notification_service->push_error("Warning!", "Someone tried to lost connection kick you remotely!");
g_notification_service->push_error("KICK"_T.data(), "REMOTE_KICK_LOST_CONNECTION"_T.data());
return true;
}
@ -350,7 +354,8 @@ namespace big
{
if (plyr->get_net_data() && plyr->get_net_data()->m_gamer_handle_2.m_rockstar_id == handle.m_rockstar_id)
{
g_notification_service->push_error("Warning!", std::format("Someone tried to lost connection kick {} remotely!", plyr->get_name()));
g_notification_service->push_error("KICK"_T.data(),
std::vformat("REMOTE_KICK_LOST_CONNECTION_PLAYER"_T, std::make_format_args(plyr->get_name())));
return true;
}
}
@ -392,9 +397,10 @@ namespace big
if (target && count == 1 && frame->m_msg_id == -1)
{
if (target->id() == g_player_service->get_self()->id())
g_notification_service->push_error("Warning!", "Someone tried to breakup kick you remotely!");
g_notification_service->push_error("KICK"_T.data(), "REMOTE_KICK_BREAKUP"_T.data());
else
g_notification_service->push_error("Warning!", std::format("Someone tried to breakup kick {} remotely!", target->get_name()));
g_notification_service->push_error("KICK"_T.data(),
std::vformat("REMOTE_KICK_BREAKUP_PLAYER"_T, std::make_format_args(target->get_name())));
}
return true;
@ -403,7 +409,7 @@ namespace big
{
if (is_kick_instruction(buffer))
{
g_notification_service->push_error("Warning!", "Someone tried to gamer instruction kick you remotely!");
g_notification_service->push_error("KICK"_T.data(), "REMOTE_KICK_GAMER_INSTRUCTION"_T.data());
return true;
}
break;

View File

@ -309,7 +309,8 @@ namespace big
if (f208 == 0 && entity && entity->gap28 == 4 && reinterpret_cast<CPed*>(entity)->m_player_info && player->m_player_info->m_ped && player->m_player_info->m_ped->m_net_object && ownerNetId != player->m_player_info->m_ped->m_net_object->m_object_id && !offset_object)
{
g_notification_service->push_error("Warning!", std::format("{} blamed {} for explosion", player->get_name(), reinterpret_cast<CPed*>(entity)->m_player_info->m_net_player_data.m_name));
g_notification_service->push_error("WARNING"_T.data(),
std::vformat("BLAMED_FOR_EXPLOSION"_T, std::make_format_args(player->get_name(), reinterpret_cast<CPed*>(entity)->m_player_info->m_net_player_data.m_name)));
session::add_infraction(g_player_service->get_by_id(player->m_player_id), Infraction::BLAME_EXPLOSION_DETECTED);
return;
}
@ -539,7 +540,8 @@ namespace big
if (g_local_player && g_local_player->m_net_object && g_local_player->m_net_object->m_object_id == net_id)
{
g_notification_service->push_warning("Protections", std::format("{} tried to remove a weapon.", source_player->get_name()));
g_notification_service->push_warning("PROTECTIONS"_T.data(),
std::vformat("REMOVE_WEAPON_ATTEMPT"_T, std::make_format_args(source_player->get_name())));
g_pointers->m_send_event_ack(event_manager, source_player, target_player, event_index, event_handled_bitset);
return;
}
@ -553,7 +555,8 @@ namespace big
if (g_local_player && g_local_player->m_net_object && g_local_player->m_net_object->m_object_id == net_id)
{
g_notification_service->push_warning("Protections", std::format("{} tried to remove all weapons.", source_player->get_name()));
g_notification_service->push_warning("PROTECTIONS"_T.data(),
std::vformat("REMOVE_ALL_WEAPONS_ATTEMPT"_T, std::make_format_args(source_player->get_name())));
g_pointers->m_send_event_ack(event_manager, source_player, target_player, event_index, event_handled_bitset);
return;
}

View File

@ -58,6 +58,9 @@ BOOL APIENTRY DllMain(HMODULE hmod, DWORD reason, PVOID)
LOG(INFO) << "Yim's Menu Initializing";
LOGF(INFO, "Git Info\n\tBranch:\t%s\n\tHash:\t%s\n\tDate:\t%s", version::GIT_BRANCH, version::GIT_SHA1, version::GIT_DATE);
g_translation_service.init();
LOG(INFO) << "Translation Service initialized.";
auto thread_pool_instance = std::make_unique<thread_pool>();
LOG(INFO) << "Thread pool initialized.";

View File

@ -46,7 +46,7 @@ namespace big
if (!buffer)
{
g_notification_service->push_error("Save Job", "Cannot obtain JSON data");
g_notification_service->push_error("CREATOR_STORAGE_SAVE_JOB"_T.data(), "CREATOR_STORAGE_CANNOT_OBTAIN_JSON"_T.data());
return;
}

View File

@ -45,6 +45,7 @@ namespace big
HOTKEY_SETTINGS,
REACTION_SETTINGS,
PROTECTION_SETTINGS,
TRANSLATION_SETTINGS,
DEBUG,
PLAYER
@ -101,6 +102,7 @@ namespace big
{ tabs::HOTKEY_SETTINGS, { "Hotkeys", view::hotkey_settings }},
{ tabs::REACTION_SETTINGS, { "Reactions", view::reaction_settings}},
{ tabs::PROTECTION_SETTINGS, { "Protection", view::protection_settings}},
{ tabs::TRANSLATION_SETTINGS, { "Translation", view::translation_settings}},
{ tabs::DEBUG, { "Debug", nullptr }},
}}},
{tabs::PLAYER, {"", view::view_player}}

View File

@ -5,7 +5,10 @@ namespace big
{
notification_service::notification_service()
{
push("Welcome", std::format("Loaded YimMenu. Press {} to open", ImGui::key_names[g.settings.hotkeys.menu_toggle]));
push(
"NOTIFICATION_WELCOME_TITLE"_T.data(),
std::vformat("NOTIFICATION_WELCOME_TEXT"_T, std::make_format_args(ImGui::key_names[g.settings.hotkeys.menu_toggle]))
);
g_notification_service = this;
}

View File

@ -0,0 +1,18 @@
#pragma once
#include "translation_entry.hpp"
namespace big
{
class local_index
{
public:
int version = -1;
std::string selected_language;
std::string fallback_default_language;
std::map<std::string, translation_entry> fallback_languages;
NLOHMANN_DEFINE_TYPE_INTRUSIVE(local_index, version, selected_language, fallback_default_language, fallback_languages)
};
}

View File

@ -0,0 +1,16 @@
#pragma once
#include "translation_entry.hpp"
namespace big
{
class remote_index
{
public:
int version = -1;
std::string default_lang;
std::map<std::string, translation_entry> translations;
NLOHMANN_DEFINE_TYPE_INTRUSIVE(remote_index, version, default_lang, translations)
};
}

View File

@ -0,0 +1,13 @@
#pragma once
namespace big
{
class translation_entry
{
public:
std::string name;
std::string file;
NLOHMANN_DEFINE_TYPE_INTRUSIVE(translation_entry, name, file)
};
}

View File

@ -0,0 +1,213 @@
#include "translation_service.hpp"
#include "file_manager.hpp"
#include "thread_pool.hpp"
#include <cpr/cpr.h>
namespace big
{
translation_service::translation_service() :
m_url("https://cdn.jsdelivr.net/gh/YimMenu/Translations@master")
{
}
void translation_service::init()
{
m_translation_directory = std::make_unique<folder>(g_file_manager->get_project_folder("./translations").get_path());
bool loaded_remote_index = false;
for (size_t i = 0; i < 5 && !loaded_remote_index; i++)
{
if (i)
LOG(WARNING) << "Failed to download remote index, trying again... (" << i << ")";
loaded_remote_index = download_index();
}
if (load_local_index())
{
if (!loaded_remote_index)
{
LOG(WARNING) << "Failed to load remote index, attempting to use fallback.";
use_fallback_remote();
}
else if (m_local_index.version < m_remote_index.version)
{
LOG(INFO) << "Languages outdated, downloading new translations.";
update_language_packs();
m_local_index.version = m_remote_index.version;
}
load_translations();
return;
}
if (!loaded_remote_index)
{
LOG(WARNING) << "Failed to load remote index, unable to load translations.";
return;
}
LOG(INFO) << "Downloading translations...";
m_local_index.fallback_default_language = m_remote_index.default_lang;
m_local_index.selected_language = m_remote_index.default_lang;
m_local_index.version = m_remote_index.version;
load_translations();
}
std::string_view translation_service::get_translation(const std::string_view translation_key) const
{
return get_translation(rage::joaat(translation_key));
}
std::string_view translation_service::get_translation(const rage::joaat_t translation_key) const
{
if (auto it = m_translations.find(translation_key); it != m_translations.end())
return it->second.c_str();
return { 0, 0 };
}
std::map<std::string, translation_entry>& translation_service::available_translations()
{
return m_remote_index.translations;
}
const std::string& translation_service::current_language_pack()
{
return m_local_index.selected_language;
}
void translation_service::select_language_pack(const std::string& pack_id)
{
g_thread_pool->push([this, &pack_id]
{
m_local_index.selected_language = pack_id;
load_translations();
});
}
void translation_service::load_translations()
{
m_translations.clear();
// load default lang first to make sure there are fallback keys if another language pack doesn't have a certain key
auto j = load_translation(m_remote_index.default_lang);
for (auto& [key, value] : j.items())
{
m_translations.insert({ rage::joaat(key), value.get<std::string>() });
}
// Don't load selected language if it's the same as default
if (m_local_index.selected_language != m_remote_index.default_lang)
{
auto j = load_translation(m_local_index.selected_language);
for (auto &[key, value] : j.items())
{
m_translations[rage::joaat(key)] = value;
}
}
save_local_index();
}
nlohmann::json translation_service::load_translation(const std::string_view pack_id)
{
auto file = m_translation_directory->get_file(std::format("./{}.json", pack_id));
if (!file.exists())
{
LOG(INFO) << "Translations for '" << pack_id << "' does not exist, downloading...";
if (!download_language_pack(pack_id))
{
LOG(WARNING) << "Failed to download language pack, can't recover...";
return {};
}
// make a copy available
m_local_index.fallback_languages[pack_id.data()] = m_remote_index.translations[pack_id.data()];
}
return nlohmann::json::parse(std::ifstream(file.get_path(), std::ios::binary));
}
bool translation_service::download_language_pack(const std::string_view pack_id)
{
if (auto it = m_remote_index.translations.find(pack_id.data()); it != m_remote_index.translations.end())
{
cpr::Response response = cpr::Get(cpr::Url{ m_url + "/" + it->second.file });
if (response.status_code == 200)
{
auto json = nlohmann::json::parse(response.text);
auto lang_file = m_translation_directory->get_file("./" + it->second.file);
auto out_file = std::ofstream(lang_file.get_path(), std::ios::binary | std::ios::trunc);
out_file << json.dump(4);
out_file.close();
return true;
}
}
return false;
}
void translation_service::update_language_packs()
{
for (auto item : std::filesystem::directory_iterator(m_translation_directory->get_path()))
{
const auto path = item.path();
const auto stem = path.stem().string();
if (stem == "index" || item.path().extension() != ".json")
continue;
if (!download_language_pack(stem))
{
LOG(WARNING) << "Failed to update '" << stem << "' language pack";
}
}
}
bool translation_service::download_index()
{
cpr::Response response = cpr::Get(cpr::Url{ m_url + "/index.json" });
if (response.status_code == 200)
{
m_remote_index = nlohmann::json::parse(response.text);
return true;
}
return false;
}
bool translation_service::load_local_index()
{
const auto local_index = m_translation_directory->get_file("./index.json");
if (local_index.exists())
{
const auto path = local_index.get_path();
m_local_index = nlohmann::json::parse(std::ifstream(path, std::ios::binary));
return true;
}
return false;
}
void translation_service::save_local_index()
{
nlohmann::json j = m_local_index;
const auto local_index = m_translation_directory->get_file("./index.json");
auto os = std::ofstream(local_index.get_path(), std::ios::binary | std::ios::trunc);
os << j.dump(4);
os.close();
}
void translation_service::use_fallback_remote()
{
m_remote_index.default_lang = m_local_index.fallback_default_language;
m_remote_index.translations = m_local_index.fallback_languages;
}
}

View File

@ -0,0 +1,88 @@
#pragma once
#include "gta/joaat.hpp"
#include "file_manager/folder.hpp"
#include "local_index.hpp"
#include "remote_index.hpp"
namespace big
{
using translation_map = std::unordered_map<rage::joaat_t, std::string>;
class translation_service
{
public:
translation_service();
virtual ~translation_service() = default;
translation_service(const translation_service&) = delete;
translation_service(translation_service&&) noexcept = delete;
translation_service& operator=(const translation_service&) = delete;
translation_service& operator=(translation_service&&) noexcept = delete;
void init();
std::string_view get_translation(const std::string_view translation_key) const;
std::string_view get_translation(const rage::joaat_t translation_key) const;
std::map<std::string, translation_entry>& available_translations();
const std::string& current_language_pack();
void select_language_pack(const std::string& pack_id);
private:
void load_translations();
nlohmann::json load_translation(const std::string_view pack_id);
bool download_language_pack(const std::string_view pack_id);
void update_language_packs();
/**
* @brief Downloads the remote index to compare with our local index
*
* @return true
* @return false
*/
bool download_index();
bool load_local_index();
void save_local_index();
/**
* @brief Attempts to load the remote from the local index fallback
*/
void use_fallback_remote();
private:
const std::string m_url;
std::unique_ptr<folder> m_translation_directory;
local_index m_local_index;
remote_index m_remote_index;
translation_map m_translations;
};
inline auto g_translation_service = translation_service();
template<std::size_t N>
struct TranslationLiteral
{
rage::joaat_t m_hash;
char m_key[N]{};
consteval TranslationLiteral(char const(&pp)[N])
{
std::ranges::copy(pp, m_key);
m_hash = rage::joaat(pp);
};
const std::string_view translation() const
{
if (const auto translation = g_translation_service.get_translation(m_hash); translation.length())
return translation;
return m_key;
}
};
template<TranslationLiteral T>
constexpr auto operator"" _T()
{
return T.translation();
}
}

View File

@ -13,7 +13,7 @@ namespace big
if (!ENTITY::DOES_ENTITY_EXIST(vehicle) ||
!ENTITY::IS_ENTITY_A_VEHICLE(vehicle))
{
g_notification_service->push_warning("Persist Car", "Tried to save a vehicle which does not exist");
g_notification_service->push_warning("PERSIST_CAR_TITLE"_T.data(), "PERSIST_CAR_INVALID_VEHICLE_SAVE_ATTEMPT"_T.data());
return;
}

View File

@ -25,7 +25,8 @@ namespace
"doit#",
"krutka#",
"<b>",
"\xD0\xBC\xD0\xB5", // Cyrillic "me"
// causes false positives for people typing in cyrillic
// "\xD0\xBC\xD0\xB5", // Cyrillic "me"
"P888",
"gtacash",
"\xE6\x89\xA3\xE6\x89\xA3", // no clue what this is

View File

@ -12,13 +12,13 @@ namespace big::teleport
if (ENTITY::IS_ENTITY_DEAD(ent, true))
{
g_notification_service->push_warning("Teleport", "Target player is dead.");
g_notification_service->push_warning("TELEPORT"_T.data(), "TELEPORT_PLAYER_IS_DEAD"_T.data());
return false;
}
if (!PED::IS_PED_IN_ANY_VEHICLE(ent, true))
{
g_notification_service->push_warning("Teleport", "Target player is not in a vehicle.");
g_notification_service->push_warning("TELEPORT"_T.data(), "TELEPORT_PLAYER_IS_NOT_IN_VEHICLE"_T.data());
return false;
}
@ -27,7 +27,7 @@ namespace big::teleport
if (entity::take_control_of(ent))
ENTITY::SET_ENTITY_COORDS(ent, coords.x, coords.y, coords.z, 0, 0, 0, 0);
else
g_notification_service->push_warning("Teleport", "Failed to take control of player vehicle.");
g_notification_service->push_warning("TELEPORT"_T.data(), "TELEPORT_FAILED_TO_TAKE_CONTROL"_T.data());
return true;
}
@ -71,7 +71,7 @@ namespace big::teleport
{
if (!ENTITY::IS_ENTITY_A_VEHICLE(veh))
{
g_notification_service->push_warning("Teleport", "Invalid vehicle handle");
g_notification_service->push_warning("TELEPORT"_T.data(), "TELEPORT_INVALID_VEHICLE"_T.data());
return false;
}
@ -84,7 +84,7 @@ namespace big::teleport
if (seat_index == 255)
{
g_notification_service->push_warning("Teleport", "No seats are free in the player vehicle.");
g_notification_service->push_warning("TELEPORT"_T.data(), "TELEPORT_NO_SEATS_FREE"_T.data());
return false;
}
@ -141,7 +141,7 @@ namespace big::teleport
{
if (!to_blip((int)BlipIcons::Waypoint))
{
g_notification_service->push_warning("Teleport", "Failed to find waypoint position");
g_notification_service->push_warning("TELEPORT"_T.data(), "TELEPORT_NO_WAYPOINT_SET"_T.data());
return false;
}
@ -154,7 +154,7 @@ namespace big::teleport
if (!blip::get_objective_location(location))
{
g_notification_service->push_warning("Teleport", "Failed to find objective position");
g_notification_service->push_warning("TELEPORT"_T.data(), "TELEPORT_NO_OBJECTIVE"_T.data());
return false;
}

View File

@ -57,13 +57,13 @@ namespace big::toxic
{
if (!g_player_service->get_self()->is_host())
{
g_notification_service->push_error("Modify Time", "Modifying time requires session host");
g_notification_service->push_error("MODIFY_TIME"_T.data(), "MODIFY_TIME_HOST_REQUIRED"_T.data());
return false;
}
if (!target->player_time_value.has_value())
{
g_notification_service->push_error("Modify Time", "We do not have the player's timestamp yet");
g_notification_service->push_error("MODIFY_TIME"_T.data(), "MODIFY_TIME_NO_PLAYER_TIMESTAMP"_T.data());
return false;
}
@ -91,7 +91,7 @@ namespace big::toxic
{
if (!target->player_time_value.has_value())
{
g_notification_service->push_error("Warp Time", "We do not have the player's timestamp yet");
g_notification_service->push_error("WARP_TIME_TITLE"_T.data(), "MODIFY_TIME_NO_PLAYER_TIMESTAMP"_T.data());
return;
}
@ -103,7 +103,7 @@ namespace big::toxic
{
if (!g_player_service->get_self()->is_host())
{
g_notification_service->push_error("Modify Time", "Modifying time requires session host");
g_notification_service->push_error("MODIFY_TIME"_T.data(), "MODIFY_TIME_HOST_REQUIRED"_T.data());
return;
}

View File

@ -46,17 +46,16 @@ namespace big::train
entity::take_control_of(train);
PED::SET_PED_INTO_VEHICLE(PLAYER::PLAYER_PED_ID(), train, -1);
g_notification_service->push_error("Hijack Train", "Found a train nearby");
g_notification_service->push_error("HIJACK_TRAIN"_T.data(), "HIJACK_TRAIN_FOUND_TRAIN"_T.data());
}
}
inline void delete_train()
{
if (!PED::IS_PED_IN_ANY_VEHICLE(PLAYER::PLAYER_PED_ID(), false) && get_closest_train() != 0)
{
VEHICLE::DELETE_ALL_TRAINS();
g_notification_service->push_error("Hijack Train", "Deleted the nearby train");
g_notification_service->push_error("HIJACK_TRAIN"_T.data(), "HIJACK_TRAIN_DELETED_TRAIN"_T.data());
}
}

View File

@ -70,13 +70,13 @@ namespace big::vehicle
inline void bring(Vehicle veh, Vector3 location, bool put_in = true, int seatIdx = -1)
{
if (!ENTITY::IS_ENTITY_A_VEHICLE(veh)) return g_notification_service->push_error("Vehicle", "Invalid handle");
if (!ENTITY::IS_ENTITY_A_VEHICLE(veh)) return g_notification_service->push_error("VEHICLE"_T.data(), "VEHICLE_INVALID"_T.data());
auto vecVehicleLocation = ENTITY::GET_ENTITY_COORDS(veh, true);
teleport::load_ground_at_3dcoord(vecVehicleLocation);
if (!entity::take_control_of(veh))
return g_notification_service->push_warning("Vehicle", "Failed to take control of remote vehicle.");
return g_notification_service->push_warning("VEHICLE"_T.data(), "VEHICLE_FAILED_CONTROL"_T.data());
auto ped = self::ped;
ENTITY::SET_ENTITY_COORDS(veh, location.x, location.y, location.z + 1.f, 0, 0, 0, 0);
@ -654,14 +654,14 @@ namespace big::vehicle
if (current_vehicle)
VEHICLE::SET_VEHICLE_ENGINE_ON(current_vehicle, state, immediately, disable_auto_start);
else
return g_notification_service->push_warning("Vehicle", "Please be in a car first then try again.");
return g_notification_service->push_warning("VEHICLE"_T.data(), "PLEASE_ENTER_VEHICLE"_T.data());
}
inline bool remote_control_vehicle(Vehicle veh)
{
if (!entity::take_control_of(veh, 4000))
{
g_notification_service->push_warning("Remote Control", "Failed to take control of remote vehicle");
g_notification_service->push_warning("REMOTE_CONTROL"_T.data(), "VEHICLE_FAILED_CONTROL"_T.data());
return false;
}

View File

@ -10,15 +10,15 @@ namespace big
if (ImGui::Begin("menu_heading", nullptr, window_flags | ImGuiWindowFlags_NoScrollbar))
{
ImGui::BeginGroup();
ImGui::Text("Welcome");
ImGui::Text("HEADING_WELCOME"_T.data());
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.172f, 0.380f, 0.909f, 1.f));
ImGui::Text(g_local_player == nullptr || g_local_player->m_player_info == nullptr ? "unknown" : g_local_player->m_player_info->m_net_player_data.m_name);
ImGui::Text(g_local_player == nullptr || g_local_player->m_player_info == nullptr ? "UNKNOWN_USERNAME"_T.data() : g_local_player->m_player_info->m_net_player_data.m_name);
ImGui::PopStyleColor();
ImGui::EndGroup();
ImGui::SameLine();
ImGui::SetCursorPos({ 300.f - ImGui::CalcTextSize("Unload").x - ImGui::GetStyle().ItemSpacing.x, ImGui::GetStyle().WindowPadding.y / 2 + ImGui::GetStyle().ItemSpacing.y + (ImGui::CalcTextSize("W").y / 2) });
ImGui::SetCursorPos({ 300.f - ImGui::CalcTextSize("UNLOAD"_T.data()).x - ImGui::GetStyle().ItemSpacing.x, ImGui::GetStyle().WindowPadding.y / 2 + ImGui::GetStyle().ItemSpacing.y + (ImGui::CalcTextSize("W").y / 2) });
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.69f, 0.29f, 0.29f, 1.00f));
if (components::nav_button("Unload"))
if (components::nav_button("UNLOAD"_T))
{
g_fiber_pool->queue_job([]
{

View File

@ -8,7 +8,7 @@ namespace big
if (strcmp(g_gui_service->get_selected()->name, "Debug"))
return;
if (ImGui::Begin("Debug"))
if (ImGui::Begin("DEBUG_WINDOW"_T.data()))
{
ImGui::BeginTabBar("debug_tabbar");
misc();
@ -16,6 +16,7 @@ namespace big
globals();
locals();
script_events();
scripts();
ImGui::EndTabBar();
}
ImGui::End();

View File

@ -7,6 +7,7 @@ namespace big::debug
extern void logs();
extern void misc();
extern void script_events();
extern void scripts();
extern void main();
}

View File

@ -7,25 +7,25 @@ namespace big
{
void debug::globals()
{
if (ImGui::BeginTabItem("Globals"))
if (ImGui::BeginTabItem("DEBUG_TAB_GLOBALS"_T.data()))
{
if (ImGui::Checkbox("Enable Freezing", &g_globals_service->m_running) && g_globals_service->m_running)
if (ImGui::Checkbox("DEBUG_GLOBALS_ENABLE_FREEZING"_T.data(), &g_globals_service->m_running) && g_globals_service->m_running)
g_thread_pool->push([&]() { g_globals_service->loop(); });
if (components::button("Load"))
if (components::button("LOAD"_T))
g_globals_service->load();
ImGui::SameLine();
if (components::button("Save"))
if (components::button("SAVE"_T))
g_globals_service->save();
ImGui::SameLine();
if (components::button("Add Global"))
if (components::button("DEBUG_GLOBALS_ADD"_T))
{
ImGui::OpenPopup("New Global");
ImGui::OpenPopup("DEBUG_GLOBALS_NEW"_T.data());
}
if (ImGui::BeginPopupModal("New Global"))
if (ImGui::BeginPopupModal("DEBUG_GLOBALS_NEW"_T.data()))
{
static int base_address = 0;
static bool freeze = false;
@ -34,13 +34,13 @@ namespace big
static int offset_count = 0;
static int previous_offset_count = 0;
ImGui::Text("Name:");
ImGui::Text("DEBUG_GLOBALS_NAME"_T.data());
components::input_text_with_hint("##global_name", "Name", name, sizeof(name));
ImGui::Text("Base Address:");
ImGui::Text("DEBUG_GLOBALS_BASE_ADDRESS"_T.data());
ImGui::InputInt("##modal_global_base_addr", &base_address);
ImGui::Text("Freeze:");
ImGui::Text("DEBUG_GLOBAL_FREEZE"_T.data());
ImGui::Checkbox("##modal_global_freeze", &freeze);
ImGui::Text("Number of Offsets:");
ImGui::Text("DEBUG_GLOBAL_OFFSET_COUNT"_T.data());
ImGui::InputInt("##modal_offset_count", &offset_count);
if (offset_count < 0) offset_count = 0;
@ -64,10 +64,10 @@ namespace big
ImGui::Separator();
ImGui::Text("Offset: %d", i + 1);
ImGui::Text("DEBUG_GLOBAL_OFFSET"_T.data(), i + 1);
ImGui::InputInt("##offset", &offsets[i][0]);
ImGui::Text("Size:");
ImGui::Text("DEBUG_GLOBAL_SIZE"_T.data());
ImGui::SameLine();
ImGui::InputInt("##size", &offsets[i][1]);
@ -75,7 +75,7 @@ namespace big
}
ImGui::PopItemWidth();
if (components::button("Cancel"))
if (components::button("CANCEL"_T))
{
strcpy(name, "");
freeze = false;
@ -87,7 +87,7 @@ namespace big
ImGui::CloseCurrentPopup();
}
ImGui::SameLine();
if (components::button("Save"))
if (components::button("SAVE"_T))
{
auto new_global = global(name, base_address, freeze, offsets, offset_count);
new_global.build_cache();
@ -114,12 +114,12 @@ namespace big
ImGui::Separator();
ImGui::PushID(global.get_id());
ImGui::Checkbox("Freeze", &global.m_freeze);
ImGui::Checkbox("DEBUG_GLOBAL_FREEZE_TOGGLE"_T.data(), &global.m_freeze);
ImGui::BeginGroup();
ImGui::Text("Name:");
ImGui::Text("Value:");
ImGui::Text("DEBUG_GLOBALS_NAME"_T.data());
ImGui::Text("DEBUG_GLOBALS_VALUE"_T.data());
ImGui::EndGroup();
@ -139,7 +139,7 @@ namespace big
ImGui::BeginGroup();
if (components::button("Delete"))
if (components::button("DELETE"_T))
{
for (int i = 0; i < g_globals_service->m_globals.size(); i++)
if (auto& it = g_globals_service->m_globals.at(i); it.get_id() == global.get_id())
@ -148,7 +148,7 @@ namespace big
break;
}
if (components::button("Write"))
if (components::button("WRITE"_T))
global.write();
ImGui::PopID();

View File

@ -4,7 +4,7 @@ namespace big
{
void debug::locals()
{
if (ImGui::BeginTabItem("Locals"))
if (ImGui::BeginTabItem("DEBUG_TAB_LOCALS"_T.data()))
{
ImGui::EndTabItem();

View File

@ -13,7 +13,7 @@ namespace big
{
void debug::misc()
{
if (ImGui::BeginTabItem("Misc"))
if (ImGui::BeginTabItem("DEBUG_TAB_MISC"_T.data()))
{
if (components::button("Dump entrypoints"))
{
@ -25,7 +25,7 @@ namespace big
NETWORK::NETWORK_BAIL(16, 0, 0);
});
components::button("Remove from Bad Sport", []
components::button("DEBUG_REMOVE_FROM_BAD_SPORT"_T, []
{
STATS::STAT_SET_FLOAT(RAGE_JOAAT("mpply_overall_badsport"), 0.0f, TRUE);
STATS::STAT_SET_BOOL(RAGE_JOAAT("mpply_was_i_bad_sport"), FALSE, TRUE);

View File

@ -6,7 +6,7 @@ namespace big
{
void debug::script_events()
{
if (ImGui::BeginTabItem("Script Events"))
if (ImGui::BeginTabItem("DEBUG_TAB_SCRIPT_EVENTS"_T.data()))
{
static int64_t* args;
static int event_arg_count = 3;
@ -14,7 +14,7 @@ namespace big
static int event_player_bits;
static bool event_everyone = false;
ImGui::Text("Script Argument Count:");
ImGui::Text("DEBUG_SCRIPT_EVENT_ARG_COUNT"_T.data());
ImGui::InputInt("###script_event_arg_count", &event_arg_count);
if (event_arg_count > 32)
event_arg_count = 32;
@ -37,7 +37,7 @@ namespace big
for (int i = 0; i < event_arg_count; i++)
{
ImGui::PushID(i);
ImGui::Text("Arg[%d]", i);
ImGui::Text("DEBUG_SCRIPT_EVENT_ARG"_T.data(), i);
ImGui::SameLine();
ImGui::InputScalar("###input_dynamic_arg", ImGuiDataType_S64, &args[i]);
@ -47,14 +47,14 @@ namespace big
ImGui::Separator();
ImGui::Checkbox("Send to everyone", &event_everyone);
ImGui::Checkbox("DEBUG_SCRIPT_EVENT_EVERYONE"_T.data(), &event_everyone);
if (!event_everyone)
{
ImGui::Text("Player ID:");
ImGui::Text("DEBUG_SCRIPT_EVENT_PLAYER_ID"_T.data());
ImGui::InputInt("###player_bits", &event_player_bits);
}
components::button("Send Event", []
components::button("DEBUG_SCRIPT_EVENT_SEND_EVENT"_T, []
{
args[1] = self::id; // prevent detection from AC
g_pointers->m_trigger_script_event(1, args, event_arg_count, event_everyone ? -1 : 1 << event_player_bits);

View File

@ -0,0 +1,26 @@
#include "view_debug.hpp"
#include "gui/components/components.hpp"
#include "script_mgr.hpp"
namespace big
{
void debug::scripts()
{
if (ImGui::BeginTabItem("DEBUG_TAB_SCRIPTS"_T.data()))
{
components::sub_title("DEBUG_SCRIPTS_SUB_TITLE"_T);
for (const auto& script : g_script_mgr.scripts())
{
if (script->is_toggleable())
{
if (ImGui::Checkbox(script->name(), script->toggle_ptr()))
{
g_notification_service->push(std::string(script->name()).append(" script"), script->is_enabled() ? "Resumed" : "Halted");
}
}
}
ImGui::EndTabItem();
}
}
}

View File

@ -6,18 +6,18 @@ namespace big
{
void debug::logs()
{
if (ImGui::BeginTabItem("Logs"))
if (ImGui::BeginTabItem("DEBUG_TABS_LOGS"_T.data()))
{
ImGui::Checkbox("Log Metrics", &g.debug.logs.metric_logs);
ImGui::Checkbox("Log Packets", &g.debug.logs.packet_logs);
ImGui::Checkbox("Native Script Hooks", &g.debug.logs.script_hook_logs);
ImGui::Checkbox("DEBUG_LOG_METRICS"_T.data(), &g.debug.logs.metric_logs);
ImGui::Checkbox("Log Packets", &g.debug.logs.packet_logs); // TODO: translate
ImGui::Checkbox("DEBUG_LOG_NATIVE_SCRIPT_HOOKS"_T.data(), &g.debug.logs.script_hook_logs);
if (ImGui::TreeNode("Script Event Logging"))
if (ImGui::TreeNode("DEBUG_LOG_TREE_SCRIPT_EVENT"_T.data()))
{
ImGui::Checkbox("Enable Script Event Logging", &g.debug.logs.script_event.logs);
ImGui::Checkbox("DEBUG_LOG_SCRIPT_EVENT"_T.data(), &g.debug.logs.script_event.logs);
ImGui::Separator();
ImGui::Checkbox("Filter by Player", &g.debug.logs.script_event.filter_player);
ImGui::Checkbox("DEBUG_LOG_SCRIPT_EVENT_FILTER_BY_PLAYER"_T.data(), &g.debug.logs.script_event.filter_player);
if (g.debug.logs.script_event.filter_player)
{

View File

@ -83,17 +83,17 @@ namespace big
if (ped_damage_bits & (uint32_t)eEntityProofs::GOD)
{
mode_str = "GOD";
mode_str = "ESP_GOD"_T.data();
}
else
{
if (ped_damage_bits & (uint32_t)eEntityProofs::BULLET)
{
mode_str += "BULLET ";
mode_str += "ESP_BULLET"_T.data();
}
if (ped_damage_bits & (uint32_t)eEntityProofs::EXPLOSION)
{
mode_str += "EXPLOSION ";
mode_str += "ESP_EXPLOSION"_T.data();
}
}

View File

@ -19,7 +19,7 @@ namespace big
static char search[64];
ImGui::SetNextItemWidth(300.f);
components::input_text_with_hint("Player", "Search", search, sizeof(search), ImGuiInputTextFlags_None);
components::input_text_with_hint("PLAYER"_T, "SEARCH"_T, search, sizeof(search), ImGuiInputTextFlags_None);
if (ImGui::ListBoxHeader("###players", { 180, static_cast<float>(*g_pointers->m_resolution_y - 400 - 38 * 4) }))
{
@ -53,7 +53,7 @@ namespace big
}
else
{
ImGui::Text("No stored players");
ImGui::Text("NO_STORED_PLAYERS"_T.data());
}
ImGui::ListBoxFooter();
@ -64,16 +64,16 @@ namespace big
ImGui::SameLine();
if (ImGui::BeginChild("###selected_player", { 500, static_cast<float>(*g_pointers->m_resolution_y - 388 - 38 * 4) }, false, ImGuiWindowFlags_NoBackground))
{
if (ImGui::InputText("Name", name_buf, sizeof(name_buf)))
if (ImGui::InputText("NAME"_T.data(), name_buf, sizeof(name_buf)))
{
current_player.name = name_buf;
}
ImGui::InputScalar("Rockstar ID", ImGuiDataType_S64, &current_player.rockstar_id);
ImGui::Checkbox("Is Modder", &current_player.is_modder);
ImGui::Checkbox("Block Join", &current_player.block_join);
ImGui::InputScalar("RID"_T.data(), ImGuiDataType_S64, &current_player.rockstar_id);
ImGui::Checkbox("IS_MODDER"_T.data(), &current_player.is_modder);
ImGui::Checkbox("BLOCK_JOIN"_T.data(), &current_player.block_join);
if (ImGui::BeginCombo("Block Join Alert", block_join_reasons[current_player.block_join_reason]))
if (ImGui::BeginCombo("BLOCK_JOIN_ALERT"_T.data(), block_join_reasons[current_player.block_join_reason]))
{
for (const auto& reason : block_join_reasons)
{
@ -92,10 +92,10 @@ namespace big
}
if (ImGui::IsItemHovered())
ImGui::SetTooltip("Only works as host");
ImGui::SetTooltip("ONLY_AS_HOST"_T.data());
if (ImGui::BeginCombo("Chat Command Permissions", COMMAND_ACCESS_LEVELS[current_player.command_access_level.value_or(g.session.chat_command_default_access_level)]))
if (ImGui::BeginCombo("CHAT_COMMAND_PERMISSIONS"_T.data(), COMMAND_ACCESS_LEVELS[current_player.command_access_level.value_or(g.session.chat_command_default_access_level)]))
{
for (const auto& [type, name] : COMMAND_ACCESS_LEVELS)
{
@ -115,7 +115,7 @@ namespace big
if (!current_player.infractions.empty())
{
ImGui::Text("Infractions:");
ImGui::Text("INFRACTIONS"_T.data());
for (auto& infraction : current_player.infractions)
{
@ -123,32 +123,32 @@ namespace big
}
}
components::button("Kick", []
components::button("KICK"_T, []
{
session::kick_by_rockstar_id(current_player.rockstar_id);
});
components::button("Join Session", []
components::button("JOIN_SESSION"_T, []
{
session::join_by_rockstar_id(current_player.rockstar_id);
});
static char message[256];
components::input_text("Input Message", message, sizeof(message));
if (components::button("Send Message"))
components::input_text("INPUT_MSG"_T, message, sizeof(message));
if (components::button("SEND_MSG"_T))
{
g_thread_pool->push([selected]
{
if (g_api_service->send_socialclub_message(selected->rockstar_id, message))
{
g_notification_service->push("SCAPI", "Message successfully sent");
g_notification_service->push("SCAPI"_T.data(), "MSG_SENT_SUCCESS"_T.data());
return;
}
g_notification_service->push_error("SCAPI", "Message not sent. Are you connected to the internet?");
g_notification_service->push_error("SCAPI"_T.data(), "MSG_SENT_FAIL"_T.data());
});
};
if (ImGui::Button("Save"))
if (ImGui::Button("SAVE"_T.data()))
{
if (current_player.rockstar_id != selected->rockstar_id)
g_player_database_service->update_rockstar_id(selected->rockstar_id, current_player.rockstar_id);
@ -159,7 +159,7 @@ namespace big
ImGui::SameLine();
if (ImGui::Button("Remove"))
if (ImGui::Button("REMOVE"_T.data()))
{
g_player_database_service->remove_rockstar_id(selected->rockstar_id);
}
@ -167,7 +167,7 @@ namespace big
ImGui::EndChild();
}
if (ImGui::Button("Remove All"))
if (ImGui::Button("REMOVE_ALL"_T.data()))
{
g_player_database_service->set_selected(nullptr);
g_player_database_service->get_players().clear();
@ -175,15 +175,15 @@ namespace big
}
ImGui::Separator();
components::sub_title("New Entry");
components::sub_title("NEW_ENTRY"_T);
static char new_name[64];
static int64_t new_rockstar_id;
components::input_text("Name", new_name, sizeof(new_name));
ImGui::InputScalar("Rockstar ID", ImGuiDataType_S64, &new_rockstar_id);
components::input_text("NAME"_T, new_name, sizeof(new_name));
ImGui::InputScalar("RID"_T.data(), ImGuiDataType_S64, &new_rockstar_id);
if (ImGui::Button("Add"))
if (ImGui::Button("ADD"_T.data()))
{
g_player_database_service->get_players()[new_rockstar_id] = persistent_player(new_name, new_rockstar_id);
g_player_database_service->save();

View File

@ -19,46 +19,46 @@ namespace big
void view::session()
{
static uint64_t rid = 0;
ImGui::InputScalar("Input RID", ImGuiDataType_U64, &rid);
components::button("Join by RID", []
ImGui::InputScalar("INPUT_RID"_T.data(), ImGuiDataType_U64, &rid);
components::button("JOIN_BY_RID"_T, []
{
session::join_by_rockstar_id(rid);
});
ImGui::SameLine();
components::button("Kick by RID", []
components::button("KICK_BY_RID"_T, []
{
session::kick_by_rockstar_id(rid);
});
static char username[20];
components::input_text("Input Username", username, sizeof(username));
if (components::button("Join by Username"))
components::input_text("INPUT_USERNAME"_T, username, sizeof(username));
if (components::button("JOIN_BY_USERNAME"_T))
{
session::join_by_username(username);
};
ImGui::SameLine();
if (components::button("Kick by Username"))
if (components::button("KICK_BY_USERNAME"_T))
{
session::kick_by_username(username);
};
static char base64[500]{};
components::input_text("Session Info", base64, sizeof(base64));
components::button("Join Session Info", []
components::input_text("SESSION_INFO"_T, base64, sizeof(base64));
components::button("JOIN_SESSION_INFO"_T, []
{
rage::rlSessionInfo info;
g_pointers->m_decode_session_info(&info, base64, nullptr);
session::join_session(info);
});
ImGui::SameLine();
components::button("Copy Current Session Info", []
components::button("COPY_SESSION_INFO"_T, []
{
char buf[0x100];
g_pointers->m_encode_session_info(&gta_util::get_network()->m_game_session.m_rline_session.m_session_info, buf, 0x7D, nullptr);
ImGui::SetClipboardText(buf);
});
components::sub_title("Session Switcher");
components::sub_title("SESSION_SWITCHER"_T);
if (ImGui::ListBoxHeader("###session_switch"))
{
for (const auto& session_type : sessions)
@ -71,7 +71,7 @@ namespace big
ImGui::EndListBox();
}
components::sub_title("Region Switcher");
components::sub_title("REGION_SWITCHER"_T);
if (ImGui::ListBoxHeader("###region_switch"))
{
for (const auto& region_type : regions)
@ -84,30 +84,29 @@ namespace big
ImGui::EndListBox();
}
ImGui::Checkbox("Join in SCTV slots", &g.session.join_in_sctv_slots);
ImGui::Checkbox("JOIN_IN_SCTV"_T.data(), &g.session.join_in_sctv_slots);
if (ImGui::IsItemHovered())
ImGui::SetTooltip("Allows you to join full and solo sessions but can be detected by other modders");
ImGui::SetTooltip("JOIN_IN_SCTV_DESC"_T.data());
components::sub_title("Player Magnet");
ImGui::Checkbox("Enabled", &g.session.player_magnet_enabled);
components::sub_title("PLAYER_MAGNET"_T);
ImGui::Checkbox("ENABLED"_T.data(), &g.session.player_magnet_enabled);
if (g.session.player_magnet_enabled)
{
ImGui::InputInt("Player Count", &g.session.player_magnet_count);
ImGui::InputInt("PLAYER_COUNT"_T.data(), &g.session.player_magnet_count);
}
components::sub_title("Chat");
ImGui::Checkbox("Auto-kick Chat Spammers", &g.session.kick_chat_spammers);
ImGui::Checkbox("Force Clean", &g.session.chat_force_clean);
ImGui::Checkbox("AUTO_KICK_CHAT_SPAMMERS"_T.data(), &g.session.kick_chat_spammers);
ImGui::Checkbox("DISABLE_FILTER"_T.data(), &g.session.chat_force_clean);
if (ImGui::IsItemHovered())
ImGui::SetTooltip("Your sent chat messages will not be censored to the receivers");
ImGui::Checkbox("Log Chat Messages", &g.session.log_chat_messages);
ImGui::Checkbox("Log Text Messages", &g.session.log_text_messages);
ImGui::SetTooltip("Your sent chat messages will not be censored to the receivers"); // TODO: add translation
ImGui::Checkbox("LOG_CHAT_MSG"_T.data(), &g.session.log_chat_messages);
ImGui::Checkbox("LOG_TXT_MSG"_T.data(), &g.session.log_text_messages);
static char msg[256];
components::input_text("##message", msg, sizeof(msg));
ImGui::SameLine();
ImGui::Checkbox("Is Team", &g.session.is_team);
ImGui::Checkbox("IS_TEAM"_T.data(), &g.session.is_team);
ImGui::SameLine();
components::button("Send", []
components::button("SEND"_T, []
{
if (const auto net_game_player = gta_util::get_network_player_mgr()->m_local_net_player; net_game_player)
{
@ -116,10 +115,10 @@ namespace big
}
});
ImGui::Checkbox("Chat Commands", &g.session.chat_commands);
ImGui::Checkbox("CHAT_COMMANDS"_T.data(), &g.session.chat_commands);
if (g.session.chat_commands)
{
if (ImGui::BeginCombo("Default Command Permissions", COMMAND_ACCESS_LEVELS[g.session.chat_command_default_access_level]))
if (ImGui::BeginCombo("DEFAULT_CMD_PERMISSIONS"_T.data(), COMMAND_ACCESS_LEVELS[g.session.chat_command_default_access_level]))
{
for (const auto& [type, name] : COMMAND_ACCESS_LEVELS)
{
@ -138,21 +137,21 @@ namespace big
}
}
components::sub_title("Decloak");
components::script_patch_checkbox("Reveal OTR Players", &g.session.decloak_players);
components::sub_title("DECLOAK"_T);
components::script_patch_checkbox("REVEAL_OTR_PLAYERS"_T, &g.session.decloak_players);
components::sub_title("Force Host");
ImGui::Checkbox("Force Session Host", &g.session.force_session_host);
components::sub_title("FORCE_HOST"_T);
ImGui::Checkbox("FORCE_SESSION_HOST"_T.data(), &g.session.force_session_host);
if (ImGui::IsItemHovered())
ImGui::SetTooltip("Join another session to apply changes. The original host of the session must leave or be kicked. This feature is easily detectable by other mod menus, use with caution");
ImGui::SetTooltip("FORCE_SESSION_HOST_DESC"_T.data());
ImGui::SameLine();
if (g.session.force_session_host)
{
ImGui::SameLine();
ImGui::Checkbox("Kick Host During Join", &g.session.kick_host_when_forcing_host);
ImGui::Checkbox("KICK_HOST_ON_JOIN"_T.data(), &g.session.kick_host_when_forcing_host);
}
if (ImGui::Checkbox("Force Script Host", &g.session.force_script_host))
if (ImGui::Checkbox("FORCE_SCRIPT_HOST"_T.data(), &g.session.force_script_host))
{
if (g.session.force_script_host)
g_fiber_pool->queue_job([]
@ -167,16 +166,16 @@ namespace big
});
}
components::sub_title("Remote Name Spoofing");
ImGui::Checkbox("Spoof Other Players' Names", &g.session.name_spoof_enabled);
components::sub_title("REMOTE_NAME_SPOOFING"_T);
ImGui::Checkbox("SPOOF_PLAYER_NAMES"_T.data(), &g.session.name_spoof_enabled);
if (ImGui::IsItemHovered())
ImGui::SetTooltip("Requires session host. Spoofed names will not visible locally nor to the player that had their name spoofed. Requires players to join after becoming host");
ImGui::SetTooltip("SPOOF_PLAYER_NAMES_DESC"_T.data());
if (g.session.name_spoof_enabled)
{
ImGui::Checkbox("Advertise YimMenu", &g.session.advertise_menu);
ImGui::Checkbox("ADVERTISE_YIMMENU"_T.data(), &g.session.advertise_menu);
if (ImGui::IsItemHovered())
ImGui::SetTooltip("Advertise YimMenu by spoofing player names to differently colored variants of 'YimMenu'. You will not be able to customize the name with this option enabled");
ImGui::SetTooltip("ADVERTISE_YIMMENU_DESC"_T.data());
if (!g.session.advertise_menu)
{
@ -184,7 +183,7 @@ namespace big
static char name[name_size];
strcpy_s(name, sizeof(name), g.session.spoofed_name.c_str());
ImGui::Text("Name: ");
ImGui::Text("PLAYER_SPOOFED_NAME"_T.data());
components::input_text("##username_input", name, sizeof(name));
if (name != g.session.spoofed_name)
@ -192,40 +191,40 @@ namespace big
}
}
components::sub_title("All Players");
ImGui::Checkbox("Off The Radar", &g.session.off_radar_all);
components::sub_title("ALL_PLAYERS"_T);
ImGui::Checkbox("OFF_THE_RADAR"_T.data(), &g.session.off_radar_all);
ImGui::SameLine();
ImGui::Checkbox("Never Wanted", &g.session.never_wanted_all);
ImGui::Checkbox("NEVER_WANTED"_T.data(), &g.session.never_wanted_all);
ImGui::SameLine();
ImGui::Checkbox("Semi Godmode", &g.session.semi_godmode_all);
ImGui::Checkbox("SEMI_GODMODE"_T.data(), &g.session.semi_godmode_all);
ImGui::Checkbox("Explosion Karma", &g.session.explosion_karma);
ImGui::Checkbox("EXPLOSION_KARMA"_T.data(), &g.session.explosion_karma);
ImGui::SameLine();
ImGui::Checkbox("Damage Karma", &g.session.damage_karma);
ImGui::Checkbox("DAMAGE_KARMA"_T.data(), &g.session.damage_karma);
static int global_wanted_level = 0;
if (ImGui::SliderInt("Wanted Level", &global_wanted_level, 0, 5))
if (ImGui::SliderInt("WANTED_LVL"_T.data(), &global_wanted_level, 0, 5))
{
*scr_globals::globalplayer_bd.at(self::id, scr_globals::size::globalplayer_bd).at(213).as<int*>() = global_wanted_level;
}
ImGui::SameLine();
if (ImGui::Checkbox("Force", &g.session.wanted_level_all))
if (ImGui::Checkbox("FORCE"_T.data(), &g.session.wanted_level_all))
{
*scr_globals::globalplayer_bd.at(self::id, scr_globals::size::globalplayer_bd).at(212).as<Player*>() = __rdtsc() + 32;
*scr_globals::globalplayer_bd.at(self::id, scr_globals::size::globalplayer_bd).at(213).as<int*>() = global_wanted_level;
}
components::command_button<"killall">({ }, "Kill Everyone");
components::command_button<"killall">({ }, "KILL_ALL"_T);
ImGui::SameLine();
components::command_button<"explodeall">({ }, "Explode Everyone");
components::command_button<"explodeall">({ }, "EXPLODE_ALL"_T);
ImGui::SameLine();
components::command_button<"beastall">({ });
if (ImGui::IsItemHovered())
ImGui::SetTooltip("Including you");
ImGui::SetTooltip("INCLUDING_YOU"_T.data());
components::command_button<"giveweapsall">({ });
ImGui::SameLine();
@ -235,9 +234,10 @@ namespace big
ImGui::SameLine();
components::command_button<"vehkickall">({ });
components::command_button<"ragdollall">({ }, "Ragdoll Players");
components::command_button<"ragdollall">({ }, "RAGDOLL_PLAYERS"_T);
ImGui::SameLine();
components::command_button<"intkickall">({ }, "Kick Everyone From Interiors");
components::command_button<"intkickall">({ }, "KICK_ALL_FROM_INTERIORS"_T);
components::command_button<"missionall">({ });
ImGui::SameLine();
@ -253,7 +253,7 @@ namespace big
ImGui::SameLine();
components::command_button<"fakebanall">({ }, "Send Fake Ban Messages");
components::small_text("Teleports");
components::small_text("TELEPORTS"_T);
if (ImGui::BeginCombo("##apartment", apartment_names[g.session.send_to_apartment_idx]))
{
@ -275,7 +275,7 @@ namespace big
ImGui::SameLine();
components::command_button<"apartmenttpall">({ (uint64_t)g.session.send_to_apartment_idx }, "TP All To Apartment");
components::command_button<"apartmenttpall">({ (uint64_t)g.session.send_to_apartment_idx }, "TP_ALL_TO_APARTMENT"_T);
if (ImGui::BeginCombo("##warehouse", warehouse_names[g.session.send_to_warehouse_idx]))
{
@ -297,37 +297,37 @@ namespace big
ImGui::SameLine();
components::command_button<"warehousetpall">({ (uint64_t)g.session.send_to_warehouse_idx }, "TP All To Warehouse");
components::command_button<"warehousetpall">({ (uint64_t)g.session.send_to_warehouse_idx }, "TP_ALL_TO_WAREHOUSE"_T);
components::button("TP All To Darts", [] { g_player_service->iterate([](auto& plyr) { toxic::start_activity(plyr.second, eActivityType::Darts); }); });
components::button("TP_ALL_TO_DARTS"_T, [] { g_player_service->iterate([](auto& plyr) { toxic::start_activity(plyr.second, eActivityType::Darts); }); });
ImGui::SameLine();
components::button("TP All To Flight School", [] { g_player_service->iterate([](auto& plyr) { toxic::start_activity(plyr.second, eActivityType::PilotSchool); }); });
components::button("TP_ALL_TO_FLIGHT_SCHOOL"_T, [] { g_player_service->iterate([](auto& plyr) { toxic::start_activity(plyr.second, eActivityType::PilotSchool); }); });
ImGui::SameLine();
components::button("TP All To Map Center", [] { g_player_service->iterate([](auto& plyr) { toxic::start_activity(plyr.second, eActivityType::ArmWresling); }); });
components::button("TP_ALL_TO_MAP_CENTER"_T, [] { g_player_service->iterate([](auto& plyr) { toxic::start_activity(plyr.second, eActivityType::ArmWresling); }); });
components::button("TP All To Skydive", [] { g_player_service->iterate([](auto& plyr) { toxic::start_activity(plyr.second, eActivityType::Skydive); }); });
components::button("TP_ALL_TO_SKYDIVE"_T, [] { g_player_service->iterate([](auto& plyr) { toxic::start_activity(plyr.second, eActivityType::Skydive); }); });
ImGui::SameLine();
components::command_button<"interiortpall">({ 81 }, "TP All To MOC");
components::command_button<"interiortpall">({ 81 }, "TP_ALL_TO_MOC"_T);
ImGui::SameLine();
components::command_button<"interiortpall">({ 123 }, "TP All To Casino");
components::command_button<"interiortpall">({ 123 }, "TP_ALL_TO_CASINO"_T);
ImGui::SameLine();
components::command_button<"interiortpall">({ 124 }, "TP All To Penthouse");
components::command_button<"interiortpall">({ 124 }, "TP_ALL_TO_PENTHOUSE"_T);
ImGui::SameLine();
components::command_button<"interiortpall">({ 128 }, "TP All To Arcade");
components::command_button<"interiortpall">({ 128 }, "TP_ALL_TO_ARCADE"_T);
components::command_button<"interiortpall">({ 146 }, "TP All To Music Locker");
components::command_button<"interiortpall">({ 146 }, "TP_ALL_TO_MUSIC_LOCKER"_T);
ImGui::SameLine();
components::command_button<"interiortpall">({ 148 }, "TP All To Record A Studios");
components::command_button<"interiortpall">({ 148 }, "TP_ALL_TO_RECORD_A_STUDIOS"_T);
ImGui::SameLine();
components::command_button<"interiortpall">({ 149 }, "TP All To Custom Auto Shop");
components::command_button<"interiortpall">({ 149 }, "TP_ALL_TO_CUSTOM_AUTO_SHOP"_T);
components::command_button<"interiortpall">({ 155 }, "TP All To Agency");
components::command_button<"interiortpall">({ 155 }, "TP_ALL_TO_AGENCY"_T);
ImGui::SameLine();
components::command_button<"interiortpall">({ 160 }, "TP All To Freakshop");
components::command_button<"interiortpall">({ 160 }, "TP_ALL_TO_FREAKSHOP"_T);
ImGui::SameLine();
components::command_button<"interiortpall">({ 161 }, "TP All To Multi Floor Garage");
components::command_button<"interiortpall">({ 161 }, "TP_ALL_TO_MULTI_FLOOR_GARAGE"_T);
components::command_button<"tutorialall">();
ImGui::SameLine();
@ -347,34 +347,34 @@ namespace big
ImGui::SameLine();
components::command_button<"camhedzall">();
ImGui::Checkbox("Disable Pedestrians", &g.session.disable_peds);
ImGui::Checkbox("DISABLE_PEDS"_T.data(), &g.session.disable_peds);
ImGui::SameLine();
ImGui::Checkbox("Disable Traffic", &g.session.disable_traffic);
ImGui::Checkbox("DISABLE_TRAFFIC"_T.data(), &g.session.disable_traffic);
ImGui::SameLine();
ImGui::Checkbox("Force Thunder", &g.session.force_thunder);
ImGui::Checkbox("FORCE_THUNDER"_T.data(), &g.session.force_thunder);
components::small_text("Warp Time (requires session host)");
components::small_text("WARP_TIME"_T.data());
components::button("+1 Minute", [] { toxic::warp_time_forward_all(60 * 1000); });
components::button("PLUS_1_MINUTE"_T, [] { toxic::warp_time_forward_all(60 * 1000); });
ImGui::SameLine();
components::button("+5 Minutes", [] { toxic::warp_time_forward_all(5 * 60 * 1000); });
components::button("PLUS_5_MINUTES"_T, [] { toxic::warp_time_forward_all(5 * 60 * 1000); });
ImGui::SameLine();
components::button("+48 Minutes", [] { toxic::warp_time_forward_all(48 * 60 * 1000); });
components::button("PLUS_48_MINUTES"_T, [] { toxic::warp_time_forward_all(48 * 60 * 1000); });
ImGui::SameLine();
components::button("+96 Minutes", [] { toxic::warp_time_forward_all(96 * 60 * 1000); });
components::button("PLUS_96_MINUTES"_T, [] { toxic::warp_time_forward_all(96 * 60 * 1000); });
ImGui::SameLine();
components::button("+200 Minutes", [] { toxic::warp_time_forward_all(200 * 60 * 1000); });
components::button("PLUS_200_MINUTES"_T, [] { toxic::warp_time_forward_all(200 * 60 * 1000); });
ImGui::SameLine();
components::button("Stop Time", [] { toxic::set_time_all(INT_MAX - 3000); });
components::button("STOP_TIME"_T, [] { toxic::set_time_all(INT_MAX - 3000); });
if (ImGui::IsItemHovered())
ImGui::SetTooltip("This cannot be reversed. Use with caution");
ImGui::SetTooltip("STOP_TIME_DESC"_T.data());
components::sub_title("Script Host Features");
ImGui::Checkbox("Disable CEO Money", &g.session.block_ceo_money);
components::sub_title("SCRIPT_HOST_FEATURES"_T);
ImGui::Checkbox("DISABLE_CEO_MONEY"_T.data(), &g.session.block_ceo_money);
if (ImGui::IsItemHovered())
ImGui::SetTooltip("Blocks CEO money drops across the entire session. This can also break other stuff, use with caution");
ImGui::SetTooltip("DISABLE_CEO_MONEY_DESC"_T.data());
ImGui::SameLine();
ImGui::Checkbox("Randomize CEO Colors", &g.session.randomize_ceo_colors);
ImGui::Checkbox("RANDOMIZE_CEO_COLORS"_T.data(), &g.session.randomize_ceo_colors);
ImGui::Checkbox("Block Jobs", &g.session.block_jobs);
if (ImGui::IsItemHovered())
ImGui::SetTooltip("Prevents remote players from starting jobs while in your session");

View File

@ -49,7 +49,7 @@ namespace big
}
else
{
ImGui::Text("No sessions");
ImGui::Text("NO_SESSIONS"_T.data());
}
ImGui::ListBoxFooter();
@ -62,25 +62,25 @@ namespace big
{
auto& session = g_matchmaking_service->get_found_sessions()[selected_session_idx];
ImGui::Text("Num Players: %d", session.attributes.player_count);
ImGui::Text("Discriminator: 0x%X", session.attributes.discriminator);
ImGui::Text("Region: %s", regions[session.attributes.region].name);
ImGui::Text("Language: %s", languages[session.attributes.language].name);
ImGui::Text("SESSION_BROWSER_NUM_PLAYERS"_T.data(), session.attributes.player_count);
ImGui::Text("SESSION_BROWSER_DISCRIMINATOR"_T.data(), session.attributes.discriminator);
ImGui::Text("SESSION_BROWSER_REGION"_T.data(), regions[session.attributes.region].name);
ImGui::Text("SESSION_BROWSER_LANGUAGE"_T.data(), languages[session.attributes.language].name);
auto& data = session.info.m_net_player_data;
ImGui::Text("Host Rockstar ID: %d", data.m_gamer_handle.m_rockstar_id);
ImGui::Text("SESSION_BROWSER_HOST_RID"_T.data(), data.m_gamer_handle.m_rockstar_id);
components::button("Copy Session Info", []
components::button("COPY_SESSION_INFO"_T, []
{
ImGui::SetClipboardText(session_info);
});
ImGui::SameLine();
components::button("Join", [session]
components::button("JOIN"_T, [session]
{
if (SCRIPT::GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(RAGE_JOAAT("maintransition")) != 0 ||
STREAMING::IS_PLAYER_SWITCH_IN_PROGRESS())
{
g_notification_service->push_error("Join Session", "Player switch in progress, wait a bit.");
g_notification_service->push_error("JOIN_SESSION"_T.data(), "PLAYER_SWITCH_IN_PROGRESS"_T.data());
return;
}
@ -96,12 +96,12 @@ namespace big
ImGui::EndChild();
}
if (ImGui::TreeNode("Filters"))
if (ImGui::TreeNode("FILTERS"_T.data()))
{
ImGui::Checkbox("Region", &g.session_browser.region_filter_enabled);
ImGui::Checkbox("REGION"_T.data(), &g.session_browser.region_filter_enabled);
if (ImGui::IsItemHovered())
ImGui::SetTooltip("It is highly recommended to keep this filter enabled");
ImGui::SetTooltip("REGION_FILTER_DESC"_T.data());
if (g.session_browser.region_filter_enabled)
{
@ -121,10 +121,10 @@ namespace big
}
ImGui::Checkbox("Language", &g.session_browser.language_filter_enabled);
ImGui::Checkbox("LANGUAGE"_T.data(), &g.session_browser.language_filter_enabled);
if (ImGui::IsItemHovered())
ImGui::SetTooltip("Setting a correct region filter for the language will help tremendously");
ImGui::SetTooltip("LANGUAGE_FILTER_DESC"_T.data());
if (g.session_browser.language_filter_enabled)
{
@ -143,15 +143,15 @@ namespace big
}
}
ImGui::Checkbox("Players", &g.session_browser.player_count_filter_enabled);
ImGui::Checkbox("PLAYERS"_T.data(), &g.session_browser.player_count_filter_enabled);
if (g.session_browser.player_count_filter_enabled)
{
ImGui::InputInt("Minimum", &g.session_browser.player_count_filter_minimum);
ImGui::InputInt("Maximum", &g.session_browser.player_count_filter_maximum);
ImGui::InputInt("MIN"_T.data(), &g.session_browser.player_count_filter_minimum);
ImGui::InputInt("MAX"_T.data(), &g.session_browser.player_count_filter_maximum);
}
ImGui::Checkbox("Pool Type", &g.session_browser.pool_filter_enabled);
ImGui::Checkbox("POOL_TYPE"_T.data(), &g.session_browser.pool_filter_enabled);
if (g.session_browser.pool_filter_enabled)
{
ImGui::SameLine();
@ -161,25 +161,25 @@ namespace big
ImGui::TreePop();
}
if (ImGui::TreeNode("Sorting"))
if (ImGui::TreeNode("SORTING"_T.data()))
{
ImGui::Combo("Sort By", &g.session_browser.sort_method, "Off\0Player Count");
ImGui::Combo("SORT_BY"_T.data(), &g.session_browser.sort_method, "Off\0Player Count");
if (g.session_browser.sort_method != 0)
ImGui::Combo("Direction", &g.session_browser.sort_direction, "Ascending\0Descending");
ImGui::Combo("DIRECTION"_T.data(), &g.session_browser.sort_direction, "Ascending\0Descending");
ImGui::TreePop();
}
if (ImGui::Checkbox("Replace Game Matchmaking", &g.session_browser.replace_game_matchmaking));
if (ImGui::Checkbox("REPLACE_GAME_MATCHMAKING"_T.data(), &g.session_browser.replace_game_matchmaking));
if (ImGui::IsItemHovered())
ImGui::SetTooltip("This will replace the default game matchmaking with a custom one that will use the filters and sorting set here");
ImGui::SetTooltip("REPLACE_GAME_MATCHMAKING_DESC"_T.data());
components::button("Refresh", []
components::button("REFRESH"_T, []
{
selected_session_idx = -1;
if (!g_matchmaking_service->matchmake())
g_notification_service->push_error("Matchmaking", "Matchmaking failed");
g_notification_service->push_error("MATCHMAKING"_T.data(), "MATCHMAKING_FAIL"_T.data());
});
}
}

View File

@ -9,22 +9,22 @@ namespace big
{
void view::spoofing()
{
components::small_text("To spoof any of the below credentials you need to reconnect with the lobby.\nAll spoofed details will be only visible by other players, your game will still show your actual name, ip, rid...");
components::small_text("SPOOFING_DESCRIPTION"_T);
components::sub_title("Username");
components::sub_title("USERNAME"_T);
ImGui::Checkbox("Spoof Username", &g.spoofing.spoof_username);
ImGui::Checkbox("SPOOFING_USERNAME"_T.data(), &g.spoofing.spoof_username);
if (g.spoofing.spoof_username)
{
ImGui::SameLine();
ImGui::Checkbox("Spoof Username Locally", &g.spoofing.spoof_local_username);
ImGui::Checkbox("SPOOFING_USERNAME_LOCAL"_T.data(), &g.spoofing.spoof_local_username);
}
constexpr size_t name_size = RTL_FIELD_SIZE(rage::rlGamerInfo, m_name);
static char name[name_size];
strcpy_s(name, sizeof(name), g.spoofing.username.c_str());
ImGui::Text("Username:");
ImGui::Text("USERNAME_COLON"_T.data());
components::input_text("##username_input", name, sizeof(name));
if (name != g.spoofing.username)
@ -32,56 +32,56 @@ namespace big
ImGui::Separator();
components::sub_title("IP Address");
components::sub_title("IP_ADDRESS"_T);
ImGui::Checkbox("Spoof IP", &g.spoofing.spoof_ip);
ImGui::Checkbox("SPOOFING_IP"_T.data(), &g.spoofing.spoof_ip);
if (ImGui::IsItemHovered())
ImGui::SetTooltip("Disable this feature if you're having trouble joining sessions.");
ImGui::SetTooltip("SPOOFING_IP_DESCRIPTION"_T.data());
ImGui::Text("IP Address:");
ImGui::Text("IP_ADDRESS_COLON"_T.data());
ImGui::DragInt4("##ip_fields", g.spoofing.ip_address.data(), 0, 255);
ImGui::Separator();
components::sub_title("Rockstar ID");
components::sub_title("ROCKSTAR_ID"_T);
ImGui::Checkbox("Spoof Rockstar ID", &g.spoofing.spoof_rockstar_id);
ImGui::Checkbox("SPOOFING_ROCKSTAR_ID"_T.data(), &g.spoofing.spoof_rockstar_id);
ImGui::Text("Rockstar ID:");
ImGui::Text("ROCKSTAR_ID_COLON"_T.data());
ImGui::InputScalar("##rockstar_id_input", ImGuiDataType_U64, &g.spoofing.rockstar_id);
components::sub_title("Hide Features");
ImGui::Checkbox("Hide God Mode", &g.spoofing.spoof_hide_god);
ImGui::Checkbox("Hide Spectate", &g.spoofing.spoof_hide_spectate);
components::sub_title("SPOOFING_HIDE_FEATURES"_T);
ImGui::Checkbox("SPOOFING_HIDE_GOD_MODE"_T.data(), &g.spoofing.spoof_hide_god);
ImGui::Checkbox("SPOOFING_HIDE_SPECTATE"_T.data(), &g.spoofing.spoof_hide_spectate);
components::sub_title("Crew");
components::sub_title("CREW"_T);
ImGui::Checkbox("Spoof Crew", &g.spoofing.spoof_crew_data);
ImGui::Checkbox("SPOOFING_CREW"_T.data(), &g.spoofing.spoof_crew_data);
constexpr size_t crew_tag_size = RTL_FIELD_SIZE(ClanData, m_clan_tag);
static char crew_tag[crew_tag_size];
strcpy_s(crew_tag, sizeof(crew_tag), g.spoofing.crew_tag.c_str());
ImGui::Text("Crew Tag:");
ImGui::Text("SPOOFING_CREW_TAG"_T.data());
components::input_text("##crew_tag_input", crew_tag, sizeof(crew_tag));
if (crew_tag != g.spoofing.crew_tag)
g.spoofing.crew_tag = std::string(crew_tag);
ImGui::Checkbox("Is Rockstar Crew", &g.spoofing.rockstar_crew);
ImGui::Checkbox("SPOOFING_CREW_ROCKSTAR"_T.data(), &g.spoofing.rockstar_crew);
ImGui::Checkbox("Square Crew Tag", &g.spoofing.square_crew_tag);
ImGui::Checkbox("SPOOFING_CREW_SQUARE_TAG"_T.data(), &g.spoofing.square_crew_tag);
components::sub_title("Extra - Only work when Spoofed RID");
components::sub_title("SPOOFING_EXTRA"_T);
ImGui::Checkbox("Is Cheater", &g.spoofing.spoof_cheater);
ImGui::Checkbox("Is Rockstar Dev", &g.spoofing.spoof_rockstar_dev);
ImGui::Checkbox("Is Rockstar QA", &g.spoofing.spoof_rockstar_qa);
ImGui::Checkbox("SPOOFING_IS_CHEATER"_T.data(), &g.spoofing.spoof_cheater);
ImGui::Checkbox("SPOOFING_IS_DEV"_T.data(), &g.spoofing.spoof_rockstar_dev);
ImGui::Checkbox("SPOOFING_IS_QA"_T.data(), &g.spoofing.spoof_rockstar_qa);
components::sub_title("Session Attributes");
components::small_text("Only works when session host");
components::sub_title("SPOOFING_SESSION_ATTRIBUTES"_T);
components::small_text("SPOOFING_ONLY_WORKS_AS_HOST"_T);
ImGui::Checkbox("Region", &g.spoofing.spoof_session_region_type);
ImGui::Checkbox("SPOOFING_ATTRIBUTE_REGION"_T.data(), &g.spoofing.spoof_session_region_type);
if (g.spoofing.spoof_session_region_type)
{
ImGui::SameLine();
@ -97,7 +97,7 @@ namespace big
ImGui::EndCombo();
}
}
ImGui::Checkbox("Language", &g.spoofing.spoof_session_language);
ImGui::Checkbox("SPOOFING_ATTRIBUTE_LANGUAGE"_T.data(), &g.spoofing.spoof_session_language);
if (g.spoofing.spoof_session_language)
{
ImGui::SameLine();
@ -115,7 +115,7 @@ namespace big
}
}
ImGui::Checkbox("Player Count", &g.spoofing.spoof_session_player_count);
ImGui::Checkbox("SPOOFING_ATTRIBUTE_PLAYER_COUNT"_T.data(), &g.spoofing.spoof_session_player_count);
if (g.spoofing.spoof_session_player_count)
{
ImGui::SameLine();

View File

@ -11,18 +11,18 @@ namespace big
{
void view::player_info()
{
if (ImGui::TreeNode("Info"))
if (ImGui::TreeNode("INFO"_T.data()))
{
ImGui::Text("Player ID: %d", g_player_service->get_selected()->id());
ImGui::Text("PLAYER_INFO_ID"_T.data(), g_player_service->get_selected()->id());
ImGui::Text("Session Host: %s", g_player_service->get_selected()->is_host() ? "Yes" : "No");
ImGui::Text("PLAYER_INFO_SESSION_HOST"_T.data(), g_player_service->get_selected()->is_host() ? "YES"_T.data() : "NO"_T.data());
ImGui::Separator();
if (CPlayerInfo* player_info = g_player_service->get_selected()->get_player_info(); player_info != nullptr)
{
ImGui::Text("Wanted Level: %d", player_info->m_wanted_level);
ImGui::Text("PLAYER_INFO_WANTED_LEVEL"_T.data(), player_info->m_wanted_level);
}
uint32_t ped_damage_bits = 0;
@ -42,17 +42,17 @@ namespace big
if (ped_damage_bits & (uint32_t)eEntityProofs::GOD)
{
mode_str = "God";
mode_str = "PLAYER_INFO_GOD"_T;
}
else
{
if (ped_damage_bits & (uint32_t)eEntityProofs::BULLET)
{
mode_str += "Bullet, ";
mode_str += "PLAYER_INFO_BULLET"_T;
}
if (ped_damage_bits & (uint32_t)eEntityProofs::EXPLOSION)
{
mode_str += "Explosion, ";
mode_str += "PLAYER_INFO_EXPLOSION"_T;
}
if (ped_health > 328 || ped_maxhealth > 328 && !(uint32_t)eEntityProofs::EXPLOSION && !(uint32_t)eEntityProofs::BULLET)
{
@ -62,10 +62,10 @@ namespace big
if (mode_str.empty())
{
mode_str = "No";
mode_str = "NO"_T;
}
ImGui::Text("Player God Mode: %s", mode_str.c_str());
ImGui::Text("PLAYER_INFO_PROOFS"_T.data(), mode_str.c_str());
mode_str = "";
@ -78,44 +78,46 @@ namespace big
{
if (veh_damage_bits & (uint32_t)eEntityProofs::GOD)
{
mode_str = "God";
mode_str = "PLAYER_INFO_GOD"_T;
}
else
{
if (veh_damage_bits & (uint32_t)eEntityProofs::COLLISION)
{
mode_str += "Collision, ";
mode_str += "PLAYER_INFO_COLLISION"_T;
}
if (veh_damage_bits & (uint32_t)eEntityProofs::EXPLOSION)
{
mode_str += "Explosion, ";
mode_str += "PLAYER_INFO_EXPLOSION"_T;
}
}
if (mode_str.empty())
{
mode_str = "No";
mode_str = "NO"_T;
}
}
else
{
mode_str = "No vehicle detected";
mode_str = "PLAYER_INFO_NO_VEHICLE"_T;
}
ImGui::Text("Vehicle God Mode: %s", mode_str.c_str());
ImGui::Text("PLAYER_INFO_VEHICLE_PROOFS"_T.data(), mode_str.c_str());
ImGui::Separator();
if (auto net_player_data = g_player_service->get_selected()->get_net_data(); net_player_data != nullptr)
{
ImGui::Text("Rockstar ID: %d", net_player_data->m_gamer_handle_2.m_rockstar_id);
ImGui::Text("PLAYER_INFO_RID"_T.data(), net_player_data->m_gamer_handle_2.m_rockstar_id);
ImGui::SameLine();
if (ImGui::Button("Copy##rid")) ImGui::SetClipboardText(std::to_string(net_player_data->m_gamer_handle_2.m_rockstar_id).data());
ImGui::PushID("##rid");
if (ImGui::Button("COPY"_T.data())) ImGui::SetClipboardText(std::to_string(net_player_data->m_gamer_handle_2.m_rockstar_id).data());
ImGui::PopID();
ImGui::Text(
"IP Address: %d.%d.%d.%d:%d",
"PLAYER_INFO_IP"_T.data(),
net_player_data->m_external_ip.m_field1,
net_player_data->m_external_ip.m_field2,
net_player_data->m_external_ip.m_field3,
@ -125,11 +127,13 @@ namespace big
ImGui::SameLine();
if (ImGui::Button("Copy##ip")) ImGui::SetClipboardText(std::format("{}.{}.{}.{}:{}", net_player_data->m_external_ip.m_field1,
ImGui::PushID("##ip");
if (ImGui::Button("COPY"_T.data())) ImGui::SetClipboardText(std::format("{}.{}.{}.{}:{}", net_player_data->m_external_ip.m_field1,
net_player_data->m_external_ip.m_field2,
net_player_data->m_external_ip.m_field3,
net_player_data->m_external_ip.m_field4,
net_player_data->m_external_port).data());
ImGui::PopID();
}
ImGui::Separator();
@ -142,27 +146,28 @@ namespace big
auto& boss_goon = scr_globals::gpbd_fm_3.as<GPBD_FM_3*>()->Entries[id].BossGoon;
if (boss_goon.Language >= 0 && boss_goon.Language < 13)
ImGui::Text("Language: %s", languages[boss_goon.Language].name);
ImGui::Text("PLAYER_INFO_LANGUAGE"_T.data(), languages[boss_goon.Language].name);
ImGui::Text("PLAYER_INFO_CEO_NAME"_T.data(), boss_goon.GangName);
ImGui::Text("PLAYER_INFO_MC_NAME"_T.data(), boss_goon.ClubhouseName);
ImGui::Text("PLAYER_INFO_WALLET"_T.data(), stats.WalletBalance);
ImGui::Text("PLAYER_INFO_BANK"_T.data(), stats.Money - stats.WalletBalance);
ImGui::Text("PLAYER_INFO_TOTAL_MONEY"_T.data(), stats.Money);
ImGui::Text("PLAYER_INFO_RANK"_T.data(), stats.Rank, stats.RP);
ImGui::Text("Health: %d (MaxHealth: %d)", ped_health, ped_maxhealth); // TODO: translate
ImGui::Text("PLAYER_INFO_KD"_T.data(), stats.KdRatio);
ImGui::Text("PLAYER_INFO_KILLS"_T.data(), stats.KillsOnPlayers);
ImGui::Text("PLAYER_INFO_DEATHS"_T.data(), stats.DeathsByPlayers);
ImGui::Text("PLAYER_INFO_PROSTITUTES"_T.data(), stats.ProstitutesFrequented);
ImGui::Text("PLAYER_INFO_LAP_DANCES"_T.data(), stats.LapDancesBought);
ImGui::Text("PLAYER_INFO_MISSIONS_CREATED"_T.data(), stats.MissionsCreated);
ImGui::Text("PLAYER_INFO_METLDOWN_COMPLETE"_T.data(), scr_globals::gpbd_fm_1.as<GPBD_FM*>()->Entries[id].MeltdownComplete ? "YES"_T.data() : "NO"_T.data()); // curious to see if anyone has actually played singleplayer
ImGui::Text("CEO Name: %s", boss_goon.GangName);
ImGui::Text("MC Name: %s", boss_goon.ClubhouseName);
ImGui::Text("Money In Wallet: %d", stats.WalletBalance);
ImGui::Text("Money In Bank: %d", stats.Money - stats.WalletBalance);
ImGui::Text("Total Money: %d", stats.Money);
ImGui::Text("Rank: %d (RP %d)", stats.Rank, stats.RP);
ImGui::Text("Health: %d (MaxHealth: %d)", ped_health, ped_maxhealth);
ImGui::Text("K/D Ratio: %f", stats.KdRatio);
ImGui::Text("Kills On Players: %d", stats.KillsOnPlayers);
ImGui::Text("Deaths By Players: %d", stats.DeathsByPlayers);
ImGui::Text("Prostitutes Frequented: %d", stats.ProstitutesFrequented);
ImGui::Text("Lap Dances Bought: %d", stats.LapDancesBought);
ImGui::Text("Missions Created: %d", stats.MissionsCreated);
ImGui::Text("Meltdown Complete: %s", scr_globals::gpbd_fm_1.as<GPBD_FM*>()->Entries[id].MeltdownComplete ? "Yes" : "No"); // curious to see if anyone has actually played singleplayer
ImGui::Separator();
}
if (ImGui::BeginCombo("Chat Command Permissions", COMMAND_ACCESS_LEVELS[g_player_service->get_selected()->command_access_level.value_or(g.session.chat_command_default_access_level)]))
if (ImGui::BeginCombo("CHAT_COMMAND_PERMISSIONS"_T.data(), COMMAND_ACCESS_LEVELS[g_player_service->get_selected()->command_access_level.value_or(g.session.chat_command_default_access_level)]))
{
for (const auto& [type, name] : COMMAND_ACCESS_LEVELS)
{
@ -182,7 +187,7 @@ namespace big
ImGui::EndCombo();
}
if (ImGui::Button("Add To Database"))
if (ImGui::Button("PLAYER_INFO_ADD_TO_DB"_T.data()))
{
g_player_database_service->get_or_create_player(g_player_service->get_selected());
}

View File

@ -6,7 +6,7 @@ namespace big
{
void view::player_kick()
{
if (ImGui::TreeNode("Kick"))
if (ImGui::TreeNode("KICK"_T.data()))
{
auto const is_session_host = [] { return gta_util::get_network()->m_game_session_ptr->is_host(); };

View File

@ -5,7 +5,7 @@ namespace big
{
void view::player_misc()
{
if (ImGui::TreeNode("Misc"))
if (ImGui::TreeNode("MISC"_T.data()))
{
components::player_command_button<"joinceo">(g_player_service->get_selected());
components::player_command_button<"enterint">(g_player_service->get_selected());
@ -20,9 +20,9 @@ namespace big
ImGui::SameLine();
components::player_command_button<"giveammo">(g_player_service->get_selected());
ImGui::Checkbox("Off The Radar", &g_player_service->get_selected()->off_radar);
ImGui::Checkbox("Never Wanted", &g_player_service->get_selected()->never_wanted);
ImGui::Checkbox("Semi Godmode", &g_player_service->get_selected()->semi_godmode);
ImGui::Checkbox("OFF_THE_RADAR"_T.data(), &g_player_service->get_selected()->off_radar);
ImGui::Checkbox("NEVER_WANTED"_T.data(), &g_player_service->get_selected()->never_wanted);
ImGui::Checkbox("SEMI_GODMODE"_T.data(), &g_player_service->get_selected()->semi_godmode);
components::button("Gooch Test", []
{

View File

@ -8,7 +8,7 @@ namespace big
{
void view::player_toxic()
{
if (ImGui::TreeNode("Toxic"))
if (ImGui::TreeNode("TOXIC"_T.data()))
{
components::player_command_button<"kill">(g_player_service->get_selected(), {});
ImGui::SameLine();
@ -39,11 +39,11 @@ namespace big
components::player_command_button<"fakeban">(g_player_service->get_selected(), {});
static int wanted_level;
ImGui::SliderInt("Wanted Level", &wanted_level, 0, 5);
ImGui::SliderInt("WANTED_LVL"_T.data(), &wanted_level, 0, 5);
ImGui::SameLine();
components::player_command_button<"wanted">(g_player_service->get_selected(), { (uint64_t)wanted_level }, "Set");
components::small_text("Teleports");
components::small_text("TELEPORTS"_T);
if (ImGui::BeginCombo("##apartment", apartment_names[g.session.send_to_apartment_idx]))
{
@ -89,13 +89,13 @@ namespace big
components::player_command_button<"warehousetp">(g_player_service->get_selected(), { (uint64_t)g.session.send_to_warehouse_idx });
components::button("TP To Darts", [] { toxic::start_activity(g_player_service->get_selected(), eActivityType::Darts); });
components::button("TP_TO_DARTS"_T, [] { toxic::start_activity(g_player_service->get_selected(), eActivityType::Darts); });
ImGui::SameLine();
components::button("TP To Flight School", [] { toxic::start_activity(g_player_service->get_selected(), eActivityType::PilotSchool); });
components::button("TP_TO_FLIGHT_SCHOOL"_T, [] { toxic::start_activity(g_player_service->get_selected(), eActivityType::PilotSchool); });
ImGui::SameLine();
components::button("TP To Map Center", [] { toxic::start_activity(g_player_service->get_selected(), eActivityType::ArmWresling); });
components::button("TP_TO_MAP_CENTER"_T, [] { toxic::start_activity(g_player_service->get_selected(), eActivityType::ArmWresling); });
components::button("TP To Skydive", [] { toxic::start_activity(g_player_service->get_selected(), eActivityType::Skydive); });
components::button("TP_TO_SKYDIVE"_T, [] { toxic::start_activity(g_player_service->get_selected(), eActivityType::Skydive); });
ImGui::SameLine();
components::player_command_button<"cayotp">(g_player_service->get_selected(), { });
ImGui::SameLine();
@ -142,33 +142,33 @@ namespace big
ImGui::SameLine();
components::player_command_button<"camhedz">(g_player_service->get_selected(), { });
components::small_text("Warp Time (requires session host)");
components::small_text("WARP_TIME"_T);
components::button("+1 Minute", [] { toxic::warp_time_forward(g_player_service->get_selected(), 60 * 1000); });
components::button("PLUS_1_MINUTE"_T, [] { toxic::warp_time_forward(g_player_service->get_selected(), 60 * 1000); });
ImGui::SameLine();
components::button("+5 Minutes", [] { toxic::warp_time_forward(g_player_service->get_selected(), 5 * 60 * 1000); });
components::button("PLUS_5_MINUTES"_T, [] { toxic::warp_time_forward(g_player_service->get_selected(), 5 * 60 * 1000); });
ImGui::SameLine();
components::button("+48 Minutes", [] { toxic::warp_time_forward(g_player_service->get_selected(), 48 * 60 * 1000); });
components::button("PLUS_48_MINUTES"_T, [] { toxic::warp_time_forward(g_player_service->get_selected(), 48 * 60 * 1000); });
ImGui::SameLine();
components::button("+96 Minutes", [] { toxic::warp_time_forward(g_player_service->get_selected(), 96 * 60 * 1000); });
components::button("PLUS_96_MINUTES"_T, [] { toxic::warp_time_forward(g_player_service->get_selected(), 96 * 60 * 1000); });
ImGui::SameLine();
components::button("+200 Minutes", [] { toxic::warp_time_forward(g_player_service->get_selected(), 200 * 60 * 1000); });
components::button("PLUS_200_MINUTES"_T, [] { toxic::warp_time_forward(g_player_service->get_selected(), 200 * 60 * 1000); });
ImGui::SameLine();
components::button("Stop Time", [] { toxic::set_time(g_player_service->get_selected(), INT_MAX - 3000); });
components::button("STOP_TIME"_T, [] { toxic::set_time(g_player_service->get_selected(), INT_MAX - 3000); });
if (ImGui::IsItemHovered())
ImGui::SetTooltip("This cannot be reversed. Use with caution");
ImGui::SetTooltip("PLAYER_TOXIC_NO_WAY_BACK"_T.data());
ImGui::Checkbox("Kill Loop", &g_player_service->get_selected()->kill_loop);
ImGui::Checkbox("KILL_LOOP"_T.data(), &g_player_service->get_selected()->kill_loop);
ImGui::SameLine();
ImGui::Checkbox("Explosion Loop", &g_player_service->get_selected()->explosion_loop);
ImGui::Checkbox("EXPLOSION_LOOP"_T.data(), &g_player_service->get_selected()->explosion_loop);
ImGui::SameLine();
ImGui::Checkbox("Freeze Loop", &g_player_service->get_selected()->freeze_loop);
ImGui::Checkbox("FREEZE_LOOP"_T.data(), &g_player_service->get_selected()->freeze_loop);
ImGui::Checkbox("Ragdoll Loop", &g_player_service->get_selected()->ragdoll_loop);
ImGui::Checkbox("RAGDOLL_LOOP"_T.data(), &g_player_service->get_selected()->ragdoll_loop);
ImGui::SameLine();
ImGui::Checkbox("Rotate Cam Loop", &g_player_service->get_selected()->rotate_cam_loop);
ImGui::Checkbox("ROT_CAM_LOOP"_T.data(), &g_player_service->get_selected()->rotate_cam_loop);
if (ImGui::IsItemHovered())
ImGui::SetTooltip("Also brings the player out of godmode if the event isn't blocked");
ImGui::SetTooltip("PLAYER_TOXIC_BRING_PLAYER_OUT_GOD"_T.data());
ImGui::TreePop();
}

View File

@ -7,7 +7,7 @@ namespace big
{
void view::player_troll()
{
if (ImGui::TreeNode("Troll"))
if (ImGui::TreeNode("TROLL"_T.data()))
{
components::player_command_button<"playertp">(g_player_service->get_selected());
ImGui::SameLine();
@ -18,11 +18,11 @@ namespace big
static int bounty_value = 0;
ImGui::SliderInt("Bounty", &bounty_value, 0, 10000);
ImGui::SliderInt("BOUNTY"_T.data(), &bounty_value, 0, 10000);
ImGui::SameLine();
components::command_checkbox<"anonbounty">();
ImGui::SameLine();
components::button("Set", [] { troll::set_bounty_on_player(g_player_service->get_selected(), bounty_value, g.session.anonymous_bounty);});
components::button("SET"_T, [] { troll::set_bounty_on_player(g_player_service->get_selected(), bounty_value, g.session.anonymous_bounty);});
ImGui::TreePop();
}

View File

@ -2,12 +2,10 @@
namespace big
{
void view::view_player() {
std::string title = std::format("Player Options: {}", g_player_service->get_selected()->get_name());
ImGui::Text(title.c_str());
ImGui::Checkbox("Spectate", &g.player.spectating);
void view::view_player()
{
ImGui::Text("VIEW_PLAYER_PLAYER_OPTIONS"_T.data(), g_player_service->get_selected()->get_name());
ImGui::Checkbox("SPECTATE"_T.data(), &g.player.spectating);
if (g_player_service->get_selected()->is_valid())
{

View File

@ -8,39 +8,39 @@ namespace big
void view::mobile() {
ImGui::SetWindowSize({ 0.f, (float)*g_pointers->m_resolution_y }, ImGuiCond_Always);
components::sub_title("Merryweather");
components::sub_title("MERRYWEATHER"_T);
ImGui::Separator();
components::button("Request Ammo Drop", [] {
components::button("MW_AMMO_DROP"_T, [] {
mobile::merry_weather::request_ammo_drop();
});
components::button("Helicopter Pickup", [] {
components::button("MW_HELI_PICKUP"_T, [] {
mobile::merry_weather::request_helicopter_pickup();
});
components::button("Request Backup Helicopter", [] {
components::button("MW_BACKUP_HELI"_T, [] {
mobile::merry_weather::request_backup_helicopter();
});
components::button("Request Airstrike", [] {
components::button("MW_AIRSTRIKE"_T, [] {
mobile::merry_weather::request_airstrike();
});
components::sub_title("Mors Mutual");
components::sub_title("MORS_MUTUAL"_T);
ImGui::Separator();
components::button("Mors Mutual Fix All Vehicles", [] {
components::button("MORS_FIX_ALL"_T, [] {
int amount_fixed = mobile::mors_mutual::fix_all();
g_notification_service->push("Mobile",
std::format("{} vehicle{} been fixed.", amount_fixed, amount_fixed == 1 ? " has" : "s have")
g_notification_service->push("MOBILE"_T.data(),
std::vformat("VEHICLE_FIX_AMOUNT"_T, std::make_format_args(amount_fixed, amount_fixed == 1 ? "VEHICLE_FIX_HAS"_T.data() : "VEHICLE_FIX_HAVE"_T.data()))
);
});
components::sub_title("CEO Abilities");
components::sub_title("CEO_ABILITIES"_T);
ImGui::Separator();
components::button("Bullshark Testosterone", [] {
components::button("CEO_BULLSHARK"_T, [] {
mobile::ceo_abilities::request_bullshark_testosterone();
});

View File

@ -21,7 +21,7 @@ namespace big
ImGui::Separator();
components::sub_title("General");
components::sub_title("GENERAL"_T);
ImGui::BeginGroup();
@ -39,7 +39,7 @@ namespace big
components::command_checkbox<"noclip">();
components::command_checkbox<"noragdoll">();
components::command_checkbox<"fastrun">();
ImGui::Checkbox("No Idle Kick", &g.tunables.no_idle_kick);
ImGui::Checkbox("NO_IDLE_KICK"_T.data(), &g.tunables.no_idle_kick);
components::command_checkbox<"walkunder">();
if(!g.self.super_jump)
components::command_checkbox<"beastjump">();
@ -56,15 +56,15 @@ namespace big
components::command_checkbox<"nocollision">();
components::command_checkbox<"mobileradio">();
ImGui::Checkbox("Dance Mode", &g.self.dance_mode);
ImGui::Checkbox("DANCE_MODE"_T.data(), &g.self.dance_mode);
ImGui::EndGroup();
ImGui::Separator();
components::sub_title("Proofs");
components::sub_title("PROOFS"_T);
if (ImGui::Button("Check all"))
if (ImGui::Button("CHECK_ALL"_T.data()))
{
g.self.proof_bullet = true;
g.self.proof_fire = true;
@ -78,7 +78,7 @@ namespace big
ImGui::SameLine();
if (ImGui::Button("Uncheck all"))
if (ImGui::Button("UNCHECK_ALL"_T.data()))
{
g.self.proof_bullet = false;
g.self.proof_fire = false;
@ -92,42 +92,42 @@ namespace big
ImGui::BeginGroup();
ImGui::Checkbox("Bullet", &g.self.proof_bullet);
ImGui::Checkbox("Fire", &g.self.proof_fire);
ImGui::Checkbox("BULLET"_T.data(), &g.self.proof_bullet);
ImGui::Checkbox("FIRE"_T.data(), &g.self.proof_fire);
ImGui::EndGroup();
ImGui::SameLine();
ImGui::BeginGroup();
ImGui::Checkbox("Collision", &g.self.proof_collision);
ImGui::Checkbox("Melee", &g.self.proof_melee);
ImGui::Checkbox("COLLISION"_T.data(), &g.self.proof_collision);
ImGui::Checkbox("MELEE"_T.data(), &g.self.proof_melee);
ImGui::EndGroup();
ImGui::SameLine();
ImGui::BeginGroup();
ImGui::Checkbox("Explosion", &g.self.proof_explosion);
ImGui::Checkbox("Steam", &g.self.proof_steam);
ImGui::Checkbox("EXPLOSION"_T.data(), &g.self.proof_explosion);
ImGui::Checkbox("STEAM"_T.data(), &g.self.proof_steam);
ImGui::EndGroup();
ImGui::SameLine();
ImGui::BeginGroup();
ImGui::Checkbox("Drown", &g.self.proof_drown);
ImGui::Checkbox("Water", &g.self.proof_water);
ImGui::Checkbox("DROWN"_T.data(), &g.self.proof_drown);
ImGui::Checkbox("WATER"_T.data(), &g.self.proof_water);
ImGui::EndGroup();
ImGui::Separator();
components::sub_title("Police");
components::sub_title("POLICE"_T);
ImGui::Checkbox("Never Wanted", &g.self.never_wanted);
ImGui::Checkbox("NEVER_WANTED"_T.data(), &g.self.never_wanted);
if (!g.self.never_wanted)
{
ImGui::Checkbox("Force Wanted Level", &g.self.force_wanted_level);
ImGui::Text("Wanted Level");
ImGui::Checkbox("FORCE_WANTED_LVL"_T.data(), &g.self.force_wanted_level);
ImGui::Text("WANTED_LVL"_T.data());
if (
ImGui::SliderInt("###wanted_level", &g.self.wanted_level, 0, 5) &&
!g.self.force_wanted_level &&
@ -139,31 +139,31 @@ namespace big
ImGui::Separator();
components::sub_title("HUD");
components::sub_title("HUD"_T);
ImGui::BeginGroup();
ImGui::Checkbox("Hide Radar", &g.self.hide_radar);
ImGui::Checkbox("HIDE_RADAR"_T.data(), &g.self.hide_radar);
ImGui::SameLine();
ImGui::Checkbox("Hide Ammo", &g.self.hide_ammo);
ImGui::Checkbox("HIDE_AMMO"_T.data(), &g.self.hide_ammo);
ImGui::SameLine();
ImGui::Checkbox("Force show HUD", &g.self.force_show_hud);
ImGui::Checkbox("FORCE_SHOW_HUD"_T.data(), &g.self.force_show_hud);
ImGui::Combo("##hud_comp_combo", &g.self.selected_hud_component, hud_component_names, (int)HudComponents::HUD_WEAPONS);
ImGui::SameLine();
components::button("Hide", [] {
components::button("HIDE"_T, [] {
g.self.hud_components_states[g.self.selected_hud_component] = true;
});
ImGui::SameLine();
components::button("Show", [] {
components::button("SHOW"_T, [] {
g.self.hud_components_states[g.self.selected_hud_component] = false;
});
components::button("Hide all", [] {
components::button("HIDE_ALL"_T, [] {
g.self.hide_radar = true;
g.self.hide_ammo = true;
for (int i = 0; i < (int)HudComponents::HUD_WEAPONS; i++)
@ -172,7 +172,7 @@ namespace big
}
});
ImGui::SameLine();
components::button("Show all", [] {
components::button("SHOW_ALL"_T, [] {
g.self.hide_radar = false;
g.self.hide_ammo = false;
for (int i = 0; i < (int)HudComponents::HUD_WEAPONS; i++)
@ -181,9 +181,9 @@ namespace big
}
});
ImGui::SameLine();
ImGui::Checkbox("Force show HUD element", &g.self.force_show_hud_element);
ImGui::Checkbox("FORCE_SHOW_HUD_ELEMENT"_T.data(), &g.self.force_show_hud_element);
if (ImGui::IsItemHovered())
ImGui::SetTooltip("To force show a HUD specific element, click Hide all then click Show on the desired element.");
ImGui::SetTooltip("FORCE_SHOW_HUD_ELEMENT_DESC"_T.data());
ImGui::EndGroup();

View File

@ -9,14 +9,14 @@ namespace big
{
void view::teleport()
{
ImGui::Text("Blips:");
ImGui::Text("BLIPS"_T.data());
components::command_button<"waypointtp">({}, "Waypoint");
ImGui::SameLine();
components::command_button<"objectivetp">({}, "Objective");
components::command_checkbox<"autotptowp">();
ImGui::Text("Vehicles:");
ImGui::Text("VEHICLES"_T.data());
components::command_button<"lastvehtp">();
ImGui::SameLine();
components::command_button<"bringpv">();

View File

@ -11,7 +11,7 @@
namespace big
{
void view::weapons() {
components::sub_title("Ammo");
components::sub_title("AMMO"_T);
ImGui::BeginGroup();
@ -22,7 +22,7 @@ namespace big
ImGui::SameLine();
ImGui::BeginGroup();
if (ImGui::Checkbox("Bypass C4 Limit", &g.weapons.bypass_c4_limit))
if (ImGui::Checkbox("BYPASS_C4_LIM"_T.data(), &g.weapons.bypass_c4_limit))
{
if (g.weapons.bypass_c4_limit)
g_pointers->m_bypass_max_count_of_active_sticky_bombs->apply();
@ -35,12 +35,12 @@ namespace big
ImGui::Separator();
ImGui::Checkbox("Enable Special Ammo", &g.weapons.ammo_special.toggle);
ImGui::Checkbox("ENABLE_SPECIAL_AMMO"_T.data(), &g.weapons.ammo_special.toggle);
eAmmoSpecialType selected_ammo = g.weapons.ammo_special.type;
eExplosionTag selected_explosion = g.weapons.ammo_special.explosion_tag;
if (ImGui::BeginCombo("Special Ammo", SPECIAL_AMMOS[(int)selected_ammo].name))
if (ImGui::BeginCombo("SPECIAL_AMMO"_T.data(), SPECIAL_AMMOS[(int)selected_ammo].name))
{
for (const auto& special_ammo : SPECIAL_AMMOS)
{
@ -58,7 +58,7 @@ namespace big
ImGui::EndCombo();
}
if (ImGui::BeginCombo("Bullet Impact", BULLET_IMPACTS[selected_explosion]))
if (ImGui::BeginCombo("BULLET_IMPACT"_T.data(), BULLET_IMPACTS[selected_explosion]))
{
for (const auto& [type, name] : BULLET_IMPACTS)
{
@ -78,7 +78,7 @@ namespace big
ImGui::Separator();
components::sub_title("Misc");
components::sub_title("MISC"_T);
components::command_checkbox<"crosshairs">();
ImGui::SameLine();
@ -86,7 +86,7 @@ namespace big
ImGui::SameLine();
components::command_checkbox<"nospread">();
components::button("Get All Weapons", []
components::button("GET_ALL_WEAPONS"_T, []
{
for (const auto& [_, weapon] : g_gta_data_service->weapons())
{
@ -97,7 +97,7 @@ namespace big
WEAPON::GIVE_DELAYED_WEAPON_TO_PED(self::ped, parachute_hash, 0, true);
});
ImGui::SameLine();
components::button("Remove Current Weapon", []
components::button("REMOVE_CUR_WEAPON"_T, []
{
Hash weaponHash;
WEAPON::GET_CURRENT_PED_WEAPON(self::ped, &weaponHash, 1);
@ -107,15 +107,15 @@ namespace big
}
});
ImGui::SliderFloat("Damage Multiplier", &g.weapons.increased_damage, 1.f, 10.f, "%.1f");
ImGui::SliderFloat("DMG_MULTIPLR"_T.data(), &g.weapons.increased_damage, 1.f, 10.f, "%.1f");
ImGui::Separator();
components::sub_title("Custom Weapons");
components::sub_title("CUSTOM_WEAPONS"_T);
CustomWeapon selected = g.weapons.custom_weapon;
if (ImGui::BeginCombo("Weapon", custom_weapons[(int)selected].name))
if (ImGui::BeginCombo("WEAPON"_T.data(), custom_weapons[(int)selected].name))
{
for (const custom_weapon& weapon : custom_weapons)
{
@ -142,7 +142,7 @@ namespace big
// this some ugly ass looking code
static char vehicle_gun[12];
std::memcpy(vehicle_gun, g.weapons.vehicle_gun_model.c_str(), 12);
if (ImGui::InputTextWithHint("Shooting Model", "Name of the vehicle model", vehicle_gun, sizeof(vehicle_gun)))
if (ImGui::InputTextWithHint("SHOOTING_MODEL"_T.data(), "NAME_VEHICLE_MODEL"_T.data(), vehicle_gun, sizeof(vehicle_gun)))
{
g.weapons.vehicle_gun_model = vehicle_gun;
}

View File

@ -5,32 +5,32 @@ namespace big
{
void view::context_menu_settings()
{
ImGui::Checkbox("Context Menu Enabled", &g.context_menu.enabled);
ImGui::Checkbox("SETTINGS_CONTEXT_MENU"_T.data(), &g.context_menu.enabled);
if (g.context_menu.enabled)
{
ImGui::Text("Allowed Entity Types:");
ImGui::CheckboxFlags("Object", reinterpret_cast<int*>(&g.context_menu.allowed_entity_types), static_cast<int>(ContextEntityType::OBJECT));
ImGui::Text("SETTINGS_CONTEXT_MENU_ENTITY_TYPES"_T.data());
ImGui::CheckboxFlags("SETTINGS_CONTEXT_MENU_ENTITY_TYPE_OBJECT"_T.data(), reinterpret_cast<int*>(&g.context_menu.allowed_entity_types), static_cast<int>(ContextEntityType::OBJECT));
ImGui::SameLine();
ImGui::CheckboxFlags("Ped", reinterpret_cast<int*>(&g.context_menu.allowed_entity_types), static_cast<int>(ContextEntityType::PED));
ImGui::CheckboxFlags("SETTINGS_CONTEXT_MENU_ENTITY_TYPE_PED"_T.data(), reinterpret_cast<int*>(&g.context_menu.allowed_entity_types), static_cast<int>(ContextEntityType::PED));
ImGui::SameLine();
ImGui::CheckboxFlags("Player", reinterpret_cast<int*>(&g.context_menu.allowed_entity_types), static_cast<int>(ContextEntityType::PLAYER));
ImGui::CheckboxFlags("SETTINGS_CONTEXT_MENU_ENTITY_TYPE_PLAYER"_T.data(), reinterpret_cast<int*>(&g.context_menu.allowed_entity_types), static_cast<int>(ContextEntityType::PLAYER));
ImGui::SameLine();
ImGui::CheckboxFlags("Vehicle", reinterpret_cast<int*>(&g.context_menu.allowed_entity_types), static_cast<int>(ContextEntityType::VEHICLE));
ImGui::CheckboxFlags("SETTINGS_CONTEXT_MENU_ENTITY_TYPE_VEHICLE"_T.data(), reinterpret_cast<int*>(&g.context_menu.allowed_entity_types), static_cast<int>(ContextEntityType::VEHICLE));
static ImVec4 selected_option_color = ImGui::ColorConvertU32ToFloat4(g.context_menu.selected_option_color);
ImGui::Text("Selected Option Color:");
ImGui::Text("SETTINGS_CONTEXT_MENU_COLOR"_T.data());
if (ImGui::ColorEdit4("###BSelected Option Color##cm_picker", (float*)&selected_option_color, ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_NoSidePreview))
{
g.context_menu.selected_option_color = ImGui::ColorConvertFloat4ToU32(selected_option_color);
}
ImGui::Checkbox("Bounding Box Enabled", &g.context_menu.bounding_box_enabled);
ImGui::Checkbox("SETTINGS_CONTEXT_MENU_BOUNDING_BOX"_T.data(), &g.context_menu.bounding_box_enabled);
if (g.context_menu.bounding_box_enabled)
{
static ImVec4 bounding_box_color = ImGui::ColorConvertU32ToFloat4(g.context_menu.bounding_box_color);
ImGui::Text("Bounding Box Color:");
ImGui::Text("SETTINGS_CONTEXT_MENU_BOUNDING_BOX_COLOR"_T.data());
if (ImGui::ColorEdit4("###Bounding Box Color##cm_picker", (float*)&bounding_box_color, ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_NoSidePreview))
{
g.context_menu.bounding_box_color = ImGui::ColorConvertFloat4ToU32(bounding_box_color);

View File

@ -4,73 +4,73 @@ namespace big
{
void view::esp_settings()
{
ImGui::Checkbox("ESP Enabled", &g.esp.enabled);
ImGui::Checkbox("SETTINGS_ESP"_T.data(), &g.esp.enabled);
if (g.esp.enabled)
{
ImGui::Checkbox("Hide Self", &g.esp.hide_self);
ImGui::Checkbox("SETTINGS_ESP_HIDE_SELF"_T.data(), &g.esp.hide_self);
ImGui::Text("Global Render Distance (min, max)");
ImGui::Text("SETTINGS_ESP_GLOBAL_RENDER_DISTANCE"_T.data());
ImGui::SliderFloat2("###Global Render Distance", g.esp.global_render_distance, 0.f, 1500.f);
ImGui::Checkbox("Tracer", &g.esp.tracer);
ImGui::Checkbox("SETTINGS_ESP_TRACER"_T.data(), &g.esp.tracer);
if (g.esp.tracer) {
ImGui::Text("Tracer Draw Position (x, y)");
ImGui::Text("SETTINGS_ESP_TRACER_POSITION"_T.data());
ImGui::SliderFloat2("###Draw Position", g.esp.tracer_draw_position, 0.f, 1.f);
ImGui::Text("Tracer Render Distance (min, max)");
ImGui::Text("SETTINGS_ESP_TRACER_RENDER_DISTANCE"_T.data());
ImGui::SliderFloat2("###Tracer Render Distance", g.esp.tracer_render_distance, g.esp.global_render_distance[0], g.esp.global_render_distance[1]);
}
ImGui::Checkbox("Box ESP", &g.esp.box);
ImGui::Checkbox("SETTINGS_ESP_BOX"_T.data(), &g.esp.box);
if (g.esp.box) {
ImGui::Text("Box Render Distance (min, max)");
ImGui::Text("SETTINGS_ESP_BOX_RENDER_DISTANCE"_T.data());
ImGui::SliderFloat2("###Box Render Distance", g.esp.box_render_distance, g.esp.global_render_distance[0], g.esp.global_render_distance[1]);
}
ImGui::Checkbox("Show Player Name", &g.esp.name);
ImGui::Checkbox("Show Player Distance", &g.esp.distance);
ImGui::Checkbox("Show Player Godmode", &g.esp.god);
ImGui::Checkbox("Show Player Health", &g.esp.health);
ImGui::Checkbox("Show Player Armor", &g.esp.armor);
ImGui::Checkbox("SETTINGS_ESP_PLAYER_NAME"_T.data(), &g.esp.name);
ImGui::Checkbox("SETTINGS_ESP_PLAYER_DISTANCE"_T.data(), &g.esp.distance);
ImGui::Checkbox("SETTINGS_ESP_PLAYER_GOD_MODE"_T.data(), &g.esp.god);
ImGui::Checkbox("SETTINGS_ESP_PLAYER_HEALTH"_T.data(), &g.esp.health);
ImGui::Checkbox("SETTINGS_ESP_PLAYER_ARMOR"_T.data(), &g.esp.armor);
ImGui::Checkbox("Should ESP Color Change with Distance", &g.esp.change_esp_color_from_dist);
ImGui::Checkbox("SETTINGS_ESP_COLOR_W_DISTANCE"_T.data(), &g.esp.change_esp_color_from_dist);
if (g.esp.health)
ImGui::Checkbox("Should Healthbar Scale with Distance", &g.esp.scale_health_from_dist);
ImGui::Checkbox("SETTINGS_ESP_SCALE_HEALTH"_T.data(), &g.esp.scale_health_from_dist);
if (g.esp.armor)
ImGui::Checkbox("Should Armorbar Scale with Distance", &g.esp.scale_armor_from_dist);
ImGui::Checkbox("SETTINGS_ESP_SCALE_ARMOR"_T.data(), &g.esp.scale_armor_from_dist);
static ImVec4 col_enemy = ImGui::ColorConvertU32ToFloat4(g.esp.enemy_color);
static ImVec4 col_enemy_near = ImGui::ColorConvertU32ToFloat4(g.esp.enemy_near_color);
static ImVec4 col_default = ImGui::ColorConvertU32ToFloat4(g.esp.default_color);
static ImVec4 col_friend = ImGui::ColorConvertU32ToFloat4(g.esp.friend_color);
ImGui::Text("Distance threshold (min, max)");
ImGui::Text("SETTINGS_ESP_DISTANCE_THRESHOLD"_T.data());
ImGui::SliderFloat2("###Distance threshold", g.esp.distance_threshold, g.esp.global_render_distance[0], g.esp.global_render_distance[1]);
if (ImGui::TreeNode("ESP Colors (RGBA)"))
if (ImGui::TreeNode("SETTINGS_ESP_COLORS"_T.data()))
{
if (g.esp.change_esp_color_from_dist) {
ImGui::Text("Enemy Close Color:");
ImGui::Text("SETTINGS_ESP_ENEMY_CLOSE_COLOR"_T.data());
if (ImGui::ColorEdit4("###Enemy ESP Color##esp_picker", (float*)&col_enemy, ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_NoSidePreview))
{
g.esp.enemy_color = ImGui::ColorConvertFloat4ToU32(col_enemy);
}
ImGui::Text("Enemy Near Color:");
ImGui::Text("SETTINGS_ESP_ENEMY_NEAR_COLOR"_T.data());
if (ImGui::ColorEdit4("###Enemy Near ESP Color##esp_picker", (float*)&col_enemy_near, ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_NoSidePreview))
{
g.esp.enemy_near_color = ImGui::ColorConvertFloat4ToU32(col_enemy_near);
}
}
ImGui::Text("Default Color:");
ImGui::Text("SETTINGS_ESP_ENEMY_DEFAULT_COLOR"_T.data());
if (ImGui::ColorEdit4("###Default ESP Color##esp_picker", (float*)&col_default, ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_NoSidePreview))
{
g.esp.default_color = ImGui::ColorConvertFloat4ToU32(col_default);
}
ImGui::Text("Friendly Color:");
ImGui::Text("SETTINGS_ESP_FRIENDLY_COLOR"_T.data());
if (ImGui::ColorEdit4("###Friend ESP Color##friend_picker", (float*)&col_friend, ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_NoSidePreview))
{
g.esp.friend_color = ImGui::ColorConvertFloat4ToU32(col_friend);

View File

@ -5,17 +5,17 @@ namespace big
{
void view::gui_settings()
{
components::sub_title("UI Scale");
components::sub_title("SETTINGS_UI_SCALE"_T);
ImGui::SliderFloat("##gui-scale", &g.window.gui_scale, 1.f, 1.5f, "%.2f");
ImGui::SameLine();
if (ImGui::Button("Apply##gui-scale"))
if (ImGui::Button("APPLY"_T.data()))
g_renderer->rescale(g.window.gui_scale);
if (ImGui::IsItemHovered())
ImGui::SetTooltip("Changing the UI scale may break rendering and require you to unload and inject YimMenu again.");
ImGui::SetTooltip("SETTINGS_UI_SCALE_DESCRIPTION"_T.data());
components::sub_title("Colors");
components::sub_title("SETTINGS_UI_COLOR"_T);
static ImVec4 col_gui = ImGui::ColorConvertU32ToFloat4(g.window.color);
if (ImGui::ColorEdit4("Gui Color##gui_picker", (float*)&col_gui, ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_NoSidePreview))
if (ImGui::ColorEdit4("SETTINGS_UI_COLOR_PICKER"_T.data(), (float*)&col_gui, ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_NoSidePreview))
{
g.window.color = ImGui::ColorConvertFloat4ToU32(col_gui);
}

View File

@ -5,46 +5,46 @@ namespace big
void view::protection_settings()
{
ImGui::BeginGroup();
ImGui::Checkbox("Bounty", &g.protections.script_events.bounty);
ImGui::Checkbox("CEO Money", &g.protections.script_events.ceo_money);
ImGui::Checkbox("Fake Deposit", &g.protections.script_events.fake_deposit);
ImGui::Checkbox("Force Mission", &g.protections.script_events.force_mission);
ImGui::Checkbox("Force Teleport", &g.protections.script_events.force_teleport);
ImGui::Checkbox("GTA Banner", &g.protections.script_events.gta_banner);
ImGui::Checkbox("MC Teleport", &g.protections.script_events.mc_teleport);
ImGui::Checkbox("BOUNTY"_T.data(), &g.protections.script_events.bounty);
ImGui::Checkbox("CEO_MONEY"_T.data(), &g.protections.script_events.ceo_money);
ImGui::Checkbox("FAKE_DEPOSIT"_T.data(), &g.protections.script_events.fake_deposit);
ImGui::Checkbox("FORCE_MISSION"_T.data(), &g.protections.script_events.force_mission);
ImGui::Checkbox("FORCE_TELEPORT"_T.data(), &g.protections.script_events.force_teleport);
ImGui::Checkbox("GTA_BANNER"_T.data(), &g.protections.script_events.gta_banner);
ImGui::Checkbox("MC_TELEPORT"_T.data(), &g.protections.script_events.mc_teleport);
ImGui::EndGroup();
ImGui::SameLine();
ImGui::BeginGroup();
ImGui::Checkbox("Send to Cutscene", &g.protections.script_events.send_to_cutscene);
ImGui::Checkbox("Send to Location", &g.protections.script_events.send_to_location);
ImGui::Checkbox("Sound Spam", &g.protections.script_events.sound_spam);
ImGui::Checkbox("Personal Vehicle Destroyed", &g.protections.script_events.personal_vehicle_destroyed);
ImGui::Checkbox("Remote Off Radar", &g.protections.script_events.remote_off_radar);
ImGui::Checkbox("Rotate Cam", &g.protections.script_events.rotate_cam);
ImGui::Checkbox("Teleport To Warehouse", &g.protections.script_events.teleport_to_warehouse);
ImGui::Checkbox("SEND_TO_CUTSCENE"_T.data(), &g.protections.script_events.send_to_cutscene);
ImGui::Checkbox("SEND_TO_LOCATION"_T.data(), &g.protections.script_events.send_to_location);
ImGui::Checkbox("SOUND_SPAM"_T.data(), &g.protections.script_events.sound_spam);
ImGui::Checkbox("PERSONAL_VEHICLE_DESTROYED"_T.data(), &g.protections.script_events.personal_vehicle_destroyed);
ImGui::Checkbox("REMOTE_OFF_RADAR"_T.data(), &g.protections.script_events.remote_off_radar);
ImGui::Checkbox("ROTATE_CAM"_T.data(), &g.protections.script_events.rotate_cam);
ImGui::Checkbox("TELEPORT_TO_WAREHOUSE"_T.data(), &g.protections.script_events.teleport_to_warehouse);
ImGui::EndGroup();
ImGui::SameLine();
ImGui::BeginGroup();
ImGui::Checkbox("Start Activity", &g.protections.script_events.start_activity);
ImGui::Checkbox("Send SMS", &g.protections.script_events.send_sms);
ImGui::Checkbox("Spectate", &g.protections.script_events.spectate);
ImGui::Checkbox("Vehicle Kick", &g.protections.script_events.vehicle_kick);
ImGui::Checkbox("Wanted Level", &g.protections.script_events.clear_wanted_level);
ImGui::Checkbox("Desync Kick", &g.protections.desync_kick);
ImGui::Checkbox("START_ACTIVITY"_T.data(), &g.protections.script_events.start_activity);
ImGui::Checkbox("SEND_SMS"_T.data(), &g.protections.script_events.send_sms);
ImGui::Checkbox("SPECTATE"_T.data(), &g.protections.script_events.spectate);
ImGui::Checkbox("VEHICLE_KICK"_T.data(), &g.protections.script_events.vehicle_kick);
ImGui::Checkbox("WANTED_LEVEL"_T.data(), &g.protections.script_events.clear_wanted_level);
ImGui::Checkbox("DESYNC_KICK"_T.data(), &g.protections.desync_kick);
ImGui::EndGroup();
ImGui::SameLine();
ImGui::BeginGroup();
ImGui::Checkbox("RID Join", &g.protections.rid_join);
ImGui::Checkbox("BLOCK_RID_JOINING"_T.data(), &g.protections.rid_join);
if (ImGui::IsItemHovered())
ImGui::SetTooltip("This will block anyone trying to join, kick or crash you with your Rockstar ID, including your friends");
ImGui::Checkbox("Lessen Breakup Kicks As Host", &g.protections.lessen_breakups);
ImGui::SetTooltip("BLOCK_RID_JOINING_DESCRIPTION"_T.data());
ImGui::Checkbox("LESSEN_BREAKUP_KICK"_T.data(), &g.protections.lessen_breakups);
if (ImGui::IsItemHovered())
ImGui::SetTooltip("Attacker must join after you have become host for this to work. There are anti-cheat concerns with this feature");
ImGui::SetTooltip("LESSEN_BREAKUP_KICK_DESCRIPTION"_T.data());
ImGui::EndGroup();
}

View File

@ -4,11 +4,11 @@ namespace big
{
void draw_pair_option(const std::string_view name, decltype(g.notifications.gta_thread_kill)& option)
{
ImGui::Text("%s", name.data());
ImGui::Text(name.data());
ImGui::PushID(name.data());
ImGui::Checkbox("Log", &option.log);
ImGui::Checkbox("Notify", &option.notify);
ImGui::Checkbox("LOG"_T.data(), &option.log);
ImGui::Checkbox("NOTIFY"_T.data(), &option.notify);
ImGui::PopID();
}
@ -16,13 +16,13 @@ namespace big
{
if (ImGui::TreeNode(reaction.m_event_name))
{
ImGui::Checkbox("Announce In Chat", &reaction.announce_in_chat);
ImGui::Checkbox("Notify", &reaction.notify);
ImGui::Checkbox("Log", &reaction.log);
ImGui::Checkbox("Add Player To Database", &reaction.add_to_player_db);
ImGui::Checkbox("REACTION_CHAT"_T.data(), &reaction.announce_in_chat);
ImGui::Checkbox("NOTIFY"_T.data(), &reaction.notify);
ImGui::Checkbox("LOG"_T.data(), &reaction.log);
ImGui::Checkbox("REACTION_ADD_TO_DATABASE"_T.data(), &reaction.add_to_player_db);
if (reaction.add_to_player_db)
ImGui::Checkbox("Block Joins", &reaction.block_joins);
ImGui::Checkbox("Kick Player", &reaction.kick);
ImGui::Checkbox("REACTION_BLOCK_JOINS"_T.data(), &reaction.block_joins);
ImGui::Checkbox("REACTION_KICK_PLAYER"_T.data(), &reaction.kick);
ImGui::TreePop();
}
}
@ -32,22 +32,22 @@ namespace big
{
if (ImGui::TreeNode(reaction.m_event_name))
{
ImGui::Checkbox("Announce In Chat", &reaction.announce_in_chat);
ImGui::Checkbox("Notify", &reaction.notify);
ImGui::Checkbox("Log", &reaction.log);
ImGui::Checkbox("Add Attacker To Database", &reaction.add_to_player_db);
ImGui::Checkbox("REACTION_CHAT"_T.data(), &reaction.announce_in_chat);
ImGui::Checkbox("NOTIFY"_T.data(), &reaction.notify);
ImGui::Checkbox("LOG"_T.data(), &reaction.log);
ImGui::Checkbox("REACTION_ADD_TO_DATABASE"_T.data(), &reaction.add_to_player_db);
if (reaction.add_to_player_db)
ImGui::Checkbox("Block Joins", &reaction.block_joins);
ImGui::Checkbox("Kick Attacker", &reaction.kick);
ImGui::Checkbox("REACTION_BLOCK_JOINS"_T.data(), &reaction.block_joins);
ImGui::Checkbox("REACTION_KICK_ATTACKER"_T.data(), &reaction.kick);
if (reaction.m_blockable || reaction.m_karmaable)
ImGui::Separator();
if (reaction.m_blockable)
ImGui::Checkbox("Block", &reaction.block);
ImGui::Checkbox("BLOCK"_T.data(), &reaction.block);
if (reaction.m_karmaable)
ImGui::Checkbox("Karma", &reaction.karma);
ImGui::Checkbox("KARMA"_T.data(), &reaction.karma);
ImGui::TreePop();
}
@ -55,7 +55,7 @@ namespace big
void view::reaction_settings()
{
components::title("Reactions");
components::title("SETTINGS_REACTIONS"_T);
draw_reaction(g.reactions.bounty);
draw_reaction(g.reactions.ceo_kick);
draw_reaction(g.reactions.ceo_money);
@ -104,31 +104,31 @@ namespace big
draw_interloper_reaction(g.reactions.lost_connection_kick_others);
draw_interloper_reaction(g.reactions.breakup_others);
components::title("Notifications");
components::sub_title("GTA Threads");
components::title("SETTINGS_NOTIFICATIONS"_T);
components::sub_title("SETTINGS_NOTIFY_GTA_THREADS"_T);
draw_pair_option("Terminate", g.notifications.gta_thread_kill);
draw_pair_option("Start", g.notifications.gta_thread_start);
draw_pair_option("SETTINGS_NOTIFY_GTA_THREADS_TERMINATE"_T, g.notifications.gta_thread_kill);
draw_pair_option("SETTINGS_NOTIFY_GTA_THREADS_START"_T, g.notifications.gta_thread_start);
components::sub_title("Network Player Manager");
components::sub_title("SETTINGS_NOTIFY_PLAYER_MGR"_T);
ImGui::Text("Player Join");
ImGui::Text("SETTINGS_NOTIFY_PLAYER_JOIN"_T.data());
ImGui::Checkbox("Above Map", &g.notifications.player_join.above_map);
ImGui::Checkbox("Log", &g.notifications.player_join.log);
ImGui::Checkbox("Notify", &g.notifications.player_join.notify);
ImGui::Checkbox("SETTINGS_NOTIFY_PLAYER_JOIN_ABOVE_MAP"_T.data(), &g.notifications.player_join.above_map);
ImGui::Checkbox("LOG"_T.data(), &g.notifications.player_join.log);
ImGui::Checkbox("NOTIFY"_T.data(), &g.notifications.player_join.notify);
draw_pair_option("Player Leave", g.notifications.player_leave);
draw_pair_option("SETTINGS_NOTIFY_PLAYER_LEAVE"_T, g.notifications.player_leave);
draw_pair_option("Init", g.notifications.network_player_mgr_init);
draw_pair_option("Shutdown", g.notifications.network_player_mgr_shutdown);
draw_pair_option("SETTINGS_NOTIFY_PLAYER_MGR_INIT"_T, g.notifications.network_player_mgr_init);
draw_pair_option("SETTINGS_NOTIFY_PLAYER_MGR_SHUTDOWN"_T, g.notifications.network_player_mgr_shutdown);
components::sub_title("Other");
components::sub_title("SETTINGS_NOTIFY_OTHER"_T);
draw_pair_option("Transaction Error / Rate Limit", g.notifications.transaction_rate_limit);
draw_pair_option("Mismatch sync type", g.notifications.mismatch_sync_type);
draw_pair_option("Out of allowed range sync type", g.notifications.out_of_allowed_range_sync_type);
draw_pair_option("Invalid sync", g.notifications.invalid_sync);
draw_pair_option("SETTINGS_NOTIFY_TRANSACTION_RATE_LIMIT"_T, g.notifications.transaction_rate_limit);
draw_pair_option("SETTINGS_NOTIFY_MISMATCH_SYNC_TYPE"_T, g.notifications.mismatch_sync_type);
draw_pair_option("SETTINGS_NOTIFY_OUT_OF_ALLOWED_RANGE_SYNC_TYPE"_T, g.notifications.out_of_allowed_range_sync_type);
draw_pair_option("SETTINGS_NOTIFY_INVALID_SYNC"_T, g.notifications.invalid_sync);
}
}

View File

@ -1,44 +1,10 @@
#include "views/view.hpp"
#include "script_mgr.hpp"
namespace big
{
void scripts_popupmodal()
{
ImGui::BeginGroup();
components::sub_title("Scripts");
ImGui::SameLine(ImGui::GetWindowWidth() - 100);
if (ImGui::Button("Close")) ImGui::CloseCurrentPopup();
ImGui::Spacing();
components::sub_title("These scripts are responsible for all looped features.\nOnly disable if you know what you are doing.");
for (const auto& script : g_script_mgr.scripts())
{
if (script->is_toggleable())
if (ImGui::Checkbox(script->name(), script->toggle_ptr()))
g_notification_service->push(std::string(script->name()).append(" script"), script->is_enabled() ? "Resumed" : "Halted");
}
ImGui::EndGroup();
}
void view::settings()
{
components::sub_title("Misc");
ImGui::Checkbox("Enable Dev DLC", &g.settings.dev_dlc);
ImGui::Separator();
if (ImGui::Button("Manage scripts"))
ImGui::OpenPopup("Scripts");
ImGui::SetNextWindowPos({ 780,228 }, ImGuiCond_FirstUseEver);
if (ImGui::BeginPopupModal("Scripts", nullptr, ImGuiWindowFlags_AlwaysAutoResize))
{
scripts_popupmodal();
ImGui::EndPopup();
}
components::sub_title("SETTINGS_MISC"_T);
ImGui::Checkbox("SETTINGS_MISC_DEV_DLC"_T.data(), &g.settings.dev_dlc);
}
}

View File

@ -0,0 +1,26 @@
#include "views/view.hpp"
namespace big
{
void view::translation_settings()
{
const auto& language_entries = g_translation_service.available_translations();
const auto current_pack = g_translation_service.current_language_pack();
ImGui::Text("SETTINGS_LANGUAGES"_T.data());
if (ImGui::BeginCombo("##combo-languages", language_entries.at(current_pack).name.c_str()))
{
for (auto& i : language_entries)
{
if (ImGui::Selectable(i.second.name.c_str(), i.first == current_pack))
g_translation_service.select_language_pack(i.first);
if (i.first == current_pack)
{
ImGui::SetItemDefaultFocus();
}
}
ImGui::EndCombo();
}
}
}

View File

@ -14,7 +14,7 @@ namespace big
{
void view::fun_vehicle()
{
components::sub_title("Seat Changer");
components::sub_title("SEAT_CHANGER"_T);
{
static std::map<int, bool> seats;
static bool ready = true;
@ -46,7 +46,7 @@ namespace big
if (seats.size() == 0)
{
ImGui::Text("Please enter a vehicle.");
ImGui::Text("PLEASE_ENTER_VEHICLE"_T.data());
}
else
{
@ -59,11 +59,11 @@ namespace big
ImGui::BeginDisabled();
}
std::string name = "Driver";
std::string name = "DRIVER"_T.data();
if (idx >= 0)
{
name = "Seat " + std::to_string(idx + 1);
name = "FUN_VEHICLE_SEAT"_T.data() + std::to_string(idx + 1);
}
if ((idx + 1) % 4 != 0) {
@ -83,11 +83,11 @@ namespace big
ImGui::Separator();
components::sub_title("Auto Drive");
components::sub_title("AUTO_DRIVE"_T);
{
float auto_drive_speed_user_unit = vehicle::mps_to_speed(g.vehicle.auto_drive_speed, g.vehicle.speed_unit);
if (ImGui::SliderFloat(
std::format("Top Speed({})", speed_unit_strings[(int)g.vehicle.speed_unit]).c_str(),
std::vformat("FUN_VEHICLE_TOP_SPEED"_T, std::make_format_args(speed_unit_strings[(int)g.vehicle.speed_unit])).c_str(),
&auto_drive_speed_user_unit,
vehicle::mps_to_speed(0.f, g.vehicle.speed_unit),
vehicle::mps_to_speed(150.f, g.vehicle.speed_unit),
@ -96,8 +96,8 @@ namespace big
g.vehicle.auto_drive_speed = vehicle::speed_to_mps(auto_drive_speed_user_unit, g.vehicle.speed_unit);
}
static constexpr char const* driving_style_names[] = { "Law-Abiding", "The Road Is Yours" };
if (ImGui::BeginCombo("Driving Style", driving_style_names[(int)g.vehicle.auto_drive_style]))
const char* driving_style_names[] = { "LAW_ABIDING"_T.data(), "ROAD_IS_YOURS"_T.data() };
if (ImGui::BeginCombo("DRIVING_STYLE"_T.data(), driving_style_names[(int)g.vehicle.auto_drive_style]))
{
for (int i = 0; i < 2; i++)
{
@ -105,8 +105,8 @@ namespace big
{
g.vehicle.auto_drive_style = (AutoDriveStyle)i;
g_notification_service->push_warning(
"Auto Drive",
std::format("Driving style set to {}.", driving_style_names[i])
"AUTO_DRIVE"_T.data(),
std::vformat("DRIVING_STYLE_SET_TO"_T.data(), std::make_format_args(driving_style_names[i]))
);
}
@ -119,39 +119,39 @@ namespace big
ImGui::EndCombo();
}
if (components::button("To Objective")) {
if (components::button("TO_OBJECTIVE"_T)) {
g.vehicle.auto_drive_destination = AutoDriveDestination::OBJECTITVE;
}
ImGui::SameLine();
if (components::button("To Waypoint")) {
if (components::button("TO_WAYPOINT"_T)) {
g.vehicle.auto_drive_destination = AutoDriveDestination::WAYPOINT;
}
ImGui::SameLine();
if (components::button("Wander")) {
if (components::button("WANDER"_T)) {
g.vehicle.auto_drive_destination = AutoDriveDestination::WANDER;
}
ImGui::SameLine();
if (components::button("Emergency Stop")) {
if (components::button("EMERGENCY_STOP"_T)) {
g.vehicle.auto_drive_destination = AutoDriveDestination::EMERGENCY_STOP;
}
}
ImGui::Separator();
components::sub_title("Rainbow Paint");
components::sub_title("RAINBOW_PAINT"_T);
{
ImGui::Checkbox("Primary", &g.vehicle.rainbow_paint.primary);
ImGui::Checkbox("PRIMARY"_T.data(), &g.vehicle.rainbow_paint.primary);
ImGui::SameLine();
ImGui::Checkbox("Secondary", &g.vehicle.rainbow_paint.secondary);
ImGui::Checkbox("SECONDARY"_T.data(), &g.vehicle.rainbow_paint.secondary);
ImGui::SameLine();
ImGui::Checkbox("Neon", &g.vehicle.rainbow_paint.neon);
ImGui::Checkbox("NEON"_T.data(), &g.vehicle.rainbow_paint.neon);
ImGui::SameLine();
ImGui::Checkbox("Smoke", &g.vehicle.rainbow_paint.smoke);
ImGui::Checkbox("SMOKE"_T.data(), &g.vehicle.rainbow_paint.smoke);
static constexpr char const* rgb_types[] = { "Off", "Fade", "Spasm" };
const char* rgb_types[] = { "OFF"_T.data(), "FADE"_T.data(), "SPASM"_T.data() };
ImGui::SetNextItemWidth(120);
if (ImGui::BeginCombo("RGB Type", rgb_types[(int)g.vehicle.rainbow_paint.type]))
if (ImGui::BeginCombo("RGB_TYPE"_T.data(), rgb_types[(int)g.vehicle.rainbow_paint.type]))
{
for (int i = 0; i < 3; i++)
{
@ -174,13 +174,13 @@ namespace big
{
ImGui::SameLine();
ImGui::SetNextItemWidth(150);
ImGui::SliderInt("RGB Speed", &g.vehicle.rainbow_paint.speed, 1, 10);
ImGui::SliderInt("RGB_SPEED"_T.data(), &g.vehicle.rainbow_paint.speed, 1, 10);
}
}
ImGui::Separator();
static constexpr char const* boost_behaviors[] = { "Default", "Instant Refill", "Infinite" };
if (ImGui::BeginCombo("Boost Behavior", boost_behaviors[static_cast<int>(g.vehicle.boost_behavior)]))
const char* boost_behaviors[] = { "DEFAULT"_T.data(), "INSTANT_REFILL"_T.data(), "INFINITE"_T.data() };
if (ImGui::BeginCombo("BOOST_BEHAVIOR"_T.data(), boost_behaviors[static_cast<int>(g.vehicle.boost_behavior)]))
{
for (int i = 0; i < 3; i++)
{
@ -203,25 +203,25 @@ namespace big
ImGui::Separator();
components::sub_title("Vehicle Fly");
components::sub_title("VEHICLE_FLY"_T);
{
ImGui::BeginGroup();
ImGui::Checkbox("Enabled", &g.vehicle.fly.enabled);
ImGui::Checkbox("Don't Stop", &g.vehicle.fly.dont_stop);
ImGui::Checkbox("ENABLED"_T.data(), &g.vehicle.fly.enabled);
ImGui::Checkbox("DONT_STOP"_T.data(), &g.vehicle.fly.dont_stop);
ImGui::EndGroup();
ImGui::SameLine();
ImGui::BeginGroup();
ImGui::Checkbox("Disable Collision", &g.vehicle.fly.no_collision);
ImGui::Checkbox("Stop On Exit", &g.vehicle.fly.stop_on_exit);
ImGui::Checkbox("DISABLE_COLLISION"_T.data(), &g.vehicle.fly.no_collision);
ImGui::Checkbox("STOP_ON_EXIT"_T.data(), &g.vehicle.fly.stop_on_exit);
ImGui::EndGroup();
float fly_speed_user_unit = vehicle::mps_to_speed(g.vehicle.fly.speed, g.vehicle.speed_unit);
if (ImGui::SliderFloat(
std::format("Speed({})", speed_unit_strings[(int)g.vehicle.speed_unit]).c_str(),
std::vformat("FUN_VEHICLE_SPEED"_T.data(), std::make_format_args(speed_unit_strings[(int)g.vehicle.speed_unit])).c_str(),
&fly_speed_user_unit,
vehicle::mps_to_speed(0.f, g.vehicle.speed_unit),
vehicle::mps_to_speed(150.f, g.vehicle.speed_unit),

View File

@ -37,7 +37,7 @@ namespace big
player_vehicle = 0;
selected_slot = -1;
ImGui::Text("Please enter a vehicle.");
ImGui::Text("PLEASE_ENTER_A_VEHICLE"_T.data());
return;
}
}
@ -67,9 +67,9 @@ namespace big
std::map<std::string, std::vector<int>> tmp_front_wheel_map;
std::map<std::string, std::vector<int>> tmp_rear_wheel_map;
tmp_slot_display_names[MOD_PLATE_STYLE] = "Plate Style";
tmp_slot_display_names[MOD_WINDOW_TINT] = "Window Tint";
tmp_slot_display_names[MOD_WHEEL_TYPE] = "Wheel Type";
tmp_slot_display_names[MOD_PLATE_STYLE] = "PLATE_STYLE"_T.data();
tmp_slot_display_names[MOD_WINDOW_TINT] = "WINDOW_TINT"_T.data();
tmp_slot_display_names[MOD_WHEEL_TYPE] = "WHEEL_TYPE"_T.data();
tmp_mod_display_names[MOD_PLATE_STYLE].insert(lsc_plate_styles.begin(), lsc_plate_styles.end());
tmp_mod_display_names[MOD_WINDOW_TINT].insert(lsc_window_tint_types.begin(), lsc_window_tint_types.end());
@ -117,7 +117,7 @@ namespace big
{
if (is_bennys)
{
if (mod_name.rfind("Chrome ", 0) == 0)
if (mod_name.rfind("LSC_CHROME"_T.data(), 0) == 0)
{
std::string new_mod_name = mod_name.substr(7);
@ -145,7 +145,7 @@ namespace big
{
if (is_bennys)
{
if (mod_name.rfind("Chrome ", 0) == 0)
if (mod_name.rfind("LSC_CHROME"_T.data(), 0) == 0)
{
std::string new_mod_name = mod_name.substr(7);
@ -194,11 +194,11 @@ namespace big
});
}
components::button("Start LS Customs", [] {
components::button("START_LS_CUSTOMS"_T, [] {
g.vehicle.ls_customs = true;
});
ImGui::SameLine();
if (components::button("Max Vehicle"))
if (components::button("MAX_VEHICLE"_T))
{
g_fiber_pool->queue_job([] {
vehicle::max_vehicle(self::veh);
@ -213,9 +213,9 @@ namespace big
static char plate[9];
ImGui::SetNextItemWidth(200.f);
components::input_text_with_hint("##plate", "Plate Number", plate, sizeof(plate), ImGuiInputTextFlags_None);
components::input_text_with_hint("##plate", "PLATE_NUMBER"_T, plate, sizeof(plate), ImGuiInputTextFlags_None);
ImGui::SameLine();
if (components::button("Change Plate Number"))
if (components::button("CHANGE_PLATE_NUMBER"_T))
{
g_fiber_pool->queue_job([] {
vehicle::set_plate(self::veh, plate);
@ -223,10 +223,10 @@ namespace big
}
ImGui::Separator();
components::sub_title("Mod Options");
components::sub_title("MOD_OPTIONS"_T);
bool is_bulletproof_tires = !owned_mods[MOD_TIRE_CAN_BURST];
if (ImGui::Checkbox("Bulletproof Tires", (bool*)&is_bulletproof_tires))
if (ImGui::Checkbox("BULLETPROOF_TIRES"_T.data(), (bool*)&is_bulletproof_tires))
{
g_fiber_pool->queue_job([is_bulletproof_tires] {
owned_mods[MOD_TIRE_CAN_BURST] = (int32_t)!is_bulletproof_tires;
@ -235,7 +235,7 @@ namespace big
}
ImGui::SameLine();
if (ImGui::Checkbox("Low Grip Tires", (bool*)&owned_mods[MOD_DRIFT_TIRE]))
if (ImGui::Checkbox("LOW_GRIP_TIRES"_T.data(), (bool*)&owned_mods[MOD_DRIFT_TIRE]))
{
g_fiber_pool->queue_job([] {
VEHICLE::SET_DRIFT_TYRES(player_vehicle, owned_mods[MOD_DRIFT_TIRE]);
@ -243,14 +243,14 @@ namespace big
}
ImGui::SameLine();
if (ImGui::Checkbox("Turbo", (bool*)&owned_mods[MOD_TURBO]))
if (ImGui::Checkbox("TURBO"_T.data(), (bool*)&owned_mods[MOD_TURBO]))
{
g_fiber_pool->queue_job([] {
VEHICLE::TOGGLE_VEHICLE_MOD(player_vehicle, MOD_TURBO, owned_mods[MOD_TURBO]);
});
}
ImGui::SameLine();
if (ImGui::Checkbox("Tiresmoke", (bool*)&owned_mods[MOD_TYRE_SMOKE]))
if (ImGui::Checkbox("TIRESMOKE"_T.data(), (bool*)&owned_mods[MOD_TYRE_SMOKE]))
{
g_fiber_pool->queue_job([] {
VEHICLE::TOGGLE_VEHICLE_MOD(player_vehicle, MOD_TYRE_SMOKE, owned_mods[MOD_TYRE_SMOKE]);
@ -261,7 +261,7 @@ namespace big
ImGui::BeginGroup();
components::sub_title("Slot");
components::sub_title("SLOT"_T);
if (ImGui::ListBoxHeader("##slot", ImVec2(200, 200)))
{
for (const auto& [slot, name] : slot_display_names)
@ -300,7 +300,7 @@ namespace big
ImGui::SameLine();
ImGui::BeginGroup();
components::sub_title("Mod");
components::sub_title("MOD"_T);
if (ImGui::ListBoxHeader("##mod", ImVec2(240, 200)))
{
for (const auto& it : mod_display_names[selected_slot])
@ -369,7 +369,7 @@ namespace big
ImGui::SameLine();
ImGui::BeginGroup();
components::sub_title("Style");
components::sub_title("STYLE"_T);
if (ImGui::ListBoxHeader("##style", ImVec2(200, 200)))
{
std::string mod_name = mod_display_names[selected_slot][*wheel_stock_mod];
@ -386,7 +386,7 @@ namespace big
{
if (i == 0)
{
if (ImGui::Selectable("Stock", mod == owned_mods[selected_slot] && *wheel_custom == false))
if (ImGui::Selectable("STOCK"_T.data(), mod == owned_mods[selected_slot] && *wheel_custom == false))
{
g_fiber_pool->queue_job([&mod] {
VEHICLE::SET_VEHICLE_MOD(player_vehicle, selected_slot, mod, false);
@ -398,7 +398,7 @@ namespace big
should_custom = true;
}
std::string label = "Style " + std::to_string(mod);
std::string label = "LSC_STYLE"_T.data() + std::to_string(mod);
if (ImGui::Selectable(label.c_str(), mod == owned_mods[selected_slot] && *wheel_custom == should_custom))
{
g_fiber_pool->queue_job([&mod, should_custom] {
@ -417,44 +417,47 @@ namespace big
ImGui::Separator();
components::sub_title("Neon Light Options");
components::sub_title("NEON_LIGHT_OPTIONS"_T);
if (ImGui::Checkbox("Headlight##headlight_en", (bool*)&owned_mods[MOD_XENON_LIGHTS]))
ImGui::PushID("##headlight_en");
if (ImGui::Checkbox("HEADLIGHT"_T.data(), (bool*)&owned_mods[MOD_XENON_LIGHTS]))
{
g_fiber_pool->queue_job([] {
VEHICLE::TOGGLE_VEHICLE_MOD(player_vehicle, MOD_XENON_LIGHTS, owned_mods[MOD_XENON_LIGHTS]);
});
}
ImGui::PopID();
ImGui::SameLine();
if (ImGui::Checkbox("Left", (bool*)&owned_mods[MOD_NEON_LEFT_ON]))
if (ImGui::Checkbox("LEFT"_T.data(), (bool*)&owned_mods[MOD_NEON_LEFT_ON]))
{
g_fiber_pool->queue_job([] {
VEHICLE::SET_VEHICLE_NEON_ENABLED(player_vehicle, NEON_LEFT, owned_mods[MOD_NEON_LEFT_ON]);
});
}
ImGui::SameLine();
if (ImGui::Checkbox("Right", (bool*)&owned_mods[MOD_NEON_RIGHT_ON]))
if (ImGui::Checkbox("RIGHT"_T.data(), (bool*)&owned_mods[MOD_NEON_RIGHT_ON]))
{
g_fiber_pool->queue_job([] {
VEHICLE::SET_VEHICLE_NEON_ENABLED(player_vehicle, NEON_RIGHT, owned_mods[MOD_NEON_RIGHT_ON]);
});
}
ImGui::SameLine();
if (ImGui::Checkbox("Front", (bool*)&owned_mods[MOD_NEON_FRONT_ON]))
if (ImGui::Checkbox("FRONT"_T.data(), (bool*)&owned_mods[MOD_NEON_FRONT_ON]))
{
g_fiber_pool->queue_job([] {
VEHICLE::SET_VEHICLE_NEON_ENABLED(player_vehicle, NEON_FRONT, owned_mods[MOD_NEON_FRONT_ON]);
});
}
ImGui::SameLine();
if (ImGui::Checkbox("Back", (bool*)&owned_mods[MOD_NEON_BACK_ON]))
if (ImGui::Checkbox("BACK"_T.data(), (bool*)&owned_mods[MOD_NEON_BACK_ON]))
{
g_fiber_pool->queue_job([] {
VEHICLE::SET_VEHICLE_NEON_ENABLED(player_vehicle, NEON_BACK, owned_mods[MOD_NEON_BACK_ON]);
});
}
ImGui::SameLine();
components::button("Check All##neon_check_all", [] {
ImGui::PushID("##neon_check_all");
components::button("CHECK_ALL"_T, [] {
owned_mods[MOD_XENON_LIGHTS] = true;
owned_mods[MOD_NEON_LEFT_ON] = true;
owned_mods[MOD_NEON_RIGHT_ON] = true;
@ -467,8 +470,10 @@ namespace big
VEHICLE::SET_VEHICLE_NEON_ENABLED(player_vehicle, NEON_FRONT, owned_mods[MOD_NEON_FRONT_ON]);
VEHICLE::SET_VEHICLE_NEON_ENABLED(player_vehicle, NEON_BACK, owned_mods[MOD_NEON_BACK_ON]);
});
ImGui::PopID();
ImGui::SameLine();
components::button("Uncheck All##neon_uncheck_all", [] {
ImGui::PushID("##neon_uncheck_all");
components::button("UNCHECK_ALL"_T, [] {
owned_mods[MOD_XENON_LIGHTS] = false;
owned_mods[MOD_NEON_LEFT_ON] = false;
owned_mods[MOD_NEON_RIGHT_ON] = false;
@ -481,9 +486,10 @@ namespace big
VEHICLE::SET_VEHICLE_NEON_ENABLED(player_vehicle, NEON_FRONT, owned_mods[MOD_NEON_FRONT_ON]);
VEHICLE::SET_VEHICLE_NEON_ENABLED(player_vehicle, NEON_BACK, owned_mods[MOD_NEON_BACK_ON]);
});
ImGui::PopID();
ImGui::Separator();
components::sub_title("Color Options");
components::sub_title("COLOR_OPTIONS"_T);
static int color_to_change = 0;
static int color_type = 8;
@ -498,29 +504,29 @@ namespace big
if (ImGui::ListBoxHeader("##color_options", ImVec2(120, 254)))
{
if (ImGui::Selectable("Primary", color_to_change == 0, ImGuiSelectableFlags_SelectOnClick))
if (ImGui::Selectable("PRIMARY"_T.data(), color_to_change == 0, ImGuiSelectableFlags_SelectOnClick))
{
color_to_change = 0;
}
if (ImGui::Selectable("Secondary", color_to_change == 1))
if (ImGui::Selectable("SECONDARY"_T.data(), color_to_change == 1))
{
color_to_change = 1;
}
if (ImGui::Selectable("Pearlescent", color_to_change == 2))
if (ImGui::Selectable("PEARLESCENT"_T.data(), color_to_change == 2))
{
color_to_change = 2;
color_type = 4;
}
if (ImGui::Selectable("Interior", color_to_change == 3))
if (ImGui::Selectable("INTERIOR"_T.data(), color_to_change == 3))
{
color_to_change = 3;
color_type = 6;
}
if (ImGui::Selectable("Dashboard", color_to_change == 4))
if (ImGui::Selectable("DASHBOARD"_T.data(), color_to_change == 4))
{
color_to_change = 4;
color_type = 7;
@ -530,7 +536,7 @@ namespace big
{
ImGui::BeginDisabled();
}
if (ImGui::Selectable("Tire Smoke", color_to_change == 5))
if (ImGui::Selectable("TIRE_SMOKE"_T.data(), color_to_change == 5))
{
color_to_change = 5;
color_type = 8;
@ -540,7 +546,7 @@ namespace big
ImGui::EndDisabled();
}
if (ImGui::Selectable("Wheel Color", color_to_change == 6))
if (ImGui::Selectable("WHEEL_COLOR"_T.data(), color_to_change == 6))
{
color_to_change = 6;
color_type = 5;
@ -550,17 +556,19 @@ namespace big
{
ImGui::BeginDisabled();
}
if (ImGui::Selectable("Headlight##headlight_col", color_to_change == 7))
ImGui::PushID("##headlight_col");
if (ImGui::Selectable("HEADLIGHT"_T.data(), color_to_change == 7))
{
color_to_change = 7;
color_type = 9;
}
ImGui::PopID();
if (!owned_mods[MOD_XENON_LIGHTS])
{
ImGui::EndDisabled();
}
if (ImGui::Selectable("Neon", color_to_change == 8))
if (ImGui::Selectable("NEON"_T.data(), color_to_change == 8))
{
color_to_change = 8;
color_type = 8;
@ -582,11 +590,11 @@ namespace big
ImGui::SameLine();
if (ImGui::ListBoxHeader("##colors", ImVec2(140, 254)))
{
if (ImGui::Selectable("Custom", color_type == 8, ImGuiSelectableFlags_SelectOnClick))
if (ImGui::Selectable("CUSTOM"_T.data(), color_type == 8, ImGuiSelectableFlags_SelectOnClick))
{
color_type = 8;
}
if (ImGui::Selectable("Remove Custom", false))
if (ImGui::Selectable("REMOVE_CUSTOM"_T.data(), false))
{
g_fiber_pool->queue_job([] {
if (color_to_change == 0)
@ -601,19 +609,19 @@ namespace big
});
}
if (ImGui::Selectable("Chrome", color_type == 0))
if (ImGui::Selectable("CHROME"_T.data(), color_type == 0))
{
color_type = 0;
}
if (ImGui::Selectable("Classic", color_type == 1))
if (ImGui::Selectable("CLASSIC"_T.data(), color_type == 1))
{
color_type = 1;
}
if (ImGui::Selectable("Matte", color_type == 2))
if (ImGui::Selectable("MATTE"_T.data(), color_type == 2))
{
color_type = 2;
}
if (ImGui::Selectable("Metals", color_type == 3))
if (ImGui::Selectable("METALS"_T.data(), color_type == 3))
{
color_type = 3;
}
@ -710,7 +718,7 @@ namespace big
ImGui::SameLine();
ImGui::SetNextItemWidth(214);
if (ImGui::ColorPicker3("Custom VehColor", color, ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoDragDrop | ImGuiColorEditFlags_NoOptions | ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_DisplayHex))
if (ImGui::ColorPicker3("CUSTOM_VEHCOLOR"_T.data(), color, ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoDragDrop | ImGuiColorEditFlags_NoOptions | ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_DisplayHex))
{
*color_r = (int)(color[0] * 255);
*color_g = (int)(color[1] * 255);
@ -772,7 +780,7 @@ namespace big
{
case 0: //Chrome
{
if (ImGui::Selectable("Chrome", selected_color == COLOR_CHROME))
if (ImGui::Selectable("CHROME"_T.data(), selected_color == COLOR_CHROME))
{
if (color_to_change == 0)
{

View File

@ -25,7 +25,7 @@ namespace big
const auto vehicle = persist_car_service::load_vehicle(selected_vehicle_file);
if (!vehicle)
{
g_notification_service->push_warning("Persist Car", "Vehicle failed to spawn, there is most likely too many spawned vehicles in the area");
g_notification_service->push_warning("PERSIST_CAR"_T.data(), "PERSIST_CAR_TO_MANY_SPAWNED"_T.data());
}
else if (g.spawn_vehicle.spawn_inside)
teleport::into_vehicle(vehicle);
@ -34,7 +34,7 @@ namespace big
}
else
{
g_notification_service->push_warning("Persist Car", "Select a file first");
g_notification_service->push_warning("PERSIST_CAR"_T.data(), "SELECT_FILE_FIRST"_T.data());
}
}
@ -45,7 +45,7 @@ namespace big
const auto vehicle_files = persist_car_service::list_files();
ImGui::PushItemWidth(250);
ImGui::Text("Saved Vehicles");
ImGui::Text("SAVED_VEHICLES"_T.data());
if (ImGui::ListBoxHeader("##empty", ImVec2(200, 200)))
{
@ -65,18 +65,18 @@ namespace big
ImGui::PushItemWidth(250);
components::input_text_with_hint(
"Vehicle File Name",
"Ex: My Cool Car",
"VEHICLE_FILE_NAME"_T,
"VEHICLE_FILE_NAME_EXAMPLE"_T,
vehicle_file_name_input, IM_ARRAYSIZE(vehicle_file_name_input));
ImGui::SameLine();
components::button("Save Vehicle", []
components::button("SAVE_VEHICLE"_T, []
{
save_vehicle(vehicle_file_name_input);
});
components::button("Load Vehicle", []
components::button("LOAD_VEHICLE"_T, []
{
load_vehicle(selected_vehicle_file);
});

View File

@ -11,7 +11,7 @@ namespace big
void view::pv() {
ImGui::SetWindowSize({ 0.f, (float)*g_pointers->m_resolution_y }, ImGuiCond_Always);
if (ImGui::Checkbox("Preview", &g.clone_pv.preview_vehicle))
if (ImGui::Checkbox("PREVIEW"_T.data(), &g.clone_pv.preview_vehicle))
{
if (!g.clone_pv.preview_vehicle)
{
@ -19,21 +19,21 @@ namespace big
}
}
ImGui::SameLine();
ImGui::Checkbox("Spawn In", &g.clone_pv.spawn_inside);
ImGui::Checkbox("SPAWN_IN"_T.data(), &g.clone_pv.spawn_inside);
ImGui::SameLine();
static char plate_buf[9] = { 0 };
int num_of_rows = 3;
ImGui::Checkbox("Spawn Clone", &g.clone_pv.spawn_clone);
ImGui::Checkbox("SPAWN_CLONE"_T.data(), &g.clone_pv.spawn_clone);
if (g.clone_pv.spawn_clone)
{
num_of_rows = 5;
ImGui::Checkbox("Spawn Maxed", &g.clone_pv.spawn_maxed);
ImGui::Checkbox("SPAWN_MAXED"_T.data(), &g.clone_pv.spawn_maxed);
ImGui::SameLine();
ImGui::Checkbox("Clone PV Plate", &g.clone_pv.clone_plate);
ImGui::Checkbox("CLONE_PV_PLATE"_T.data(), &g.clone_pv.clone_plate);
if (g.clone_pv.clone_plate)
{
num_of_rows = 4;
@ -43,7 +43,7 @@ namespace big
ImGui::SetNextItemWidth(300.f);
strncpy(plate_buf, g.clone_pv.plate.c_str(), 9);
components::input_text_with_hint("Plate", "Plate Number", plate_buf, sizeof(plate_buf), ImGuiInputTextFlags_None, [] {
components::input_text_with_hint("PLATE"_T, "PLATE_NUMBER"_T, plate_buf, sizeof(plate_buf), ImGuiInputTextFlags_None, [] {
g.clone_pv.plate = plate_buf;
});
}
@ -54,9 +54,9 @@ namespace big
const auto& class_arr = g_gta_data_service->vehicle_classes();
ImGui::SetNextItemWidth(300.f);
if (ImGui::BeginCombo("Vehicle Class", selected_class == -1 ? "ALL" : class_arr[selected_class].c_str()))
if (ImGui::BeginCombo("VEHICLE_CLASS"_T.data(), selected_class == -1 ? "ALL"_T.data() : class_arr[selected_class].c_str()))
{
if (ImGui::Selectable("ALL", selected_class == -1))
if (ImGui::Selectable("ALL"_T.data(), selected_class == -1))
{
selected_class = -1;
}
@ -81,14 +81,14 @@ namespace big
static char search[64];
ImGui::SetNextItemWidth(300.f);
components::input_text_with_hint("Model Name", "Search", search, sizeof(search), ImGuiInputTextFlags_None);
components::input_text_with_hint("MODEL_NAME"_T, "SEARCH"_T, search, sizeof(search), ImGuiInputTextFlags_None);
g_mobile_service->refresh_personal_vehicles();
if (ImGui::ListBoxHeader("###personal_veh_list", { 300, static_cast<float>(*g_pointers->m_resolution_y - 188 - 38 * num_of_rows) }))
{
if (g_mobile_service->personal_vehicles().empty())
{
ImGui::Text("No personal vehicles found, \nare you online?");
ImGui::Text("NO_PERSONAL_VEHICLES"_T.data());
}
else
{
@ -134,7 +134,7 @@ namespace big
if (veh == 0)
{
g_notification_service->push_error("Vehicle", "Unable to spawn vehicle");
g_notification_service->push_error("VEHICLE"_T.data(), "UNABLE_TO_SPAWN_VEHICLE"_T.data());
}
else
{

View File

@ -11,7 +11,7 @@ namespace big
{
ImGui::SetWindowSize({ 0.f, (float)*g_pointers->m_resolution_y }, ImGuiCond_Always);
if (ImGui::Checkbox("Preview", &g.spawn_vehicle.preview_vehicle))
if (ImGui::Checkbox("PREVIEW"_T.data(), &g.spawn_vehicle.preview_vehicle))
{
if (!g.spawn_vehicle.preview_vehicle)
{
@ -27,7 +27,7 @@ namespace big
strncpy(plate_buf, g.spawn_vehicle.plate.c_str(), 9);
ImGui::SetNextItemWidth(300.f);
components::input_text_with_hint("Plate", "Plate Number", plate_buf, sizeof(plate_buf), ImGuiInputTextFlags_None, [] {
components::input_text_with_hint("PLATE"_T, "PLATE_NUMBER"_T, plate_buf, sizeof(plate_buf), ImGuiInputTextFlags_None, [] {
g.spawn_vehicle.plate = plate_buf;
});
@ -36,9 +36,9 @@ namespace big
const auto& class_arr = g_gta_data_service->vehicle_classes();
ImGui::SetNextItemWidth(300.f);
if (ImGui::BeginCombo("Vehicle Class", selected_class == -1 ? "ALL" : class_arr[selected_class].c_str()))
if (ImGui::BeginCombo("VEHICLE_CLASS"_T.data(), selected_class == -1 ? "ALL"_T.data() : class_arr[selected_class].c_str()))
{
if (ImGui::Selectable("ALL", selected_class == -1))
if (ImGui::Selectable("ALL"_T.data(), selected_class == -1))
{
selected_class = -1;
}
@ -63,7 +63,7 @@ namespace big
static char search[64];
ImGui::SetNextItemWidth(300.f);
components::input_text_with_hint("Model Name", "Search", search, sizeof(search), ImGuiInputTextFlags_None);
components::input_text_with_hint("MODEL_NAME"_T, "SEARCH"_T, search, sizeof(search), ImGuiInputTextFlags_None);
if (ImGui::ListBoxHeader("###vehicles", { 300, static_cast<float>(*g_pointers->m_resolution_y - 188 - 38 * 4) }))
@ -80,7 +80,7 @@ namespace big
{
const auto& item = g_gta_data_service->vehicle_by_hash(veh_hash);
components::selectable(std::format("Current Vehicle [{}]", item.m_display_name), false, [] {
components::selectable(std::vformat("SPAWN_VEHICLE_CURRENT_VEHICLE"_T, std::make_format_args(item.m_display_name)), false, [] {
if (self::veh)
{
Vector3 spawn_location = vehicle::get_spawn_location(g.spawn_vehicle.spawn_inside);
@ -92,7 +92,7 @@ namespace big
if (veh == 0)
{
g_notification_service->push_error("Vehicle", "Unable to spawn vehicle");
g_notification_service->push_error("VEHICLE"_T.data(), "UNABLE_TO_SPAWN_VEHICLE"_T.data());
}
else
{
@ -162,7 +162,7 @@ namespace big
if (veh == 0)
{
g_notification_service->push_error("Vehicle", "Unable to spawn vehicle");
g_notification_service->push_error("VEHICLE"_T.data(), "UNABLE_TO_SPAWN_VEHICLE"_T.data());
}
else
{
@ -196,7 +196,7 @@ namespace big
}
else
{
ImGui::Text("No vehicles in registry.");
ImGui::Text("NO_VEHICLE_IN_REGISTRY"_T.data());
}
ImGui::ListBoxFooter();
}

View File

@ -8,14 +8,14 @@ namespace big
{
void view::vehicle()
{
components::button("MMI Fix All PV", [] {
components::button("MORS_FIX_ALL"_T, [] {
int amount_fixed = mobile::mors_mutual::fix_all();
g_notification_service->push("Mobile",
std::format("{} vehicle{} been fixed.", amount_fixed, amount_fixed == 1 ? " has" : "s have")
g_notification_service->push("MOBILE"_T.data(),
std::vformat("VEHICLE_FIX_AMOUNT"_T.data(), std::make_format_args(amount_fixed, amount_fixed == 1 ? "VEHICLE_FIX_HAS"_T.data() : "VEHICLE_FIX_HAVE"_T.data()))
);
});
ImGui::SameLine();
components::button("Repair", [] {
components::button("REPAIR"_T, [] {
vehicle::repair(self::veh);
});
@ -24,24 +24,24 @@ namespace big
ImGui::Separator();
components::button("Teleport in PV", [] {
components::button("TP_IN_PV"_T, [] {
Vehicle veh = mobile::mechanic::get_personal_vehicle();
teleport::into_vehicle(veh);
});
ImGui::SameLine();
components::button("Bring PV", [] {
components::button("BRING_PV"_T, [] {
Vehicle veh = mobile::mechanic::get_personal_vehicle();
vehicle::bring(veh, self::pos, true);
});
ImGui::SameLine();
components::button("Bring Closest Vehicle", [] {
components::button("BRING_CLOSEST_VEHICLE"_T, [] {
Vehicle veh = vehicle::get_closest_to_location(self::pos, 200);
vehicle::bring(veh, self::pos, true, -1);
});
ImGui::Separator();
components::button("Turn Engine On", [] {
components::button("TURN_ENGINE_ON"_T, [] {
vehicle::set_engine_state(
self::veh,
true,
@ -50,7 +50,7 @@ namespace big
);
});
ImGui::SameLine();
components::button("Turn Engine Off", [] {
components::button("TURN_ENGINE_OFF"_T, [] {
vehicle::set_engine_state(
self::veh,
false,
@ -58,17 +58,17 @@ namespace big
g.vehicle.disable_engine_auto_start
);
});
ImGui::Checkbox("Disable Engine Auto Start", &g.vehicle.disable_engine_auto_start);
ImGui::Checkbox("DISABLE_ENGINE_AUTO_START"_T.data(), &g.vehicle.disable_engine_auto_start);
ImGui::SameLine();
ImGui::Checkbox("Change State Immediately", &g.vehicle.change_engine_state_immediately);
ImGui::Checkbox("CHANGE_STATE_IMMEDIATELY"_T.data(), &g.vehicle.change_engine_state_immediately);
ImGui::Separator();
components::sub_title("General");
components::sub_title("GENERAL"_T);
{
ImGui::BeginGroup();
ImGui::Checkbox("God Mode", &g.vehicle.god_mode);
ImGui::Checkbox("GOD_MODE"_T.data(), &g.vehicle.god_mode);
components::command_checkbox<"hornboost">();
components::command_checkbox<"vehjump">();
components::command_checkbox<"invisveh">();
@ -91,10 +91,10 @@ namespace big
ImGui::BeginGroup();
components::command_checkbox<"seatbelt">();
ImGui::Checkbox("Turn Signals", &g.vehicle.turn_signals);
ImGui::Checkbox("TURN_SIGNALS"_T.data(), &g.vehicle.turn_signals);
if (g.vehicle.turn_signals)
{
ImGui::Checkbox("Fully Automatic Signal", &g.vehicle.auto_turn_signals);
ImGui::Checkbox("FULLY_AUTOMATIC_SIGNAL"_T.data(), &g.vehicle.auto_turn_signals);
}
components::command_checkbox<"driveunder">();
@ -103,9 +103,9 @@ namespace big
ImGui::Separator();
components::sub_title("Proofs");
components::sub_title("PROOFS"_T);
{
if (ImGui::Button("Check all"))
if (ImGui::Button("CHECK_ALL"_T.data()))
{
g.vehicle.proof_bullet = true;
g.vehicle.proof_fire = true;
@ -118,7 +118,7 @@ namespace big
ImGui::SameLine();
if (ImGui::Button("Uncheck all"))
if (ImGui::Button("UNCHECK_ALL"_T.data()))
{
g.vehicle.proof_bullet = false;
g.vehicle.proof_fire = false;
@ -131,35 +131,35 @@ namespace big
ImGui::BeginGroup();
ImGui::Checkbox("Bullet", &g.vehicle.proof_bullet);
ImGui::Checkbox("Fire", &g.vehicle.proof_fire);
ImGui::Checkbox("BULLET"_T.data(), &g.vehicle.proof_bullet);
ImGui::Checkbox("FIRE"_T.data(), &g.vehicle.proof_fire);
ImGui::EndGroup();
ImGui::SameLine();
ImGui::BeginGroup();
ImGui::Checkbox("Collision", &g.vehicle.proof_collision);
ImGui::Checkbox("Melee", &g.vehicle.proof_melee);
ImGui::Checkbox("COLLISION"_T.data(), &g.vehicle.proof_collision);
ImGui::Checkbox("MELEE"_T.data(), &g.vehicle.proof_melee);
ImGui::EndGroup();
ImGui::SameLine();
ImGui::BeginGroup();
ImGui::Checkbox("Explosion", &g.vehicle.proof_explosion);
ImGui::Checkbox("Steam", &g.vehicle.proof_steam);
ImGui::Checkbox("EXPLOSION"_T.data(), &g.vehicle.proof_explosion);
ImGui::Checkbox("STEAM"_T.data(), &g.vehicle.proof_steam);
ImGui::EndGroup();
ImGui::SameLine();
ImGui::BeginGroup();
ImGui::Checkbox("Water", &g.vehicle.proof_water);
ImGui::Checkbox("WATER"_T.data(), &g.vehicle.proof_water);
ImGui::EndGroup();
}
ImGui::Separator();
components::sub_title("Speed Unit");
components::sub_title("SPEED_UNIT"_T);
{
ImGui::RadioButton(
speed_unit_strings[(int)SpeedUnit::KMPH].c_str(),
@ -181,13 +181,13 @@ namespace big
}
ImGui::Separator();
components::sub_title("Speedo Meter");
components::sub_title("SPEEDO_METER"_T);
{
ImGui::Checkbox("Enabled", &g.vehicle.speedo_meter.enabled);
ImGui::Checkbox("ENABLED"_T.data(), &g.vehicle.speedo_meter.enabled);
if (g.vehicle.speedo_meter.enabled)
{
ImGui::Text("Position (X, Y)");
ImGui::Text("POS_X_Y"_T.data());
float pos[2] = { g.vehicle.speedo_meter.x, g.vehicle.speedo_meter.y };
@ -199,7 +199,7 @@ namespace big
ImGui::SameLine();
ImGui::Checkbox("Left Sided", &g.vehicle.speedo_meter.left_side);
ImGui::Checkbox("LEFT_SIDED"_T.data(), &g.vehicle.speedo_meter.left_side);
}
}

View File

@ -23,6 +23,7 @@ namespace big
static void handling_saved_profiles();
static void reaction_settings();
static void protection_settings();
static void translation_settings();
static void heading();
static void mobile();
static void navigation();

View File

@ -13,36 +13,36 @@ namespace big
if (g_gta_data_service->cache_needs_update())
{
g_gui->toggle(true);
ImGui::OpenPopup("Game Cache");
ImGui::OpenPopup("GAME_CACHE"_T.data());
}
ImGui::SetNextWindowSize({ 800, 210 }, ImGuiCond_FirstUseEver);
ImGui::SetNextWindowPos({ 200, 200 }, ImGuiCond_FirstUseEver);
if (ImGui::BeginPopupModal("Game Cache"))
if (ImGui::BeginPopupModal("GAME_CACHE"_T.data()))
{
switch (g_gta_data_service->state())
{
case eGtaDataUpdateState::NEEDS_UPDATE:
{
ImGui::Text("YimMenu requires a rebuild of the game cache. This may take up to one minute to generate.");
ImGui::Text("GAME_CACHE_UPDATE"_T.data());
if (*g_pointers->m_is_session_started)
{
if (ImGui::Button("Update Cache"))
if (ImGui::Button("GAME_CACHE_UPDATE_CACHE"_T.data()))
{
g_gta_data_service->update_now();
}
}
else
{
ImGui::TextWrapped("You are currently in single player, you can force build the cache in single player but risk crashing when going into multiplayer or load online and cache.");
ImGui::TextWrapped("GAME_CACHE_SINGLE_PLAYER_DESCRIPTION"_T.data());
if (ImGui::Button("I don't care, update in single player!"))
if (ImGui::Button("GAME_CACHE_DONT_CARE"_T.data()))
{
g_gta_data_service->update_now();
}
if (ImGui::Button("Update cache in online."))
if (ImGui::Button("GAME_CACHE_GO_ONLINE"_T.data()))
{
g_gta_data_service->update_in_online();
}
@ -52,13 +52,13 @@ namespace big
}
case eGtaDataUpdateState::WAITING_FOR_ONLINE:
{
ImGui::Text("Waiting for online to start cache update...");
ImGui::Text("GAME_CACHE_WAITING_FOR_ONLINE"_T.data());
break;
}
case eGtaDataUpdateState::UPDATING:
{
ImGui::Text("Updating cache, please wait...");
ImGui::Text("GAME_CACHE_UPDATING"_T.data());
break;
}

View File

@ -21,7 +21,7 @@ namespace big
}
ImGui::PushItemWidth(250);
components::sub_title("Saved Jobs");
components::sub_title("CREATOR_SAVED_JOBS"_T);
if (ImGui::ListBoxHeader("##empty", ImVec2(200, 200)))
{
@ -40,14 +40,14 @@ namespace big
if (!selected_creator_file.empty())
{
components::button("Save To File", []
components::button("CREATOR_SAVE_TO_FILE"_T, []
{
creator_storage_service::save_file(selected_creator_file);
});
ImGui::SameLine();
components::button("Load From File", []
components::button("CREATOR_LOAD_FROM_FILE"_T, []
{
creator_storage_service::load_file(selected_creator_file);
});
@ -57,11 +57,11 @@ namespace big
ImGui::PushItemWidth(250);
components::input_text_with_hint(
"Job Name",
"Ex: My Cool Job",
"CREATOR_JOB_FILENAME"_T,
"CREATOR_JOB_FILENAME_HINT"_T,
job_file_name_input, IM_ARRAYSIZE(job_file_name_input));
components::button("Create Job File", []
components::button("CREATOR_JOB_CREATE_FILE"_T, []
{
cached_creator_files = false;
creator_storage_service::create_file(std::string(job_file_name_input) + ".json");
@ -69,7 +69,7 @@ namespace big
ImGui::SameLine();
components::button("Refresh", []
components::button("REFRESH"_T, []
{
cached_creator_files = false;
});
@ -77,9 +77,9 @@ namespace big
ImGui::Separator();
static char job_link[69]{};
components::input_text("SocialClub Job Link", job_link, sizeof(job_link));
components::input_text("CREATOR_JOB_LINK"_T, job_link, sizeof(job_link));
components::button("Import", []
components::button("CREATOR_JOB_IMPORT"_T, []
{
g_thread_pool->push([]
{
@ -100,14 +100,14 @@ namespace big
if (g_api_service->download_job_metadata(content_id, f1 < 0 ? 0 : f1, f0 < 0 ? 0 : f0, NETWORK::UGC_GET_CONTENT_LANGUAGE(0)))
{
cached_creator_files = false;
g_notification_service->push("Job Import", "Job Import successfully done");
g_notification_service->push("CREATOR_JOB_IMPORT_NOTIFICATION"_T.data(), "CREATOR_JOB_IMPORT_SUCCESS"_T.data());
}
else {
g_notification_service->push_error("Job Import", "Could download job metadata");
g_notification_service->push_error("CREATOR_JOB_IMPORT_NOTIFICATION"_T.data(), "CREATOR_JOB_FAILED_METADATA_FETCH"_T.data());
}
}
else {
g_notification_service->push_error("Job Import", "UGC QueryContent failed");
g_notification_service->push_error("CREATOR_JOB_IMPORT_NOTIFICATION"_T.data(), "CREATOR_JOB_UGC_QUERY_FAILED"_T.data());
}
});
});
@ -115,19 +115,19 @@ namespace big
ImGui::EndGroup();
components::sub_title("Launch Creator");
components::sub_title("CREATOR_LAUNCH"_T);
ImGui::BeginGroup();
components::button("Race", [] { scripts::start_creator_script(RAGE_JOAAT("fm_race_creator")); }); ImGui::SameLine();
components::button("Capture", [] { scripts::start_creator_script(RAGE_JOAAT("fm_capture_creator")); }); ImGui::SameLine();
components::button("Deathmatch", [] { scripts::start_creator_script(RAGE_JOAAT("fm_deathmatch_creator")); }); ImGui::SameLine();
components::button("LTS", [] { scripts::start_creator_script(RAGE_JOAAT("fm_lts_creator")); });
components::button("RACE"_T, [] { scripts::start_creator_script(RAGE_JOAAT("fm_race_creator")); }); ImGui::SameLine();
components::button("CAPTURE"_T, [] { scripts::start_creator_script(RAGE_JOAAT("fm_capture_creator")); }); ImGui::SameLine();
components::button("DEATHMATCH"_T, [] { scripts::start_creator_script(RAGE_JOAAT("fm_deathmatch_creator")); }); ImGui::SameLine();
components::button("LTS"_T, [] { scripts::start_creator_script(RAGE_JOAAT("fm_lts_creator")); });
ImGui::EndGroup();
components::sub_title("Creator Options");
components::sub_title("CREATOR_OPTIONS"_T);
ImGui::BeginGroup();
ImGui::Checkbox("Infinite Model Memory", &g.ugc.infinite_model_memory);
ImGui::Checkbox("CREATOR_INFINITE_MEMORY"_T.data(), &g.ugc.infinite_model_memory);
if (ImGui::IsItemHovered())
ImGui::SetTooltip("Infinite Model Memory is only useful if dev mode is not activated");
ImGui::SetTooltip("CREATOR_INFINITE_MEMORY_DESCRIPTION"_T.data());
ImGui::EndGroup();
}

View File

@ -77,7 +77,7 @@ namespace big
auto plyr = g_player_service->get_by_id(selected_ped_player_id);
if (plyr == nullptr || !plyr->is_valid() || !plyr->get_ped() || !plyr->get_ped()->m_navigation)
{
g_notification_service->push_error("Ped", "Invalid Online Player.");
g_notification_service->push_error("PED"_T.data(), "INVALID_ONLINE_PED"_T.data());
return 0;
}
@ -102,7 +102,7 @@ namespace big
auto plyr = g_player_service->get_by_id(selected_ped_for_player_id);
if (plyr == nullptr || !plyr->is_valid() || !plyr->get_ped() || !plyr->get_ped()->m_navigation)
{
g_notification_service->push_error("Ped", "Invalid Online Player.");
g_notification_service->push_error("PED"_T.data(), "INVALID_ONLINE_PED"_T.data());
return 0;
}
@ -121,7 +121,7 @@ namespace big
if (ped == 0)
{
g_notification_service->push_error("Ped", "Failed to spawn model, did you give an incorrect model ? ");
g_notification_service->push_error("PED"_T.data(), "SPAWN_MODEL_FAILED"_T.data());
return 0;
}
@ -234,26 +234,26 @@ namespace big
}
}
components::sub_title("Ped Model");
components::sub_title("PED_MODEL"_T);
{
ImGui::BeginGroup();
{
ImGui::Text("Ped Type");
ImGui::Text("PED_TYPE"_T.data());
ImGui::SetNextItemWidth(160.f);
if (ImGui::BeginCombo(
"##ped_type",
selected_ped_type == -1 ? "ALL" :
selected_ped_type == -2 ? "ONLINE PLAYER" :
selected_ped_type == -1 ? "ALL"_T.data() :
selected_ped_type == -2 ? "ONLINE_PLAYER"_T.data() :
ped_type_arr[selected_ped_type].c_str()
)) {
if (ImGui::Selectable("ONLINE PLAYER", selected_ped_type == -2))
if (ImGui::Selectable("ONLINE_PLAYER"_T.data(), selected_ped_type == -2))
{
selected_ped_type = -2;
}
if (ImGui::Selectable("ALL", selected_ped_type == -1))
if (ImGui::Selectable("ALL"_T.data(), selected_ped_type == -1))
{
selected_ped_type = -1;
}
@ -283,16 +283,16 @@ namespace big
{
ImGui::BeginGroup();
{
ImGui::Text("Player");
ImGui::Text("PLAYER"_T.data());
ImGui::SetNextItemWidth(240.f);
if (ImGui::BeginCombo(
"##ped_player",
selected_ped_player_id == -1 ?
"Self" :
"SELF"_T.data() :
g_player_service->get_by_id(selected_ped_player_id)->get_name()
)) {
if (ImGui::Selectable("Self", selected_ped_player_id == -1))
if (ImGui::Selectable("SELF"_T.data(), selected_ped_player_id == -1))
{
selected_ped_player_id = -1;
g_model_preview_service->stop_preview();
@ -364,11 +364,11 @@ namespace big
{
ImGui::BeginGroup();
{
ImGui::Text("Model Name");
ImGui::Text("MODEL_NAME"_T.data());
ImGui::SetNextItemWidth(240.f);
components::input_text_with_hint(
"##ped_model_name", "Model Name",
"##ped_model_name", "MODEL_NAME"_T,
ped_model_buf, sizeof(ped_model_buf), ImGuiInputTextFlags_EnterReturnsTrue,
[] {
ped_model_dropdown_open = false;
@ -453,22 +453,22 @@ namespace big
ImGui::Separator();
components::sub_title("Weapon");
components::sub_title("WEAPON"_T);
{
ImGui::BeginGroup();
{
ImGui::Text("Weapon Type");
ImGui::Text("WEAPON_TYPE"_T.data());
ImGui::SetNextItemWidth(160.f);
if (ImGui::BeginCombo(
"##ped_weapon_type",
selected_ped_weapon_type == SPAWN_PED_ALL_WEAPONS ?
"ALL" :
"ALL"_T.data() :
selected_ped_weapon_type == SPAWN_PED_NO_WEAPONS ?
"NO WEAPONS" :
"NO_WEAPONS"_T.data() :
weapon_type_arr[selected_ped_weapon_type].c_str()
)) {
if (ImGui::Selectable("ALL", selected_ped_weapon_type == SPAWN_PED_ALL_WEAPONS))
if (ImGui::Selectable("ALL"_T.data(), selected_ped_weapon_type == SPAWN_PED_ALL_WEAPONS))
{
selected_ped_weapon_type = SPAWN_PED_ALL_WEAPONS;
}
@ -478,7 +478,7 @@ namespace big
ImGui::SetItemDefaultFocus();
}
if (ImGui::Selectable("NO WEAPONS", selected_ped_weapon_type == SPAWN_PED_NO_WEAPONS))
if (ImGui::Selectable("NO_WEAPONS"_T.data(), selected_ped_weapon_type == SPAWN_PED_NO_WEAPONS))
{
selected_ped_weapon_type = SPAWN_PED_NO_WEAPONS;
}
@ -511,20 +511,20 @@ namespace big
ImGui::BeginGroup();
{
ImGui::Text("Weapon");
ImGui::Text("WEAPON"_T.data());
ImGui::SetNextItemWidth(240.f);
if (ImGui::BeginCombo(
"##ped_weapon",
selected_ped_weapon_type == SPAWN_PED_NO_WEAPONS ?
"NO WEAPONS" :
"NO_WEAPONS"_T.data() :
selected_ped_weapon_hash == 0 ?
"ALL" :
"ALL"_T.data() :
g_gta_data_service->weapon_by_hash(selected_ped_weapon_hash).m_display_name
)) {
if (selected_ped_weapon_type != SPAWN_PED_NO_WEAPONS)
{
if (ImGui::Selectable("ALL", selected_ped_weapon_hash == 0))
if (ImGui::Selectable("ALL"_T.data(), selected_ped_weapon_hash == 0))
{
selected_ped_weapon_hash = 0;
}
@ -562,7 +562,7 @@ namespace big
ImGui::Separator();
components::sub_title("Spawn For");
components::sub_title("SPAWN_FOR"_T);
{
if (ImGui::BeginCombo(
"##ped_for",
@ -619,7 +619,7 @@ namespace big
ImGui::Separator();
if (ImGui::Checkbox("Preview", &g.world.spawn_ped.preview_ped))
if (ImGui::Checkbox("PREVIEW"_T.data(), &g.world.spawn_ped.preview_ped))
{
if (!g.world.spawn_ped.preview_ped)
{
@ -631,7 +631,7 @@ namespace big
ImGui::Checkbox("Invisible", &g.world.spawn_ped.spawn_invisible);
ImGui::Checkbox("Attacker", &g.world.spawn_ped.spawn_as_attacker);
components::button("Change Player Model", []
components::button("CHANGE_PLAYER_MODEL"_T, []
{
if (selected_ped_type == -2)
{
@ -649,7 +649,7 @@ namespace big
{
if (!ped::change_player_model(rage::joaat(ped_model_buf)))
{
g_notification_service->push_error("Ped", "Failed to spawn model, did you give an incorrect model?");
g_notification_service->push_error("PED"_T.data(), "SPAWN_MODEL_FAILED"_T.data());
return;
}
@ -659,7 +659,8 @@ namespace big
ImGui::SameLine();
components::button("Spawn Ped", []
components::button("SPAWN_PED"_T, []
{
if (selected_ped_for_player_id == SPAWN_PED_FOR_EVERYONE)
{
@ -676,7 +677,7 @@ namespace big
ImGui::SameLine();
components::button("Spawn Bodyguard", []
components::button("SPAWN_BODYGUARD"_T, []
{
if (selected_ped_for_player_id == SPAWN_PED_FOR_EVERYONE)
{

View File

@ -6,28 +6,28 @@ namespace big
{
void view::time_and_weather()
{
if (ImGui::TreeNode("Local Time"))
if (ImGui::TreeNode("LOCAL_TIME"_T.data()))
{
ImGui::Checkbox("Override Time", &g.session.override_time);
ImGui::Checkbox("OVERRIDE_TIME"_T.data(), &g.session.override_time);
if (g.session.override_time)
{
ImGui::SliderInt("Hour", &g.session.custom_time.hour, 0, 23);
ImGui::SliderInt("Minute", &g.session.custom_time.minute, 0, 59);
ImGui::SliderInt("Second", &g.session.custom_time.second, 0, 59);
ImGui::SliderInt("HOUR"_T.data(), &g.session.custom_time.hour, 0, 23);
ImGui::SliderInt("MINUTE"_T.data(), &g.session.custom_time.minute, 0, 59);
ImGui::SliderInt("SECOND"_T.data(), &g.session.custom_time.second, 0, 59);
}
ImGui::TreePop();
}
if (ImGui::TreeNode("Local Weather"))
if (ImGui::TreeNode("LOCAL_WEATHER"_T.data()))
{
components::button("Clear Override", []
components::button("CLEAR_OVERRIDE"_T, []
{
MISC::CLEAR_OVERRIDE_WEATHER();
});
if (ImGui::ListBox("", &g.session.local_weather, session::weathers, 15))
if (ImGui::ListBox("##weather-listbox", &g.session.local_weather, session::weathers, 15))
{
g_fiber_pool->queue_job([]
{

View File

@ -8,39 +8,38 @@ namespace big
{
void view::train()
{
components::button("Hijack Train", []
{
train::hijack_train();
});
components::button("HIJACK_TRAIN"_T, []
{
train::hijack_train();
});
ImGui::SameLine();
components::button("Delete Train", []
{
train::delete_train();
});
components::button("DELETE_TRAIN"_T, []
{
train::delete_train();
});
if (ImGui::IsItemHovered())
ImGui::SetTooltip("You cant delete the train while in it.");
ImGui::SetTooltip("DELETE_TRAIN_DESC"_T.data());
ImGui::SameLine();
components::button("Exit Train", []
{
train::exit_train();
});
components::button("EXIT_TRAIN"_T, []
{
train::exit_train();
});
static float train_speed = 0;
ImGui::SliderFloat("Train Speed", &train_speed, -500.f, 500.f);
ImGui::SliderFloat("TRAIN_SPEED"_T.data(), &train_speed, -500.f, 500.f);
ImGui::SameLine();
components::button("Set", [] { train::set_train_speed(train_speed); });
components::button("SET"_T, [] { train::set_train_speed(train_speed); });
ImGui::Checkbox("Drive Train", &g.world.train.drive_train);
ImGui::Checkbox("DRIVE_TRAIN"_T.data(), &g.world.train.drive_train);
ImGui::SameLine();
ImGui::Checkbox("Derail Train", &g.world.train.derail_train);
ImGui::Checkbox("DERAIL_TRAIN"_T.data(), &g.world.train.derail_train);
}
}