本文整理汇总了C++中Distance函数的典型用法代码示例。如果您正苦于以下问题:C++ Distance函数的具体用法?C++ Distance怎么用?C++ Distance使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了Distance函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: NPC_BSHowler_Default
/*
-------------------------
NPC_BSHowler_Default
-------------------------
*/
void NPC_BSHowler_Default( void )
{
if ( NPC->client->ps.legsAnim != BOTH_GESTURE1 )
{
NPC->count = 0;
}
//FIXME: if in jump, do damage in front and maybe knock them down?
if ( !TIMER_Done( NPC, "attacking" ) )
{
if ( NPC->enemy )
{
//NPC_FaceEnemy( qfalse );
Howler_Attack( Distance( NPC->enemy->currentOrigin, NPC->currentOrigin ) );
}
else
{
//NPC_UpdateAngles( qfalse, qtrue );
Howler_Attack( 0.0f );
}
NPC_UpdateAngles( qfalse, qtrue );
return;
}
if ( NPC->enemy )
{
if ( NPCInfo->stats.aggression > 0 )
{
if ( TIMER_Done( NPC, "aggressionDecay" ) )
{
NPCInfo->stats.aggression--;
TIMER_Set( NPC, "aggressionDecay", 500 );
}
}
if ( !TIMER_Done( NPC, "flee" )
&& NPC_BSFlee() ) //this can clear ENEMY
{//successfully trying to run away
return;
}
if ( NPC->enemy == NULL)
{
NPC_UpdateAngles( qfalse, qtrue );
return;
}
if ( NPCInfo->localState == LSTATE_FLEE )
{//we were fleeing, now done (either timer ran out or we cannot flee anymore
if ( NPC_ClearLOS( NPC->enemy ) )
{//if enemy is still around, go berzerk
NPCInfo->localState = LSTATE_BERZERK;
}
else
{//otherwise, lick our wounds?
NPCInfo->localState = LSTATE_CLEAR;
TIMER_Set( NPC, "standing", Q_irand( 3000, 10000 ) );
}
}
else if ( NPCInfo->localState == LSTATE_BERZERK )
{//go nuts!
}
else if ( NPCInfo->stats.aggression >= Q_irand( 75, 125 ) )
{//that's it, go nuts!
NPCInfo->localState = LSTATE_BERZERK;
}
else if ( !TIMER_Done( NPC, "retreating" ) )
{//trying to back off
NPC_FaceEnemy( qtrue );
if ( NPC->client->ps.speed > NPCInfo->stats.walkSpeed )
{
NPC->client->ps.speed = NPCInfo->stats.walkSpeed;
}
ucmd.buttons |= BUTTON_WALKING;
if ( Distance( NPC->enemy->currentOrigin, NPC->currentOrigin ) < HOWLER_RETREAT_DIST )
{//enemy is close
vec3_t moveDir;
AngleVectors( NPC->currentAngles, moveDir, NULL, NULL );
VectorScale( moveDir, -1, moveDir );
if ( !NAV_DirSafe( NPC, moveDir, 8 ) )
{//enemy is backing me up against a wall or ledge! Start to get really mad!
NPCInfo->stats.aggression += 2;
}
else
{//back off
ucmd.forwardmove = -127;
}
//enemy won't leave me alone, get mad...
NPCInfo->stats.aggression++;
}
return;
}
else if ( TIMER_Done( NPC, "standing" ) )
{//not standing around
if ( !(NPCInfo->last_ucmd.forwardmove)
&& !(NPCInfo->last_ucmd.rightmove) )
{//stood last frame
if ( TIMER_Done( NPC, "walking" )
&& TIMER_Done( NPC, "running" ) )
//.........这里部分代码省略.........
示例2: Max
float Ray::Distance(const Capsule &capsule) const
{
return Max(0.f, Distance(capsule.l) - capsule.r);
}
示例3: Index
Index(const Matrix<ElementType>& features, const IndexParams& params, Distance distance = Distance() )
: index_params_(params)
{
flann_algorithm_t index_type = get_param<flann_algorithm_t>(params,"algorithm");
loaded_ = false;
if (index_type == FLANN_INDEX_SAVED) {
nnIndex_ = load_saved_index<Distance>(features, get_param<cv::String>(params,"filename"), distance);
loaded_ = true;
}
else {
nnIndex_ = create_index_by_type<Distance>(features, params, distance);
}
}
示例4: Distance
float Ray::Distance(const Ray &ray) const
{
return Distance(ray, 0, 0);
}
示例5: Rancor_Combat
//----------------------------------
void Rancor_Combat( void )
{
if ( NPC->count )
{//holding my enemy
if ( TIMER_Done2( NPC, "takingPain", qtrue ))
{
NPCInfo->localState = LSTATE_CLEAR;
}
else
{
Rancor_Attack( 0, qfalse );
}
NPC_UpdateAngles( qtrue, qtrue );
return;
}
// If we cannot see our target or we have somewhere to go, then do that
if ( !NPC_ClearLOS4( NPC->enemy ) )//|| UpdateGoal( ))
{
NPCInfo->combatMove = qtrue;
NPCInfo->goalEntity = NPC->enemy;
NPCInfo->goalRadius = MIN_DISTANCE;//MAX_DISTANCE; // just get us within combat range
if ( !NPC_MoveToGoal( qtrue ) )
{//couldn't go after him? Look for a new one
TIMER_Set( NPC, "lookForNewEnemy", 0 );
NPCInfo->consecutiveBlockedMoves++;
}
else
{
NPCInfo->consecutiveBlockedMoves = 0;
}
return;
}
// Sometimes I have problems with facing the enemy I'm attacking, so force the issue so I don't look dumb
NPC_FaceEnemy( qtrue );
{
float distance;
qboolean advance;
qboolean doCharge;
distance = Distance( NPC->r.currentOrigin, NPC->enemy->r.currentOrigin );
advance = (qboolean)( distance > (NPC->r.maxs[0]+MIN_DISTANCE) ? qtrue : qfalse );
doCharge = qfalse;
if ( advance )
{//have to get closer
vec3_t yawOnlyAngles;
VectorSet( yawOnlyAngles, 0, NPC->r.currentAngles[YAW], 0 );
if ( NPC->enemy->health > 0
&& fabs(distance-250) <= 80
&& InFOV3( NPC->enemy->r.currentOrigin, NPC->r.currentOrigin, yawOnlyAngles, 30, 30 ) )
{
if ( !Q_irand( 0, 9 ) )
{//go for the charge
doCharge = qtrue;
advance = qfalse;
}
}
}
if (( advance /*|| NPCInfo->localState == LSTATE_WAITING*/ ) && TIMER_Done( NPC, "attacking" )) // waiting monsters can't attack
{
if ( TIMER_Done2( NPC, "takingPain", qtrue ))
{
NPCInfo->localState = LSTATE_CLEAR;
}
else
{
Rancor_Move( 1 );
}
}
else
{
Rancor_Attack( distance, doCharge );
}
}
}
示例6: return
vec3f Plane::Projection( const vec3f& point ) const
{
return ( point - normal_ * Distance( point ) );
}
示例7: return
bool
PlaneGeometry::IsOnPlane( const PlaneGeometry *plane ) const
{
return ( IsParallel( plane ) && (Distance( plane->GetOrigin() ) < eps) );
}
示例8: RewindToMark
/**
* Resets current offset position of input stream to marked position.
* This allows us to back up to this point if the need should arise,
* such as when tokenization gets interrupted.
* NOTE: IT IS REALLY BAD FORM TO CALL RELEASE WITHOUT CALLING MARK FIRST!
*
* @update gess 5/12/98
* @param
* @return
*/
void nsScanner::RewindToMark(void){
if (mSlidingBuffer) {
mCountRemaining += (Distance(mMarkPosition, mCurrentPosition));
mCurrentPosition = mMarkPosition;
}
}
示例9: Distance
bool
PlaneGeometry::IsOnPlane( const Point3D &point ) const
{
return Distance(point) < eps;
}
示例10: Team_TouchEnemyFlag
int Team_TouchEnemyFlag( gentity_t *ent, gentity_t *other, int team ) {
gclient_t *cl = other->client;
vec3_t mins, maxs;
int num, j, ourFlag;
int touch[MAX_GENTITIES];
gentity_t* enemy;
float enemyDist, dist;
VectorSubtract( ent->s.pos.trBase, minFlagRange, mins );
VectorAdd( ent->s.pos.trBase, maxFlagRange, maxs );
num = trap->EntitiesInBox( mins, maxs, touch, MAX_GENTITIES );
dist = Distance(ent->s.pos.trBase, other->client->ps.origin);
if (other->client->sess.sessionTeam == TEAM_RED){
ourFlag = PW_REDFLAG;
} else {
ourFlag = PW_BLUEFLAG;
}
for(j = 0; j < num; ++j){
enemy = (g_entities + touch[j]);
if (!enemy || !enemy->inuse || !enemy->client){
continue;
}
//ignore specs
if (enemy->client->sess.sessionTeam == TEAM_SPECTATOR)
continue;
//check if its alive
if (enemy->health < 1)
continue; // dead people can't pick up items
//lets check if he has our flag
if (!enemy->client->ps.powerups[ourFlag])
continue;
//check if enemy is closer to our flag than us
enemyDist = Distance(ent->s.pos.trBase,enemy->client->ps.origin);
if (enemyDist < dist){
// possible recursion is hidden in this, but
// infinite recursion wont happen, because we cant
// have a < b and b < a at the same time
return Team_TouchOurFlag( ent, enemy, team );
}
}
//PrintMsg (NULL, "%s" S_COLOR_WHITE " got the %s flag!\n",
// other->client->pers.netname, TeamName(team));
PrintCTFMessage(other->s.number, team, CTFMESSAGE_PLAYER_GOT_FLAG);
if (team == TEAM_RED)
cl->ps.powerups[PW_REDFLAG] = INT_MAX; // flags never expire
else
cl->ps.powerups[PW_BLUEFLAG] = INT_MAX; // flags never expire
Team_SetFlagStatus( team, FLAG_TAKEN );
AddScore(other, ent->r.currentOrigin, CTF_FLAG_BONUS);
cl->pers.teamState.flagsince = level.time;
Team_TakeFlagSound( ent, team );
return -1; // Do not respawn this automatically, but do delete it if it was FL_DROPPED
}
示例11: Team_TouchOurFlag
int Team_TouchOurFlag( gentity_t *ent, gentity_t *other, int team ) {
int i, num, j, enemyTeam;
gentity_t *player;
gclient_t *cl = other->client;
int enemy_flag;
vec3_t mins, maxs;
int touch[MAX_GENTITIES];
gentity_t* enemy;
float enemyDist, dist;
if (cl->sess.sessionTeam == TEAM_RED) {
enemy_flag = PW_BLUEFLAG;
} else {
enemy_flag = PW_REDFLAG;
}
if ( ent->flags & FL_DROPPED_ITEM ) {
// hey, its not home. return it by teleporting it back
//PrintMsg( NULL, "%s" S_COLOR_WHITE " returned the %s flag!\n",
// cl->pers.netname, TeamName(team));
PrintCTFMessage(other->s.number, team, CTFMESSAGE_PLAYER_RETURNED_FLAG);
AddScore(other, ent->r.currentOrigin, CTF_RECOVERY_BONUS);
other->client->pers.teamState.flagrecovery++;
other->client->pers.teamState.lastreturnedflag = level.time;
//ResetFlag will remove this entity! We must return zero
Team_ReturnFlagSound(Team_ResetFlag(team), team);
return 0;
}
// the flag is at home base. if the player has the enemy
// flag, he's just won!
if (!cl->ps.powerups[enemy_flag])
return 0; // We don't have the flag
// fix: captures after timelimit hit could
// cause game ending with tied score
if (level.intermissionQueued)
return 0;
// check for enemy closer to grab the flag
VectorSubtract( ent->s.pos.trBase, minFlagRange, mins );
VectorAdd( ent->s.pos.trBase, maxFlagRange, maxs );
num = trap->EntitiesInBox( mins, maxs, touch, MAX_GENTITIES );
dist = Distance( ent->s.pos.trBase, other->client->ps.origin );
if (other->client->sess.sessionTeam == TEAM_RED)
enemyTeam = TEAM_BLUE;
else
enemyTeam = TEAM_RED;
for (j = 0; j < num; j++) {
enemy = (g_entities + touch[j]);
if (!enemy || !enemy->inuse || !enemy->client)
continue;
if (enemy->client->pers.connected != CON_CONNECTED)
continue;
//check if its alive
if (enemy->health < 1)
continue; // dead people can't pickup
//ignore specs
if (enemy->client->sess.sessionTeam == TEAM_SPECTATOR)
continue;
//check if this is enemy
if ((enemy->client->sess.sessionTeam != TEAM_RED && enemy->client->sess.sessionTeam != TEAM_BLUE) ||
enemy->client->sess.sessionTeam != enemyTeam){
continue;
}
//check if enemy is closer to our flag than us
enemyDist = Distance(ent->s.pos.trBase, enemy->client->ps.origin);
if (enemyDist < dist) {
// possible recursion is hidden in this, but
// infinite recursion wont happen, because we cant
// have a < b and b < a at the same time
return Team_TouchEnemyFlag( ent, enemy, team );
}
}
//PrintMsg( NULL, "%s" S_COLOR_WHITE " captured the %s flag!\n", cl->pers.netname, TeamName(OtherTeam(team)));
PrintCTFMessage(other->s.number, team, CTFMESSAGE_PLAYER_CAPTURED_FLAG);
cl->ps.powerups[enemy_flag] = 0;
teamgame.last_flag_capture = level.time;
teamgame.last_capture_team = team;
// Increase the team's score
AddTeamScore(ent->s.pos.trBase, other->client->sess.sessionTeam, 1);
other->client->pers.teamState.captures++;
other->client->rewardTime = level.time + REWARD_SPRITE_TIME;
other->client->ps.persistant[PERS_CAPTURES]++;
//.........这里部分代码省略.........
示例12: DelaunayClustering
static int DelaunayClustering(int MaxClusterSize)
{
int Count = 0, Count1, Count2 = 0, i, j = 0;
Edge *EdgeSet, Key;
Node *From, *To, *N, *F, *T;
point *u, *v;
edge *e_start, *e;
delaunay(Dimension);
for (i = 0; i < Dimension; i++) {
u = &p_array[i];
e_start = e = u->entry_pt;
do {
v = Other_point(e, u);
if (u->id < v->id)
Count++;
} while ((e = Next(e, u)) != e_start);
}
assert(EdgeSet = (Edge *) malloc(Count * sizeof(Edge)));
for (i = 0; i < Dimension; i++) {
u = &p_array[i];
e_start = e = u->entry_pt;
do {
v = Other_point(e, u);
if (u->id < v->id) {
EdgeSet[j].From = From = &NodeSet[u->id];
EdgeSet[j].To = To = &NodeSet[v->id];
EdgeSet[j++].Cost = FixedOrCommon(From, To) ? INT_MIN :
Distance(From, To) * Precision + From->Pi + To->Pi;
}
} while ((e = Next(e, u)) != e_start);
}
free_memory();
if (WeightType == GEO || WeightType == GEOM ||
WeightType == GEO_MEEUS || WeightType == GEOM_MEEUS) {
N = FirstNode;
while ((N = N->Suc) != FirstNode)
if ((N->Y > 0) != (FirstNode->Y > 0))
break;
if (N != FirstNode) {
N = FirstNode;
do
N->Zc = N->Y;
while ((N = N->Suc) != FirstNode);
/* Transform longitude (180 and -180 map to 0) */
From = FirstNode;
do {
From->Zc = From->Y;
if (WeightType == GEO || WeightType == GEO_MEEUS)
From->Y =
(int) From->Y + 5.0 * (From->Y -
(int) From->Y) / 3.0;
From->Y += From->Y > 0 ? -180 : 180;
if (WeightType == GEO || WeightType == GEO_MEEUS)
From->Y =
(int) From->Y + 3.0 * (From->Y -
(int) From->Y) / 5.0;
} while ((From = From->Suc) != FirstNode);
delaunay(Dimension);
do
From->Y = From->Zc;
while ((From = From->Suc) != FirstNode);
qsort(EdgeSet, Count, sizeof(Edge), compareFromTo);
for (i = 0; i < Dimension; i++) {
u = &p_array[i];
e_start = e = u->entry_pt;
do {
v = Other_point(e, u);
if (u->id < v->id)
Count2++;
} while ((e = Next(e, u)) != e_start);
}
Count1 = Count;
assert(EdgeSet =
(Edge *) realloc(EdgeSet,
(Count1 + Count2) * sizeof(Edge)));
for (i = 0; i < Dimension; i++) {
u = &p_array[i];
e_start = e = u->entry_pt;
do {
v = Other_point(e, u);
if (u->id > v->id)
continue;
Key.From = From = &NodeSet[u->id];
Key.To = To = &NodeSet[v->id];
if (!bsearch
(&Key, EdgeSet, Count1, sizeof(Edge),
compareFromTo)) {
EdgeSet[Count].From = From;
EdgeSet[Count].To = To;
EdgeSet[Count].Cost =
FixedOrCommon(From, To) ? INT_MIN :
Distance(From,
To) * Precision + From->Pi + To->Pi;
Count++;
}
} while ((e = Next(e, u)) != e_start);
}
free_memory();
//.........这里部分代码省略.........
示例13: CG_CalculateBeamNodeProperties
/*
===============
CG_CalculateBeamNodeProperties
Fills in trailBeamNode_t.textureCoord
===============
*/
static void CG_CalculateBeamNodeProperties( trailBeam_t *tb )
{
trailBeamNode_t *i = nullptr;
trailSystem_t *ts;
baseTrailBeam_t *btb;
float nodeDistances[ MAX_TRAIL_BEAM_NODES ];
float totalDistance = 0.0f, position = 0.0f;
int j, numNodes = 0;
float TCRange, widthRange, alphaRange;
vec3_t colorRange;
float fadeAlpha = 1.0f;
if ( !tb || !tb->nodes )
{
return;
}
ts = tb->parent;
btb = tb->class_;
if ( ts->destroyTime > 0 && btb->fadeOutTime )
{
fadeAlpha -= ( float )( cg.time - ts->destroyTime ) / btb->fadeOutTime;
if ( fadeAlpha < 0.0f )
{
fadeAlpha = 0.0f;
}
}
TCRange = tb->class_->backTextureCoord -
tb->class_->frontTextureCoord;
widthRange = tb->class_->backWidth -
tb->class_->frontWidth;
alphaRange = tb->class_->backAlpha -
tb->class_->frontAlpha;
VectorSubtract( tb->class_->backColor,
tb->class_->frontColor, colorRange );
for ( i = tb->nodes; i && i->next; i = i->next )
{
nodeDistances[ numNodes++ ] =
Distance( i->position, i->next->position );
}
for ( j = 0; j < numNodes; j++ )
{
totalDistance += nodeDistances[ j ];
}
for ( j = 0, i = tb->nodes; i; i = i->next, j++ )
{
if ( tb->class_->textureType == TBTT_STRETCH )
{
i->textureCoord = tb->class_->frontTextureCoord +
( ( position / totalDistance ) * TCRange );
}
else if ( tb->class_->textureType == TBTT_REPEAT )
{
if ( tb->class_->clampToBack )
{
i->textureCoord = ( totalDistance - position ) /
tb->class_->repeatLength;
}
else
{
i->textureCoord = position / tb->class_->repeatLength;
}
}
i->halfWidth = ( tb->class_->frontWidth +
( ( position / totalDistance ) * widthRange ) ) / 2.0f;
i->alpha = ( byte )( ( float ) 0xFF * ( tb->class_->frontAlpha +
( ( position / totalDistance ) * alphaRange ) ) * fadeAlpha );
VectorMA( tb->class_->frontColor, ( position / totalDistance ),
colorRange, i->color );
position += nodeDistances[ j ];
}
}
示例14: getUndoTextBuffer
Int
getUndoTextBuffer(TextBuffer tb)
{ long caret = -1;
if ( tb->undo_buffer != NULL )
{ UndoBuffer ub = tb->undo_buffer;
UndoCell cell;
if ( (cell = ub->current) == NULL ) /* No further undo's */
fail;
while(cell != NULL)
{ DEBUG(NAME_undo, Cprintf("Undo using cell %d: ",
Distance(cell, ub->buffer)));
switch( cell->type )
{
case UNDO_DELETE:
{ UndoDelete d = (UndoDelete) cell;
string s;
s.size = d->len;
s.iswide = d->iswide;
if ( d->iswide )
s.s_textA = d->text.A;
else
s.s_textW = d->text.W;
DEBUG(NAME_undo, Cprintf("Undo delete at %ld, len=%ld\n",
d->where, d->len));
insert_textbuffer(tb, d->where, 1, &s);
caret = max(caret, d->where + d->len);
break;
}
case UNDO_INSERT:
{ UndoInsert i = (UndoInsert) cell;
DEBUG(NAME_undo, Cprintf("Undo insert at %ld, len=%ld\n",
i->where, i->len));
delete_textbuffer(tb, i->where, i->len);
caret = max(caret, i->where);
break;
}
case UNDO_CHANGE:
{ UndoChange c = (UndoChange) cell;
string s;
s.size = c->len;
s.iswide = c->iswide;
if ( c->iswide )
s.s_textA = c->text.A;
else
s.s_textW = c->text.W;
DEBUG(NAME_undo, Cprintf("Undo change at %ld, len=%ld\n",
c->where, c->len));
change_textbuffer(tb, c->where, &s);
caret = max(caret, c->where + c->len);
break;
}
}
cell = cell->previous;
if ( cell == NULL || cell->marked == TRUE )
{ ub->current = cell;
if ( cell == ub->checkpoint ) /* reached non-modified checkpoint */
{ DEBUG(NAME_undo, Cprintf("Reset modified to @off\n"));
CmodifiedTextBuffer(tb, OFF);
}
changedTextBuffer(tb);
ub->undone = TRUE;
answer(toInt(caret));
}
}
}
fail;
}
示例15: AIFunc_DefaultStart
const char *AIFunc_Heinrich_Earthquake( cast_state_t *cs ) {
gentity_t *ent = &g_entities[cs->entityNum];
gentity_t *enemy;
cast_state_t *ecs;
vec3_t enemyVec;
float enemyDist, scale;
trace_t *tr;
cs->aiFlags |= AIFL_SPECIAL_FUNC;
if ( cs->enemyNum < 0 ) {
if ( !ent->client->ps.torsoTimer ) {
return AIFunc_DefaultStart( cs );
}
return NULL;
}
enemy = &g_entities[cs->enemyNum];
ecs = AICast_GetCastState( cs->enemyNum );
VectorMA( enemy->r.currentOrigin, HEINRICH_STOMP_DELAY, enemy->client->ps.velocity, enemyVec );
enemyDist = VectorDistance( ent->r.currentOrigin, enemyVec );
if ( ent->client->ps.torsoTimer < 500 ) {
int rnd;
aicast_predictmove_t move;
vec3_t vec;
AICast_PredictMovement( ecs, 2, 0.5, &move, &g_entities[cs->enemyNum].client->pers.cmd, -1 );
VectorSubtract( move.endpos, cs->bs->origin, vec );
vec[2] = 0;
enemyDist = VectorLength( vec );
enemyDist -= g_entities[cs->enemyNum].r.maxs[0];
enemyDist -= ent->r.maxs[0];
//
if ( enemyDist < 140 ) {
// combo attack
rnd = rand() % 3;
switch ( rnd ) {
case 0:
return AIFunc_Heinrich_SwordSideSlashStart( cs );
case 1:
return AIFunc_Heinrich_SwordKnockbackStart( cs );
case 2:
return AIFunc_Heinrich_SwordLungeStart( cs );
}
} else { // back to roaming
ent->client->ps.legsTimer = 0;
ent->client->ps.torsoTimer = 0;
cs->castScriptStatus.scriptNoMoveTime = 0;
AICast_Heinrich_Taunt( cs );
return AIFunc_DefaultStart( cs );
}
}
// time for the thump?
if ( !( cs->aiFlags & AIFL_MISCFLAG1 ) ) {
// face them
AICast_AimAtEnemy( cs );
// ready for damage?
if ( cs->thinkFuncChangeTime < level.time - HEINRICH_STOMP_DELAY ) {
cs->aiFlags |= AIFL_MISCFLAG1;
// play the stomp sound
G_AddEvent( ent, EV_GENERAL_SOUND, G_SoundIndex( aiDefaults[ent->aiCharacter].soundScripts[ORDERSDENYSOUNDSCRIPT] ) );
// check for striking the player
tr = CheckMeleeAttack( ent, 70, qfalse );
// do melee damage
if ( tr && ( tr->entityNum == cs->enemyNum ) ) {
G_Damage( &g_entities[tr->entityNum], ent, ent, vec3_origin, tr->endpos, HEINRICH_STOMP_DAMAGE, 0, MOD_GAUNTLET );
}
// call the debris trigger
AICast_ScriptEvent( cs, "trigger", "quake" );
}
}
enemyDist = Distance( enemy->s.pos.trBase, ent->s.pos.trBase );
// do the earthquake effects
if ( cs->thinkFuncChangeTime < level.time - HEINRICH_STOMP_DELAY ) {
// throw the player into the air, if they are on the ground
if ( ( enemy->s.groundEntityNum != ENTITYNUM_NONE ) && enemyDist < HEINRICH_STOMP_RANGE ) {
scale = 0.5 + 0.5 * ( (float)ent->client->ps.torsoTimer / 1000.0 );
if ( scale > 1.0 ) {
scale = 1.0;
}
VectorSubtract( ent->s.pos.trBase, enemy->s.pos.trBase, enemyVec );
VectorScale( enemyVec, 2.0 * ( 0.6 + 0.5 * random() ) * scale * ( 0.6 + 0.6 * ( 1.0 - ( enemyDist / HEINRICH_STOMP_RANGE ) ) ), enemyVec );
enemyVec[2] = scale * HEINRICH_STOMP_VELOCITY_Z * ( 1.0 - 0.5 * ( enemyDist / HEINRICH_STOMP_RANGE ) );
// bounce the player using this velocity
VectorAdd( enemy->client->ps.velocity, enemyVec, enemy->client->ps.velocity );
}
}
return NULL;
}