📄 player.cpp
字号:
{
// world effects
next_drown_time = 0;
air_finished = level.time + 20;
old_waterlevel = 0;
drown_damage = 0;
}
void Player::InitWeapons
(
void
)
{
// weapon stuff
firing = false;
firedown = false;
firedowntime = 0;
gunoffset = Vector( 0, 0, STAND_HEIGHT );
}
void Player::InitInventory
(
void
)
{
// Don't do anything if we're loading a server game.
// This is either a loadgame or a restart
if ( LoadingServer )
{
return;
}
// Give player the default weapon
if ( !FindItem( "Magnum" ) )
{
giveWeapon( "Magnum" );
}
if ( !FindItem( "Fists" ) )
{
giveWeapon( "Fists" );
}
#ifndef SIN_DEMO
if ( !FindItem( "SpiderMine" ) )
{
giveWeapon( "SpiderMine" );
}
#endif
}
void Player::InitView
(
void
)
{
// Camera stuff
zoom_mode = ZOOMED_OUT;
spectator = false;
currentCameraTarget = 0;
checked_dead_camera = false;
SetViewMode( defaultViewMode );
// view stuff
kick_angles = vec_zero;
kick_origin = vec_zero;
v_angle = vec_zero;
oldviewangles = vec_zero;
v_gunoffset = vec_zero;
v_gunangles = vec_zero;
viewheight = STAND_EYE_HEIGHT;
// blend stuff
v_dmg_time = 0;
damage_blend = vec_zero;
flash_color[0] = flash_color[1] = flash_color[2] = flash_color[3] = 0;
// hud
hidestats = false;
}
void Player::ChooseSpawnPoint
(
void
)
{
// set up the player's spawn location
SelectSpawnPoint( origin, angles, &gravaxis );
setOrigin( origin + "0 0 17" );
worldorigin.copyTo( edict->s.old_origin );
edict->s.renderfx |= RF_FRAMELERP;
KillBox( this );
// set gravity axis
SetGravityAxis( gravaxis );
client->ps.pmove.gravity_axis = gravaxis;
// setup the orientation
setAngles( angles );
v_angle = worldangles;
// set the delta angle
client->ps.pmove.delta_angles[0] = ANGLE2SHORT( angles.x - client->resp.cmd_angles[0] );
client->ps.pmove.delta_angles[1] = ANGLE2SHORT( angles.y - client->resp.cmd_angles[1] );
client->ps.pmove.delta_angles[2] = ANGLE2SHORT( angles.z - client->resp.cmd_angles[2] );
if ( deathmatch->value || coop->value )
{
SpawnTeleportEffect( worldorigin, 124 );
}
}
void Player::InitPath
(
void
)
{
// pathnode placement stuff
nearestNode = NULL;
if ( ai_createnodes->value )
{
nearestNode = new PathNode;
nearestNode->Setup( worldorigin );
}
goalNode = nearestNode;
lastNode = nearestNode;
lastVisible = worldorigin;
searchTime = level.time + 0.1;
}
Player::~Player()
{
if ( client )
{
gi.bprintf( PRINT_HIGH, "%s disconnected\n", client->pers.netname );
}
if ( watchCamera && ( ( watchCamera == thirdpersonCamera ) || ( watchCamera == spectatorCamera ) ) )
{
delete watchCamera;
watchCamera = NULL;
thirdpersonCamera = NULL;
spectatorCamera = NULL;
}
if ( crosshair )
{
delete crosshair;
crosshair = NULL;
}
if ( path )
{
delete path;
path = NULL;
}
edict->s.modelindex = 0;
gi.configstring( CS_PLAYERSKINS + entnum - 1, "" );
}
void Player::EndLevel
(
Event *ev
)
{
if ( flags & FL_MUTANT )
{
Human( NULL );
}
InitPowerups();
if ( health > max_health )
{
health = max_health;
}
if ( health < 1 )
{
health = 1;
}
}
void Player::Respawn
(
Event *ev
)
{
if ( deathmatch->value || coop->value || level.training )
{
assert ( deadflag == DEAD_DEAD );
#ifdef SIN_ARCADE
if ( deathmatch->value )
{
FreeInventory();
}
#else
FreeInventory();
#endif
if ( !gibbed && !level.training )
{
CopyToBodyQueue( edict );
}
respawn_time = level.time;
Init();
// hold in place briefly
client->ps.pmove.pm_time = 50;
client->ps.pmove.pm_flags = PMF_TIME_TELEPORT;
return;
}
// force the load game menu to come up
level.missionfailed = true;
level.missionfailedtime = level.time - FRAMETIME;
}
void Player::SetDeltaAngles
(
void
)
{
int i;
// Use v_angle since we may be in a camera
for( i = 0; i < 3; i++ )
{
client->ps.pmove.delta_angles[ i ] = ANGLE2SHORT( v_angle[ i ] );
}
}
void Player::Spectator
(
Event *ev
)
{
hideModel();
setSolidType( SOLID_NOT );
spectator = true;
FreeInventory();
// Send over a message that lets the player know they are in spectator mode.
gi.WriteByte (svc_layout);
gi.WriteString ("jcx jt hstring 0 0 1 \"SPECTATOR MODE\"");
gi.unicast (edict, true);
client->ps.stats[ STAT_LAYOUTS ] |= DRAW_SPECTATOR;
}
void Player::Obituary
(
Entity *attacker,
Entity *inflictor,
str location,
int meansofdeath
)
{
const char *message1 = NULL;
const char *message2 = "";
int num;
if ( !deathmatch->value )
return;
// Client killed themself
if ( attacker == this )
{
switch ( meansofdeath )
{
case MOD_FALLING:
message1 = "fell down";
break;
case MOD_ADRENALINE:
message1 = "overdosed on adrenaline";
break;
case MOD_ION_DESTRUCT:
message1 = "overloaded his gun";
break;
default:
message1 = "cracked under the pressure";
}
if ( message1 )
{
gi.bprintf( PRINT_MEDIUM, "%s %s.\n", client->pers.netname, message1 );
}
else
{
gi.bprintf( PRINT_MEDIUM, "%s died.\n", client->pers.netname );
}
client->resp.score--;
return;
}
// Killed by another client
if ( attacker && attacker->isClient() )
{
switch (meansofdeath)
{
case MOD_FISTS: // FISTS
{
num = G_Random(6);
switch (num)
{
case 0:
message1 = "was knocked out by";
break;
case 1:
message1 = "was pummelled by";
break;
case 2:
message1 = "was over come by";
message2 = "'s ninja technique";
break;
case 3:
message1 = "ate a knuckle sandwich courtesy of";
break;
case 4:
message1 = "takes";
message2 = "'s beating";
break;
case 5:
message1 = "liked";
message2 = "'s death touch";
break;
default:
message1 = "was killed by";
message2 = "'s fists";
break;
}
}
break;
case MOD_MUTANTHANDS:
message1 = "was shredded by";
break;
case MOD_MAGNUM: // Magnum
{
num = G_Random(5);
switch (num)
{
case 0:
message1 = "was capped in the ass by";
break;
case 1:
message1 = "was gunned down in broad daylight by";
break;
case 2:
message1 = "eats";
message2 = "'s magnum";
break;
case 3:
message1 = "was punked by";
break;
case 4:
message1 = "was jacked by";
break;
default:
message1 = "was killed by";
message2 = "'s magnum";
break;
}
break;
}
case MOD_SHOTGUN: // Shotgun
{
num = G_Random(5);
switch (num)
{
case 0:
message1 = "is a victim of";
message2 = "'s shotgun";
break;
case 1:
message1 = "was slaughtered by";
break;
case 2:
message1 = "drowns in a rain of";
message2 = "'s hot lead";
break;
case 3:
message1 = "finds out why";
message2 = " got an F in gun safety";
break;
case 4:
message1 = "was shotgunned by";
break;
default:
message1 = "was killed by";
message2 = "'s shotgun";
break;
}
break;
}
case MOD_ASSRIFLE:
{
num = G_Random(4);
switch (num)
{
case 0:
message1 = "was assaulted by";
break;
case 1:
message1 = "was cut in half by";
break;
case 2:
message1 = "forgot that";
message2 = " had a bigger gun";
break;
case 3:
message1 = "was machinegunned down by";
break;
default:
message1 = "was killed by";
message2 = "'s assault rifle";
break;
}
}
break;
case MOD_CHAINGUN:
message1 = "was mowed down by";
message2 = "'s chaingun";
break;
case MOD_GRENADE:
message1 = "was fragged by";
message2 = "'s grenade";
break;
case MOD_ROCKET:
{
num = G_Random(5);
switch (num)
{
case 0:
message1 = "was blown up by";
message2 = "'s direct rocket hit";
break;
case 1:
message1 = "bows down to";
message2 = "'s almighty rocket launcher";
break;
case 2:
message1 = "was incinerated by";
message2 = "'s rocket";
break;
case 3:
message1 = "was obliterated by";
message2 = "'s rocket";
break;
case 4:
message1 = "likes walking into";
message2 = "'s projectiles";
break;
default:
message1 = "was killed by";
message2 = "'s rocket launcher";
}
}
break;
case MOD_ROCKETSPLASH:
{
num = G_Random(5);
switch (num)
{
case 0:
message1 = "was caught in";
message2 = "'s explosion";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -