Prevent OOB warp by teleporting one player to the other when OOB is detected

This commit is contained in:
MysterD 2020-10-04 22:38:54 -07:00
parent 104e824a13
commit 5eb5e678c5
1 changed files with 16 additions and 0 deletions

View File

@ -1380,6 +1380,9 @@ void update_mario_joystick_inputs(struct MarioState *m) {
* Resolves wall collisions, and updates a variety of inputs. * Resolves wall collisions, and updates a variety of inputs.
*/ */
void update_mario_geometry_inputs(struct MarioState *m) { void update_mario_geometry_inputs(struct MarioState *m) {
u8 copiedPlayer = FALSE;
copyPlayerGoto:;
f32 gasLevel; f32 gasLevel;
f32 ceilToFloorDist; f32 ceilToFloorDist;
@ -1431,6 +1434,19 @@ void update_mario_geometry_inputs(struct MarioState *m) {
} }
} else { } else {
if (!copiedPlayer) {
// try to prevent OOB by copying position of other player
struct Surface* floor2 = NULL;
for (int i = 0; i < MAX_PLAYERS; i++) {
struct MarioState* m2 = &gMarioStates[i];
if (m == m2) { continue; }
find_floor(m2->pos[0], m2->pos[1], m2->pos[2], &floor2);
if (floor2 == NULL) { continue; }
vec3f_copy(m->pos, m2->pos);
copiedPlayer = TRUE;
goto copyPlayerGoto;
}
}
level_trigger_warp(m, WARP_OP_DEATH); level_trigger_warp(m, WARP_OP_DEATH);
} }
} }