|
|
|
/***
|
|
|
|
*
|
|
|
|
* Copyright (c) 1996-2001, Valve LLC. All rights reserved.
|
|
|
|
*
|
|
|
|
* This product contains software technology licensed from Id
|
|
|
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
|
|
|
* All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Use, distribution, and modification of this source code and/or resulting
|
|
|
|
* object code is restricted to non-commercial enhancements to products from
|
|
|
|
* Valve LLC. All other use, distribution, or modification is prohibited
|
|
|
|
* without written permission from Valve LLC.
|
|
|
|
*
|
|
|
|
****/
|
|
|
|
|
|
|
|
#include "extdll.h"
|
|
|
|
#include "util.h"
|
|
|
|
#include "cbase.h"
|
|
|
|
#include "monsters.h"
|
|
|
|
#include "weapons.h"
|
|
|
|
#include "effects.h"
|
|
|
|
#include "decals.h"
|
|
|
|
#include "soundent.h"
|
|
|
|
#include "game.h"
|
|
|
|
#include "nail.h"
|
|
|
|
|
|
|
|
|
|
|
|
LINK_ENTITY_TO_CLASS(nail, CNail);
|
|
|
|
|
|
|
|
CNail *CNail::NailCreate(void)
|
|
|
|
{
|
|
|
|
// Create a new entity with CCrossbowBolt private data
|
|
|
|
CNail *pBolt = GetClassPtr((CNail *)NULL);
|
|
|
|
pBolt->pev->classname = MAKE_STRING("nail");
|
|
|
|
pBolt->Spawn();
|
|
|
|
|
|
|
|
return pBolt;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CNail::Spawn()
|
|
|
|
{
|
|
|
|
Precache();
|
|
|
|
pev->movetype = MOVETYPE_FLY;
|
|
|
|
pev->solid = SOLID_BBOX;
|
|
|
|
|
|
|
|
pev->gravity = 0.0;
|
|
|
|
|
|
|
|
SET_MODEL(ENT(pev), "models/nail.mdl");
|
|
|
|
|
|
|
|
UTIL_SetOrigin(pev, pev->origin);
|
|
|
|
UTIL_SetSize(pev, Vector(0, 0, 0), Vector(0, 0, 0));
|
|
|
|
|
|
|
|
SetTouch(&CNail::NailTouch);
|
|
|
|
SetThink(&CNail::NailThink);
|
|
|
|
pev->nextthink = gpGlobals->time + 0.2;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CNail::Precache()
|
|
|
|
{
|
|
|
|
PRECACHE_MODEL("models/nail.mdl");
|
|
|
|
PRECACHE_SOUND("weapons/brad_hit1.wav");
|
|
|
|
PRECACHE_SOUND("weapons/brad_hit2.wav");
|
|
|
|
}
|
|
|
|
|
|
|
|
int CNail::Classify(void)
|
|
|
|
{
|
|
|
|
return CLASS_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CNail::NailTouch(CBaseEntity *pOther)
|
|
|
|
{
|
|
|
|
SetTouch(NULL);
|
|
|
|
SetThink(NULL);
|
|
|
|
|
|
|
|
if (pOther->pev->takedamage)
|
|
|
|
{
|
|
|
|
TraceResult tr = UTIL_GetGlobalTrace();
|
|
|
|
entvars_t *pevOwner;
|
|
|
|
|
|
|
|
pevOwner = VARS(pev->owner);
|
|
|
|
|
|
|
|
// UNDONE: this needs to call TraceAttack instead
|
|
|
|
ClearMultiDamage();
|
|
|
|
|
|
|
|
pOther->TraceAttack(pevOwner, 0, pev->velocity.Normalize(), &tr, DMG_NEVERGIB);
|
|
|
|
|
|
|
|
ApplyMultiDamage(pev, pevOwner);
|
|
|
|
|
|
|
|
pev->velocity = Vector(0, 0, 0);
|
|
|
|
// play body "thwack" sound
|
|
|
|
switch (RANDOM_LONG(0, 1))
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
EMIT_SOUND(ENT(pev), CHAN_BODY, "weapons/brad_hit1.wav", 1, ATTN_NORM); break;
|
|
|
|
case 1:
|
|
|
|
EMIT_SOUND(ENT(pev), CHAN_BODY, "weapons/brad_hit2.wav", 1, ATTN_NORM); break;
|
|
|
|
}
|
|
|
|
|
|
|
|
Killed(pev, GIB_NEVER);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
EMIT_SOUND_DYN(ENT(pev), CHAN_BODY, "weapons/brad_hit1.wav", RANDOM_FLOAT(0.95, 1.0), ATTN_NORM, 0, 98 + RANDOM_LONG(0, 7));
|
|
|
|
|
|
|
|
SetThink(&CNail::SUB_Remove);
|
|
|
|
pev->nextthink = gpGlobals->time;// this will get changed below if the bolt is allowed to stick in what it hit.
|
|
|
|
|
|
|
|
if (FClassnameIs(pOther->pev, "worldspawn"))
|
|
|
|
{
|
|
|
|
// if what we hit is static architecture, can stay around for a while.
|
|
|
|
Vector vecDir = pev->velocity.Normalize();
|
|
|
|
UTIL_SetOrigin(pev, pev->origin - vecDir * 12);
|
|
|
|
pev->angles = UTIL_VecToAngles(vecDir);
|
|
|
|
pev->solid = SOLID_NOT;
|
|
|
|
pev->movetype = MOVETYPE_FLY;
|
|
|
|
pev->velocity = Vector(0, 0, 0);
|
|
|
|
pev->avelocity.z = 0;
|
|
|
|
pev->angles.z = RANDOM_LONG(0, 360);
|
|
|
|
pev->nextthink = gpGlobals->time + 10.0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*if (UTIL_PointContents(pev->origin) != CONTENTS_WATER)
|
|
|
|
{
|
|
|
|
UTIL_Sparks(pev->origin);
|
|
|
|
}*/
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CNail::NailThink(void)
|
|
|
|
{
|
|
|
|
pev->nextthink = gpGlobals->time + 0.1;
|
|
|
|
}
|