mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-12-01 16:52:25 +00:00
Add conditions for new player bot type
This commit is contained in:
parent
4b9a95a538
commit
b995e3cb75
1 changed files with 48 additions and 77 deletions
125
src/p_user.c
125
src/p_user.c
|
@ -1189,7 +1189,7 @@ void P_GivePlayerRings(player_t *player, INT32 num_rings)
|
||||||
if (!player)
|
if (!player)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (player->bot)
|
if (player->bot && player->bot != 3)
|
||||||
player = &players[consoleplayer];
|
player = &players[consoleplayer];
|
||||||
|
|
||||||
if (!player->mo)
|
if (!player->mo)
|
||||||
|
@ -1234,7 +1234,7 @@ void P_GivePlayerSpheres(player_t *player, INT32 num_spheres)
|
||||||
if (!player)
|
if (!player)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (player->bot)
|
if (player->bot && player->bot != 3)
|
||||||
player = &players[consoleplayer];
|
player = &players[consoleplayer];
|
||||||
|
|
||||||
if (!player->mo)
|
if (!player->mo)
|
||||||
|
@ -1261,7 +1261,7 @@ void P_GivePlayerLives(player_t *player, INT32 numlives)
|
||||||
if (!player)
|
if (!player)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (player->bot)
|
if (player->bot && player->bot != 3)
|
||||||
player = &players[consoleplayer];
|
player = &players[consoleplayer];
|
||||||
|
|
||||||
if (gamestate == GS_LEVEL)
|
if (gamestate == GS_LEVEL)
|
||||||
|
@ -1341,7 +1341,7 @@ void P_DoSuperTransformation(player_t *player, boolean giverings)
|
||||||
// Transformation animation
|
// Transformation animation
|
||||||
P_SetPlayerMobjState(player->mo, S_PLAY_SUPER_TRANS1);
|
P_SetPlayerMobjState(player->mo, S_PLAY_SUPER_TRANS1);
|
||||||
|
|
||||||
if (giverings && player->rings < 50)
|
if (giverings)
|
||||||
player->rings = 50;
|
player->rings = 50;
|
||||||
|
|
||||||
// Just in case.
|
// Just in case.
|
||||||
|
@ -1367,7 +1367,7 @@ void P_AddPlayerScore(player_t *player, UINT32 amount)
|
||||||
{
|
{
|
||||||
UINT32 oldscore;
|
UINT32 oldscore;
|
||||||
|
|
||||||
if (player->bot)
|
if (player->bot && player->bot != 3)
|
||||||
player = &players[consoleplayer];
|
player = &players[consoleplayer];
|
||||||
|
|
||||||
// NiGHTS does it different!
|
// NiGHTS does it different!
|
||||||
|
@ -1491,10 +1491,10 @@ void P_PlayLivesJingle(player_t *player)
|
||||||
if (player && !P_IsLocalPlayer(player))
|
if (player && !P_IsLocalPlayer(player))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (mariomode)
|
if (use1upSound || cv_1upsound.value)
|
||||||
S_StartSound(NULL, sfx_marioa);
|
|
||||||
else if (use1upSound || cv_1upsound.value)
|
|
||||||
S_StartSound(NULL, sfx_oneup);
|
S_StartSound(NULL, sfx_oneup);
|
||||||
|
else if (mariomode)
|
||||||
|
S_StartSound(NULL, sfx_marioa);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
P_PlayJingle(player, JT_1UP);
|
P_PlayJingle(player, JT_1UP);
|
||||||
|
@ -2329,8 +2329,7 @@ boolean P_PlayerHitFloor(player_t *player, boolean dorollstuff)
|
||||||
P_MobjCheckWater(player->mo);
|
P_MobjCheckWater(player->mo);
|
||||||
if (player->pflags & PF_SPINNING)
|
if (player->pflags & PF_SPINNING)
|
||||||
{
|
{
|
||||||
if (!(player->pflags & PF_STARTDASH) && player->panim != PA_ROLL && player->panim != PA_ETC
|
if (player->mo->state-states != S_PLAY_ROLL && !(player->pflags & PF_STARTDASH))
|
||||||
&& player->panim != PA_ABILITY && player->panim != PA_ABILITY2)
|
|
||||||
{
|
{
|
||||||
P_SetPlayerMobjState(player->mo, S_PLAY_ROLL);
|
P_SetPlayerMobjState(player->mo, S_PLAY_ROLL);
|
||||||
S_StartSound(player->mo, sfx_spin);
|
S_StartSound(player->mo, sfx_spin);
|
||||||
|
@ -2613,10 +2612,10 @@ static void P_CheckBustableBlocks(player_t *player)
|
||||||
|
|
||||||
if ((netgame || multiplayer) && player->spectator)
|
if ((netgame || multiplayer) && player->spectator)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
oldx = player->mo->x;
|
oldx = player->mo->x;
|
||||||
oldy = player->mo->y;
|
oldy = player->mo->y;
|
||||||
|
|
||||||
if (!(player->pflags & PF_BOUNCING)) // Bouncers only get to break downwards, not sideways
|
if (!(player->pflags & PF_BOUNCING)) // Bouncers only get to break downwards, not sideways
|
||||||
{
|
{
|
||||||
P_UnsetThingPosition(player->mo);
|
P_UnsetThingPosition(player->mo);
|
||||||
|
@ -2635,7 +2634,7 @@ static void P_CheckBustableBlocks(player_t *player)
|
||||||
|
|
||||||
if (!node->m_sector->ffloors)
|
if (!node->m_sector->ffloors)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (rover = node->m_sector->ffloors; rover; rover = rover->next)
|
for (rover = node->m_sector->ffloors; rover; rover = rover->next)
|
||||||
{
|
{
|
||||||
if (!P_PlayerCanBust(player, rover))
|
if (!P_PlayerCanBust(player, rover))
|
||||||
|
@ -2993,7 +2992,7 @@ static void P_CheckUnderwaterAndSpaceTimer(player_t *player)
|
||||||
player->powers[pw_spacetime] = 0;
|
player->powers[pw_spacetime] = 0;
|
||||||
|
|
||||||
// Underwater audio cues
|
// Underwater audio cues
|
||||||
if (P_IsLocalPlayer(player) && !player->bot)
|
if (P_IsLocalPlayer(player) && !player->bot && player->bot != 3)
|
||||||
{
|
{
|
||||||
if ((player->powers[pw_underwater] == 25*TICRATE + 1)
|
if ((player->powers[pw_underwater] == 25*TICRATE + 1)
|
||||||
|| (player->powers[pw_underwater] == 20*TICRATE + 1)
|
|| (player->powers[pw_underwater] == 20*TICRATE + 1)
|
||||||
|
@ -4526,9 +4525,6 @@ void P_DoJump(player_t *player, boolean soundandstate)
|
||||||
|
|
||||||
player->pflags |= P_GetJumpFlags(player);;
|
player->pflags |= P_GetJumpFlags(player);;
|
||||||
|
|
||||||
if (player->charflags & SF_NOJUMPDAMAGE)
|
|
||||||
player->pflags &= ~PF_SPINNING;
|
|
||||||
|
|
||||||
if (soundandstate)
|
if (soundandstate)
|
||||||
{
|
{
|
||||||
if (!player->spectator)
|
if (!player->spectator)
|
||||||
|
@ -5024,7 +5020,7 @@ static boolean P_PlayerShieldThink(player_t *player, ticcmd_t *cmd, mobj_t *lock
|
||||||
if ((player->powers[pw_shield] & SH_NOSTACK) && !player->powers[pw_super] && !(player->pflags & PF_SPINDOWN)
|
if ((player->powers[pw_shield] & SH_NOSTACK) && !player->powers[pw_super] && !(player->pflags & PF_SPINDOWN)
|
||||||
&& ((!(player->pflags & PF_THOKKED) || (((player->powers[pw_shield] & SH_NOSTACK) == SH_BUBBLEWRAP || (player->powers[pw_shield] & SH_NOSTACK) == SH_ATTRACT) && player->secondjump == UINT8_MAX) ))) // thokked is optional if you're bubblewrapped / 3dblasted
|
&& ((!(player->pflags & PF_THOKKED) || (((player->powers[pw_shield] & SH_NOSTACK) == SH_BUBBLEWRAP || (player->powers[pw_shield] & SH_NOSTACK) == SH_ATTRACT) && player->secondjump == UINT8_MAX) ))) // thokked is optional if you're bubblewrapped / 3dblasted
|
||||||
{
|
{
|
||||||
if ((player->powers[pw_shield] & SH_NOSTACK) == SH_ATTRACT && !(player->charflags & SF_NOSHIELDABILITY))
|
if ((player->powers[pw_shield] & SH_NOSTACK) == SH_ATTRACT)
|
||||||
{
|
{
|
||||||
if ((lockonshield = P_LookForEnemies(player, false, false)))
|
if ((lockonshield = P_LookForEnemies(player, false, false)))
|
||||||
{
|
{
|
||||||
|
@ -5047,7 +5043,7 @@ static boolean P_PlayerShieldThink(player_t *player, ticcmd_t *cmd, mobj_t *lock
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((!(player->charflags & SF_NOSHIELDABILITY)) && (cmd->buttons & BT_SPIN && !LUAh_ShieldSpecial(player))) // Spin button effects
|
if (cmd->buttons & BT_SPIN && !LUAh_ShieldSpecial(player)) // Spin button effects
|
||||||
{
|
{
|
||||||
// Force stop
|
// Force stop
|
||||||
if ((player->powers[pw_shield] & ~(SH_FORCEHP|SH_STACK)) == SH_FORCE)
|
if ((player->powers[pw_shield] & ~(SH_FORCEHP|SH_STACK)) == SH_FORCE)
|
||||||
|
@ -5495,7 +5491,7 @@ static void P_DoJumpStuff(player_t *player, ticcmd_t *cmd)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ((!(player->charflags & SF_NOSHIELDABILITY)) && ((player->powers[pw_shield] & SH_NOSTACK) == SH_WHIRLWIND && !player->powers[pw_super] && !LUAh_ShieldSpecial(player)))
|
else if ((player->powers[pw_shield] & SH_NOSTACK) == SH_WHIRLWIND && !player->powers[pw_super])
|
||||||
P_DoJumpShield(player);
|
P_DoJumpShield(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5924,7 +5920,7 @@ static void P_3dMovement(player_t *player)
|
||||||
player->rmomy = player->mo->momy - player->cmomy;
|
player->rmomy = player->mo->momy - player->cmomy;
|
||||||
|
|
||||||
// Calculates player's speed based on distance-of-a-line formula
|
// Calculates player's speed based on distance-of-a-line formula
|
||||||
player->speed = R_PointToDist2(0, 0, player->rmomx, player->rmomy);
|
player->speed = P_AproxDistance(player->rmomx, player->rmomy);
|
||||||
|
|
||||||
// Monster Iestyn - 04-11-13
|
// Monster Iestyn - 04-11-13
|
||||||
// Quadrants are stupid, excessive and broken, let's do this a much simpler way!
|
// Quadrants are stupid, excessive and broken, let's do this a much simpler way!
|
||||||
|
@ -5957,22 +5953,6 @@ static void P_3dMovement(player_t *player)
|
||||||
acceleration = 96 + (FixedDiv(player->speed, player->mo->scale)>>FRACBITS) * 40;
|
acceleration = 96 + (FixedDiv(player->speed, player->mo->scale)>>FRACBITS) * 40;
|
||||||
topspeed = normalspd;
|
topspeed = normalspd;
|
||||||
}
|
}
|
||||||
else if (player->bot)
|
|
||||||
{ // Bot steals player 1's stats
|
|
||||||
normalspd = FixedMul(players[consoleplayer].normalspeed, player->mo->scale);
|
|
||||||
thrustfactor = players[consoleplayer].thrustfactor;
|
|
||||||
acceleration = players[consoleplayer].accelstart + (FixedDiv(player->speed, player->mo->scale)>>FRACBITS) * players[consoleplayer].acceleration;
|
|
||||||
|
|
||||||
if (player->powers[pw_tailsfly])
|
|
||||||
topspeed = normalspd/2;
|
|
||||||
else if (player->mo->eflags & (MFE_UNDERWATER|MFE_GOOWATER))
|
|
||||||
{
|
|
||||||
topspeed = normalspd/2;
|
|
||||||
acceleration = 2*acceleration/3;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
topspeed = normalspd;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (player->powers[pw_super] || player->powers[pw_sneakers])
|
if (player->powers[pw_super] || player->powers[pw_sneakers])
|
||||||
|
@ -7756,11 +7736,6 @@ void P_ElementalFire(player_t *player, boolean cropcircle)
|
||||||
flame->eflags = (flame->eflags & ~MFE_VERTICALFLIP)|(player->mo->eflags & MFE_VERTICALFLIP);
|
flame->eflags = (flame->eflags & ~MFE_VERTICALFLIP)|(player->mo->eflags & MFE_VERTICALFLIP);
|
||||||
P_InstaThrust(flame, flame->angle, FixedMul(3*FRACUNIT, flame->scale));
|
P_InstaThrust(flame, flame->angle, FixedMul(3*FRACUNIT, flame->scale));
|
||||||
P_SetObjectMomZ(flame, 3*FRACUNIT, false);
|
P_SetObjectMomZ(flame, 3*FRACUNIT, false);
|
||||||
if (!(gametyperules & GTR_FRIENDLY))
|
|
||||||
{
|
|
||||||
P_SetMobjState(flame, S_TEAM_SPINFIRE1);
|
|
||||||
flame->color = player->mo->color;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#undef limitangle
|
#undef limitangle
|
||||||
#undef numangles
|
#undef numangles
|
||||||
|
@ -7788,11 +7763,6 @@ void P_ElementalFire(player_t *player, boolean cropcircle)
|
||||||
flame->destscale = player->mo->scale;
|
flame->destscale = player->mo->scale;
|
||||||
P_SetScale(flame, player->mo->scale);
|
P_SetScale(flame, player->mo->scale);
|
||||||
flame->eflags = (flame->eflags & ~MFE_VERTICALFLIP)|(player->mo->eflags & MFE_VERTICALFLIP);
|
flame->eflags = (flame->eflags & ~MFE_VERTICALFLIP)|(player->mo->eflags & MFE_VERTICALFLIP);
|
||||||
if (!(gametyperules & GTR_FRIENDLY))
|
|
||||||
{
|
|
||||||
P_SetMobjState(flame, S_TEAM_SPINFIRE1);
|
|
||||||
flame->color = player->mo->color;
|
|
||||||
}
|
|
||||||
|
|
||||||
flame->momx = 8; // this is a hack which is used to ensure it still behaves as a missile and can damage others
|
flame->momx = 8; // this is a hack which is used to ensure it still behaves as a missile and can damage others
|
||||||
P_XYMovement(flame);
|
P_XYMovement(flame);
|
||||||
|
@ -8619,6 +8589,12 @@ void P_MovePlayer(player_t *player)
|
||||||
player->climbing--;
|
player->climbing--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!player->climbing)
|
||||||
|
{
|
||||||
|
player->lastsidehit = -1;
|
||||||
|
player->lastlinehit = -1;
|
||||||
|
}
|
||||||
|
|
||||||
// Make sure you're not teetering when you shouldn't be.
|
// Make sure you're not teetering when you shouldn't be.
|
||||||
if (player->panim == PA_EDGE
|
if (player->panim == PA_EDGE
|
||||||
&& (player->mo->momx || player->mo->momy || player->mo->momz))
|
&& (player->mo->momx || player->mo->momy || player->mo->momz))
|
||||||
|
@ -8643,7 +8619,6 @@ void P_MovePlayer(player_t *player)
|
||||||
P_DoFiring(player, cmd);
|
P_DoFiring(player, cmd);
|
||||||
|
|
||||||
{
|
{
|
||||||
boolean atspinheight = false;
|
|
||||||
fixed_t oldheight = player->mo->height;
|
fixed_t oldheight = player->mo->height;
|
||||||
|
|
||||||
// Less height while spinning. Good for spinning under things...?
|
// Less height while spinning. Good for spinning under things...?
|
||||||
|
@ -8653,35 +8628,32 @@ void P_MovePlayer(player_t *player)
|
||||||
|| player->powers[pw_tailsfly] || player->pflags & PF_GLIDING
|
|| player->powers[pw_tailsfly] || player->pflags & PF_GLIDING
|
||||||
|| (player->charability == CA_GLIDEANDCLIMB && player->mo->state-states == S_PLAY_GLIDE_LANDING)
|
|| (player->charability == CA_GLIDEANDCLIMB && player->mo->state-states == S_PLAY_GLIDE_LANDING)
|
||||||
|| (player->charability == CA_FLY && player->mo->state-states == S_PLAY_FLY_TIRED))
|
|| (player->charability == CA_FLY && player->mo->state-states == S_PLAY_FLY_TIRED))
|
||||||
{
|
|
||||||
player->mo->height = P_GetPlayerSpinHeight(player);
|
player->mo->height = P_GetPlayerSpinHeight(player);
|
||||||
atspinheight = true;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
player->mo->height = P_GetPlayerHeight(player);
|
player->mo->height = P_GetPlayerHeight(player);
|
||||||
|
|
||||||
if (player->mo->eflags & MFE_VERTICALFLIP && player->mo->height != oldheight) // adjust z height for reverse gravity, similar to how it's done for scaling
|
if (player->mo->eflags & MFE_VERTICALFLIP && player->mo->height != oldheight) // adjust z height for reverse gravity, similar to how it's done for scaling
|
||||||
player->mo->z -= player->mo->height - oldheight;
|
player->mo->z -= player->mo->height - oldheight;
|
||||||
|
}
|
||||||
|
|
||||||
// Crush test...
|
// Crush test...
|
||||||
if ((player->mo->ceilingz - player->mo->floorz < player->mo->height)
|
if ((player->mo->ceilingz - player->mo->floorz < player->mo->height)
|
||||||
&& !(player->mo->flags & MF_NOCLIP))
|
&& !(player->mo->flags & MF_NOCLIP))
|
||||||
|
{
|
||||||
|
if ((player->charability2 == CA2_SPINDASH) && !(player->pflags & PF_SPINNING))
|
||||||
{
|
{
|
||||||
if (!atspinheight)
|
player->pflags |= PF_SPINNING;
|
||||||
{
|
P_SetPlayerMobjState(player->mo, S_PLAY_ROLL);
|
||||||
player->pflags |= PF_SPINNING;
|
}
|
||||||
P_SetPlayerMobjState(player->mo, S_PLAY_ROLL);
|
else if (player->mo->ceilingz - player->mo->floorz < player->mo->height)
|
||||||
}
|
{
|
||||||
else if (player->mo->ceilingz - player->mo->floorz < player->mo->height)
|
if ((netgame || multiplayer) && player->spectator)
|
||||||
{
|
P_DamageMobj(player->mo, NULL, NULL, 1, DMG_SPECTATOR); // Respawn crushed spectators
|
||||||
if ((netgame || multiplayer) && player->spectator)
|
else
|
||||||
P_DamageMobj(player->mo, NULL, NULL, 1, DMG_SPECTATOR); // Respawn crushed spectators
|
P_DamageMobj(player->mo, NULL, NULL, 1, DMG_CRUSHED);
|
||||||
else
|
|
||||||
P_DamageMobj(player->mo, NULL, NULL, 1, DMG_CRUSHED);
|
|
||||||
|
|
||||||
if (player->playerstate == PST_DEAD)
|
if (player->playerstate == PST_DEAD)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9497,11 +9469,11 @@ static void P_DeathThink(player_t *player)
|
||||||
if (player->deadtimer < INT32_MAX)
|
if (player->deadtimer < INT32_MAX)
|
||||||
player->deadtimer++;
|
player->deadtimer++;
|
||||||
|
|
||||||
if (player->bot) // don't allow bots to do any of the below, B_CheckRespawn does all they need for respawning already
|
if (player->bot && player->bot != 3) // don't allow bots to do any of the below, B_CheckRespawn does all they need for respawning already
|
||||||
goto notrealplayer;
|
goto notrealplayer;
|
||||||
|
|
||||||
// continue logic
|
// continue logic
|
||||||
if (!(netgame || multiplayer) && player->lives <= 0)
|
if (!(netgame || multiplayer) && player->lives <= 0 && player ==&players[consoleplayer]) //Extra players in SP can't be allowed to continue or end game
|
||||||
{
|
{
|
||||||
if (player->deadtimer > (3*TICRATE) && (cmd->buttons & BT_SPIN || cmd->buttons & BT_JUMP) && (!continuesInSession || player->continues > 0))
|
if (player->deadtimer > (3*TICRATE) && (cmd->buttons & BT_SPIN || cmd->buttons & BT_JUMP) && (!continuesInSession || player->continues > 0))
|
||||||
G_UseContinue();
|
G_UseContinue();
|
||||||
|
@ -11480,7 +11452,7 @@ void P_PlayerThink(player_t *player)
|
||||||
player->playerstate = PST_DEAD;
|
player->playerstate = PST_DEAD;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (player->bot)
|
if (player->bot && player->bot != 3)
|
||||||
{
|
{
|
||||||
if (player->playerstate == PST_LIVE || player->playerstate == PST_DEAD)
|
if (player->playerstate == PST_LIVE || player->playerstate == PST_DEAD)
|
||||||
{
|
{
|
||||||
|
@ -11494,6 +11466,7 @@ void P_PlayerThink(player_t *player)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef SEENAMES
|
||||||
if (netgame && player == &players[displayplayer] && !(leveltime % (TICRATE/5)))
|
if (netgame && player == &players[displayplayer] && !(leveltime % (TICRATE/5)))
|
||||||
{
|
{
|
||||||
seenplayer = NULL;
|
seenplayer = NULL;
|
||||||
|
@ -11518,6 +11491,7 @@ void P_PlayerThink(player_t *player)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (player->awayviewmobj && P_MobjWasRemoved(player->awayviewmobj))
|
if (player->awayviewmobj && P_MobjWasRemoved(player->awayviewmobj))
|
||||||
{
|
{
|
||||||
|
@ -12588,16 +12562,13 @@ void P_PlayerAfterThink(player_t *player)
|
||||||
player->powers[pw_carry] = CR_NONE;
|
player->powers[pw_carry] = CR_NONE;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (tails->player)
|
P_TryMove(player->mo, tails->x + P_ReturnThrustX(tails, tails->player->drawangle, 4*FRACUNIT), tails->y + P_ReturnThrustY(tails, tails->player->drawangle, 4*FRACUNIT), true);
|
||||||
P_TryMove(player->mo, tails->x + P_ReturnThrustX(tails, tails->player->drawangle, 4*FRACUNIT), tails->y + P_ReturnThrustY(tails, tails->player->drawangle, 4*FRACUNIT), true);
|
|
||||||
else
|
|
||||||
P_TryMove(player->mo, tails->x + P_ReturnThrustX(tails, tails->angle, 4*FRACUNIT), tails->y + P_ReturnThrustY(tails, tails->angle, 4*FRACUNIT), true);
|
|
||||||
player->mo->momx = tails->momx;
|
player->mo->momx = tails->momx;
|
||||||
player->mo->momy = tails->momy;
|
player->mo->momy = tails->momy;
|
||||||
player->mo->momz = tails->momz;
|
player->mo->momz = tails->momz;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (G_CoopGametype() && tails->player && tails->player->bot != 1)
|
if (G_CoopGametype() && (!tails->player || tails->player->bot != 1))
|
||||||
{
|
{
|
||||||
player->mo->angle = tails->angle;
|
player->mo->angle = tails->angle;
|
||||||
|
|
||||||
|
@ -12612,7 +12583,7 @@ void P_PlayerAfterThink(player_t *player)
|
||||||
{
|
{
|
||||||
if (player->mo->state-states != S_PLAY_RIDE)
|
if (player->mo->state-states != S_PLAY_RIDE)
|
||||||
P_SetPlayerMobjState(player->mo, S_PLAY_RIDE);
|
P_SetPlayerMobjState(player->mo, S_PLAY_RIDE);
|
||||||
if (tails->player && (tails->skin && ((skin_t *)(tails->skin))->sprites[SPR2_SWIM].numframes) && (tails->eflags & MFE_UNDERWATER))
|
if ((tails->skin && ((skin_t *)(tails->skin))->sprites[SPR2_SWIM].numframes) && (tails->eflags & MFE_UNDERWATER))
|
||||||
tails->player->powers[pw_tailsfly] = 0;
|
tails->player->powers[pw_tailsfly] = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in a new issue