⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 player.cpp

📁 this keik game source
💻 CPP
📖 第 1 页 / 共 5 页
字号:

CLASS_DECLARATION( Sentient, Player, "player" );

ResponseDef Player::Responses[] =
	{
	   { &EV_ClientMove,					( Response )Player::ClientThink },
	   { &EV_ClientEndFrame,			( Response )Player::EndFrame },
      { &EV_Player_ShowInfo,		   ( Response )Player::ShowInfo },
		{ &EV_Vehicle_Enter,				( Response )Player::EnterVehicle },
		{ &EV_Vehicle_Exit,				( Response )Player::ExitVehicle },
      
      { &EV_Player_EndLevel,		   ( Response )Player::EndLevel },

		{ &EV_Player_AddPathNode,		( Response )Player::AddPathNode },
	   { &EV_Player_PrevWeapon,		( Response )Player::EventPreviousWeapon },
	   { &EV_Player_NextWeapon,		( Response )Player::EventNextWeapon },
      { &EV_Player_PrevItem,	   	( Response )Player::EventPreviousItem },
	   { &EV_Player_NextItem,  		( Response )Player::EventNextItem },
		{ &EV_Player_UseItem,			( Response )Player::EventUseItem },
      { &EV_Player_UseInventoryItem,( Response )Player::EventUseInventoryItem },
	   { &EV_Player_GiveCheat,			( Response )Player::GiveCheat },
		{ &EV_Player_GiveAllCheat,		( Response )Player::GiveAllCheat },
      { &EV_Player_Take,   			( Response )Player::Take },
	   { &EV_Player_GodCheat,			( Response )Player::GodCheat },
      { &EV_Player_DevGodCheat,		( Response )Player::GodCheat },
      { &EV_Player_Spectator,			( Response )Player::Spectator },
	   { &EV_Player_NoTargetCheat,	( Response )Player::NoTargetCheat },
      { &EV_Player_DevNoTargetCheat,( Response )Player::NoTargetCheat },
	   { &EV_Player_NoClipCheat,		( Response )Player::NoclipCheat },
      { &EV_Player_DevNoClipCheat,	( Response )Player::NoclipCheat },
	   { &EV_Player_GameVersion,		( Response )Player::GameVersion },
	   { &EV_Player_Fov,					( Response )Player::Fov },
	   { &EV_Player_SaveFov,			( Response )Player::SaveFov },
	   { &EV_Player_RestoreFov,		( Response )Player::RestoreFov },
		{ &EV_Player_ToggleViewMode,	( Response )Player::ToggleViewMode },
      { &EV_Player_ToggleZoomMode,	( Response )Player::ToggleZoomMode },
      { &EV_Player_ZoomOut, 	      ( Response )Player::ZoomOut },
      { &EV_EnterConsole,           ( Response )Player::EnterConsole },
      { &EV_ExitConsole,            ( Response )Player::ExitConsole },
      { &EV_KickFromConsole,        ( Response )Player::KickConsole },
		{ &EV_Player_Kill,				( Response )Player::Kill },
      { &EV_Player_Dead,				( Response )Player::Dead },
		{ &EV_Player_SpawnEntity,		( Response )Player::SpawnEntity },
      { &EV_Player_SpawnActor,      ( Response )Player::SpawnActor },
		{ &EV_Player_Respawn,			( Response )Player::Respawn },

		{ &EV_Pain,							( Response )Player::Pain },
		{ &EV_Killed,						( Response )Player::Killed },
      { &EV_Gib,                    ( Response )Player::GibEvent },
		{ &EV_GotKill,						( Response )Player::GotKill },

		{ &EV_Player_ReadyToFire,		( Response )Player::ReadyToFire },
		{ &EV_Player_WaitingToFire,	( Response )Player::WaitingToFire },
		{ &EV_Player_AttackDone,		( Response )Player::DoneFiring },
		{ &EV_Player_TestThread,		( Response )Player::TestThread },

      { &EV_Player_ClearFloatingInventory,   (Response)Player::ClearFloatingInventory },
      { &EV_Player_PowerupTimer,		         ( Response )Player::SetPowerupTimer },
      { &EV_Player_UpdatePowerupTimer,		   ( Response )Player::UpdatePowerupTimer },

		{ &EV_Player_WhatIs,							( Response )Player::WhatIs },
      { &EV_Player_ActorInfo,                ( Response )Player::ActorInfo },
		{ &EV_Player_Taunt,							( Response )Player::Taunt },
		{ &EV_Player_KillEnt,						( Response )Player::KillEnt },
		{ &EV_Player_RemoveEnt,						( Response )Player::RemoveEnt },
		{ &EV_Player_KillClass,						( Response )Player::KillClass },
		{ &EV_Player_RemoveClass,					( Response )Player::RemoveClass },

		{ &EV_Player_DrawOverlay,					( Response )Player::DrawOverlay },
		{ &EV_Player_HideOverlay,					( Response )Player::HideOverlay },
		{ &EV_Player_DrawStats,					   ( Response )Player::DrawStats },
		{ &EV_Player_HideStats,					   ( Response )Player::HideStats },

      { &EV_Player_SetFlashColor,    		   ( Response )Player::SetFlashColor },
      { &EV_Player_ClearFlashColor,    		( Response )Player::ClearFlashColor },
      { &EV_Player_Mutate,    		         ( Response )Player::Mutate },
      { &EV_Player_Human,               		( Response )Player::Human },
      { &EV_Player_Skin,               		( Response )Player::SetSkin },

      { NULL, NULL }
	};

Player::Player()
	{
	path = NULL;
   
   respawn_time = -1;

   watchCamera       = NULL;
   thirdpersonCamera = NULL;
   movieCamera       = NULL;
   spectatorCamera   = NULL;

	damage_blood = 0;
	damage_alpha = 0;

   action_level = 0;
   drawoverlay  = false;

	defaultViewMode = FIRST_PERSON;

	fov = atof( Info_ValueForKey( client->pers.userinfo, "fov" ) );
	if ( fov < 1 )
      {
		fov = 90;
      }
	else if ( fov > 160 )
      {
		fov = 160;
      }

   savedfov = 0;
   has_thought = false;

	s_debugmusic = gi.cvar ("s_debugmusic", "0", 0);
	whereami = gi.cvar ("whereami", "0", 0);

   // Remove him from the world until we spawn him
   unlink();
	}

void Player::InitSkin
   (
   void
   )

   {
   
   // If this is a new level, there will be no custom skin, so go back to the original blade skin.
   if ( !LoadingSavegame && !deathmatch->value )
      {
      int playernum = edict-g_edicts-1;

      strcpy( client->pers.skin, "blade_base" );
   
   
      // combine name, skin and model into a configstring
	   gi.configstring( CS_PLAYERSKINS+playernum, va( "%s\\%s\\%s", 
                       client->pers.netname,
                       client->pers.model,
                       client->pers.skin ) );     
      }
   }


void Player::Init
	(
	void
	)

	{
   InitClient();
   InitPhysics();
   InitPowerups();
   InitWorldEffects();
   InitMusic();
   InitPath();
   InitView();
   InitState();
   InitEdict();
   InitModel();
   InitWeapons();
   InitSkin();

   // don't call RestoreEnt when respawning on a training level
   if ( !LoadingServer && ( deathmatch->value || ( level.training && ( respawn_time != -1 ) ) || 
      !PersistantData.RestoreEnt( this ) ) )
      {
      InitInventory();
      InitHealth();
      }

   ChooseSpawnPoint();

	if ( !LoadingSavegame && ( viewmode == THIRD_PERSON ) && !crosshair )
		{
      cvar_t * chair;

      chair = gi.cvar("crosshair", "0", 0);
		crosshair = new Entity;
		crosshair->setModel( va( "sprites/crosshair%d.spr", (int)chair->value ) );
      crosshair->edict->svflags |= SVF_ONLYPARENT;
      crosshair->edict->owner = this->edict;
		}

   if ( !deathmatch->value )
      {
      gi.AddCommandString( "con_clearfade\n" );
      }

   // make sure we put the player back into the world
   link();
	}

void Player::WritePersistantData
   (
   SpawnArgGroup &group
   )

   {
   str text;
   char t[ 3 ];
   int hi;
   int lo;
   int i;

   // encode the damage states into a text string
   t[ 2 ] = 0;
   for( i = 0; i < MAX_MODEL_GROUPS; i++ )
      {
      hi = ( edict->s.groups[ i ] >> 4 ) & 0xf;
      lo = edict->s.groups[ i ] & 0xf;
      t[ 0 ] = ( char )( 'A' + hi );
      t[ 1 ] = ( char )( 'A' + lo );
      text += t;
      }

   G_SetSpawnArg( "savemodel", savemodel.c_str() );
   G_SetSpawnArg( "saveskin", saveskin.c_str() );
   G_SetSpawnArg( "damage_groups", text.c_str() );
   G_SetFloatArg( "fov", fov );
   G_SetIntArg( "defaultViewMode", defaultViewMode );
   G_SetIntArg( "flags", flags & ( FL_GODMODE | FL_NOTARGET	| FL_SP_MUTANT ) );

   Sentient::WritePersistantData( group );
   }

void Player::RestorePersistantData
   (
   SpawnArgGroup &group
   )

   {
#ifndef SIN_DEMO
   SpiderMine *spidermine;
   Detonator  *detonator;
#endif
   int i;
   int len;
   str text;
   const char *ptr;
   int hi;
   int lo;

   Sentient::RestorePersistantData( group );

   group.RestoreArgs( 1 );

   // clear the damage states
   memset( edict->s.groups, 0, sizeof( edict->s.groups ) );

   savemodel = G_GetStringArg( "savemodel" );
   saveskin = G_GetStringArg( "saveskin" );

   text = G_GetStringArg( "damage_groups" );
   len = text.length() >> 1;
   if ( len > MAX_MODEL_GROUPS )
      {
      len = MAX_MODEL_GROUPS;
      }

   // decode the damage states from text string
   ptr = text.c_str();
   for( i = 0; i < len; i++ )
      {
      hi = ( *ptr++ - 'A' ) & 0xf;
      lo = ( *ptr++ - 'A' ) & 0xf;
      edict->s.groups[ i ]  = ( hi << 4 ) + lo;
      }

   flags |= G_GetIntArg( "flags" );
   fov = G_GetFloatArg( "fov", 90 );
   defaultViewMode = ( viewmode_t )G_GetIntArg( "defaultViewMode", FIRST_PERSON );

#ifndef SIN_DEMO
   spidermine = ( SpiderMine * )FindItem( "SpiderMine" );
   detonator  = ( Detonator * )FindItem( "Detonator" );
   
   if ( spidermine )
      {
      spidermine->SetDetonator( detonator );
      }

   if ( FindItem( "Silencer" ) )
      {
      flags |= FL_SILENCER;
      }
   
   if ( FindItem( "ScubaGear" ) )
      {
      flags |= FL_OXYGEN;
      }

   if ( flags & FL_SP_MUTANT )
      {
      setModel( "manumit_pl.def" );
      SetAnim( "idle" );
      }
#endif

   if ( defaultViewMode == CAMERA_VIEW )
      {
      defaultViewMode = FIRST_PERSON;
      }

   SetViewMode( defaultViewMode );

   // prevent the player from starting dead
   if ( health < 1 )
      {
      health = 1;
      }
   }

void Player::InitEdict
   (
   void
   )

   {
   // entity state stuff
   setSolidType( SOLID_BBOX );
	setMoveType( MOVETYPE_WALK );
	setSize( Vector( -16, -16, 0 ), Vector( 16, 16, STAND_HEIGHT ) );
	edict->clipmask	 = MASK_PLAYERSOLID;
	edict->svflags		&= ~SVF_DEADMONSTER;
   edict->svflags    &= ~SVF_HIDEOWNER;
   edict->owner       = NULL;

	// clear entity state values
	edict->s.effects		= 0;
	edict->s.frame	      = 0;
   }

void Player::InitMusic
   (
   void
   )

   {
   //
   // reset the music 
   //
	client->ps.current_music_mood = mood_normal;
	client->ps.fallback_music_mood = mood_normal;
   ChangeMusic( "normal", "normal", false );
   music_forced = false;
   }

void Player::InitClient
   (
   void
   )

   {
	client_persistant_t	saved;
	client_respawn_t		resp;

   // deathmatch wipes most client data every spawn
	if ( deathmatch->value || level.training )
		{
		char userinfo[ MAX_INFO_STRING ];

		resp = client->resp;
		memcpy( userinfo, client->pers.userinfo, sizeof( userinfo ) );
		G_InitClientPersistant( client );
		G_ClientUserinfoChanged( edict, userinfo );
		}
	else
		{
		memset( &resp, 0, sizeof( resp ) );
		}

	// clear everything but the persistant data and fov
	saved = client->pers;
	memset( client, 0, sizeof( *client ) );
	client->pers = saved;
	client->resp = resp;
   }

void Player::InitState
   (
   void
   )
   
   {
   in_console         = false;
   trappedInQuantum   = false;
   floating_owner     = NULL;
   gibbed             = false;
   enemy              = NULL;
   lastEnemyTime      = 0;
   lastTauntTime      = 0;

   takedamage			 = DAMAGE_AIM;
   deadflag				 = DEAD_NO;
	flags					&= ~FL_NO_KNOCKBACK;
	flags					|= ( FL_BLOOD | FL_DIE_GIBS );

   if ( parentmode->value )
      {
      flags &= ~FL_BLOOD;
      flags &= ~FL_DIE_GIBS;
      }
   }

void Player::InitHealth
   (
   void
   )
   
   {
   // Don't do anything if we're loading a server game.
   // This is either a loadgame or a restart
   if ( LoadingServer )
      {
      return;
      }

   // reset the health values
   health	  = 100;
	max_health = 100;
   last_damage_time = 0;

   // clear the damage states
   memset( edict->s.groups, 0, sizeof( edict->s.groups ) );
   }

void Player::InitModel
   (
   void
   )

   {
   str model;

   // Model stuff
   edict->s.renderfx |= RF_CUSTOMSKIN;
   edict->s.skinnum   = edict->s.number - 1;

   // Make sure that the model is allowed
   model = client->pers.model;
   if ( !game.ValidPlayerModels.ObjectInList( model ) )
      {
      model = "pl_blade.def";
      }
   
   setModel( model.c_str() );
   TempAnim( "idle", NULL );
	showModel();
   }

void Player::InitPhysics
   (
   void
   )

   {
   // Physics stuff
   onladder       = false;
   sentientFrozen = false;
   oldvelocity    = vec_zero;
	velocity       = vec_zero;
	gravity        = 1.0;
   falling        = false;
   fall_time      = 0;
   fall_value     = 0;
   fallsurface    = NULL; 
	mass				= 200;
   xyspeed        = 0;
   }
 
void Player::InitPowerups
   (
   void
   )

   {
   // powerups
   poweruptimer       = 0;
   poweruptype        = 0;
   flags             &= ~( FL_SHIELDS | FL_ADRENALINE | FL_CLOAK | FL_MUTANT | FL_SILENCER | FL_OXYGEN );
   edict->s.renderfx &= ~( RF_DLIGHT | RF_ENVMAPPED );
   }

void Player::InitWorldEffects
   (
   void
   )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -