From ab585db973c8781aba475fd05447e4ca8c832885 Mon Sep 17 00:00:00 2001 From: MysterD Date: Tue, 16 May 2023 02:03:49 -0700 Subject: [PATCH] Prevent lua mods from saving over your camera settings --- src/game/behaviors/chain_chomp.inc.c | 4 +- src/game/behaviors/ttc_pendulum.inc.c | 2 +- src/game/bettercamera.inc.h | 21 +++---- src/game/camera.c | 5 +- src/game/object_helpers.c | 3 +- src/pc/lua/utils/smlua_misc_utils.c | 79 ++++++++++++++++++++------- src/pc/lua/utils/smlua_misc_utils.h | 1 + src/pc/network/network.c | 2 + 8 files changed, 81 insertions(+), 36 deletions(-) diff --git a/src/game/behaviors/chain_chomp.inc.c b/src/game/behaviors/chain_chomp.inc.c index 368215151..60d3b900f 100644 --- a/src/game/behaviors/chain_chomp.inc.c +++ b/src/game/behaviors/chain_chomp.inc.c @@ -456,7 +456,9 @@ static void chain_chomp_act_unload_chain(void) { if (o->oChainChompReleaseStatus != CHAIN_CHOMP_NOT_RELEASED) { if (o->oChainChompSegments) { for (u8 i = 0; i < 5; i++) { - obj_mark_for_deletion((struct Object*)&o->oChainChompSegments[i]); + struct Object* segment = (struct Object*)&o->oChainChompSegments[i]; + if (!segment) { continue; } + obj_mark_for_deletion(segment); } } obj_mark_for_deletion(o); diff --git a/src/game/behaviors/ttc_pendulum.inc.c b/src/game/behaviors/ttc_pendulum.inc.c index 2368dc6e0..72286e633 100644 --- a/src/game/behaviors/ttc_pendulum.inc.c +++ b/src/game/behaviors/ttc_pendulum.inc.c @@ -18,7 +18,7 @@ static f32 sTTCPendulumInitialAccels[] = { * Init function for bhvTTCPendulum. */ void bhv_ttc_pendulum_init(void) { - if (gTTCSpeedSetting != TTC_SPEED_STOPPED) { + if (gTTCSpeedSetting != TTC_SPEED_STOPPED && gTTCSpeedSetting > 0 && gTTCSpeedSetting < 4) { o->oTTCPendulumAngleAccel = sTTCPendulumInitialAccels[gTTCSpeedSetting]; o->oTTCPendulumAngle = 6500.0f; } else { diff --git a/src/game/bettercamera.inc.h b/src/game/bettercamera.inc.h index fbc990fd4..62d42dd71 100644 --- a/src/game/bettercamera.inc.h +++ b/src/game/bettercamera.inc.h @@ -10,6 +10,7 @@ #include "engine/surface_collision.h" #include "pc/configfile.h" #include "pc/controller/controller_mouse.h" +#include "pc/lua/utils/smlua_misc_utils.h" #if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR) //quick and dirty fix for some older MinGW.org mingwrt @@ -184,20 +185,20 @@ void newcam_toggle(bool enabled) { ///These are the default settings for Puppycam. You may change them to change how they'll be set for first timers. void newcam_init_settings(void) { - newcam_sensitivityX = newcam_clamp(configCameraXSens, 1, 100) * 5; - newcam_sensitivityY = newcam_clamp(configCameraYSens, 1, 100) * 5; - newcam_aggression = newcam_clamp(configCameraAggr, 0, 100); - newcam_panlevel = newcam_clamp(configCameraPan, 0, 100); - newcam_invertX = (s16)configCameraInvertX; - newcam_invertY = (s16)configCameraInvertY; - newcam_mouse = (u8)configCameraMouse; - newcam_analogue = (s16)configCameraAnalog; - newcam_degrade = (f32)configCameraDegrade; + newcam_sensitivityX = newcam_clamp(camera_config_get_x_sensitivity(), 1, 100) * 5; + newcam_sensitivityY = newcam_clamp(camera_config_get_y_sensitivity(), 1, 100) * 5; + newcam_aggression = newcam_clamp(camera_config_get_aggression(), 0, 100); + newcam_panlevel = newcam_clamp(camera_config_get_pan_level(), 0, 100); + newcam_invertX = (s16)camera_config_is_x_inverted(); + newcam_invertY = (s16)camera_config_is_y_inverted(); + newcam_mouse = (u8)camera_config_is_mouse_look_enabled(); + newcam_analogue = (s16)camera_config_is_analog_cam_enabled(); + newcam_degrade = (f32)camera_config_get_deceleration(); // setup main menu camera if (gDjuiInMainMenu) { newcam_tilt = 5; } - newcam_toggle(configEnableCamera || gDjuiInMainMenu); + newcam_toggle(camera_config_is_free_cam_enabled() || gDjuiInMainMenu); } /** Mathematic calculations. This stuffs so basic even *I* understand it lol diff --git a/src/game/camera.c b/src/game/camera.c index 944de05b8..6733169cc 100644 --- a/src/game/camera.c +++ b/src/game/camera.c @@ -12145,7 +12145,6 @@ void center_rom_hack_camera(void) { */ void mode_rom_hack_camera(struct Camera *c) { if (!c) { return; } - extern bool configCameraInvertX; s16 oldAreaYaw = sAreaYaw; Vec3f oldPos = { @@ -12156,13 +12155,13 @@ void mode_rom_hack_camera(struct Camera *c) { // look left if (gMarioStates[0].controller->buttonPressed & L_CBUTTONS) { - sRomHackYaw += DEGREES(45) * (configCameraInvertX ? -1 : 1); + sRomHackYaw += DEGREES(45) * (camera_config_is_x_inverted() ? -1 : 1); play_sound_cbutton_side(); } // look right if (gMarioStates[0].controller->buttonPressed & R_CBUTTONS) { - sRomHackYaw -= DEGREES(45) * (configCameraInvertX ? -1 : 1); + sRomHackYaw -= DEGREES(45) * (camera_config_is_x_inverted() ? -1 : 1); play_sound_cbutton_side(); } diff --git a/src/game/object_helpers.c b/src/game/object_helpers.c index d67a58dab..eea989af5 100644 --- a/src/game/object_helpers.c +++ b/src/game/object_helpers.c @@ -29,6 +29,7 @@ #include "spawn_sound.h" #include "pc/network/network.h" #include "pc/lua/smlua_hooks.h" +#include "pc/lua/utils/smlua_misc_utils.h" u8 (*gContinueDialogFunction)(void) = NULL; struct Object* gContinueDialogFunctionObject = NULL; @@ -1943,7 +1944,7 @@ void obj_set_cylboard(struct Object *obj) { void cur_obj_set_billboard_if_vanilla_cam(void) { if (!o) { return; } - if (configEnableCamera) { + if (camera_config_is_free_cam_enabled()) { o->header.gfx.node.flags &= ~GRAPH_RENDER_BILLBOARD; o->header.gfx.node.flags |= GRAPH_RENDER_CYLBOARD; } else { diff --git a/src/pc/lua/utils/smlua_misc_utils.c b/src/pc/lua/utils/smlua_misc_utils.c index bda0152ec..8176096b2 100644 --- a/src/pc/lua/utils/smlua_misc_utils.c +++ b/src/pc/lua/utils/smlua_misc_utils.c @@ -167,6 +167,35 @@ void hud_render_power_meter_interpolated(s32 health, f32 prevX, f32 prevY, f32 p /// +struct CameraOverride { + unsigned int value; + bool override; +}; + +struct CameraOverride sOverrideCameraXSens = { 0 }; +struct CameraOverride sOverrideCameraYSens = { 0 }; +struct CameraOverride sOverrideCameraAggr = { 0 }; +struct CameraOverride sOverrideCameraPan = { 0 }; +struct CameraOverride sOverrideCameraDegrade = { 0 }; +struct CameraOverride sOverrideCameraInvertX = { 0 }; +struct CameraOverride sOverrideCameraInvertY = { 0 }; +struct CameraOverride sOverrideEnableCamera = { 0 }; +struct CameraOverride sOverrideCameraAnalog = { 0 }; +struct CameraOverride sOverrideCameraMouse = { 0 }; + +void camera_reset_overrides(void) { + sOverrideCameraXSens.override = false; + sOverrideCameraYSens.override = false; + sOverrideCameraAggr.override = false; + sOverrideCameraPan.override = false; + sOverrideCameraDegrade.override = false; + sOverrideCameraInvertX.override = false; + sOverrideCameraInvertY.override = false; + sOverrideEnableCamera.override = false; + sOverrideCameraAnalog.override = false; + sOverrideCameraMouse.override = false; +} + void camera_freeze(void) { gOverrideFreezeCamera = TRUE; } @@ -181,7 +210,7 @@ bool camera_is_frozen(void) { bool camera_config_is_free_cam_enabled(void) { #ifdef BETTERCAMERA - return configEnableCamera; + return sOverrideEnableCamera.override ? sOverrideEnableCamera.value : configEnableCamera; #else return false; #endif @@ -189,7 +218,7 @@ bool camera_config_is_free_cam_enabled(void) { bool camera_config_is_analog_cam_enabled(void) { #ifdef BETTERCAMERA - return configCameraAnalog; + return sOverrideCameraAnalog.override ? sOverrideCameraAnalog.value : configCameraAnalog; #else return false; #endif @@ -197,7 +226,7 @@ bool camera_config_is_analog_cam_enabled(void) { bool camera_config_is_mouse_look_enabled(void) { #ifdef BETTERCAMERA - return configCameraMouse; + return sOverrideCameraMouse.override ? sOverrideCameraMouse.value : configCameraMouse; #else return false; #endif @@ -205,7 +234,7 @@ bool camera_config_is_mouse_look_enabled(void) { bool camera_config_is_x_inverted(void) { #ifdef BETTERCAMERA - return configCameraInvertX; + return sOverrideCameraInvertX.override ? sOverrideCameraInvertX.value : configCameraInvertX; #else return false; #endif @@ -213,7 +242,7 @@ bool camera_config_is_x_inverted(void) { bool camera_config_is_y_inverted(void) { #ifdef BETTERCAMERA - return configCameraInvertY; + return sOverrideCameraInvertY.override ? sOverrideCameraInvertY.value : configCameraInvertY; #else return false; #endif @@ -221,7 +250,7 @@ bool camera_config_is_y_inverted(void) { u32 camera_config_get_x_sensitivity(void) { #ifdef BETTERCAMERA - return configCameraXSens; + return sOverrideCameraXSens.override ? sOverrideCameraXSens.value : configCameraXSens; #else return 0; #endif @@ -229,7 +258,7 @@ u32 camera_config_get_x_sensitivity(void) { u32 camera_config_get_y_sensitivity(void) { #ifdef BETTERCAMERA - return configCameraYSens; + return sOverrideCameraYSens.override ? sOverrideCameraYSens.value : configCameraYSens; #else return 0; #endif @@ -237,7 +266,7 @@ u32 camera_config_get_y_sensitivity(void) { u32 camera_config_get_aggression(void) { #ifdef BETTERCAMERA - return configCameraAggr; + return sOverrideCameraAggr.override ? sOverrideCameraAggr.value : configCameraAggr; #else return 0; #endif @@ -245,7 +274,7 @@ u32 camera_config_get_aggression(void) { u32 camera_config_get_pan_level(void) { #ifdef BETTERCAMERA - return configCameraPan; + return sOverrideCameraPan.override ? sOverrideCameraPan.value : configCameraPan; #else return 0; #endif @@ -253,7 +282,7 @@ u32 camera_config_get_pan_level(void) { u32 camera_config_get_deceleration(void) { #ifdef BETTERCAMERA - return configCameraDegrade; + return sOverrideCameraDegrade.override ? sOverrideCameraDegrade.value : configCameraDegrade; #else return 0; #endif @@ -261,70 +290,80 @@ u32 camera_config_get_deceleration(void) { void camera_config_enable_free_cam(bool enable) { #ifdef BETTERCAMERA - configEnableCamera = enable; + sOverrideEnableCamera.value = enable; + sOverrideEnableCamera.override = true; newcam_init_settings(); #endif } void camera_config_enable_analog_cam(bool enable) { #ifdef BETTERCAMERA - configCameraAnalog = enable; + sOverrideCameraAnalog.value = enable; + sOverrideCameraAnalog.override = true; newcam_init_settings(); #endif } void camera_config_enable_mouse_look(bool enable) { #ifdef BETTERCAMERA - configCameraMouse = enable; + sOverrideCameraMouse.value = enable; + sOverrideCameraMouse.override = true; newcam_init_settings(); #endif } void camera_config_invert_x(bool invert) { #ifdef BETTERCAMERA - configCameraInvertX = invert; + sOverrideCameraInvertX.value = invert; + sOverrideCameraInvertX.override = true; newcam_init_settings(); #endif } void camera_config_invert_y(bool invert) { #ifdef BETTERCAMERA - configCameraInvertY = invert; + sOverrideCameraInvertY.value = invert; + sOverrideCameraInvertY.override = true; newcam_init_settings(); #endif } void camera_config_set_x_sensitivity(u32 value) { #ifdef BETTERCAMERA - configCameraXSens = MIN(MAX(value, 1), 100); + sOverrideCameraXSens.value = MIN(MAX(value, 1), 100); + sOverrideCameraXSens.override = true; newcam_init_settings(); #endif } void camera_config_set_y_sensitivity(u32 value) { #ifdef BETTERCAMERA - configCameraYSens = MIN(MAX(value, 1), 100); + sOverrideCameraYSens.value = MIN(MAX(value, 1), 100); + sOverrideCameraYSens.override = true; newcam_init_settings(); #endif } void camera_config_set_aggression(u32 value) { #ifdef BETTERCAMERA - configCameraAggr = MIN(MAX(value, 0), 100); + sOverrideCameraAggr.value = MIN(MAX(value, 0), 100); + sOverrideCameraAggr.override = true; newcam_init_settings(); #endif } void camera_config_set_pan_level(u32 value) { #ifdef BETTERCAMERA - configCameraPan = MIN(MAX(value, 0), 100); + sOverrideCameraPan.value = MIN(MAX(value, 0), 100); + sOverrideCameraPan.override = true; newcam_init_settings(); #endif } void camera_config_set_deceleration(u32 value) { #ifdef BETTERCAMERA - configCameraDegrade = MIN(MAX(value, 0), 100); + sOverrideCameraDegrade.value = MIN(MAX(value, 0), 100); + sOverrideCameraDegrade.override = true; newcam_init_settings(); #endif } diff --git a/src/pc/lua/utils/smlua_misc_utils.h b/src/pc/lua/utils/smlua_misc_utils.h index 88410f307..55a7a2287 100644 --- a/src/pc/lua/utils/smlua_misc_utils.h +++ b/src/pc/lua/utils/smlua_misc_utils.h @@ -40,6 +40,7 @@ void hud_set_value(enum HudDisplayValue type, s32 value); void hud_render_power_meter(s32 health, f32 x, f32 y, f32 width, f32 height); void hud_render_power_meter_interpolated(s32 health, f32 prevX, f32 prevY, f32 prevWidth, f32 prevHeight, f32 x, f32 y, f32 width, f32 height); +void camera_reset_overrides(void); void camera_freeze(void); void camera_unfreeze(void); bool camera_is_frozen(void); diff --git a/src/pc/network/network.c b/src/pc/network/network.c index b540c53c1..d2cea5078 100644 --- a/src/pc/network/network.c +++ b/src/pc/network/network.c @@ -17,6 +17,7 @@ #include "pc/utils/misc.h" #include "pc/lua/smlua.h" #include "pc/lua/utils/smlua_model_utils.h" +#include "pc/lua/utils/smlua_misc_utils.h" #include "pc/mods/mods.h" #include "pc/crash_handler.h" #include "pc/debuglog.h" @@ -635,6 +636,7 @@ void network_shutdown(bool sendLeaving, bool exiting, bool popup, bool reconnect gOverrideBackground = -1; gOverrideEnvFx = -1; gDjuiRenderBehindHud = false; + camera_reset_overrides(); dynos_mod_shutdown(); mods_clear(&gActiveMods); mods_clear(&gRemoteMods);