diff --git a/src/k_kart.c b/src/k_kart.c index d963c4b4..908d4dba 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -925,6 +925,42 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) //{ SRB2kart p_user.c Stuff +static fixed_t K_GetMobjWeight(mobj_t *mobj, mobj_t *against) +{ + fixed_t weight = 5<type) + { + case MT_PLAYER: + if (!mobj->player) + break; + if (against->player && !against->player->kartstuff[k_spinouttimer] && mobj->player->kartstuff[k_spinouttimer]) + weight = 0; // Do not bump + else + weight = (mobj->player->kartweight)<player) + weight = (against->player->kartweight)<player) + weight = (against->player->kartweight+3)<player) - { - if (mobj2->player && !mobj2->player->kartstuff[k_spinouttimer] && mobj1->player->kartstuff[k_spinouttimer]) - mass1 = 0; // Do not bump - else - mass1 = (mobj1->player->kartweight)*FRACUNIT; - } - - if (mobj2->player) - { - if (mobj1->player && !mobj1->player->kartstuff[k_spinouttimer] && mobj2->player->kartstuff[k_spinouttimer]) - mass2 = 0; // Do not bump - else - mass2 = (mobj2->player->kartweight)*FRACUNIT; - } - else if (solid == true && mobj1->player) - mass2 = (mobj1->player->kartweight)*FRACUNIT; + if (solid == true && mass1 > 0) + mass2 = mass1; + else + mass2 = K_GetMobjWeight(mobj2, mobj1); momdifx = mobj1->momx - mobj2->momx; momdify = mobj1->momy - mobj2->momy; @@ -1589,7 +1612,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, boolean trapitem S_StartSound(player->mo, sfx_slip); } else - player->kartstuff[k_spinouttimer] = (1*TICRATE)+20; // Wipeout + player->kartstuff[k_spinouttimer] = TICRATE+20; // Wipeout player->powers[pw_flashing] = K_GetKartFlashing(); @@ -3868,8 +3891,16 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->mo->movefactor < 32) player->mo->movefactor = 32; } - if (player->kartstuff[k_wipeoutslow] == 1) - player->mo->friction -= 4912; + if (player->kartstuff[k_spinouttimer]) + { + player->mo->friction = FRACUNIT; + if (player->kartstuff[k_wipeoutslow]) + { + player->mo->friction -= FixedMul(1228, player->kartstuff[k_offroad]); + if (player->kartstuff[k_wipeoutslow] == 1) + player->mo->friction -= 4912; + } + } K_KartDrift(player, onground); diff --git a/src/p_inter.c b/src/p_inter.c index 6f4e7554..8f71ea71 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3325,7 +3325,8 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da damage = player->mo->health - 1; P_RingDamage(player, inflictor, source, damage); P_PlayerRingBurst(player, 5); - K_KartBouncing(player->mo, inflictor, false, false); + if (inflictor->type == MT_FAKEITEM || inflictor->type == MT_FAKESHIELD) + player->mo->momx = player->mo->momy = 0; if (P_IsLocalPlayer(player)) { quake.intensity = 32*FRACUNIT; diff --git a/src/p_map.c b/src/p_map.c index c024982d..33498bff 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -694,6 +694,7 @@ static boolean PIT_CheckThing(mobj_t *thing) { // Player Damage P_DamageMobj(thing, tmthing, tmthing->target, 1); + K_KartBouncing(thing, tmthing, false, false); if (tmthing->type == MT_GREENITEM || tmthing->type == MT_JAWZ || tmthing->type == MT_JAWZ_DUD) S_StartSound(thing, sfx_shelit); @@ -1126,6 +1127,9 @@ static boolean PIT_CheckThing(mobj_t *thing) // Player Damage P_DamageMobj(tmthing, thing, thing->target, 1); + if (thing->type != MT_FAKESHIELD && thing->type != MT_FAKEITEM) + K_KartBouncing(tmthing, thing, false, false); + if (thing->type == MT_GREENITEM || thing->type == MT_JAWZ || thing->type == MT_JAWZ_DUD) S_StartSound(tmthing, sfx_shelit); diff --git a/src/p_mobj.c b/src/p_mobj.c index a9fd4eba..a2b91f80 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -2003,7 +2003,7 @@ void P_XYMovement(mobj_t *mo) if (mo->type == MT_GREENITEM || mo->type == MT_JAWZ_DUD || mo->type == MT_JAWZ || mo->type == MT_BALLHOG) //(mo->type == MT_JAWZ && !mo->tracer)) return; - if (mo->player && (mo->player->kartstuff[k_spinouttimer] && mo->player->kartstuff[k_wipeoutslow] != 1) && mo->player->speed <= mo->player->normalspeed/2) + if (mo->player && (mo->player->kartstuff[k_spinouttimer] && !mo->player->kartstuff[k_wipeoutslow]) && mo->player->speed <= mo->player->normalspeed/2) return; //} diff --git a/src/p_user.c b/src/p_user.c index 1868d24d..076edb9c 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -852,15 +852,19 @@ void P_DoPlayerPain(player_t *player, mobj_t *source, mobj_t *inflictor) angle_t ang; fixed_t fallbackspeed; - if (player->mo->eflags & MFE_VERTICALFLIP) - player->mo->z--; - else - player->mo->z++; + if (inflictor && (inflictor->type != MT_PLAYER && inflictor->type != MT_GREENITEM && inflictor->type != MT_GREENSHIELD + && inflictor->type != MT_JAWZ && inflictor->type != MT_JAWZ_DUD && inflictor->type != MT_JAWZ_SHIELD)) + { + if (player->mo->eflags & MFE_VERTICALFLIP) + player->mo->z--; + else + player->mo->z++; - if (player->mo->eflags & MFE_UNDERWATER) - P_SetObjectMomZ(player->mo, FixedDiv(10511*FRACUNIT,2600*FRACUNIT), false); - else - P_SetObjectMomZ(player->mo, FixedDiv(69*FRACUNIT,10*FRACUNIT), false); + if (player->mo->eflags & MFE_UNDERWATER) + P_SetObjectMomZ(player->mo, FixedDiv(10511*FRACUNIT,2600*FRACUNIT), false); + else + P_SetObjectMomZ(player->mo, FixedDiv(69*FRACUNIT,10*FRACUNIT), false); + } if (inflictor) {