уменьшить сужение прицела

Vespan

loneliness
Автор темы
Проверенный
2,139
1,782
Версия MoonLoader
.026-beta
как можно снизить-увеличить время сужения прицела 💫
 
  • Вау
Реакции: MLycoris

stool

Известный
426
342
1724523092687.png

в теории, можно
если у меня получится, скину код
1724523167764.png

пока сам ебусь
 
  • Эм
Реакции: Corenale

chromiusj

Стань той переменой, которую хочешь увидеть в мире
Модератор
5,732
4,040

stool

Известный
426
342

Вложения

  • 1724532614323.jpeg
    1724532614323.jpeg
    9.4 KB · Просмотры: 24
Последнее редактирование:

ARMOR

Мне кажется, я всё проебал
Модератор
5,017
7,091
если это CHud::DrawCrosshairs, то это не то, там только отрисовка с использованием getWeaponRadiusOnScreen
Если хукнуть CSprite::Draw() по адресу 0x58E3A5, то размер при выстреле меняться не будет, значит его сужение вызывается именно в CRect.

Само сужение получается с помощью CPlayerPed::GetWeaponRadiusOnScreen, ты прав. И нужно как-то изменять параметр который возвращает этот метод
1724535201492.png
 

stool

Известный
426
342
Если хукнуть CSprite::Draw() по адресу 0x58E3A5, то размер при выстреле меняться не будет, значит его сужение вызывается именно в CRect.

Само сужение получается с помощью CPlayerPed::GetWeaponRadiusOnScreen, ты прав. И нужно как-то изменять параметр который возвращает этот метод
Посмотреть вложение 250205
я пришел к совершенно идиотскому решению, за которое на самом деле нужно по рукам розгой бить

в общем, @Vespan, вот код, который ВЛИЯЕТ на скорость анимации сужения прицела

Код:
local ffi = require('ffi')

ffi.cast("float*", 0x856CA0)[0] = 0.01 -- 0.5
ffi.cast("unsigned long*", 0x609CFD)[0] = 0x856ca0

ffi.cast("float*", 0x856CB0)[0] = 10.5 --0.5
ffi.cast("unsigned long*", 0x609D45)[0] = 0x856CB0

играйся со значениями, в комментариях (-- 0.5) вроде как дефолтное значение
что делает код? объявляет в жопе памяти игры пару флоатов и задает там значение, а потом патчит код GetWeaponRadiusOnScreen, чтобы они брали флоаты оттуда, а не изначальные константы.
метод явно неадекватный, возможно, есть способ проще и лучше, но я, честно говоря, заебался его искать с буквально головной болью

бонусом держи килограмм говна
Код:
-- https://github.com/DK22Pac/plugin-sdk
-- https://github.com/gta-reversed/gta-reversed-modern

local ffi = require('ffi')

local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF


-- 0xB7CD98 - CPed
local wep_ch = {
    getWeaponRadius = ffi.cast("float (__thiscall*)(int cped)", 0x609CD0)
}

-- D8 3D 8C8B8500
-- D8 3D A06C8500

-- определяем переменную множителя прицела в памяти
ffi.cast("float*", 0x856CA0)[0] = 0.5
-- патчим функцию getWeaponRadiusOnScreen
-- чтобы она работала с новым значением
ffi.cast("unsigned long*", 0x609CFD)[0] = 0x856ca0
-- ^ зачем? чтобы игру не распидорасило, если будешь менять оригинальное значение по адресу 0x856CA0

-- const float rangeProg = std::min(1.0f, 15.0f / wepInfo.m_fWeaponRange);
ffi.cast("float*", 0x856CA8)[0] = 15.0
ffi.cast("unsigned long*", 0x609D22)[0] = 0x856ca8

-- const float rangeProg = std::min(1.0f, 15.0f / wepInfo.m_fWeaponRange);
ffi.cast("float*", 0x856CAC)[0] = 1.0
ffi.cast("unsigned long*", 0x609D28)[0] = 0x856CAC

--x
-- ffi.cast("float*", 0x856CB0)[0] = 1.0
-- ffi.cast("unsigned long*", 0x609D39)[0] = 0x856CB0


-- тоже мульт радиус штоле
-- ffi.cast("float*", 0x856CB0)[0] = 0.5 --0.5
-- ffi.cast("unsigned long*", 0x609D45)[0] = 0x856CB0

-- множитель размера прицела
ffi.cast("float*", 0x856CB4)[0] = 0.25 --0.5
ffi.cast("unsigned long*", 0x609D59)[0] = 0x856CB4
ffi.cast("float*", 0x8D24E4)[0] = 0.05

-- if ( result < 0.2 ) return 0.2;
ffi.cast("float*", 0x856CB8)[0] = 0.2 --0.20
ffi.cast("unsigned long*", 0x609D77)[0] = 0x856CB8

-- хуй знает похоже на базовое значение прицела
-- ffi.cast("float*", 0x856CBC)[0] = 0.2 --0.20
-- ffi.cast("unsigned long*", 0x609D86)[0] = 0x856CBC

ffi.cast("float*", 0x856CB8)[0] = 0.2 --0.20
ffi.cast("unsigned long*", 0x609D77)[0] = 0x856CB8



ffi.cast("float*", 0x856CBC)[0] = 64.0 --0.20
ffi.cast("unsigned long*", 0x58E307)[0] = 0x856CBC


-- CPed + mPlayerData + m_fAttackButtonCounter
-- 0xB7CD98 + 0x480 + 0x2c


function wep_ch:radius_get()
    return wep_ch.getWeaponRadius(ffi.cast("int32_t*", 0xb7cd98)[0])
end

function wep_ch:radius_max_get()
    return ffi.cast("float*", 0x8D24E4)[0]
end       

function wep_ch:radius_max_set(max_radius)
    ffi.cast("float*", 0x8D24E4)[0] = tonumber(max_radius)
end

function wep_ch:radius_mult_get()
    return ffi.cast("float*", 0x856CA0)[0]
end

function wep_ch:radius_mult_set(mult)
    ffi.cast("float*", 0x856CA0)[0] = tonumber(mult)
end

local cped = ffi.cast("int32_t*", 0xB7CD98)
local mPlayerData = ffi.cast("int32_t*", cped[0] + 0x480)


function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand("ch_rad_max", function (max_radius)
        if #max_radius ~= 0 then
            wep_ch:radius_max_set(max_radius)
        else
            sampAddChatMessage("current max radius: " .. wep_ch:radius_max_get(), -1)
        end
    end)

    sampRegisterChatCommand("ch_rad_mult", function (mult)
        if #mult ~= 0 then
            wep_ch:radius_mult_set(mult)
        else
            sampAddChatMessage("current radius multiplier: " .. wep_ch:radius_mult_get(), -1)
        end
    end)


    sampAddChatMessage("123", -1)
    -- ffi.cast("float*", mPlayerData[0] + 0x2C)[0] = 120.0

    while true do wait(0)
        local m_fAttackButtonCounter = ffi.cast("float*", mPlayerData[0] + 0x2C)
    end
end

И нужно как-то изменять параметр который возвращает этот метод
если через cheat engine покопаться в участке getWeaponRadiusOnScreen, то там можно кучу флоатов достать, с которыми можно поиграться и посмотреть что будет. я на это убил несколько часов, как грамотно поменять поведение линейной интерполяции - не разобрался, получилось только говно дропнуть, но к желаемому результату оно вполне может приводить
 
  • Нравится
  • Влюблен
Реакции: Vespan, ARMOR и movebx

movebx

Известный
70
197
я пришел к совершенно идиотскому решению, за которое на самом деле нужно по рукам розгой бить

в общем, @Vespan, вот код, который ВЛИЯЕТ на скорость анимации сужения прицела

Код:
local ffi = require('ffi')

ffi.cast("float*", 0x856CA0)[0] = 0.01 -- 0.5
ffi.cast("unsigned long*", 0x609CFD)[0] = 0x856ca0

ffi.cast("float*", 0x856CB0)[0] = 10.5 --0.5
ffi.cast("unsigned long*", 0x609D45)[0] = 0x856CB0

играйся со значениями, в комментариях (-- 0.5) вроде как дефолтное значение
что делает код? объявляет в жопе памяти игры пару флоатов и задает там значение, а потом патчит код GetWeaponRadiusOnScreen, чтобы они брали флоаты оттуда, а не изначальные константы.
метод явно неадекватный, возможно, есть способ проще и лучше, но я, честно говоря, заебался его искать с буквально головной болью

бонусом держи килограмм говна
Код:
-- https://github.com/DK22Pac/plugin-sdk
-- https://github.com/gta-reversed/gta-reversed-modern

local ffi = require('ffi')

local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF


-- 0xB7CD98 - CPed
local wep_ch = {
    getWeaponRadius = ffi.cast("float (__thiscall*)(int cped)", 0x609CD0)
}

-- D8 3D 8C8B8500
-- D8 3D A06C8500

-- определяем переменную множителя прицела в памяти
ffi.cast("float*", 0x856CA0)[0] = 0.5
-- патчим функцию getWeaponRadiusOnScreen
-- чтобы она работала с новым значением
ffi.cast("unsigned long*", 0x609CFD)[0] = 0x856ca0
-- ^ зачем? чтобы игру не распидорасило, если будешь менять оригинальное значение по адресу 0x856CA0

-- const float rangeProg = std::min(1.0f, 15.0f / wepInfo.m_fWeaponRange);
ffi.cast("float*", 0x856CA8)[0] = 15.0
ffi.cast("unsigned long*", 0x609D22)[0] = 0x856ca8

-- const float rangeProg = std::min(1.0f, 15.0f / wepInfo.m_fWeaponRange);
ffi.cast("float*", 0x856CAC)[0] = 1.0
ffi.cast("unsigned long*", 0x609D28)[0] = 0x856CAC

--x
-- ffi.cast("float*", 0x856CB0)[0] = 1.0
-- ffi.cast("unsigned long*", 0x609D39)[0] = 0x856CB0


-- тоже мульт радиус штоле
-- ffi.cast("float*", 0x856CB0)[0] = 0.5 --0.5
-- ffi.cast("unsigned long*", 0x609D45)[0] = 0x856CB0

-- множитель размера прицела
ffi.cast("float*", 0x856CB4)[0] = 0.25 --0.5
ffi.cast("unsigned long*", 0x609D59)[0] = 0x856CB4
ffi.cast("float*", 0x8D24E4)[0] = 0.05

-- if ( result < 0.2 ) return 0.2;
ffi.cast("float*", 0x856CB8)[0] = 0.2 --0.20
ffi.cast("unsigned long*", 0x609D77)[0] = 0x856CB8

-- хуй знает похоже на базовое значение прицела
-- ffi.cast("float*", 0x856CBC)[0] = 0.2 --0.20
-- ffi.cast("unsigned long*", 0x609D86)[0] = 0x856CBC

ffi.cast("float*", 0x856CB8)[0] = 0.2 --0.20
ffi.cast("unsigned long*", 0x609D77)[0] = 0x856CB8



ffi.cast("float*", 0x856CBC)[0] = 64.0 --0.20
ffi.cast("unsigned long*", 0x58E307)[0] = 0x856CBC


-- CPed + mPlayerData + m_fAttackButtonCounter
-- 0xB7CD98 + 0x480 + 0x2c


function wep_ch:radius_get()
    return wep_ch.getWeaponRadius(ffi.cast("int32_t*", 0xb7cd98)[0])
end

function wep_ch:radius_max_get()
    return ffi.cast("float*", 0x8D24E4)[0]
end      

function wep_ch:radius_max_set(max_radius)
    ffi.cast("float*", 0x8D24E4)[0] = tonumber(max_radius)
end

function wep_ch:radius_mult_get()
    return ffi.cast("float*", 0x856CA0)[0]
end

function wep_ch:radius_mult_set(mult)
    ffi.cast("float*", 0x856CA0)[0] = tonumber(mult)
end

local cped = ffi.cast("int32_t*", 0xB7CD98)
local mPlayerData = ffi.cast("int32_t*", cped[0] + 0x480)


function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand("ch_rad_max", function (max_radius)
        if #max_radius ~= 0 then
            wep_ch:radius_max_set(max_radius)
        else
            sampAddChatMessage("current max radius: " .. wep_ch:radius_max_get(), -1)
        end
    end)

    sampRegisterChatCommand("ch_rad_mult", function (mult)
        if #mult ~= 0 then
            wep_ch:radius_mult_set(mult)
        else
            sampAddChatMessage("current radius multiplier: " .. wep_ch:radius_mult_get(), -1)
        end
    end)


    sampAddChatMessage("123", -1)
    -- ffi.cast("float*", mPlayerData[0] + 0x2C)[0] = 120.0

    while true do wait(0)
        local m_fAttackButtonCounter = ffi.cast("float*", mPlayerData[0] + 0x2C)
    end
end


если через cheat engine покопаться в участке getWeaponRadiusOnScreen, то там можно кучу флоатов достать, с которыми можно поиграться и посмотреть что будет. я на это убил несколько часов, как грамотно поменять поведение линейной интерполяции - не разобрался, получилось только говно дропнуть, но к желаемому результату оно вполне может приводить
C++:
float hueta = GetLocalPed()->GetPlayerData()->m_fHUETA
 
  • Эм
Реакции: ARMOR и stool