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

sc6ut

неизвестный
Модератор
385
1,109
есть такой код
C++:
class CClass {
private:
    template<typename T>
    using callbacks = std::vector<T>;

    using SomeCallback_t = void(__stdcall*)(int, int);
 
    callbacks<SomeCallback_t> vecCallBacks;
public:
    inline auto operator += (SomeCallback_t func) -> void {
        vecCallBacks.push_back(func);
    };

    inline auto ProcessCallBack(int a, int b) -> void {
        printf("start of calling\n");
        for (auto i : vecCallBacks) {
            i(a, b);
        }
        printf("end of calling\n");
    };
};

int main()
{
    CClass tmp;

    int var1 = 10;

    tmp += [&](int a, int b)
    {
        var1++;
        printf("%d + %d = %d\n", a, b, a + b);
    };

    while (true) {
        tmp.ProcessCallBack(rand() % 100, rand() % 100);
        Sleep(300);
    }

    return 0;
}
Если указывать лямбду без захвата по ссылке, всё работает, однако, если попытаться создать лямбду с захватом переменных по ссылке, пишет, что нет перегруженного оператора +=, вопрос в том, как сделать так, чтобы лямбда
C++:
tmp += [&](int a, int b)
{
        var1++;
        printf("%d + %d = %d\n", a, b, a + b);
};
захватывала переменные по ссылке?
юзай std function
 
  • Нравится
Реакции: AdCKuY_DpO4uLa

Ltall

Потрачен
14
6
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

AdCKuY_DpO4uLa

Адский дрочер
Друг
369
822
Как исправить? https://prnt.sc/KKZw_b8gTUPz

В препроцессоре стоит /NODEFAULTLIB:libcmt.lib
 
  • Клоун
Реакции: Fott

Ltall

Потрачен
14
6
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

ARMOR

Я креветка
Модератор
5,067
7,398
Как можно сделать проверку на Нажатие/Зажатие кнопок мыши через WndProc? Вот так почему-то не работает.
C++:
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_KEYDOWN:
    {
        switch (wParam)
        {
            case VK_MBUTTON:
            {
                break;
            }
        }
    }
    }
    return CallWindowProcA(WNDPROC(pDLLProject.PrevWndFunc), hwnd, uMsg, wParam, lParam);
}
С VK_RETURN, VK_SPACE всё работает отлично, а с кнопками мыши - нет.
 
  • Нравится
Реакции: Nestle

RTD

Потужно
Модератор
410
486
Как можно сделать проверку на Нажатие/Зажатие кнопок мыши через WndProc? Вот так почему-то не работает.
C++:
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_KEYDOWN:
    {
        switch (wParam)
        {
            case VK_MBUTTON:
            {
                break;
            }
        }
    }
    }
    return CallWindowProcA(WNDPROC(pDLLProject.PrevWndFunc), hwnd, uMsg, wParam, lParam);
}
С VK_RETURN, VK_SPACE всё работает отлично, а с кнопками мыши - нет.
 
  • Влюблен
Реакции: ARMOR

sizeoftrickster

Известный
Проверенный
137
594
Ку прив, использую plugin-sdk, подскажите пожалуйста, как мне проверить на то, что объект коснулся чего угодно?
У меня обрабатывается это всё чудо в цикле, мне нужно, что-бы объект, когда косается чего-то, происходило действие, в данном случае удаление объекта, использовал z координату и проверял ее с 0.f, но мне кажется, что это неправильно, и я хочу понять, как мне сделать так, что-бы проверялось касание
C++:
if ( obj->GetPosition().z <= 0.f ) {
    CWorld::Remove(obj);
// ...
}
Для проверки объекта на касание использовал, ловил краш =)
C++:
// Crash
if ( obj->TestCollision() ) {
    // some actions...
}
 

Musaigen

ihatemyself
Проверенный
1,709
1,601
Ку прив, использую plugin-sdk, подскажите пожалуйста, как мне проверить на то, что объект коснулся чего угодно?
У меня обрабатывается это всё чудо в цикле, мне нужно, что-бы объект, когда косается чего-то, происходило действие, в данном случае удаление объекта, использовал z координату и проверял ее с 0.f, но мне кажется, что это неправильно, и я хочу понять, как мне сделать так, что-бы проверялось касание
C++:
if ( obj->GetPosition().z <= 0.f ) {
    CWorld::Remove(obj);
// ...
}
Для проверки объекта на касание использовал, ловил краш =)
C++:
// Crash
if ( obj->TestCollision() ) {
    // some actions...
}
Хукни коллизию и доставай с esi/edi два касающихся объекта. kthook вполне с этим справится. Адрес можно найти в сурсах коллизии от фипа
 

Ltall

Потрачен
14
6
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как сделать бег к координатам ?
C++:
float* xCam = (float*)0xB6F258;
DWORD* ptrActor = (DWORD*)0xB6F5F0;

void rotateCamToXY(float x, float y) {

    DWORD* pActorMtrx = (DWORD*)((*ptrActor) + 0x14);

    CVector2D pPos(*(float*)((*pActorMtrx) + 0x30), *(float*)((*pActorMtrx) + 0x34));
    CVector2D cPos(*(float*)(0xB6F9CC), *(float*)(0xB6F9D0));

    float ac = sqrt(pow(fabs(cPos.fX - x), 2) + pow(fabs(cPos.fY - y), 2));
    float alpha = asin(fabs(cPos.fX - x) / ac);
    float beta = acos(fabs(cPos.fX - x) / ac);

    if ((pPos.fX > x) && (pPos.fY < y))
        *xCam = -beta;
    if ((pPos.fX > x) && (pPos.fY > y))
        *xCam = beta;
    if ((pPos.fX < x) && (pPos.fY > y))
        *xCam = (alpha + (1.57));
    if ((pPos.fX < x) && (pPos.fY < y))
        *xCam = (-alpha - (1.57));

    keybd_event(VK_SPACE, 0, 0, 0);
    keybd_event(0x57, 0, 0, 0);
}
 

вайега52

Налуашил состояние
Модератор
2,996
3,125
Посмотрел пару уроков по сф и решил сделать жоски скрипт с хуком синхры педа, сделал, ошибок при компиляции никаких нету, но хук как я понял не срабатывает.

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
43
возможно ли это сделать в .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