Wavelength Logo
tl.jpg (2351 bytes) blank.gif (837 bytes) tr.jpg (2446 bytes)
blank.gif (837 bytes)
StealthSuit by BigGuy
blank.gif (837 bytes)
COPY AND PASTE SERIES

First off I would like to thank EvilClone for his Cloaking tutorial for which served as a base for this.
The next section should be fairly easy just to copy and paste, but please give me some credit.
Some features may need to be refined for your own purposes.


1. Open mp workspace-> goto New.
2. C/C++ source file name it, stealthsuit.cpp.
3. Copy and Paste!

Stealthsuit.cpp



/*
* This is the invisible pack
* they must have this equipped in order to be cloaked
* Thought that would be best to prevent invisible frags
* As they move with this equipped they are visible
* But when they stop they are entirely invisible!
*/


#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "nodes.h"
#include "player.h"
#include "gamerules.h"
#include "shake.h"//Ooooh make the screen turn colors when invisible.


class CStealth : public CBasePlayerWeapon
{
public:
void Spawn( void );
void Precache( void );
int iItemSlot( void ) { return 1; }
int GetItemInfo(ItemInfo *p);
int AddToPlayer( CBasePlayer *pPlayer );
void PrimaryAttack( void );
void SecondaryAttack(void);
void Cloak(void);
void UnCloak(void);
BOOL Deploy( void );
void Holster( void );
void WeaponIdle( void );
int cloak; //cloak amount
int cloaked; //cloak flag
float flSpeed; //Speed of player



};

LINK_ENTITY_TO_CLASS( weapon_stealthsuit, CStealth ); //remember to define this in weapons.cpp and weapons.h


//need a model for this? Perhaps just hands
enum stealth_e {
SATCHEL_RADIO_IDLE1 = 0,
SATCHEL_RADIO_FIDGET1,
SATCHEL_RADIO_DRAW,
SATCHEL_RADIO_FIRE,
SATCHEL_RADIO_HOLSTER
};
int CStealth::AddToPlayer( CBasePlayer *pPlayer )
{
if ( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
WRITE_BYTE( m_iId );
MESSAGE_END();
return TRUE;
}
return FALSE;
}

void CStealth::Spawn( )
{
Precache( );
m_iId = WEAPON_STEALTHSUIT;
SET_MODEL(ENT(pev), "models/w_longjump.mdl");
m_iClip = -1; //no ammo for this, but...

FallInit();// get ready to fall down.
}


void CStealth::Precache( void )
{
PRECACHE_MODEL("models/v_satchel_radio.mdl");
PRECACHE_MODEL ("models/w_longjump.mdl");
PRECACHE_MODEL("models/p_satchel_radio.mdl");

}
int CStealth::GetItemInfo(ItemInfo *p)
{
p->pszName = STRING(pev->classname);
p->pszAmmo1 = NULL;
p->iMaxAmmo1 = -1;
p->pszAmmo2 = NULL;
p->iMaxAmmo2 = -1;
p->iMaxClip = WEAPON_NOCLIP;
p->iSlot = 0;
p->iPosition = 1;
p->iId = WEAPON_STEALTHSUIT;
p->iWeight = CROWBAR_WEIGHT;
return 1;
} //im lazy just use some other weapons code the crowbar wont miss it



BOOL CStealth::Deploy( )
{
cloaked=0;
return DefaultDeploy( "models/v_satchel_radio.mdl", "models/p_satchel_radio.mdl", SATCHEL_RADIO_DRAW, "satchel" );

}

void CStealth::Holster( )
{
m_pPlayer->m_flNextAttack = gpGlobals->time + 0.5;
if (cloaked)
{
cloak= 255;
UnCloak();
}

SendWeaponAnim( SATCHEL_RADIO_HOLSTER );
}

void CStealth::PrimaryAttack()
{
m_flNextPrimaryAttack = gpGlobals->time + 2;
if (!(cloaked))
{
cloak=18;
ClientPrint(m_pPlayer->pev, HUD_PRINTCENTER, "Cloaking...");
Cloak();
UTIL_ScreenFade( m_pPlayer, Vector(15,15,255), 1, 0.5, 128, FFADE_OUT |
FFADE_STAYOUT);
ClientPrint(m_pPlayer->pev, HUD_PRINTCENTER, "You are now invisible!");
}
else
{
flSpeed = m_pPlayer->pev->velocity.Length(); //get players speed
cloak = (flSpeed + 6) * 3;
m_pPlayer->pev->renderamt = cloak;
}

SendWeaponAnim( SATCHEL_RADIO_FIRE );

}

void CStealth::SecondaryAttack()
{
m_flNextSecondaryAttack = gpGlobals->time + 2;
if (!(cloaked))
{
return;
}
else
{
ClientPrint(m_pPlayer->pev, HUD_PRINTCENTER, "Uncloaking...");
cloak=255;
UnCloak();
UTIL_ScreenFade( m_pPlayer, Vector(15,15,255), 0.01, 0.5, 128, FFADE_IN);
ClientPrint(m_pPlayer->pev, HUD_PRINTCENTER, "You are now visible!");
}
SendWeaponAnim( SATCHEL_RADIO_FIRE );

}

void CStealth::Cloak()
{
//Put the cloaking stuff here
m_pPlayer->pev->renderamt = cloak;
m_pPlayer->pev->rendermode = kRenderTransAlpha;
//This lets you see thought them
cloaked=1;
return;
}

void CStealth::UnCloak()
{
//Uncloaking here
m_pPlayer->pev->renderamt = cloak; //Return them to normal values
m_pPlayer->pev->renderfx = kRenderFxNone;
m_pPlayer->pev->rendermode = kRenderNormal;
cloaked=0;
return;
}

void CStealth::WeaponIdle()
{
flSpeed = m_pPlayer->pev->velocity.Length(); //get players speed
if (cloaked)
{
if(!(m_pPlayer->pev->button & (IN_MOVELEFT|IN_MOVERIGHT|IN_FORWARD|IN_BACK|IN_JUMP)))
{ //test to see if you are moving left/right/forward/back/jump
cloak=18;
m_pPlayer->pev->renderamt = cloak;
}
else
{
cloak = (flSpeed + 6)*3;
m_pPlayer->pev->renderamt = cloak;
//this is so you gain visibility while moving
}
}
else
{
cloak=255;
m_pPlayer->pev->renderamt = cloak;
}

}
/////////////end of copy and paste///////////

Wow!

Remember to define the weapon in weapon.h and weapon.cpp.

Weapon.h

#define WEAPON_STEALTHSUIT 16

Weapon.cpp

UTIL_PrecacheOtherWeapon("weapon_stealthsuit")

Get your Stealthsuit by typing /give weapon_stealthsuit in the console.


*Extra Credit*

Make the stealthsuit take battery power.
Old in
GREEN.
New in
CYAN.

Lets add a new line in Cloak()

//Put the cloaking stuff here
if (m_pPlayer->pev->armorvalue <= 3)
{
ClientPrint(m_pPlayer->pev, HUD_PRINTCENTER, "You cannot cloak due\n to low battery power\n");
return;
}
else
{
m_pPlayer->pev->armorvalue -= 2; //takes more battery power to turn on than off
}

m_pPlayer->pev->renderamt = cloak;

Then in UnCloak()

//Uncloaking here
m_pPlayer->pev->armorvalue -= 1;
m_pPlayer->pev->renderamt = cloak;

Finally in WeaponIdle()

if (m_pPlayer->pev->armorvalue <= 2)
{
Uncloak()
}

flSpeed = m_pPlayer->pev->velocity.Length(); //get players speed

Now you may say that this should check to make sure your cloaked before you subtract the battery power, but I thought not checking made it feel real. (Hmmm, stealthsuits arent real are they?)
 

Any questions or suggestions should be sent to me: venturis52@hotmail.com

 

blank.gif (837 bytes)
bl.jpg (2471 bytes) blank.gif (837 bytes) br.jpg (2132 bytes)