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

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,780
2,604
Посмотрел пару уроков по сф и решил сделать жоски скрипт с хуком синхры педа, сделал, ошибок при компиляции никаких нету, но хук как я понял не срабатывает.

main.cpp:
#include "main.h"

SAMPFUNCS *SF = new SAMPFUNCS();

void __stdcall mainloop()
{
    static bool initialized = false;
    if (!initialized)
    {
        if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
        {
            initialized = true;

            SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_OUTCOMING_PACKET, onSendPacket);

            SF->getSAMP()->registerChatCommand("abc", [](std::string) {
                AddChat(-1, "Mamut_Rahal active");
                actived = !actived;
            });

            //SF->getSAMP()->getPlayers()->GetActorHandleFromSAMPPlayerID(id);
            SF->getSAMP()->getPlayers()->pRemotePlayer;
            AddChat(-1, "Ну типа работа с синхрой бу Ега.");
        }
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    if (dwReasonForCall == DLL_PROCESS_ATTACH)
        SF->initPlugin(mainloop, hModule);
    return TRUE;
}

main.h:
#pragma once

#include "SAMPFUNCS_API.h"
#include "game_api.h"

bool __stdcall onSendPacket(stRakNetHookParams* param);
static bool actived = false;

#define AddChat SF->getSAMP()->getChat()->AddChatMessage

extern SAMPFUNCS *SF;

raknet.cpp (сам хук):
#include "main.h"

bool __stdcall onSendPacket(stRakNetHookParams* param)
{
    if (param->packetId == ID_PLAYER_SYNC)
    {
        if (actived)
        {
            BYTE packet;
            stOnFootData data;
            memset(&data, 0, sizeof(stOnFootData));

            //float pos = SF->getSAMP()->getPlayers()->GetOnFootData(2)->fPosition[3];

            param->bitStream->ResetReadPointer();
            param->bitStream->Read(packet);
            param->bitStream->Read((PCHAR)&data, sizeof(stOnFootData));

            data.fMoveSpeed[0] = 2.5f;
            data.fMoveSpeed[1] = 2.5f;
            data.fMoveSpeed[2] = 2.5f;

            param->bitStream->ResetWritePointer();
            param->bitStream->Write((PCHAR)packet);
            param->bitStream->Write((PCHAR)&data, sizeof(stOnFootData));

            AddChat(-1, "%f %f %f", data.fMoveSpeed[0], data.fMoveSpeed[1], data.fMoveSpeed[2]);
        }
    }

    return true;
}
P.S. смог решить тем, что хук перенес из отдельного файла в main.cpp. Тогда еще 2 вопроса: как можно это сделать в разных файлах и влияет ли как-то на производительность то, что все в одном файле или разделено на несколько?
 
Последнее редактирование:

0x73616D

Активный
140
42
возможно ли это сделать в .asi? есть какой-нибудь пример?
Lua:
local encoding = require 'encoding' -- подключаем для корректной отправки русских букв
encoding.default = 'CP1251'
u8 = encoding.UTF8
local sampev = require 'lib.samp.events' -- подключаем для хука отправки ответа на диалог
local effil = require 'effil' -- для ассинхронных запросов

local url = 'URL'
local data = {
   ['content'] = '', -- текст (меняется через команду, так что можно оставить пустым)
   ['username'] = 'Sended from .lua script!', -- ник отправителя
   ['avatar_url'] = 'https://c.tenor.com/Z9mXH7-MlcsAAAAS/sexy-black-man-thirst-trap.gif', -- ссылка на аватарку (можно убрать, будет дефолтная)
   ['tts'] = false, -- tts - text to speech - читалка сообщений (true/false)
   -- так же можно сделать еще много чего, подробнее тут: https://discord.com/developers/docs/resources/webhook
}

function main()
   while not isSampAvailable() do wait(0) end
   sampRegisterChatCommand('ds.msg', function(arg)
      data['username'] = sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))) -- ник отправителя = ник в игре
      data['content'] = arg -- делаем что бы текст сообщения был равен тексту который мы ввели после команды
      -- отправляем запрос
      asyncHttpRequest('POST', url, {headers = {['content-type'] = 'application/json'}, data = u8(encodeJson(data))},
      function(response)
         print('[WebHook] [OK] отправлено!')
      end,
      function(err)
         print('[WebHook] [ERROR] error: '..err)
      end)
   end)
   wait(-1)
end

-- функция для отправки ассинхронных сообщений
function asyncHttpRequest(method, url, args, resolve, reject)
   local request_thread = effil.thread(function (method, url, args)
      local requests = require 'requests'
      local result, response = pcall(requests.request, method, url, args)
      if result then
         response.json, response.xml = nil, nil
         return true, response
      else
         return false, response
      end
   end)(method, url, args)
   -- Если запрос без функций обработки ответа и ошибок.
   if not resolve then resolve = function() end end
   if not reject then reject = function() end end
   -- Проверка выполнения потока
   lua_thread.create(function()
      local runner = request_thread
      while true do
         local status, err = runner:status()
         if not err then
            if status == 'completed' then
               local result, response = runner:get()
               if result then
                  resolve(response)
               else
                  reject(response)
               end
               return
            elseif status == 'canceled' then
               return reject(status)
            end
         else
            return reject(err)
         end
         wait(0)
      end
   end)
end
 
  • Ха-ха
Реакции: cort

MeG@LaDo[N] ^_^

Известный
280
319
Посмотрел пару уроков по сф и решил сделать жоски скрипт с хуком синхры педа, сделал, ошибок при компиляции никаких нету, но хук как я понял не срабатывает.

main.cpp:
#include "main.h"

SAMPFUNCS *SF = new SAMPFUNCS();

void __stdcall mainloop()
{
    static bool initialized = false;
    if (!initialized)
    {
        if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
        {
            initialized = true;

            SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_OUTCOMING_PACKET, onSendPacket);

            SF->getSAMP()->registerChatCommand("abc", [](std::string) {
                AddChat(-1, "Mamut_Rahal active");
                actived = !actived;
            });

            //SF->getSAMP()->getPlayers()->GetActorHandleFromSAMPPlayerID(id);
            SF->getSAMP()->getPlayers()->pRemotePlayer;
            AddChat(-1, "Ну типа работа с синхрой бу Ега.");
        }
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
    if (dwReasonForCall == DLL_PROCESS_ATTACH)
        SF->initPlugin(mainloop, hModule);
    return TRUE;
}

main.h:
#pragma once

#include "SAMPFUNCS_API.h"
#include "game_api.h"

bool __stdcall onSendPacket(stRakNetHookParams* param);
static bool actived = false;

#define AddChat SF->getSAMP()->getChat()->AddChatMessage

extern SAMPFUNCS *SF;

raknet.cpp (сам хук):
#include "main.h"

bool __stdcall onSendPacket(stRakNetHookParams* param)
{
    if (param->packetId == ID_PLAYER_SYNC)
    {
        if (actived)
        {
            BYTE packet;
            stOnFootData data;
            memset(&data, 0, sizeof(stOnFootData));

            //float pos = SF->getSAMP()->getPlayers()->GetOnFootData(2)->fPosition[3];

            param->bitStream->ResetReadPointer();
            param->bitStream->Read(packet);
            param->bitStream->Read((PCHAR)&data, sizeof(stOnFootData));

            data.fMoveSpeed[0] = 2.5f;
            data.fMoveSpeed[1] = 2.5f;
            data.fMoveSpeed[2] = 2.5f;

            param->bitStream->ResetWritePointer();
            param->bitStream->Write((PCHAR)packet);
            param->bitStream->Write((PCHAR)&data, sizeof(stOnFootData));

            AddChat(-1, "%f %f %f", data.fMoveSpeed[0], data.fMoveSpeed[1], data.fMoveSpeed[2]);
        }
    }

    return true;
}
P.S. смог решить тем, что хук перенес из отдельного файла в main.cpp. Тогда еще 2 вопроса: как можно это сделать в разных файлах и влияет ли как-то на производительность то, что все в одном файле или разделено на несколько?
создать raknet.h и добавить прототип bool __stdcall onSendPacket(stRakNetHookParams* param);
и подключить этот файл в main.h и raknet.cpp
или вместо .cpp/h юзать .hpp
 
  • Нравится
Реакции: whyega52

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,780
2,604
как сделать бег к координатам ?
C++:
void Camera::TurnToCoord(Vector3 vecObj, float smooth) {
    Vector3 playerPos = sdk::player::coordinate();
    Vector2 ViewAngle = sdk::camera::angle();

    Vector3 vec = vecObj - playerPos;
    Vector2 CameraAngle = Vector2(std::atan2(-vec.Length2d(), vec.z) * 0.1, std::atan2(-vec.y, -vec.x));
    Vector2 calcAngle = (CameraAngle - ViewAngle) / smooth; //чем больше смутч, тем плавнее

    Utils::setCameraAngle(ViewAngle + calcAngle);
}
Видел эту функцию на другом форуме
 
  • Нравится
Реакции: cort

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,744
4,808
Ку прив, использую plugin-sdk, подскажите пожалуйста, как мне проверить на то, что объект коснулся чего угодно?
У меня обрабатывается это всё чудо в цикле, мне нужно, что-бы объект, когда косается чего-то, происходило действие, в данном случае удаление объекта, использовал z координату и проверял ее с 0.f, но мне кажется, что это неправильно, и я хочу понять, как мне сделать так, что-бы проверялось касание
C++:
if ( obj->GetPosition().z <= 0.f ) {
    CWorld::Remove(obj);
// ...
}
Для проверки объекта на касание использовал, ловил краш =)
C++:
// Crash
if ( obj->TestCollision() ) {
    // some actions...
}
C++:
kthook::kthook_naked hook{ 0x54BCEE };

hook.set_cb([](const kthook::kthook_naked& hook) {
    auto for_obj = reinterpret_cast<CEntity*>(hook.get_context().esi);
    auto with_obj = reinterpret_cast<CEntity*>(hook.get_context().edi);
   
    /*
    if (for_obj == my_obj || with_obj == my_obj) {
       
    }
    */
});

hook.install();
 

Saroking

Потрачен
3
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
всем привет,не могу понять как фиксится данная проблема? хочу поставить в ImGui русский язык но u8 не работает:
1663856295797.png
 

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,780
2,604
Есть ли wiki по функциям сампфункса, как у луа?
 

MeG@LaDo[N] ^_^

Известный
280
319
всем привет,не могу понять как фиксится данная проблема? хочу поставить в ImGui русский язык но u8 не работает:Посмотреть вложение 169966
а у тебя в настройках проекта стоит какая кодировка? Многобайтовая или Юникод? Вроде из за этого трабл(нужно многобайтовую поставить)
 

Saroking

Потрачен
3
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
а у тебя в настройках проекта стоит какая кодировка? Многобайтовая или Юникод? Вроде из за этого трабл(нужно многобайтовую поставить)
многобайтовая,я пробывал и юникод и вообще вырубать,всё равно такая ощибка.
 

Sadow

Известный
1,428
592
Почему выдаёт ошибку?
C++:
#include <iostream>
using namespace std;

int main()
{

}
 
Последнее редактирование:

ARMOR

Модератор по раксампу
Модератор
4,937
6,734
Почему выдаёт ошибку?
Код:
#include <iostream>
using namespace std;

int main()
{

}
int должен возвращать любое значение. Введи в конец функции return 0;
C++:
int main(){


    return 0; 
}

Мне показывает что проблема в #include<iostream>
После #include должен быть пробел, и только потом <iostream>
 
  • Нравится
Реакции: whyega52