From 8f532b48ef2960dccd5165b385ca706c93225364 Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Mon, 6 Nov 2017 15:27:15 +0000 Subject: [PATCH] Various held and thrown items tweaks "Missile" items are spawned on the ground and should follow slopes when the player is on the ground Forwards thrown items should work in reverse gravity Dropped items are dropped slightly closer (depends on player and item radius) and have their position set correctly Held items are held closer (depends on player and item radius) --- src/k_kart.c | 96 +++++++++++++++++++--------------------------------- src/p_mobj.c | 9 +---- 2 files changed, 36 insertions(+), 69 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 4be0b489..9059c1ba 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1831,12 +1831,29 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t angle x = source->x + source->momx; y = source->y + source->momy; - z = source->z + source->height/3; + z = source->z; // spawn on the ground please + + if (P_MobjFlip(source) < 0) + { + z = source->z+source->height - mobjinfo[type].height; + } th = P_SpawnMobj(x, y, z, type); th->flags2 |= flags2; + if (P_IsObjectOnGround(source)) + { + // spawn on the ground if the player is on the ground + if (P_MobjFlip(source) < 0) + { + th->z = th->ceilingz - th->height; + th->eflags |= MFE_VERTICALFLIP; + } + else + th->z = th->floorz; + } + th->threshold = 10; #ifdef WEAPON_SFX @@ -1976,51 +1993,23 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map { if (mapthing == MT_FIREBALL) // Messy { - mobj_t *mo2; - mobj_t *mo3; - mobj_t *mo4; - mobj_t *mo5; if (dir == -1) { // Shoot backward - mo = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180 - 0x06000000, 0, PROJSPEED/2); - mo2 = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180 - 0x03000000, 0, PROJSPEED/2); - mo3 = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180, 0, PROJSPEED/2); - mo4 = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180 + 0x03000000, 0, PROJSPEED/2); - mo5 = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180 + 0x06000000, 0, PROJSPEED/2); - - if (mo) - { - if (player->mo->eflags & MFE_VERTICALFLIP) - { - mo->eflags |= MFE_VERTICALFLIP; - mo2->eflags |= MFE_VERTICALFLIP; - mo3->eflags |= MFE_VERTICALFLIP; - mo4->eflags |= MFE_VERTICALFLIP; - mo5->eflags |= MFE_VERTICALFLIP; - } - } + mo = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180 - 0x06000000, 0, PROJSPEED/2); + K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180 - 0x03000000, 0, PROJSPEED/2); + K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180, 0, PROJSPEED/2); + K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180 + 0x03000000, 0, PROJSPEED/2); + K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180 + 0x06000000, 0, PROJSPEED/2); } else { // Shoot forward - mo = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle - 0x06000000, 0, PROJSPEED); - mo2 = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle - 0x03000000, 0, PROJSPEED); - mo3 = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle, 0, PROJSPEED); - mo4 = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + 0x03000000, 0, PROJSPEED); - mo5 = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + 0x06000000, 0, PROJSPEED); - - if (mo) - { - if (player->mo->eflags & MFE_VERTICALFLIP) - { - mo->eflags |= MFE_VERTICALFLIP; - mo2->eflags |= MFE_VERTICALFLIP; - mo3->eflags |= MFE_VERTICALFLIP; - mo4->eflags |= MFE_VERTICALFLIP; - mo5->eflags |= MFE_VERTICALFLIP; - } - } + mo = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle - 0x06000000, 0, PROJSPEED); + K_SpawnKartMissile(player->mo, mapthing, player->mo->angle - 0x03000000, 0, PROJSPEED); + K_SpawnKartMissile(player->mo, mapthing, player->mo->angle, 0, PROJSPEED); + K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + 0x03000000, 0, PROJSPEED); + K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + 0x06000000, 0, PROJSPEED); } } else // Shells @@ -2029,23 +2018,11 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map { // Shoot backward mo = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle + ANGLE_180, 0, PROJSPEED/2); - - if (mo) - { - if (player->mo->eflags & MFE_VERTICALFLIP) - mo->eflags |= MFE_VERTICALFLIP; - } } else { // Shoot forward mo = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle, 0, PROJSPEED + player->speed); - - if (mo) - { - if (player->mo->eflags & MFE_VERTICALFLIP) - mo->eflags |= MFE_VERTICALFLIP; - } } } } @@ -2057,7 +2034,6 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, mapthing); mo->threshold = 10; - P_SetTarget(&mo->target, player->mo); S_StartSound(player->mo, mo->info->seesound); @@ -2074,7 +2050,7 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map mo->momx = player->mo->momx + FixedMul(FINECOSINE(fa), PROJSPEED); mo->momy = player->mo->momy + FixedMul(FINESINE(fa), PROJSPEED); - mo->momz = HEIGHT; + mo->momz = P_MobjFlip(player->mo) * HEIGHT; if (player->mo->eflags & MFE_VERTICALFLIP) mo->eflags |= MFE_VERTICALFLIP; @@ -2086,21 +2062,19 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map } else { + fixed_t dropradius = FixedHypot(player->mo->radius, player->mo->radius) + FixedHypot(mobjinfo[mapthing].radius, mobjinfo[mapthing].radius); + // Drop it directly behind you. newangle = player->mo->angle; - mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, mapthing); + newx = player->mo->x + P_ReturnThrustX(player->mo, newangle + ANGLE_180, dropradius); + newy = player->mo->y + P_ReturnThrustY(player->mo, newangle + ANGLE_180, dropradius); + + mo = P_SpawnMobj(newx, newy, player->mo->z, mapthing); mo->threshold = 10; - P_SetTarget(&mo->target, player->mo); - newx = player->mo->x + P_ReturnThrustX(player->mo, newangle + ANGLE_180, player->mo->radius*2 + mo->radius*3); - newy = player->mo->y + P_ReturnThrustY(player->mo, newangle + ANGLE_180, player->mo->radius*2 + mo->radius*3); - - mo->x = newx; - mo->y = newy; - if (mo) { if (player->mo->eflags & MFE_VERTICALFLIP) diff --git a/src/p_mobj.c b/src/p_mobj.c index 19b0662f..8370fb64 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6544,15 +6544,8 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->health > 0 && mobj->target && mobj->target->player && mobj->target->player->mo && mobj->target->player->health > 0 && !mobj->target->player->spectator) { - INT32 zfixds = 56; - INT32 DIST = FixedMul(zfixds, mobj->target->scale); fixed_t z; - const fixed_t radius = DIST*FRACUNIT; // mobj's distance from its Target, or Radius. - - if (mobj->type == MT_BANANASHIELD || mobj->type == MT_TRIPLEBANANASHIELD1 || mobj->type == MT_TRIPLEBANANASHIELD2 || mobj->type == MT_TRIPLEBANANASHIELD3) - zfixds = 64; - else - zfixds = 56; + const fixed_t radius = FixedHypot(mobj->target->radius, mobj->target->radius) + FixedHypot(mobj->radius, mobj->radius); // mobj's distance from its Target, or Radius. //mobj->angle += FixedAngle(12*FRACUNIT); // mobj's actual speed. if (mobj->type == MT_TRIPLEGREENSHIELD1 || mobj->type == MT_TRIPLEGREENSHIELD2 || mobj->type == MT_TRIPLEGREENSHIELD3