diff --git a/src/k_kart.c b/src/k_kart.c index 33fc20003..54119254b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -12649,6 +12649,25 @@ void K_MoveKartPlayer(player_t *player, boolean onground) ring->extravalue2 = 1; // Ring use animation flag ring->shadowscale = 0; P_SetTarget(&ring->target, player->mo); // user + + if (player->follower && !P_MobjWasRemoved(player->follower)) + { + // TODO: only do when using an auto-ring + ring->cusval = player->follower->x - player->mo->x; + ring->cvmem = player->follower->y - player->mo->y; + ring->movefactor = P_GetMobjHead(player->follower) - P_GetMobjHead(player->mo); + } + else + { + ring->cusval = ring->cvmem = ring->movefactor = 0; + } + + // really silly stupid dumb HACK to fix interp + // without needing to duplicate any code + A_AttractChase(ring); + P_SetOrigin(ring, ring->x, ring->y, ring->z); + ring->extravalue1 = 1; + player->rings--; if (player->autoring && !(cmd->buttons & BT_ATTACK)) player->ringdelay = 6; diff --git a/src/p_enemy.c b/src/p_enemy.c index f2f50e8c5..0cfc0d5e5 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3547,13 +3547,26 @@ void A_AttractChase(mobj_t *actor) } else { - fixed_t offz = FixedMul(80*actor->target->scale, FINESINE(FixedAngle((90 - (9 * abs(10 - actor->extravalue1))) << FRACBITS) >> ANGLETOFINESHIFT)); + fixed_t hop = FixedMul( + 80 * actor->target->scale, + FINESINE(FixedAngle((90 - (9 * abs(10 - actor->extravalue1))) << FRACBITS) >> ANGLETOFINESHIFT) + ); + + fixed_t offsFrac = (20 - (actor->extravalue1 - 1)) * FRACUNIT / 20; + fixed_t offsX = FixedMul(actor->cusval, offsFrac); + fixed_t offsY = FixedMul(actor->cvmem, offsFrac); + fixed_t offsZ = FixedMul(actor->movefactor, offsFrac); + //P_SetScale(actor, (actor->destscale = actor->target->scale)); - actor->z = actor->target->z; K_MatchGenericExtraFlags(actor, actor->target); - P_MoveOrigin(actor, actor->target->x, actor->target->y, - actor->z + - ( actor->target->height + offz )* P_MobjFlip(actor)); + + P_MoveOrigin( + actor, + actor->target->x + offsX, + actor->target->y + offsY, + actor->target->z + offsZ + ( actor->target->height + hop ) * P_MobjFlip(actor) + ); + actor->extravalue1++; } }