diff --git a/autogen/convert_functions.py b/autogen/convert_functions.py
index 0bbc501af..15b24993e 100644
--- a/autogen/convert_functions.py
+++ b/autogen/convert_functions.py
@@ -110,7 +110,7 @@ override_disallowed_functions = {
"src/game/interaction.h": [ "process_interaction", "_handle_" ],
"src/game/sound_init.h": [ "_loop_", "thread4_", "set_sound_mode" ],
"src/pc/network/network_utils.h": [ "network_get_player_text_color[^_]" ],
- "src/pc/network/network_player.h": [ "_init", "_connected[^_]", "_shutdown", "_disconnected", "_update", "construct_player_popup" ],
+ "src/pc/network/network_player.h": [ "_init", "_connected[^_]", "_shutdown", "_disconnected", "_update", "construct_player_popup", "network_player_name_valid" ],
"src/game/object_helpers.c": [ "spawn_obj", "^bhv_", "abs[fi]", "^bit_shift", "_debug$", "^stub_", "_set_model", "cur_obj_set_direction_table", "cur_obj_progress_direction_table" ],
"src/game/obj_behaviors.c": [ "debug_" ],
"src/game/obj_behaviors_2.c": [ "wiggler_jumped_on_attack_handler", "huge_goomba_weakly_attacked" ],
diff --git a/autogen/lua_definitions/functions.lua b/autogen/lua_definitions/functions.lua
index ac25e1008..80da794ad 100644
--- a/autogen/lua_definitions/functions.lua
+++ b/autogen/lua_definitions/functions.lua
@@ -10545,6 +10545,14 @@ function find_water_level(x, z)
-- ...
end
+--- @param dir Vec3f
+--- @param active boolean
+--- @param airborne boolean
+--- Sets whether collision finding functions should check wall directions.
+function set_find_wall_direction(dir, active, airborne)
+ -- ...
+end
+
--- @param data Pointer_integer
--- @return integer
function get_area_terrain_size(data)
diff --git a/docs/lua/functions-6.md b/docs/lua/functions-6.md
index 02ca21a3e..435c1f391 100644
--- a/docs/lua/functions-6.md
+++ b/docs/lua/functions-6.md
@@ -3577,6 +3577,31 @@ Finds the height of water at a given position (x, z), if the position is within
+## [set_find_wall_direction](#set_find_wall_direction)
+
+### Description
+Sets whether collision finding functions should check wall directions.
+
+### Lua Example
+`set_find_wall_direction(dir, active, airborne)`
+
+### Parameters
+| Field | Type |
+| ----- | ---- |
+| dir | [Vec3f](structs.md#Vec3f) |
+| active | `boolean` |
+| airborne | `boolean` |
+
+### Returns
+- None
+
+### C Prototype
+`void set_find_wall_direction(Vec3f dir, bool active, bool airborne);`
+
+[:arrow_up_small:](#)
+
+
+
---
# functions from surface_load.h
diff --git a/docs/lua/functions.md b/docs/lua/functions.md
index ffcb65189..d978fea91 100644
--- a/docs/lua/functions.md
+++ b/docs/lua/functions.md
@@ -1930,6 +1930,7 @@
- [find_poison_gas_level](functions-6.md#find_poison_gas_level)
- [find_wall_collisions](functions-6.md#find_wall_collisions)
- [find_water_level](functions-6.md#find_water_level)
+ - [set_find_wall_direction](functions-6.md#set_find_wall_direction)
diff --git a/src/engine/surface_collision.c b/src/engine/surface_collision.c
index 4276594f2..fddae07a2 100644
--- a/src/engine/surface_collision.c
+++ b/src/engine/surface_collision.c
@@ -19,6 +19,14 @@ u8 gFindWallDirectionAirborne = false;
#define CLAMP(_val, _min, _max) MAX(MIN((_val), _max), _min)
+void set_find_wall_direction(Vec3f dir, bool active, bool airborne) {
+ if (active) {
+ vec3f_copy(gFindWallDirection, dir);
+ }
+ gFindWallDirectionActive = active;
+ gFindWallDirectionAirborne = airborne;
+}
+
static void closest_point_to_triangle(struct Surface* surf, Vec3f src, Vec3f out) {
Vec3f v1; vec3s_to_vec3f(v1, surf->vertex1);
Vec3f v2; vec3s_to_vec3f(v2, surf->vertex2);
diff --git a/src/engine/surface_collision.h b/src/engine/surface_collision.h
index 7eb4fccb1..e8a375d0d 100644
--- a/src/engine/surface_collision.h
+++ b/src/engine/surface_collision.h
@@ -11,7 +11,7 @@
#define CELL_HEIGHT_LIMIT 20000
#define FLOOR_LOWER_LIMIT -11000
#define FLOOR_LOWER_LIMIT_MISC (FLOOR_LOWER_LIMIT + 1000)
-// same as FLOOR_LOWER_LIMIT_MISC, explicitly for shadow.c
+// same as FLOOR_LOWER_LIMIT_MISC, explicitly for shadow.c
// It doesn't match if ".0" is removed or ".f" is added
#define FLOOR_LOWER_LIMIT_SHADOW (FLOOR_LOWER_LIMIT + 1000.0)
@@ -45,38 +45,43 @@ extern u8 gFindWallDirectionAirborne;
s32 f32_find_wall_collision(f32 *xPtr, f32 *yPtr, f32 *zPtr, f32 offsetY, f32 radius);
/* |description|
-Detects wall collisions at a given position and adjusts the position based on the walls found.
+Detects wall collisions at a given position and adjusts the position based on the walls found.
Returns the number of wall collisions detected
|descriptionEnd| */
s32 find_wall_collisions(struct WallCollisionData *colData);
f32 find_ceil(f32 posX, f32 posY, f32 posZ, struct Surface **pceil);
/* |description|
-Finds the height of the highest ceiling above a given position (x, y, z).
+Finds the height of the highest ceiling above a given position (x, y, z).
If no ceiling is found, returns the default height limit of `gLevelValues.cellHeightLimit`(20000 by default)
|descriptionEnd| */
f32 find_ceil_height(f32 x, f32 y, f32 z);
f32 find_floor_height_and_data(f32 xPos, f32 yPos, f32 zPos, struct FloorGeometry **floorGeo);
/* |description|
-Finds the height of the highest floor below a given position (x, y, z).
+Finds the height of the highest floor below a given position (x, y, z).
If no floor is found, returns the default floor height of `gLevelValues.floorLowerLimit`(-11000 by default)
|descriptionEnd| */
f32 find_floor_height(f32 x, f32 y, f32 z);
f32 find_floor(f32 xPos, f32 yPos, f32 zPos, struct Surface **pfloor);
/* |description|
-Finds the height of water at a given position (x, z), if the position is within a water region.
+Finds the height of water at a given position (x, z), if the position is within a water region.
If no water is found, returns the default height of `gLevelValues.floorLowerLimit`(-11000 by default)
|descriptionEnd| */
f32 find_water_level(f32 x, f32 z);
/* |description|
-Finds the height of the poison gas at a given position (x, z), if the position is within a gas region.
+Finds the height of the poison gas at a given position (x, z), if the position is within a gas region.
If no gas is found, returns the default height of `gLevelValues.floorLowerLimit`(-11000 by default)
|descriptionEnd| */
f32 find_poison_gas_level(f32 x, f32 z);
void debug_surface_list_info(f32 xPos, f32 zPos);
void find_surface_on_ray(Vec3f orig, Vec3f dir, struct Surface **hit_surface, Vec3f hit_pos, f32 precision);
+/* |description|
+Sets whether collision finding functions should check wall directions.
+|descriptionEnd| */
+void set_find_wall_direction(Vec3f dir, bool active, bool airborne);
+
#endif // SURFACE_COLLISION_H
diff --git a/src/pc/lua/smlua_functions_autogen.c b/src/pc/lua/smlua_functions_autogen.c
index 912f5a8d3..fbf3f4c1c 100644
--- a/src/pc/lua/smlua_functions_autogen.c
+++ b/src/pc/lua/smlua_functions_autogen.c
@@ -31892,6 +31892,31 @@ int smlua_func_find_water_level(lua_State* L) {
return 1;
}
+int smlua_func_set_find_wall_direction(lua_State* L) {
+ if (L == NULL) { return 0; }
+
+ int top = lua_gettop(L);
+ if (top != 3) {
+ LOG_LUA_LINE("Improper param count for '%s': Expected %u, Received %u", "set_find_wall_direction", 3, top);
+ return 0;
+ }
+
+
+ Vec3f dir;
+ smlua_get_vec3f(dir, 1);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 1, "set_find_wall_direction"); return 0; }
+ bool active = smlua_to_boolean(L, 2);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 2, "set_find_wall_direction"); return 0; }
+ bool airborne = smlua_to_boolean(L, 3);
+ if (!gSmLuaConvertSuccess) { LOG_LUA("Failed to convert parameter %u for function '%s'", 3, "set_find_wall_direction"); return 0; }
+
+ set_find_wall_direction(dir, active, airborne);
+
+ smlua_push_vec3f(dir, 1);
+
+ return 1;
+}
+
////////////////////
// surface_load.h //
////////////////////
@@ -33824,6 +33849,7 @@ void smlua_bind_functions_autogen(void) {
//smlua_bind_function(L, "find_surface_on_ray", smlua_func_find_surface_on_ray); <--- UNIMPLEMENTED
smlua_bind_function(L, "find_wall_collisions", smlua_func_find_wall_collisions);
smlua_bind_function(L, "find_water_level", smlua_func_find_water_level);
+ smlua_bind_function(L, "set_find_wall_direction", smlua_func_set_find_wall_direction);
// surface_load.h
smlua_bind_function(L, "get_area_terrain_size", smlua_func_get_area_terrain_size);