Merge pull request #729 from diamante0018/main
feat: cl_yawspeed & cl_pitchspeed
This commit is contained in:
commit
6762da248b
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
# What is BOIII ☄️
|
# What is BOIII ☄️
|
||||||
|
|
||||||
BOIII is a game modification for Call of Duty: Black Ops 3.
|
BOIII is a game modification for Call of Duty: Black Ops 3.
|
||||||
The Steam version of Black Ops 3 is required to be owned and installed for BOIII to work. You can get it from <a href="https://store.steampowered.com/app/311210/Call_of_Duty_Black_Ops_III/">here</a>, if you don't already own it.
|
The Steam version of Black Ops 3 is required to be owned and installed for BOIII to work. You can get it from <a href="https://store.steampowered.com/app/311210/Call_of_Duty_Black_Ops_III/">here</a>, if you don't already own it.
|
||||||
|
|
||||||
<img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQeSXYzQITJrcjiifN1nqX1fsVE7VwLZ3vl2g&usqp=CAU">
|
<img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQeSXYzQITJrcjiifN1nqX1fsVE7VwLZ3vl2g&usqp=CAU">
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include "scheduler.hpp"
|
#include "scheduler.hpp"
|
||||||
|
|
||||||
#include <game/game.hpp>
|
#include <game/game.hpp>
|
||||||
|
#include <game/utils.hpp>
|
||||||
|
|
||||||
#include <utils/hook.hpp>
|
#include <utils/hook.hpp>
|
||||||
#include <utils/io.hpp>
|
#include <utils/io.hpp>
|
||||||
@ -16,6 +17,9 @@ namespace client_patches
|
|||||||
{
|
{
|
||||||
utils::hook::detour preload_map_hook;
|
utils::hook::detour preload_map_hook;
|
||||||
|
|
||||||
|
const game::dvar_t* cl_yaw_speed;
|
||||||
|
const game::dvar_t* cl_pitch_speed;
|
||||||
|
|
||||||
void stop_intro_if_needed()
|
void stop_intro_if_needed()
|
||||||
{
|
{
|
||||||
if (game::Com_SessionMode_GetMode() != game::MODE_ZOMBIES &&
|
if (game::Com_SessionMode_GetMode() != game::MODE_ZOMBIES &&
|
||||||
@ -110,6 +114,16 @@ namespace client_patches
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float cl_key_state_yaw_speed_stub(void* key)
|
||||||
|
{
|
||||||
|
return game::CL_KeyState(key) * cl_yaw_speed->current.value.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
float cl_key_state_pitch_speed_stub(void* key)
|
||||||
|
{
|
||||||
|
return game::CL_KeyState(key) * cl_pitch_speed->current.value.value;
|
||||||
|
}
|
||||||
|
|
||||||
game::fileHandle_t fs_f_open_file_write_to_dir_stub(const char* filename, [[maybe_unused]] const char* dir,
|
game::fileHandle_t fs_f_open_file_write_to_dir_stub(const char* filename, [[maybe_unused]] const char* dir,
|
||||||
const char* os_base_path)
|
const char* os_base_path)
|
||||||
{
|
{
|
||||||
@ -183,6 +197,8 @@ namespace client_patches
|
|||||||
class component final : public client_component
|
class component final : public client_component
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
static_assert(offsetof(game::clientActive_t, viewangles) == 0xB8C8);
|
||||||
|
|
||||||
component()
|
component()
|
||||||
{
|
{
|
||||||
migrate_if_needed(); // TODO: Remove me after some time
|
migrate_if_needed(); // TODO: Remove me after some time
|
||||||
@ -210,6 +226,17 @@ namespace client_patches
|
|||||||
// Always get loadscreen gametype from s_gametype
|
// Always get loadscreen gametype from s_gametype
|
||||||
utils::hook::set<uint8_t>(0x14228F5DC_g, 0xEB);
|
utils::hook::set<uint8_t>(0x14228F5DC_g, 0xEB);
|
||||||
|
|
||||||
|
cl_yaw_speed = game::register_dvar_float("cl_yawspeed", 140.0f, std::numeric_limits<float>::min(), std::numeric_limits<float>::max(),
|
||||||
|
game::DVAR_NONE, "Max yaw speed in degrees for game pad and keyboard");
|
||||||
|
cl_pitch_speed = game::register_dvar_float("cl_pitchspeed", 140.0f, std::numeric_limits<float>::min(), std::numeric_limits<float>::max(),
|
||||||
|
game::DVAR_NONE, "Max pitch speed in degrees for game pad");
|
||||||
|
// CL_AdjustAngles
|
||||||
|
utils::hook::call(0x1412F3324_g, cl_key_state_yaw_speed_stub); // cl_yawspeed
|
||||||
|
utils::hook::call(0x1412F3344_g, cl_key_state_yaw_speed_stub); // ^^
|
||||||
|
|
||||||
|
utils::hook::call(0x1412F3380_g, cl_key_state_pitch_speed_stub); // cl_pitchspeed
|
||||||
|
utils::hook::call(0x1412F33A1_g, cl_key_state_pitch_speed_stub); // ^^
|
||||||
|
|
||||||
patch_players_folder_name();
|
patch_players_folder_name();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -11,7 +11,6 @@ namespace patches
|
|||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
const game::dvar_t* lobby_min_players;
|
const game::dvar_t* lobby_min_players;
|
||||||
const game::dvar_t* cl_yaw_speed;
|
|
||||||
|
|
||||||
void script_errors_stub([[maybe_unused]] const char* file, [[maybe_unused]] int line,
|
void script_errors_stub([[maybe_unused]] const char* file, [[maybe_unused]] int line,
|
||||||
[[maybe_unused]] unsigned int code, const char* fmt, ...)
|
[[maybe_unused]] unsigned int code, const char* fmt, ...)
|
||||||
@ -79,9 +78,6 @@ namespace patches
|
|||||||
|
|
||||||
lobby_min_players = game::register_dvar_int("lobby_min_players", 0, 0, 8, game::DVAR_NONE, "");
|
lobby_min_players = game::register_dvar_int("lobby_min_players", 0, 0, 8, game::DVAR_NONE, "");
|
||||||
utils::hook::jump(game::select(0x141A7BCF0, 0x1402CB900), scr_get_num_expected_players, true);
|
utils::hook::jump(game::select(0x141A7BCF0, 0x1402CB900), scr_get_num_expected_players, true);
|
||||||
|
|
||||||
cl_yaw_speed = game::register_dvar_float("cl_yawspeed", 140.0f, std::numeric_limits<float>::min(), std::numeric_limits<float>::max(),
|
|
||||||
game::DVAR_NONE, "Max yaw speed in degrees for game pad and keyboard");
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -634,6 +634,41 @@ namespace game
|
|||||||
void* errorData;
|
void* errorData;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum connstate_t
|
||||||
|
{
|
||||||
|
CA_DISCONNECTED = 0x0,
|
||||||
|
CA_CINEMATIC = 0x1,
|
||||||
|
CA_UICINEMATIC = 0x2,
|
||||||
|
CA_LOGO = 0x3,
|
||||||
|
CA_CONNECTING = 0x4,
|
||||||
|
CA_CHALLENGING = 0x5,
|
||||||
|
CA_CONFIRMLOADING = 0x6,
|
||||||
|
CA_CONNECTED = 0x7,
|
||||||
|
CA_SENDINGDATA = 0x8,
|
||||||
|
CA_LOADING = 0x9,
|
||||||
|
CA_PRIMED = 0xA,
|
||||||
|
CA_ACTIVE = 0xB,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct clientUIActive_t
|
||||||
|
{
|
||||||
|
int flags;
|
||||||
|
int keyCatchers;
|
||||||
|
connstate_t connectionState;
|
||||||
|
unsigned char __pad0[0x106C];
|
||||||
|
};
|
||||||
|
|
||||||
|
static_assert(sizeof(clientUIActive_t) == 0x1078);
|
||||||
|
|
||||||
|
struct clientActive_t
|
||||||
|
{
|
||||||
|
char __pad0[0xB8C8];
|
||||||
|
float viewangles[3];
|
||||||
|
char __pad1[0x18C15C];
|
||||||
|
};
|
||||||
|
|
||||||
|
static_assert(sizeof(clientActive_t) == 0x197A30);
|
||||||
|
|
||||||
typedef void* fileHandle_t;
|
typedef void* fileHandle_t;
|
||||||
|
|
||||||
typedef uint32_t dvarStrHash_t;
|
typedef uint32_t dvarStrHash_t;
|
||||||
|
@ -20,6 +20,8 @@ namespace game
|
|||||||
WEAK symbol<bool(int localClientNum, int index, char* buf, int size, bool addClanName)> CL_GetClientName{
|
WEAK symbol<bool(int localClientNum, int index, char* buf, int size, bool addClanName)> CL_GetClientName{
|
||||||
0x1413E3140
|
0x1413E3140
|
||||||
};
|
};
|
||||||
|
WEAK symbol<bool(int localClientNum)> CL_LocalClient_IsActive{0x14283AA50};
|
||||||
|
WEAK symbol<float(void* key)> CL_KeyState{0x1412FF860};
|
||||||
|
|
||||||
// Game
|
// Game
|
||||||
WEAK symbol<void(gentity_s* ent, gentity_s* target, int mode, const char* chatText)> G_Say{0x0, 0x140299170};
|
WEAK symbol<void(gentity_s* ent, gentity_s* target, int mode, const char* chatText)> G_Say{0x0, 0x140299170};
|
||||||
@ -282,6 +284,8 @@ namespace game
|
|||||||
// Dvar variables
|
// Dvar variables
|
||||||
WEAK symbol<dvar_t*> com_maxclients{0x0, 0x14948EE70};
|
WEAK symbol<dvar_t*> com_maxclients{0x0, 0x14948EE70};
|
||||||
|
|
||||||
|
WEAK symbol<clientUIActive_t> clientUIActives{0x1453D8BC0};
|
||||||
|
|
||||||
namespace s_wcd
|
namespace s_wcd
|
||||||
{
|
{
|
||||||
WEAK symbol<HWND> codLogo{0x157E75A50, 0x14A640BC0};
|
WEAK symbol<HWND> codLogo{0x157E75A50, 0x14A640BC0};
|
||||||
|
Loading…
Reference in New Issue
Block a user