Это ведь можно использовать как сам fout, ссылаясь на него? Так примерно:int a = reinterpret_cast<int>(&fout);
*a << "\n" << string(message).c_str();
Это ведь можно использовать как сам fout, ссылаясь на него? Так примерно:int a = reinterpret_cast<int>(&fout);
Отлично сказано.Какая у тебя задача вообще ? А то щас настроеш код из говна и палок и потом хер разберешься почему у тебя крашит.
#include <windows.h>
#include <string>
#include <assert.h>
#include <process.h>
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
#include "SFAPI\SFRakNet.h"
#include <tchar.h>
#include <fstream>
#include <stdlib.h>
#include <iostream>
#include <Shlwapi.h>
#include "qwe\main.h"
#pragma comment(lib, "shlwapi.lib")
using namespace std;
SAMPFUNCS *SF = new SAMPFUNCS();
int *a = nullptr;
bool CALLBACK irpc(stRakNetHookParams *params)
{
if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage) // id: 93 thanks for MISTER_GONWIK
{
D3DCOLOR color = -1;
int length = 0;
char message[144]{ 0 };
params->bitStream->Read(color);
params->bitStream->Read(length);
params->bitStream->Read(message, length);
//sss[len] = '\0';
if (strcmp(string(message).c_str(), " ") == 0)
return false;
else
{
//SF->getSAMP()->getChat()->AddChatMessage(555555, "%s", string(message).c_str());
//fout << "\n" << string(message).c_str();
}
}
return true;
}
void CALLBACK mainloop()
{
static bool init = false;
if (!init)
{
if (GAME == nullptr)
return;
if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME)
return;
if (!SF->getSAMP()->IsInitialized())
return;
init = true;
char meow[MAX_PATH];
GetCurrentDirectory(sizeof(meow), meow);
if (PathFileExists(strcat(meow, "/yiffme")))
{
ofstream fout("yiffme", ios::app);
*a = reinterpret_cast<int>(&fout);
SF->getSAMP()->getChat()->AddChatMessage(555555, "file exist");
}
else
SF->getSAMP()->getChat()->AddChatMessage(555555, "file doesnt exist");
fout << "\nsession started";
SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, irpc);
}
}
Отлично сказано.
Да вот я хотел поставить условие на проверку существования файла для логов, и открывать файл создавая указатель для записи, в зависимости от его наличия - есть файл, пишем с конца . Нет файла - создаём заново. Вот. И поскольку заполнение лога идёт через хук, мне требуется создать указатель на файл, (fout) в mainloop, чтобы он был доступен коллбеку irpc, вот код если не понятно:
C++:#include <windows.h> #include <string> #include <assert.h> #include <process.h> #include "SAMPFUNCS_API.h" #include "game_api\game_api.h" #include "SFAPI\SFRakNet.h" #include <tchar.h> #include <fstream> #include <stdlib.h> #include <iostream> #include <Shlwapi.h> #include "qwe\main.h" #pragma comment(lib, "shlwapi.lib") using namespace std; SAMPFUNCS *SF = new SAMPFUNCS(); int *a = nullptr; bool CALLBACK irpc(stRakNetHookParams *params) { if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage) // id: 93 thanks for MISTER_GONWIK { D3DCOLOR color = -1; int length = 0; char message[144]{ 0 }; params->bitStream->Read(color); params->bitStream->Read(length); params->bitStream->Read(message, length); //sss[len] = '\0'; if (strcmp(string(message).c_str(), " ") == 0) return false; else { //SF->getSAMP()->getChat()->AddChatMessage(555555, "%s", string(message).c_str()); //fout << "\n" << string(message).c_str(); } } return true; } void CALLBACK mainloop() { static bool init = false; if (!init) { if (GAME == nullptr) return; if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME) return; if (!SF->getSAMP()->IsInitialized()) return; init = true; char meow[MAX_PATH]; GetCurrentDirectory(sizeof(meow), meow); if (PathFileExists(strcat(meow, "/yiffme"))) { ofstream fout("yiffme", ios::app); *a = reinterpret_cast<int>(&fout); SF->getSAMP()->getChat()->AddChatMessage(555555, "file exist"); } else SF->getSAMP()->getChat()->AddChatMessage(555555, "file doesnt exist"); fout << "\nsession started"; SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, irpc); } }
GetCurrentDirectory(..), PathFileExists(..) и т.д.
// после всех инклудов
#include <filesystem>
namespace fs = std::experimental::filesystem;
// самой первой функцией
std::ofstream& log()
{
static std::ofstream logFile;
if (logFile.is_open() == false)
{
fs::path workDirectoryPath = fs::current_path() / "SAMPFUNCS" / "Meow";
if (!fs::exists(workDirectoryPath))
fs::create_directories(workDirectoryPath);
fs::path logFilePath = workDirectoryPath / "yiffme.fr";
bool fileExists = fs::exists(logFilePath);
logFile.open(logFilePath.string(), std::ios::app);
if (fileExists == true)
logFile << std::endl;
}
return logFile;
}
void CALLBACK mainloop()
{
static bool init = false;
if (!init)
{
if (GAME == nullptr) return;
if (!SF->getSAMP()->IsInitialized()) return;
SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, incomingRPC);
log() << "Session started." << std::endl;
init = true;
}
}
bool CALLBACK incomingRPC(stRakNetHookParams *params)
{
if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage) // id: 93 thanks for MISTER_GONWIK
{
D3DCOLOR color = -1;
int length = 0;
char message[144]{ 0 };
params->bitStream->Read(color);
params->bitStream->Read(length);
params->bitStream->Read(message, length);
if (!strcmp(message, " "))
return false;
log() << message << std::endl;
}
return true;
}
проще сказать, что никак.Запустил через RakSAMP три бота на advance. Примерно через 10 минут двух ботов телепортировал к себе администратор, а ещё через минуту забанил всех трех за использование "песочницы".
Как он определил, что я использую "песочницу"? Скорее всего посмотрел, что одинаковые ip, но как тогда можно обмануть админов? Можно сделать, чтобы боты двигались, но администратор может телепортировать в любую точку и бот тупо может забежать в стену.
А если не проще? Я не ищу легких путей.проще сказать, что никак.
для тебя это невозможно, хочешь чтоб бот бегал как человек, пиши систему путей, но учти, у тебя нет никакой карты коллизииА если не проще? Я не ищу легких путей.
Такая система мне нужна в случае, если админ уже телепортировал меня. А что если просто не доходить до этого? Скорее всего он вычисляет меня по ip (если есть ещё варианты, скажи), значит если будут разные ip, то все будет нормально. Разные ip можно получить используя прокси, но я не знаю, поддерживает ли RakSAMP или хотя бы RakNet прокси.для тебя это невозможно, хочешь чтоб бот бегал как человек, пиши систему путей, но учти, у тебя нет никакой карты коллизии
1. обычный раксамп не поддерживает работу через прокси, но сделать можно, как это сделать, думай сам.Такая система мне нужна в случае, если админ уже телепортировал меня. А что если просто не доходить до этого? Скорее всего он вычисляет меня по ip (если есть ещё варианты, скажи), значит если будут разные ip, то все будет нормально. Разные ip можно получить используя прокси, но я не знаю, поддерживает ли RakSAMP или хотя бы RakNet прокси.
Как они палятся? Я могу заставить бота бегать между точками, с анимацией бега, его все равно спалят?ведь они всё равно палятся
А чем плохи конкретно эти функции?GetCurrentDirectory(..), PathFileExists(..)
Я делаю так, как в клео привык - составляю на бумажке примерный "план" проекта, расписывая все нужные функции, а затем разбиваю эти функции на другие функции, без которых предыдущие реализовать не получится, и просто ввожу желаемые действия функций в поиск, не забывая указывать site:microsoft.com. Так я и нахожу нужные функции, а насколько они хороши мне судить как-то рановато, мне ведь даже не каждую из них применить-то удаётся, сам толком ничего не умею Х)займись изучением чего-то более классного и функционального
они устарели, я б сказал, что они больше С, а то что я скинул - С++А чем плохи конкретно эти функции?
Я делаю так, как в клео привык - составляю на бумажке примерный "план" проекта, расписывая все нужные функции, а затем разбиваю эти функции на другие функции, без которых предыдущие реализовать не получится, и просто ввожу желаемые действия функций в поиск, не забывая указывать site:microsoft.com. Так я и нахожу нужные функции, а насколько они хороши мне судить как-то рановато, мне ведь даже не каждую из них применить-то удаётся, сам толком ничего не умею Х)
Но конечно спасибо за совет, расширять кругозор точно не будет лишним
ответ очень прост, боты не способны действовать как люди, их действия повторяются, они очень примитивные и т.д.Как они палятся? Я могу заставить бота бегать между точками, с анимацией бега, его все равно спалят?
Немного оффтопа.они устарели, я б сказал, что они больше С, а то что я скинул - С++
у std:: очень хороший функционал, изучай его