Другое С/С++ Вопрос - Ответ

MISTER_GONWIK

Всефорумный гонщик
Всефорумный модератор
1,259
1,737
C++:
ofstream fout("yiffme", ios::app);
Объявить это дело глобально при помощи extern не удаётся, в связи с чем вопрос: каким образом объявить fout внутри функции глобальной переменной?

C++:
// main.cpp
ofstream fout("yiffme", ios::app);

// main.h
extern ofstream fout;
 

Dark_Knight

Me, me and me.
Друг
4,056
2,074
Какая у тебя задача вообще ? А то щас настроеш код из говна и палок и потом хер разберешься почему у тебя крашит.
 

ishi

Известный
493
110
Какая у тебя задача вообще ? А то щас настроеш код из говна и палок и потом хер разберешься почему у тебя крашит.
Отлично сказано.
Да вот я хотел поставить условие на проверку существования файла для логов, и открывать файл создавая указатель для записи, в зависимости от его наличия - есть файл, пишем с конца . Нет файла - создаём заново. Вот. И поскольку заполнение лога идёт через хук, мне требуется создать указатель на файл, (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);
   }
}
 

MISTER_GONWIK

Всефорумный гонщик
Всефорумный модератор
1,259
1,737
Отлично сказано.
Да вот я хотел поставить условие на проверку существования файла для логов, и открывать файл создавая указатель для записи, в зависимости от его наличия - есть файл, пишем с конца . Нет файла - создаём заново. Вот. И поскольку заполнение лога идёт через хук, мне требуется создать указатель на файл, (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);
   }
}

Это лишь пример накидал, но не пользуйся такими дерьмовыми функциями как:
C++:
GetCurrentDirectory(..), PathFileExists(..) и т.д.
займись изучением чего-то более классного и функционального

C++:
// после всех инклудов
#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;
}

ну и mainloop в твоём случае должен выглядеть вот так:
C++:
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;
    }
}

а irpc
C++:
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;
}
 
Последнее редактирование:
  • Нравится
Реакции: ishi

winrare

Новичок
75
1
Запустил через RakSAMP три бота на advance. Примерно через 10 минут двух ботов телепортировал к себе администратор, а ещё через минуту забанил всех трех за использование "песочницы".
Как он определил, что я использую "песочницу"? Скорее всего посмотрел, что одинаковые ip, но как тогда можно обмануть админов? Можно сделать, чтобы боты двигались, но администратор может телепортировать в любую точку и бот тупо может забежать в стену.
 

MISTER_GONWIK

Всефорумный гонщик
Всефорумный модератор
1,259
1,737
Запустил через RakSAMP три бота на advance. Примерно через 10 минут двух ботов телепортировал к себе администратор, а ещё через минуту забанил всех трех за использование "песочницы".
Как он определил, что я использую "песочницу"? Скорее всего посмотрел, что одинаковые ip, но как тогда можно обмануть админов? Можно сделать, чтобы боты двигались, но администратор может телепортировать в любую точку и бот тупо может забежать в стену.
проще сказать, что никак.
 

winrare

Новичок
75
1
для тебя это невозможно, хочешь чтоб бот бегал как человек, пиши систему путей, но учти, у тебя нет никакой карты коллизии
Такая система мне нужна в случае, если админ уже телепортировал меня. А что если просто не доходить до этого? Скорее всего он вычисляет меня по ip (если есть ещё варианты, скажи), значит если будут разные ip, то все будет нормально. Разные ip можно получить используя прокси, но я не знаю, поддерживает ли RakSAMP или хотя бы RakNet прокси.
 

MISTER_GONWIK

Всефорумный гонщик
Всефорумный модератор
1,259
1,737
Такая система мне нужна в случае, если админ уже телепортировал меня. А что если просто не доходить до этого? Скорее всего он вычисляет меня по ip (если есть ещё варианты, скажи), значит если будут разные ip, то все будет нормально. Разные ip можно получить используя прокси, но я не знаю, поддерживает ли RakSAMP или хотя бы RakNet прокси.
1. обычный раксамп не поддерживает работу через прокси, но сделать можно, как это сделать, думай сам.
2. я не админ на сервере, так что могут сказать лишь предположительно, что есть команда, по которой отображаются текущие онлайн аккаунты с одного ип (как ты и подумал), для раксампа нужны прокси UDP, их ты не найдёшь, только если с помощью программ hotspot shield и прочих.
3. сомневаюсь что всё это спасёт тебя от банов, ведь они всё равно палятся (я про ботов)
 
  • Нравится
Реакции: winrare

ishi

Известный
493
110
GetCurrentDirectory(..), PathFileExists(..)
А чем плохи конкретно эти функции?
займись изучением чего-то более классного и функционального
Я делаю так, как в клео привык - составляю на бумажке примерный "план" проекта, расписывая все нужные функции, а затем разбиваю эти функции на другие функции, без которых предыдущие реализовать не получится, и просто ввожу желаемые действия функций в поиск, не забывая указывать site:microsoft.com. Так я и нахожу нужные функции, а насколько они хороши мне судить как-то рановато, мне ведь даже не каждую из них применить-то удаётся, сам толком ничего не умею Х)
Но конечно спасибо за совет, расширять кругозор точно не будет лишним
 

MISTER_GONWIK

Всефорумный гонщик
Всефорумный модератор
1,259
1,737
А чем плохи конкретно эти функции?

Я делаю так, как в клео привык - составляю на бумажке примерный "план" проекта, расписывая все нужные функции, а затем разбиваю эти функции на другие функции, без которых предыдущие реализовать не получится, и просто ввожу желаемые действия функций в поиск, не забывая указывать site:microsoft.com. Так я и нахожу нужные функции, а насколько они хороши мне судить как-то рановато, мне ведь даже не каждую из них применить-то удаётся, сам толком ничего не умею Х)
Но конечно спасибо за совет, расширять кругозор точно не будет лишним
они устарели, я б сказал, что они больше С, а то что я скинул - С++
у std:: очень хороший функционал, изучай его
 
  • Нравится
Реакции: ishi