NS/main/source/mod/AvHDivineWind.cpp
2014-12-16 14:36:27 +01:00

238 lines
6.3 KiB
C++

//======== (C) Copyright 2001 Charles G. Cleveland All rights reserved. =========
//
// The copyright to the contents herein is the property of Charles G. Cleveland.
// The contents may be used and/or copied only with the written permission of
// Charles G. Cleveland, or in accordance with the terms and conditions stipulated in
// the agreement/contract under which the contents have been supplied.
//
// Purpose:
//
// $Workfile: AvHDivineWind.cpp$
// $Date: 2002/11/22 21:28:16 $
//
//-------------------------------------------------------------------------------
// $Log: AvHDivineWind.cpp,v $
// Revision 1.11 2002/11/22 21:28:16 Flayra
// - mp_consistency changes
//
// Revision 1.10 2002/10/16 00:52:55 Flayra
// - Plays cool effect now
//
// Revision 1.9 2002/09/23 22:12:20 Flayra
// - Removed offensive upgrade awareness
//
// Revision 1.8 2002/08/16 02:44:10 Flayra
// - New damage types
//
// Revision 1.7 2002/07/24 19:09:16 Flayra
// - Linux issues
//
// Revision 1.6 2002/07/24 18:55:51 Flayra
// - Linux case sensitivity stuff
//
// Revision 1.5 2002/07/24 18:45:41 Flayra
// - Linux and scripting changes
//
// Revision 1.4 2002/06/25 17:50:59 Flayra
// - Reworking for correct player animations and new enable/disable state, new view model artwork, alien weapon refactoring
//
// Revision 1.3 2002/06/10 19:49:06 Flayra
// - Updated with new alien view model artwork (with running anims)
//
// Revision 1.2 2002/06/03 16:27:06 Flayra
// - Animation constants and changes with new artwork
//
// Revision 1.1 2002/05/23 02:33:41 Flayra
// - Post-crash checkin. Restored @Backup from around 4/16. Contains changes for last four weeks of development.
//
//===============================================================================
#include "AvHAlienWeapons.h"
#include "AvHPlayer.h"
#ifdef AVH_CLIENT
#include "cl_dll/eventscripts.h"
#include "cl_dll/in_defs.h"
#include "cl_dll/wrect.h"
#include "cl_dll/cl_dll.h"
#endif
#include "../common/hldm.h"
#include "../common/event_api.h"
#include "../common/event_args.h"
#include "../common/vector_util.h"
#include "AvHAlienWeaponConstants.h"
#include "AvHPlayerUpgrade.h"
#ifdef AVH_SERVER
#include "AvHGamerules.h"
#include "AvHServerUtil.h"
#endif
#include "AvHParticleConstants.h"
#include "AvHSharedUtil.h"
LINK_ENTITY_TO_CLASS(kwDivineWind, AvHDivineWind);
extern int gDivineWindStartEventID;
BOOL AvHDivineWind::CanHolster(void)
{
return true;
}
void AvHDivineWind::Init()
{
this->mRange = kDivineWindRange;
this->mDamage = BALANCE_VAR(kDivineWindDamage);
this->mPrimed = false;
}
int AvHDivineWind::GetBarrelLength() const
{
return 0;
}
float AvHDivineWind::GetRateOfFire() const
{
return BALANCE_VAR(kDivineWindROF);
}
int AvHDivineWind::GetDeployAnimation() const
{
return 13;
}
bool AvHDivineWind::GetFiresUnderwater() const
{
return true;
}
bool AvHDivineWind::GetIsDroppable() const
{
return false;
}
int AvHDivineWind::GetShootAnimation() const
{
return -1;
}
BOOL AvHDivineWind::IsUseable(void)
{
BOOL theIsUseable = FALSE;
if(AvHAlienWeapon::IsUseable())
{
theIsUseable = !this->mPrimed;
}
return theIsUseable;
}
void AvHDivineWind::Explode(void)
{
#ifdef AVH_SERVER
AvHPlayer* thePlayer = dynamic_cast<AvHPlayer*>(this->m_pPlayer);
ASSERT(thePlayer);
if(thePlayer->GetCanBeAffectedByEnemies())
{
// Treat damage upgrade as modifier onto DivineWind
//int theTracerFreq;
//float theDamageMultiplier;
//AvHPlayerUpgrade::GetWeaponUpgrade(thePlayer->pev->iuser4, &theDamageMultiplier, &theTracerFreq);
// Explode!
EMIT_SOUND(thePlayer->edict(), CHAN_AUTO, kDivineWindExplodeSound, 1.0f, ATTN_NORM);
// Kill ourself (set team to 0 so we always take damage)
this->pev->team = 0;
thePlayer->TakeDamage(this->pev, this->pev, 1000, NS_DMG_NORMAL | DMG_ALWAYSGIB);
// Add explosive force
float theDamage = this->mDamage * AvHPlayerUpgrade::GetAlienRangedDamageUpgrade(this->m_pPlayer->pev->iuser4);
if(AvHSHUGetIsWeaponFocusable(AvHWeaponID(this->m_iId)))
{
theDamage *= AvHPlayerUpgrade::GetFocusDamageUpgrade(this->m_pPlayer->pev->iuser4);
}
float theForceScalar = .05f*theDamage;
int theRadius = BALANCE_VAR(kDivineWindRadius);
AvHSUExplosiveForce(this->pev->origin, theRadius, theForceScalar, thePlayer);
// Make sure weapon team is the same as player team so we don't damage friends when friendly fire is off
this->pev->team = thePlayer->pev->team;
::RadiusDamage(thePlayer->pev->origin, this->pev, thePlayer->pev, theDamage, theRadius, CLASS_NONE, NS_DMG_NORMAL);
// Shake view of those around us!
float theShakeAmplitude = 30;
float theShakeFrequency = 100;
float theShakeDuration = 1.5f;
float theShakeRadius = theRadius;
UTIL_ScreenShake(thePlayer->pev->origin, theShakeAmplitude, theShakeFrequency, theShakeDuration, theShakeRadius);
AvHSUPlayParticleEvent(kpsXenocide, this->edict(), this->pev->origin);
// Increment our score so it doesn't count as suicide
//thePlayer->pev->frags++;
}
#endif
}
// This is currently the length of kDivineWindFireSound
const float kExplodeTime = 1.7f;
void AvHDivineWind::FireProjectiles(void)
{
#ifdef AVH_SERVER
// If we haven't already been activated
if(!this->mPrimed)
{
// Make it so weapon can't be switched away from
this->mPrimed = true;
// Play "about to go off" sound (this is the fire sound)
// Set think to be a small time from now
SetThink(&AvHDivineWind::Explode);
this->pev->nextthink = gpGlobals->time + kExplodeTime;
}
#endif
}
char* AvHDivineWind::GetViewModel() const
{
return kLevel1ViewModel;
}
void AvHDivineWind::Precache()
{
AvHAlienWeapon::Precache();
PRECACHE_UNMODIFIED_SOUND(kDivineWindFireSound);
PRECACHE_UNMODIFIED_SOUND(kDivineWindExplodeSound);
this->mEvent = PRECACHE_EVENT(1, kDivineWindShootEventName);
}
void AvHDivineWind::Spawn()
{
AvHAlienWeapon::Spawn();
Precache();
this->m_iId = AVH_WEAPON_DIVINEWIND;
// Set our class name
this->pev->classname = MAKE_STRING(kwsDivineWind);
SET_MODEL(ENT(this->pev), kNullModel);
FallInit();// get ready to fall down.
}
bool AvHDivineWind::UsesAmmo(void) const
{
return false;
}