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

Ltall

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

ARMOR

kjor32 is legend
Модератор
4,851
6,081
Как можно сделать проверку на Нажатие/Зажатие кнопок мыши через 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

Нестандартное звание
Модератор
391
414
Как можно сделать проверку на Нажатие/Зажатие кнопок мыши через 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

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

Musaigen

abobusnik
Проверенный
1,583
1,302
Ку прив, использую 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

Потрачен
15
7
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как сделать бег к координатам ?
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);
}
 

why ega

РП игрок
Модератор
2,541
2,233
Посмотрел пару уроков по сф и решил сделать жоски скрипт с хуком синхры педа, сделал, ошибок при компиляции никаких нету, но хук как я понял не срабатывает.

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 вопроса: как можно это сделать в разных файлах и влияет ли как-то на производительность то, что все в одном файле или разделено на несколько?
 
Последнее редактирование:

!Sam#0235

Активный
122
40
возможно ли это сделать в .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
316
Посмотрел пару уроков по сф и решил сделать жоски скрипт с хуком синхры педа, сделал, ошибок при компиляции никаких нету, но хук как я понял не срабатывает.

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
 
  • Нравится
Реакции: why ega

why ega

РП игрок
Модератор
2,541
2,233
как сделать бег к координатам ?
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