2021-05-19 11:27:47 +02:00
|
|
|
#pragma once
|
2023-03-01 21:27:15 +00:00
|
|
|
#include "gta/enums.hpp"
|
2021-05-19 11:27:47 +02:00
|
|
|
#include "natives.hpp"
|
2023-03-01 21:27:15 +00:00
|
|
|
#include "network/CNetGamePlayer.hpp"
|
2023-03-23 11:11:29 +01:00
|
|
|
#include "network/ChatData.hpp"
|
|
|
|
#include "pointers.hpp"
|
2022-01-18 02:05:38 +01:00
|
|
|
#include "script.hpp"
|
2022-11-19 01:49:36 +00:00
|
|
|
#include "session.hpp"
|
2023-03-01 21:27:15 +00:00
|
|
|
|
2023-01-03 16:48:32 +00:00
|
|
|
#include <script/HudColor.hpp>
|
2021-05-19 11:27:47 +02:00
|
|
|
|
|
|
|
namespace big::notify
|
|
|
|
{
|
2022-02-21 01:24:27 +01:00
|
|
|
inline void above_map(std::string_view text)
|
2021-05-19 11:27:47 +02:00
|
|
|
{
|
|
|
|
HUD::SET_TEXT_OUTLINE();
|
|
|
|
HUD::BEGIN_TEXT_COMMAND_THEFEED_POST("STRING");
|
2022-02-21 01:24:27 +01:00
|
|
|
HUD::ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text.data());
|
2021-05-19 11:27:47 +02:00
|
|
|
HUD::END_TEXT_COMMAND_THEFEED_POST_TICKER(false, false);
|
|
|
|
}
|
2021-05-20 20:27:07 +02:00
|
|
|
|
2022-11-19 01:49:36 +00:00
|
|
|
inline void crash_blocked(CNetGamePlayer* player, const char* crash)
|
2021-05-25 12:58:33 +02:00
|
|
|
{
|
2022-11-19 01:49:36 +00:00
|
|
|
if (player)
|
|
|
|
{
|
|
|
|
g_notification_service->push_error("Protections", std::format("Blocked {} crash from {}", crash, player->get_name()));
|
2023-03-01 21:27:15 +00:00
|
|
|
LOG(WARNING) << "Blocked " << crash << " crash from " << player->get_name() << " ("
|
|
|
|
<< (player->get_net_data() ? player->get_net_data()->m_gamer_handle.m_rockstar_id : 0) << ")";
|
2022-11-19 01:49:36 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
g_notification_service->push_error("Protections", std::format("Blocked {} crash from unknown player", crash));
|
|
|
|
}
|
2021-05-25 12:58:33 +02:00
|
|
|
|
2023-01-03 16:48:32 +00:00
|
|
|
if (player)
|
2022-11-19 01:49:36 +00:00
|
|
|
{
|
2023-01-03 16:48:32 +00:00
|
|
|
if (auto plyr = g_player_service->get_by_id(player->m_player_id))
|
|
|
|
{
|
|
|
|
session::add_infraction(plyr, Infraction::TRIED_CRASH_PLAYER);
|
|
|
|
}
|
2022-11-19 01:49:36 +00:00
|
|
|
}
|
2021-05-25 12:58:33 +02:00
|
|
|
}
|
|
|
|
|
2022-01-18 02:05:38 +01:00
|
|
|
// Shows a busy spinner till the value at the address equals the value passed or if timeout is hit
|
2022-02-21 01:24:27 +01:00
|
|
|
inline void busy_spinner(std::string_view text, int* address, int value, int timeout = 15)
|
2022-01-18 02:05:38 +01:00
|
|
|
{
|
|
|
|
HUD::BEGIN_TEXT_COMMAND_BUSYSPINNER_ON("STRING");
|
2022-02-21 01:24:27 +01:00
|
|
|
HUD::ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text.data());
|
2022-01-18 02:05:38 +01:00
|
|
|
HUD::END_TEXT_COMMAND_BUSYSPINNER_ON(3);
|
|
|
|
|
|
|
|
for (size_t i = 0; *address != value && i < (size_t)timeout * 100; i++)
|
|
|
|
script::get_current()->yield(10ms);
|
2023-03-01 21:27:15 +00:00
|
|
|
|
2022-01-18 02:05:38 +01:00
|
|
|
HUD::BUSYSPINNER_OFF();
|
|
|
|
}
|
|
|
|
|
2022-02-21 01:24:27 +01:00
|
|
|
inline void display_help_text(std::string_view text)
|
2021-05-20 20:27:07 +02:00
|
|
|
{
|
|
|
|
HUD::BEGIN_TEXT_COMMAND_DISPLAY_HELP("STRING");
|
2022-02-21 01:24:27 +01:00
|
|
|
HUD::ADD_TEXT_COMPONENT_SUBSTRING_PLAYER_NAME(text.data());
|
2021-05-20 20:27:07 +02:00
|
|
|
HUD::END_TEXT_COMMAND_DISPLAY_HELP(0, 0, 1, -1);
|
|
|
|
}
|
2021-07-26 21:18:36 +02:00
|
|
|
|
2022-01-31 18:27:35 +01:00
|
|
|
inline void player_joined(CNetGamePlayer* net_game_player)
|
2021-07-26 21:18:36 +02:00
|
|
|
{
|
2023-03-01 21:27:15 +00:00
|
|
|
above_map(std::format("<C>{}</C> joined.", net_game_player->get_name()));
|
2021-07-26 21:18:36 +02:00
|
|
|
}
|
2022-11-14 23:37:38 +08:00
|
|
|
|
|
|
|
inline void draw_chat(char* msg, const char* player_name, bool is_team)
|
|
|
|
{
|
|
|
|
int scaleform = GRAPHICS::REQUEST_SCALEFORM_MOVIE("MULTIPLAYER_CHAT");
|
2023-03-23 11:11:29 +01:00
|
|
|
|
2023-04-16 18:28:49 +00:00
|
|
|
while (!GRAPHICS::HAS_SCALEFORM_MOVIE_LOADED(scaleform))
|
|
|
|
script::get_current()->yield();
|
|
|
|
|
2022-11-14 23:37:38 +08:00
|
|
|
GRAPHICS::BEGIN_SCALEFORM_MOVIE_METHOD(scaleform, "ADD_MESSAGE");
|
2023-03-23 11:11:29 +01:00
|
|
|
GRAPHICS::SCALEFORM_MOVIE_METHOD_ADD_PARAM_PLAYER_NAME_STRING(player_name); // player name
|
|
|
|
GRAPHICS::SCALEFORM_MOVIE_METHOD_ADD_PARAM_LITERAL_STRING(msg); // content
|
|
|
|
GRAPHICS::SCALEFORM_MOVIE_METHOD_ADD_PARAM_TEXTURE_NAME_STRING(HUD::GET_FILENAME_FOR_AUDIO_CONVERSATION(is_team ? "MP_CHAT_TEAM" : "MP_CHAT_ALL")); // scope
|
|
|
|
GRAPHICS::SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(false); // teamOnly
|
|
|
|
GRAPHICS::SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT((int)HudColor::HUD_COLOUR_PURE_WHITE); // eHudColour
|
2023-01-03 16:48:32 +00:00
|
|
|
GRAPHICS::END_SCALEFORM_MOVIE_METHOD();
|
2023-03-23 11:11:29 +01:00
|
|
|
|
2023-01-03 16:48:32 +00:00
|
|
|
GRAPHICS::BEGIN_SCALEFORM_MOVIE_METHOD(scaleform, "SET_FOCUS");
|
2023-03-23 11:11:29 +01:00
|
|
|
GRAPHICS::SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1); // VISIBLE_STATE_DEFAULT
|
|
|
|
GRAPHICS::SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0); // scopeType (unused)
|
|
|
|
GRAPHICS::SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0); // scope (unused)
|
|
|
|
GRAPHICS::SCALEFORM_MOVIE_METHOD_ADD_PARAM_PLAYER_NAME_STRING(player_name); // player
|
|
|
|
GRAPHICS::SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT((int)HudColor::HUD_COLOUR_PURE_WHITE); // eHudColour
|
2022-11-14 23:37:38 +08:00
|
|
|
GRAPHICS::END_SCALEFORM_MOVIE_METHOD();
|
2023-03-23 11:11:29 +01:00
|
|
|
|
2022-12-22 21:23:32 +00:00
|
|
|
GRAPHICS::DRAW_SCALEFORM_MOVIE_FULLSCREEN(scaleform, 255, 255, 255, 255, 0);
|
2023-03-23 11:11:29 +01:00
|
|
|
|
2023-04-16 18:28:49 +00:00
|
|
|
// fix broken scaleforms, when chat alrdy opened
|
2023-04-14 18:54:07 +02:00
|
|
|
if (const auto chat_data = *g_pointers->m_gta.m_chat_data; chat_data && (chat_data->m_chat_open || chat_data->m_timer_two))
|
2023-03-23 11:11:29 +01:00
|
|
|
HUD::CLOSE_MP_TEXT_CHAT();
|
2022-11-14 23:37:38 +08:00
|
|
|
}
|
2021-05-19 11:27:47 +02:00
|
|
|
}
|