#include "core/trace.hpp"
#include "core/network.hpp"
int main()
{
int choice;
while (true)
{
system("cls");
std::cout << R"(
*//
.*/****/. ,***************
*****************************************
******(***************************************
.********%#***************************************
**************************************************.
////**********************//******************
////*************////*****************
////*******///////****************
//*****///////*********************
***. ********* *******
***** ******** ****
****
,*****
.*************************
)" << '\n';
g_network = std::make_unique<network>();
g_trace = std::make_unique<trace>();
while (true)
{
g_trace->m_fivem_path = g_trace->set_folder("Select FiveM Folder which contains FiveM.exe");
system("cls");
if (!g_trace->m_fivem_path.empty())
{
std::cout << " [Selected Folder] " << g_trace->m_fivem_path << std::endl;
std::cout << " [Launch Build] " << g_trace->get_launch_build() << "\n" << std::endl;
std::cout << " [1] : " << "clean traces" << std::endl;
std::cout << " [2] : " << "enable network bypass" << std::endl;
std::cout << " [3] : " << "disable network bypass" << std::endl;
std::cout << " [4] : " << "reset fivem path" << std::endl;
std::cout << " [5] : " << "edit launch options" << std::endl;
std::cin >> choice;
switch (choice)
{
case 1:
{
g_trace->setup();
}
break;
case 2:
{
g_network->setup();
}
break;
case 3:
{
g_network->destroy();
}
break;
case 4:
{
g_trace->destroy();
}
break;
case 5:
{
g_trace->set_launch_build();
}
break;
}
}
else
{
std::cout << " [Error] : " << "select valid folder for FiveM" << "\n" << std::endl;
}
system("Pause");
}
system("Pause");
}
}
auto g_trace = std::make_unique<trace>();
Ale nie do końca, bo nie podałeś całego kodu, więc nie wiadomo co się kryje w tych include.
Używanie zmiennych globalnych jest jednym z najpoważniejszych błędów w projekcie aplikacji.
Podaj Minimalny Kompletny Reprodukowany Przykład.
Innymi słowy, albo próbujesz operować na czymś, co (jeszcze?) nie istnieje (zmiennej g_trace
), albo zadeklarować zmienną bez podawania typu.
W C(++) nowe zmienne tworzy się, m.in., typ nazwa_zmiennej = wartość;
; a samo nazwa_zmiennej = wartość;
to próba przypisania wartości do zmiennej, która w tym momencie musi już istnieć.
Jak MarekR22 wyżej napisał, nie bardzo wiadomo, o którą opcję Ci chodziło.
MAIN
#include "trace.hpp"
void trace::setup()
{
// Locate Appdata
std::string appdata = getenv("LOCALAPPDATA");
std::string localappdata = getenv("APPDATA");
// Locate DigitalElements
appdata = appdata + "\\" + "DigitalEntitlements";
if(std::filesystem::remove_all(appdata))
{
std::cout << "Removed: " << appdata << std::endl;
}
else
{
std::cout << "Couldn't Find: " << appdata << std::endl;
}
// Locate CitizenFX
appdata = localappdata + "\\" + "CitizenFX";
if (std::filesystem::remove_all(appdata))
{
std::cout << "Removed: " << appdata << std::endl;
}
else
{
std::cout << "Couldn't Find: " << appdata << std::endl;
}
}
INT CALLBACK browse_callback_proc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData)
{
if (uMsg == BFFM_INITIALIZED) SendMessage(hwnd, BFFM_SETSELECTION, TRUE, pData);
return 0;
}
void trace::destroy()
{
m_fivem_path.clear();
std::remove(m_save_path.c_str());
}
std::string trace::set_folder(std::string title)
{
std::ifstream path(m_save_path);
if (!path.good())
{
std::string appdata = getenv("LOCALAPPDATA");
auto fivem_path = appdata + "\" + "FiveM";
BROWSEINFO br;
ZeroMemory(&br, sizeof(BROWSEINFO));
br.lpfn = browse_callback_proc;
br.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;
br.hwndOwner = NULL;
br.lpszTitle = title.c_str();
br.lParam = (LPARAM)fivem_path.c_str();
std::string ret;
LPITEMIDLIST pidl = NULL;
if ((pidl = SHBrowseForFolder(&br)) != NULL)
{
char buffer[_MAX_PATH];
if (SHGetPathFromIDList(pidl, buffer)) ret = buffer;
}
if (!std::filesystem::exists(ret + "\\" + "FiveM.exe"))
{
return std::string();
}
if (!ret.empty())
{
std::ofstream save_path(m_save_path);
save_path << ret << std::endl;
save_path.close();
}
return ret;
}
else
{
std::string name;
path >> name;
return name;
}
}
void trace::set_launch_build()
{
int choice;
std::vector<const char*> m_builds = { "2545", "2372", "2189", "2060", "1604" };
for (int i = 0; i < m_builds.size(); i++)
{
std::cout << " [" << i + 1 << "] : " << m_builds[i] << std::endl;
}
std::cin >> choice;
auto path = std::string(m_fivem_path + m_citizen_ini_path).c_str();
if (std::filesystem::exists(path))
{
WritePrivateProfileString("Game", "SavedBuildNumber", m_builds[choice - 1], path);
}
}
std::string trace::get_launch_build()
{
auto path = std::string(m_fivem_path + m_citizen_ini_path).c_str();
auto buildNumber = 0;
if (std::filesystem::exists(path))
{
buildNumber = GetPrivateProfileInt("Game", "SavedBuildNumber", buildNumber, path);
}
return std::to_string(buildNumber);
}
NETWORK
#include "network.hpp"
#include "trace.hpp"
#include <vector>
void network::block_connection(std::string process)
{
std::string outbound = "netsh advfirewall firewall add rule name = " + process + " dir = out program = " + process + " action = block";
system(outbound.c_str());
std::string inbound = "netsh advfirewall firewall add rule name = " + process + " dir = in program = " + process + " action = block";
system(inbound.c_str());
}
void network::unblock_connection(std::string process)
{
std::string outbound = "netsh advfirewall firewall delete rule name = " + process + " dir = out program = " + process;
system(outbound.c_str());
std::string inbound = "netsh advfirewall firewall delete rule name = " + process + " dir = in program = " + process;
system(inbound.c_str());
}
void network::setup()
{
// Locate FiveM.exe
auto fivem_path = g_trace->m_fivem_path + "\FiveM.exe";
block_connection(fivem_path);
// Locate FiveM Subprocesses path
auto subprocess_path = g_trace->m_fivem_path + "\\FiveM.app\\data\\cache\\subprocess";
std::vector<std::string> gta_versions{ "b2545_", "b2372_", "b2189_", "b2060_", "" };
for (auto &processes : gta_versions)
{
// Block the gta processes
auto gta_process = subprocess_path + "\\FiveM_" + processes + "GTAProcess.exe";
block_connection(gta_process);
// Block the steam processes
auto steam_process = subprocess_path + "\\FiveM_" + processes + "SteamChild.exe";
block_connection(steam_process);
}
}
void network::destroy()
{
// Locate FiveM.exe
auto fivem_path = g_trace->m_fivem_path + "\" + "FiveM.exe";
unblock_connection(fivem_path);
// Locate FiveM Subprocesses path
auto subprocess_path = g_trace->m_fivem_path + "\\FiveM.app\\data\\cache\\subprocess";
std::vector<std::string> gta_versions{ "b2545_", "b2372_", "b2189_", "b2060_", "" };
for (auto &processes : gta_versions)
{
// Block the gta processes
auto gta_process = subprocess_path + "\\FiveM_" + processes + "GTAProcess.exe";
unblock_connection(gta_process);
// Block the steam processes
auto steam_process = subprocess_path + "\\FiveM_" + processes + "SteamChild.exe";
unblock_connection(steam_process);
}
}
COMMON
#pragma once
#include <Windows.h>
#include <string>
#include <iostream>
#include <filesystem>
#include <functional>
#include <string>
#include <vector>
#include <cctype>
#include <shlobj_core.h>
#include <fstream>
#include <format>
#include <netfw.h>
TRACE
#pragma once
#include "common.hpp"
#include <string>
class trace
{
public:
void setup();
void destroy();
void set_launch_build();
std::string get_launch_build();
std::string set_folder(std::string title);
public:
std::string m_save_path{ "save.txt" };
std::string m_fivem_path;
std::string m_citizen_ini_path{ "\FiveM.app\CitizenFX.ini" };
};
inline std::unique_ptr;<trace> g_trace{} ;
NETWORK
#pragma once
#include "common.hpp"
class network
{
public:
void setup();
void destroy();
private:
void block_connection(std::string process);
void unblock_connection(std::string process);
};
inline std::unique_ptr<network> g_network;
a u góry jest main
a tu są wszystkie błędy jakie występują
Po jaką jasną Anielcię kopiowac kod, który przerasta kopistę o rząd wielkości?
Co nie znaczy, że bezczelne kopiowanie hello world jest moralnie lepsze, ale przynajmniej dojdzie do jakiegoś wyniku
@ZrobieDobrze: jest to pasta z githuba którą chiałbym naprawić ale napotykam dużą ilość problemów
"ale napotykam dużą ilość problemów" ... jakby ci to delikatnie powiedzieć ... moze jeszcze nie przyszedł na to czas ?
Zrobić własnoręcznie znaczniejsze programy w jednym module, potem w kilku plikach źródłowych, coraz trudniejsze.
Poobijasz się z typowymi problemami, zaczniesz łączyć w głowie "co jest co" - na obecnym etapie nie masz ŻADNCYH skojarzeń, żadnych intuicji.
Do brania kodu z netu - może cię zdziwię - trzeba o wiele większych kwalifikacji, niż do napisania własnego.