diff --git a/src/k_hud.cpp b/src/k_hud.cpp index a8dd5f3cd..4e6adebaa 100644 --- a/src/k_hud.cpp +++ b/src/k_hud.cpp @@ -3859,7 +3859,7 @@ static void K_DrawNameTagItemSpy(INT32 x, INT32 y, player_t *p, INT32 flags) flip = P_MobjFlip(p->mo); flipboxoffset = 8; } - + Draw bar = Draw(x, y).flags(V_NOSCALESTART|flags); Draw box = tiny ? bar.xy(-22 * vid.dupx, (-17+flipboxoffset) * vid.dupy) : bar.xy(-40 * vid.dupx, (-26+flipboxoffset) * vid.dupy); @@ -4029,8 +4029,8 @@ playertagtype_t K_WhichPlayerTag(player_t *p) void K_DrawPlayerTag(fixed_t x, fixed_t y, player_t *p, playertagtype_t type, boolean foreground) { - INT32 flags = P_IsObjectFlipped(p->mo) ? V_VFLIP : 0; - + INT32 flags = P_IsObjectFlipped(p->mo) ? V_VFLIP : 0; + switch (type) { case PLAYERTAG_LOCAL: @@ -4261,13 +4261,13 @@ static void K_drawKartProgressionMinimapIcon(UINT32 distancetofinish, INT32 hudx position_t K_GetKartObjectPosToMinimapPos(fixed_t objx, fixed_t objy) { fixed_t amnumxpos, amnumypos; - + amnumxpos = (FixedMul(objx, minimapinfo.zoom) - minimapinfo.offs_x); amnumypos = -(FixedMul(objy, minimapinfo.zoom) - minimapinfo.offs_y); if (encoremode) amnumxpos = -amnumxpos; - + return (position_t){amnumxpos, amnumypos}; } @@ -4279,10 +4279,10 @@ static void K_drawKartMinimapIcon(fixed_t objx, fixed_t objy, INT32 hudx, INT32 // am xpos & ypos are the icon's starting position. Withouht // it, they wouldn't 'spawn' on the top-right side of the HUD. - + position_t amnumpos; INT32 amxpos, amypos; - + amnumpos = K_GetKartObjectPosToMinimapPos(objx, objy); amxpos = amnumpos.x + ((hudx - (SHORT(icon->width))/2)<spectator || !stplyr->mo || (stplyr->mo->renderflags & RF_DONTDRAW)) + if (stplyr->spectator || !stplyr->mo || (stplyr->mo->renderflags & RF_DONTDRAW || stplyr->mo->state == &states[S_KART_DEAD])) return; { diff --git a/src/p_user.c b/src/p_user.c index d8f83c7ce..63f43bdab 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4092,6 +4092,9 @@ Quaketilt (player_t *player) static void DoABarrelRoll (player_t *player) { + UINT8 viewnum = R_GetViewNumber(); + camera_t *cam = &camera[viewnum]; + angle_t slope; angle_t delta; @@ -4120,9 +4123,17 @@ DoABarrelRoll (player_t *player) slope = 0; } - if (AbsAngle(slope) > ANGLE_45) + if (cam->chase) { - slope = slope & ANGLE_180 ? InvAngle(ANGLE_45) : ANGLE_45; + if (AbsAngle(slope) > ANGLE_45) + { + slope = slope & ANGLE_180 ? InvAngle(ANGLE_45) : ANGLE_45; + } + } else { + if (AbsAngle(slope) > ANGLE_90) + { + slope = slope & ANGLE_180 ? InvAngle(ANGLE_90) : ANGLE_90; + } } slope -= Quaketilt(player); @@ -4130,7 +4141,7 @@ DoABarrelRoll (player_t *player) delta = slope - player->tilt; smoothing = FixedDiv(AbsAngle(slope), ANGLE_45); - delta = FixedDiv(delta, 33 * + delta = FixedDiv(delta, (cam->chase ? 33 : 11) * FixedDiv(FRACUNIT, FRACUNIT + smoothing)); if (delta) diff --git a/src/r_main.cpp b/src/r_main.cpp index 564e60f7b..47d2d7ded 100644 --- a/src/r_main.cpp +++ b/src/r_main.cpp @@ -307,8 +307,18 @@ angle_t R_PointToAnglePlayer(player_t *player, fixed_t x, fixed_t y) { refx = cam->x; refy = cam->y; - } + // Bandaid for two very specific bugs that arise with chasecam off. + // 1: Camera tilt from slopes wouldn't apply correctly in first person. + // 2: Trick pies would appear strangely in first person. + if (player->mo) + { + if ((!cam->chase) && player->mo->x == x && player->mo->y == y) + { + return player->mo->angle; + } + } + } return R_PointToAngle2(refx, refy, x, y); }