本文整理汇总了C++中Killed函数的典型用法代码示例。如果您正苦于以下问题:C++ Killed函数的具体用法?C++ Killed怎么用?C++ Killed使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了Killed函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: while
void PlayerTrackBomb::SelectTarget()
{
POSITION pos = list_->GetHeadPosition();
while (pos != NULL)
{
EnemyPlane *p = (EnemyPlane *)list_->GetNext(pos);
if (!p->GetLock())
{
p->Lock();
plane_ = p;
return;
}
}
Killed();
}
示例2: vecDir
// DeadTakeDamage - takedamage function called when a monster's corpse is damaged.
int CBaseMonster::DeadTakeDamage(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType)
{
// grab the vector of the incoming attack. ( pretend that the inflictor is a little lower than it really is, so the body will tend to fly upward a bit).
Vector vecDir(0, 0, 0);
if (!FNullEnt(pevInflictor))
{
CBaseEntity *pInflictor = CBaseEntity::Instance(pevInflictor);
if (pInflictor)
{
vecDir = (pInflictor->Center() - Vector(0, 0, 10) - Center()).Normalize();
vecDir = g_vecAttackDir = vecDir.Normalize();
}
}
// turn this back on when the bounding box issues are resolved.
#if 0
pev->flags &= ~FL_ONGROUND;
pev->origin.z += 1;
// let the damage scoot the corpse around a bit.
if (!FNullEnt(pevInflictor) && (pevAttacker->solid != SOLID_TRIGGER))
{
pev->velocity = pev->velocity + vecDir * -DamageForce(flDamage);
}
#endif
// kill the corpse if enough damage was done to destroy the corpse and the damage is of a type that is allowed to destroy the corpse.
if (bitsDamageType & DMG_GIB_CORPSE)
{
if (pev->health <= flDamage)
{
pev->health = -50;
Killed(pevAttacker, GIB_ALWAYS);
return 0;
}
// Accumulate corpse gibbing damage, so you can gib with multiple hits
pev->health -= flDamage * 0.1;
}
return 1;
}
示例3: AddCounter
//延时器函数 放慢动画的模仿速度
void GameObject::DelayerCount()
{
AddCounter();
if (Counter() >= Delayer()) {
AddIndexColumn();
if (IndexColumn() == Ima()->Column())
{
IndexColumn(0);
AddIndexRow();
}
if (IndexRow() == Ima()->Row())
{
if (Loop()) {
IndexRow(0);
IndexColumn(0);
}
else Killed();
}
ClearCounter();
}
}
示例4: SetTouch
void CSqueakGrenade::HuntThink( void )
{
// ALERT( at_console, "think\n" );
if (!IsInWorld())
{
SetTouch( NULL );
UTIL_Remove( this );
return;
}
StudioFrameAdvance( );
pev->nextthink = gpGlobals->time + 0.1;
// explode when ready
if (gpGlobals->time >= m_flDie)
{
g_vecAttackDir = pev->velocity.Normalize( );
pev->health = -1;
Killed( pev, 0 );
return;
}
// float
if (pev->waterlevel != 0)
{
if (pev->movetype == MOVETYPE_BOUNCE)
{
pev->movetype = MOVETYPE_FLY;
}
pev->velocity = pev->velocity * 0.9;
pev->velocity.z += 8.0;
}
else if (pev->movetype = MOVETYPE_FLY)
{
pev->movetype = MOVETYPE_BOUNCE;
}
// return if not time to hunt
if (m_flNextHunt > gpGlobals->time)
return;
m_flNextHunt = gpGlobals->time + 2.0;
CBaseEntity *pOther = NULL;
Vector vecDir;
TraceResult tr;
Vector vecFlat = pev->velocity;
vecFlat.z = 0;
vecFlat = vecFlat.Normalize( );
UTIL_MakeVectors( pev->angles );
if (m_hEnemy == NULL || !m_hEnemy->IsAlive())
{
// find target, bounce a bit towards it.
Look( 512 );
m_hEnemy = BestVisibleEnemy( );
}
// squeek if it's about time blow up
if ((m_flDie - gpGlobals->time <= 0.5) && (m_flDie - gpGlobals->time >= 0.3))
{
EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, "squeek/sqk_die1.wav", 1, ATTN_NORM, 0, 100 + RANDOM_LONG(0,0x3F));
CSoundEnt::InsertSound ( bits_SOUND_COMBAT, pev->origin, 256, 0.25 );
}
// higher pitch as squeeker gets closer to detonation time
float flpitch = 155.0 - 60.0 * ((m_flDie - gpGlobals->time) / SQUEEK_DETONATE_DELAY);
if (flpitch < 80)
flpitch = 80;
if (m_hEnemy != NULL)
{
if (FVisible( m_hEnemy ))
{
vecDir = m_hEnemy->EyePosition() - pev->origin;
m_vecTarget = vecDir.Normalize( );
}
float flVel = pev->velocity.Length();
float flAdj = 50.0 / (flVel + 10.0);
if (flAdj > 1.2)
flAdj = 1.2;
// ALERT( at_console, "think : enemy\n");
// ALERT( at_console, "%.0f %.2f %.2f %.2f\n", flVel, m_vecTarget.x, m_vecTarget.y, m_vecTarget.z );
pev->velocity = pev->velocity * flAdj + m_vecTarget * 300;
}
if (pev->flags & FL_ONGROUND)
{
pev->avelocity = Vector( 0, 0, 0 );
}
else
{
//.........这里部分代码省略.........
示例5: SetTouch
void CCrossbowBolt::BoltTouch( 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( );
if ( pOther->IsPlayer() )
{
pOther->TraceAttack(pevOwner, gSkillData.plrDmgCrossbowClient, pev->velocity.Normalize(), &tr, DMG_NEVERGIB );
}
else
{
pOther->TraceAttack(pevOwner, gSkillData.plrDmgCrossbowMonster, pev->velocity.Normalize(), &tr, DMG_BULLET | 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/xbow_hitbod1.wav", 1, ATTN_NORM); break;
case 1:
EMIT_SOUND(ENT(pev), CHAN_BODY, "weapons/xbow_hitbod2.wav", 1, ATTN_NORM); break;
}
if ( !g_pGameRules->IsMultiplayer() )
{
Killed( pev, GIB_NEVER );
}
}
else
{
EMIT_SOUND_DYN(ENT(pev), CHAN_BODY, "weapons/xbow_hit1.wav", RANDOM_FLOAT(0.95, 1.0), ATTN_NORM, 0, 98 + RANDOM_LONG(0,7));
SetThink( &CCrossbowBolt::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 );
}
}
if ( g_pGameRules->IsMultiplayer() )
{
SetThink( &CCrossbowBolt::ExplodeThink );
pev->nextthink = gpGlobals->time + 0.1;
}
}
示例6: T_Damage
//.........这里部分代码省略.........
{
if ( !midair || ( (int)targ->s.v.flags & FL_ONGROUND ) )
{
if ( targ->ct == ctPlayer )
targ->s.v.currentammo = 1000 + Q_rint(damage);
if ( attacker != targ && attacker->ct == ctPlayer)
attacker->s.v.health = 1000 + Q_rint(damage);
}
}
// update damage stats like: give/taked/team damage
if ( attacker->ct == ctPlayer && targ->ct == ctPlayer )
{
if ( attacker == targ )
{
// self damage
attacker->ps.dmg_self += dmg_dealt;
}
else
{
int items = targ->s.v.items;
// damage to enemy weapon
if ( items & (IT_ROCKET_LAUNCHER | IT_LIGHTNING) )
{
attacker->ps.dmg_eweapon += dmg_dealt;
}
if ( tp_num() && streq(attackerteam, targteam) )
{
attacker->ps.dmg_team += dmg_dealt;
}
else
{
attacker->ps.dmg_g += dmg_dealt;
targ->ps.dmg_t += dmg_dealt;
}
// real hits
if ( take || save )
{
if ( dtRL == targ->deathtype )
attacker->ps.wpn[wpRL].rhits++;
if ( dtGL == targ->deathtype )
attacker->ps.wpn[wpGL].rhits++;
}
// virtual hits
if ( virtual_take || save )
{
if ( dtRL == targ->deathtype )
{
attacker->ps.wpn[wpRL].vhits++;
// virtual given rl damage
attacker->ps.dmg_g_rl += ( virtual_take + save );
}
if ( dtGL == targ->deathtype )
attacker->ps.wpn[wpGL].vhits++;
}
}
}
// mid air bonuses
if ( midair && match_in_progress == 2 && attacker != targ && take && rl_dmg)
MidairDamageBonus(attacker, midheight);
if ( midair && match_in_progress == 2 && stomp_dmg ) {
attacker->ps.mid_stomps++;
targ->s.v.frags -= 3;
}
// if targed killed, do appropriate action and return
if ( ISDEAD( targ ) )
{
Killed( targ, attacker, inflictor );
return;
}
// react to the damage - call pain function
oldself = self;
self = targ;
if ( (int)self->s.v.flags & FL_MONSTER )
{
GetMadAtAttacker( attacker );
}
if ( self->th_pain )
{
self->th_pain( attacker, take );
}
self = oldself;
}
示例7: T_Damage
//.........这里部分代码省略.........
take = 0;
save = damage;
}
//ZOID
//team armor protect
if (ctf->value && targ->client && attacker->client &&
targ->client->resp.ctf_team == attacker->client->resp.ctf_team &&
targ != attacker && ((int)dmflags->value & DF_ARMOR_PROTECT)) {
psave = asave = 0;
} else {
//ZOID
psave = CheckPowerArmor (targ, point, normal, take, dflags);
take -= psave;
asave = CheckArmor (targ, point, normal, take, te_sparks, dflags);
take -= asave;
}
//treat cheat/powerup savings the same as armor
asave += save;
//ZOID
//resistance tech
take = CTFApplyResistance(targ, take);
//ZOID
// team damage avoidance
if (!(dflags & DAMAGE_NO_PROTECTION) && CheckTeamDamage (targ, attacker))
return;
//ZOID
CTFCheckHurtCarrier(targ, attacker);
//ZOID
// do the damage
if (take)
{
if ((targ->svflags & SVF_MONSTER) || (client))
{
SpawnDamage (TE_BLOOD, point, normal, take);
if(client && (targ->svflags & SVF_MONSTER) && attacker)
{
if(client->zc.battlemode & FIRE_CHIKEN) client->zc.battlemode &= ~FIRE_CHIKEN;
if(mod == MOD_RAILGUN
|| mod == MOD_BFG_LASER
|| mod == MOD_ROCKET
|| mod == MOD_BLASTER
|| mod == MOD_RIPPER
|| mod == MOD_HYPERBLASTER
|| mod == MOD_PHALANX)
{
if(attacker->client
&& (9 * random() < Bot[client->zc.botindex].param[BOP_REACTION])
&& !client->zc.first_target)
{
if(!OnSameTeam (targ, attacker)) client->zc.first_target = attacker;
}
}
}
}
else
SpawnDamage (te_sparks, point, normal, take);
targ->health = targ->health - take;
if (targ->health <= 0)
{
if ((targ->svflags & SVF_MONSTER) || (client))
targ->flags |= FL_NO_KNOCKBACK;
Killed (targ, inflictor, attacker, take, point);
return;
}
}
if (client)
{
if (!(targ->flags & FL_GODMODE) && (take))
targ->pain (targ, attacker, knockback, take);
}
else if (take)
{
if (targ->pain)
targ->pain (targ, attacker, knockback, take);
}
// add to the damage inflicted on a player this frame
// the total will be turned into screen blends and view angle kicks
// at the end of the frame
if (client)
{
client->damage_parmor += psave;
client->damage_armor += asave;
client->damage_blood += take;
client->damage_knockback += knockback;
VectorCopy (point, client->damage_from);
}
}
示例8: Killed
/*
================
idExplodingBarrel::Event_Explode
================
*/
void idExplodingBarrel::Event_Explode() {
if ( state == NORMAL || state == BURNING ) {
state = BURNEXPIRED;
Killed( NULL, NULL, 0, vec3_zero, 0 );
}
}
示例9: ceil
//.........这里部分代码省略.........
m_iQuakeItems &= ~(IT_ARMOR1 | IT_ARMOR2 | IT_ARMOR3);
}
pev->armorvalue -= flSave;
float flTake = ceil(flDamage - flSave);
// add to the damage total for clients, which will be sent as a single message at the end of the frame
pev->dmg_take = pev->dmg_take + flTake;
pev->dmg_inflictor = ENT(pevInflictor);
Vector vecTemp;
if ( pevAttacker == pevInflictor )
{
vecTemp = pevAttacker->origin - ( VecBModelOrigin(pev) );
}
else
// an actual missile was involved.
{
vecTemp = pevInflictor->origin - ( VecBModelOrigin(pev) );
}
// this global is still used for glass and other non-monster killables, along with decals.
g_vecAttackDir = vecTemp.Normalize();
// figure momentum add
if ( (pevInflictor) && (pev->movetype == MOVETYPE_WALK) && !( FBitSet (bitsDamageType, DMG_BURN) ) && !( FBitSet (bitsDamageType, DMG_ACID) ) )
{
Vector vecPush = (pev->origin - (pevInflictor->absmin + pevInflictor->absmax) * 0.5).Normalize();
// Set kickback for smaller weapons
// Read: only if it's not yourself doing the damage
if ( (flDamage < 60) && pAttacker->IsPlayer() && (pAttacker != this) )
pev->velocity = pev->velocity + vecPush * flDamage * 11;
else
{
// Otherwise, these rules apply to rockets and grenades
// for blast velocity
if ( pAttacker == this )
{
if ( m_iQuakeWeapon != IT_LIGHTNING )
pev->velocity = pev->velocity + vecPush * flDamage * 8;
}
else
pev->velocity = pev->velocity + vecPush * flDamage * 8;
}
// Rocket Jump modifiers
int iRocketJumpModifier = (int)CVAR_GET_FLOAT("rj");
if ( (iRocketJumpModifier > 1) && (pAttacker == this) && m_iQuakeWeapon == ( IT_ROCKET_LAUNCHER | IT_GRENADE_LAUNCHER ) )
pev->velocity = pev->velocity + vecPush * flDamage * iRocketJumpModifier;
}
// check for godmode or invincibility
if (pev->flags & FL_GODMODE)
return 0;
if (m_flInvincibleFinished > gpGlobals->time)
{
if (m_fInvincSound < gpGlobals->time)
{
EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/protect3.wav", 1, ATTN_NORM);
m_fInvincSound = gpGlobals->time + 2;
}
return 0;
}
// do the damage
pev->health -= (int)flTake;
// tell director about it
MESSAGE_BEGIN( MSG_SPEC, SVC_DIRECTOR );
WRITE_BYTE ( 9 ); // command length in bytes
WRITE_BYTE ( DRC_CMD_EVENT ); // take damage event
WRITE_SHORT( ENTINDEX(this->edict()) ); // index number of primary entity
WRITE_SHORT( ENTINDEX(ENT(pevInflictor)) ); // index number of secondary entity
WRITE_LONG( 5 ); // eventflags (priority and flags)
MESSAGE_END();
// react to the damage
m_bitsDamageType |= bitsDamageType; // Save this so we can report it to the client
m_bitsHUDDamage = -1; // make sure the damage bits get resent
if ( pev->health <= 0 )
{
g_pevLastInflictor = pevInflictor;
Killed( pevAttacker, GIB_NORMAL );
g_pevLastInflictor = NULL;
return 0;
}
// play pain sound
Pain( pAttacker );
return flTake;
}
示例10: DeadTakeDamage
// The damage is coming from inflictor, but get mad at attacker
// This should be the only function that ever reduces health.
// bitsDamageType indicates the type of damage sustained, ie: DMG_SHOCK
//
// Time-based damage: only occurs while the monster is within the trigger_hurt.
// When a monster is poisoned via an arrow etc it takes all the poison damage at once.
int CBaseMonster::__MAKE_VHOOK(TakeDamage)(entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType)
{
if (pev->takedamage == DAMAGE_NO)
return 0;
if (!IsAlive())
{
return DeadTakeDamage(pevInflictor, pevAttacker, flDamage, bitsDamageType);
}
if (pev->deadflag == DEAD_NO)
{
// no pain sound during death animation.
PainSound();
}
// LATER: make armor consideration here!
float flTake = flDamage;
// set damage type sustained
m_bitsDamageType |= bitsDamageType;
// grab the vector of the incoming attack. ( pretend that the inflictor is a little lower than it really is, so the body will tend to fly upward a bit).
Vector vecDir(0, 0, 0);
if (!FNullEnt(pevInflictor))
{
CBaseEntity *pInflictor = CBaseEntity::Instance(pevInflictor);
if (pInflictor)
{
#ifndef PLAY_GAMEDLL
vecDir = (pInflictor->Center() - Vector(0, 0, 10) - Center()).Normalize();
#else
// TODO: fix test demo
vecDir = NormalizeSubtract<
float_precision, float, float_precision, float_precision
>(Center(), pInflictor->Center() - Vector(0, 0, 10));
#endif
vecDir = g_vecAttackDir = vecDir.Normalize();
}
}
// add to the damage total for clients, which will be sent as a single
// message at the end of the frame
// TODO: remove after combining shotgun blasts?
if (IsPlayer())
{
if (pevInflictor)
{
pev->dmg_inflictor = ENT(pevInflictor);
}
pev->dmg_take += flTake;
}
pev->health -= flTake;
if (m_MonsterState == MONSTERSTATE_SCRIPT)
{
SetConditions(bits_COND_LIGHT_DAMAGE);
return 0;
}
if (pev->health <= 0.0f)
{
g_pevLastInflictor = pevInflictor;
if (bitsDamageType & DMG_ALWAYSGIB)
Killed(pevAttacker, GIB_ALWAYS);
else if (bitsDamageType & DMG_NEVERGIB)
Killed(pevAttacker, GIB_NEVER);
else
Killed(pevAttacker, GIB_NORMAL);
g_pevLastInflictor = NULL;
return 0;
}
if ((pev->flags & FL_MONSTER) && !FNullEnt(pevAttacker))
{
if (pevAttacker->flags & (FL_MONSTER | FL_CLIENT))
{
if (pevInflictor)
{
if (m_hEnemy == NULL || pevInflictor == m_hEnemy->pev || !HasConditions(bits_COND_SEE_ENEMY))
m_vecEnemyLKP = pevInflictor->origin;
}
else
{
m_vecEnemyLKP = pev->origin + (g_vecAttackDir * 64);
}
MakeIdealYaw(m_vecEnemyLKP);
//.........这里部分代码省略.........
示例11: Killed
void CGrappleHook::Move( void )
{
// Fograin92: If owner (player) is dead
if( !myowner->IsAlive() )
{
Killed(pev, 0); // Remove tongue instantly
return;
}
// Fograin92: Player isn't holding attack buttons
if( !(myowner->pev->button & (IN_ATTACK|IN_ATTACK2)) )
{
bPullBack = true; // Fograin92: We should pull the tongue back
}
// Fograin92: Animate pull-back tongue animation ONLY if we didn't hit a monster
if(bPullBack)
{
UTIL_MakeVectors( myowner->pev->v_angle + myowner->pev->punchangle );
Vector GunPosition = myowner->GetGunPosition();
GunPosition = GunPosition + gpGlobals->v_up * -4 + gpGlobals->v_right * 3 + gpGlobals->v_forward * 6;
pev->velocity = (GunPosition - pev->origin) * 10; // Pull back the tongue tip
float fDistance = (GunPosition - pev->origin).Length2D(); // Calculate distance between tongue tip and player
//ALERT( at_console, "^2HLU -> ^3weapon_grapple ^2-> %f\n", fDistance );
if (fDistance < 40)
{
Killed(pev, 0);
return;
}
}
else
{
// Fograin92: We did hit a monster
if(m_iHitMonster > 0)
{
// Fograin92: Let's "stick" grapple tongue XYZ to target's center XYZ
pev->origin = myHitMonster->Center();
// Fograin92: We did hit tiny monster, let's pull it
if(m_iHitMonster == 2)
{
myHitMonster->pev->movetype = MOVETYPE_FLY; // Remove gravity effect on our pulled monster
myHitMonster->pev->velocity = (myowner->pev->origin - myHitMonster->pev->origin) * 4; // Pull our monster
}
// Fograin92: Check distance (player <-> monster)
float fDistance = (myowner->pev->origin - myHitMonster->pev->origin).Length2D();
// Fograin92: The monster is very close to player, let's OWN IT!
if (fDistance < 40)
{
ALERT( at_console, "^2HLU -> ^3weapon_grapple ^2-> OWNED -> ^3%s\n", STRING(myHitMonster->pev->classname) );
// Fograin92: Did we pull the gib?
if( myHitMonster->Classify() == CLASS_GIBS )
myHitMonster->SUB_Remove();
else
myHitMonster->TakeDamage(myHitMonster->pev, myowner->pev, 10000, DMG_GENERIC);
Killed(pev, 0); // Fograin92: Target died, kill tongue
}
}
}
// Fograin92: If tongue (beam) exists
if( m_pTongue )
{
UTIL_MakeVectors( myowner->pev->v_angle + myowner->pev->punchangle );
Vector GunPosition = myowner->GetGunPosition();
GunPosition = GunPosition + gpGlobals->v_up * -4 + gpGlobals->v_right * 3 + gpGlobals->v_forward * 6;
m_pTongue->PointEntInit( GunPosition, this->entindex() );
}
else
{
// Fograin92: Create tongue (beam)
m_pTongue = CBeam::BeamCreate( "sprites/_tongue.spr", 8 );
m_pTongue->SetFlags( 0x20 ); // Solid beam
m_pTongue->SetColor( 100, 100, 100 );
m_pTongue->SetScrollRate( 20 );
}
pev->nextthink = gpGlobals->time + 0.01;
}
示例12: T_Damage
//.........这里部分代码省略.........
if (rsave > 0) {
SpawnDamage (TE_SCREEN_SPARKS, point, normal, rsave);
}
if (sasave > 0) {
SpawnDamage (TE_SHIELD_SPARKS, point, normal, sasave);
}
if ((take > 0) || ( (take < 0) && (targ->health < 2 * targ->max_health)) ) {
targ->health -= take;
}
if ( (targ->health > 0) && ((take != 0) || (take + asave > 0)) ) {
addExp(attacker, targ, take + asave); //Also give exp for killing armor
}
if (take != 0) {
if ((targ->svflags & SVF_MONSTER) || (client))
SpawnDamage (TE_BLOOD, point, normal, take);
else
SpawnDamage (te_sparks, point, normal, take);
if ((attacker->client) && (mod != MOD_TELEFRAG)) /* && (targ->health > 0))*/ {
if ((damage > 0) && (attacker->client->pers.skill[34] /*|| (attacker->client->pers.skills.classLevel[4] > 0)*/) && ((targ->health + take) > 0)) {
int maxhealth = attacker->max_health * 0.75;
maxhealth += 13.5 * pow(attacker->client->pers.skills.classLevel[4], 1.05);
if (attacker->health < maxhealth) {
float amount = 0;
float mult = 0;
//mult += 0.001 * pow(attacker->client->pers.skills.classLevel[4], 1.1); // Vampire class level bonus
//mult *= 0.4 + 0.6 * ((float) attacker->client->pers.skills.classLevel[4] / (float) attacker->radius_dmg); // Penalty if not pure Vampire
mult += 0.01 * attacker->client->pers.skill[34]; //From item powerups
if (attacker->client->damage_time > level.time) {
mult *= 0.25;
}
amount = take * mult;
if ((mod == MOD_TELEFRAG) || (attacker == targ))
amount = 0;
attacker->client->pers.add_health += amount;
if (attacker->health > maxhealth)
attacker->health = maxhealth;
}
}
}
if (targ->health <= 0) {
if ((targ->svflags & SVF_MONSTER) || (client))
targ->flags |= FL_NO_KNOCKBACK;
Killed (targ, inflictor, attacker, take, point);
return take;
}
}
if (take > 0) {
if (targ->svflags & SVF_MONSTER) {
edict_t *oldenemy = targ->enemy;
if (targ->radius_dmg && (targ != attacker) && (attacker->takedamage) && (targ->monsterinfo.ability & GIEX_MABILITY_SHARDARMOR) && targ->monsterinfo.shardtime < (level.time - 0.1)) {
vec3_t aim, end;
float mult = level.time - targ->monsterinfo.shardtime;
if (mult > 1.7)
mult = 1.7;
mult += 0.2;
targ->monsterinfo.shardtime = level.time + 0.2;
VectorMA(attacker->s.origin, 0.3, attacker->velocity, end);
end[2] += attacker->viewheight;
VectorSubtract (end, point, aim);
if (targ->monsterinfo.ability & GIEX_MABILITY_DAMAGE) // Damage ability shouldn't affect Shard armor, halve mult
mult *= 0.5;
monster_fire_blaster (targ, point, aim, (int) ceil((16 + 10 * targ->monsterinfo.skill) * mult), 2200, MZ2_SOLDIER_BLASTER_1, EF_BLASTER);
gi.sound(targ, CHAN_AUTO, gi.soundindex("giex/magarm2.wav"), 0.8, ATTN_NORM, 0);
}
M_ReactToDamage (targ, attacker);
if (!(targ->monsterinfo.aiflags & AI_DUCKED) && (take)) {
targ->pain_debounce_time = level.time + 2 + 0.1 * targ->monsterinfo.skill;
if (oldenemy != NULL)
targ->pain (targ, attacker, knockback, take);
}
} else if (client) {
if (!(targ->flags & FL_GODMODE) && (take))
targ->pain (targ, attacker, knockback, take);
} else if (take) {
if (targ->pain)
targ->pain (targ, attacker, knockback, take);
}
}
// add to the damage inflicted on a player this frame
// the total will be turned into screen blends and view angle kicks
// at the end of the frame
if (client) {
client->damage_parmor += psave;
client->damage_armor += (asave + save);
client->damage_blood += take;
client->damage_knockback += knockback;
VectorCopy (point, client->damage_from);
}
return take;
}
示例13: _log
//.........这里部分代码省略.........
//other:
//passiveEmDamageResonanceMultiplier
//passiveThermalDamageResonanceMultiplier
//passiveKineticDamageResonanceMultiplier
//passiveExplosiveDamageResonanceMultiplier
//activeEmDamageResonance
//activeThermalDamageResonance
//activeKineticDamageResonance
//activeExplosiveDamageResonance
//structureUniformity
// Not sure about this, but with this we get some random hits... :)
//total_hull_damage += total_hull_damage * random_damage_mult;
hull_damage.SumWithMultFactor( random_damage_mult );
double total_hull_damage = hull_damage.GetTotal();
total_damage += total_hull_damage;
if(total_hull_damage < available_hull)
{
//we can take all this damage with our hull...
double new_damage = m_hullDamage + total_hull_damage;
m_hullDamage = new_damage;
_log(ITEM__TRACE, "%s(%u): Applying entire %.1f damage to structure. New structure damage: %.1f", GetName(), GetID(), total_hull_damage, new_damage);
}
else
{
//dead....
_log(ITEM__TRACE, "%s(%u): %.1f damage has depleated our structure. Time to explode.", GetName(), GetID(), total_hull_damage);
killed = true;
//m_hullDamage = m_self->hp();
m_hullDamage = m_self->GetAttribute(AttrHp).get_float();
}
//TODO: deal with damaging modules. no idea the mechanics on this.
}
}
//if( total_damage <= 0.0 )
// return(killed);
PyTuple *up;
//Notifications to ourself:
Notify_OnEffectHit noeh;
noeh.itemID = d.source->GetID();
noeh.effectID = d.effect;
noeh.targetID = GetID();
noeh.damage = total_damage;
up = noeh.Encode();
QueueDestinyEvent(&up);
PySafeDecRef( up );
//NOTE: could send out the RD version of this message instead of the R version, which
//includes "weapon" and "owner" instead of "source".
Notify_OnDamageMessage_Self ondam;
//ondam.messageID = "AttackHit2R"; //TODO: randomize/select this somehow.
ondam.messageID = DamageMessageIDs_Self[random_damage];
ondam.damage = total_damage;
ondam.source = d.source->GetID();
ondam.splash = "";
up = ondam.Encode();
QueueDestinyEvent(&up);
PySafeDecRef( up );
//Notifications to others:
//I am not sure what the correct scope of this broadcast
//should be. For now, it goes to anybody targeting us.
if(targets.IsTargetedBySomething()) {
up = noeh.Encode();
targets.QueueTBDestinyEvent(&up);
PySafeDecRef( up );
Notify_OnDamageMessage_Other ondamo;
//ondamo.messageID = "AttackHit3"; //TODO: select this based on the severity of the hit...
ondamo.messageID = DamageMessageIDs_Other[random_damage];
ondamo.format_type = fmtMapping_itemTypeName;
ondamo.weaponType = d.weapon->typeID();
ondamo.damage = total_damage;
ondamo.target = GetID();
ondamo.splash = "";
up = ondamo.Encode();
targets.QueueTBDestinyEvent(&up);
PySafeDecRef( up );
}
if(killed == true)
{
Killed(d);
}
else
{
_SendDamageStateChanged();
}
return(killed);
}
示例14: Damage
/*
============
idActor::Damage
this entity that is being damaged
inflictor entity that is causing the damage
attacker entity that caused the inflictor to damage targ
example: this=monster, inflictor=rocket, attacker=player
dir direction of the attack for knockback in global space
point point at which the damage is being inflicted, used for headshots
damage amount of damage being inflicted
inflictor, attacker, dir, and point can be NULL for environmental effects
Bleeding wounds and surface overlays are applied in the collision code that
calls Damage()
============
*/
void idActor::Damage( idEntity *inflictor, idEntity *attacker, const noVec3 &dir, const char *damageDefName, const float damageScale, const int location ) {
if ( !fl.takedamage ) {
return;
}
if ( !inflictor ) {
inflictor = gameLocal.world;
}
if ( !attacker ) {
attacker = gameLocal.world;
}
#if 0
#ifdef _D3XP
SetTimeState ts( timeGroup );
// Helltime boss is immune to all projectiles except the helltime killer
if ( finalBoss && idStr::Icmp(inflictor->GetEntityDefName(), "projectile_helltime_killer") ) {
return;
}
// Maledict is immume to the falling asteroids
if ( !idStr::Icmp( GetEntityDefName(), "monster_boss_d3xp_maledict" ) &&
(!idStr::Icmp( damageDefName, "damage_maledict_asteroid" ) || !idStr::Icmp( damageDefName, "damage_maledict_asteroid_splash" ) ) ) {
return;
}
#else
if ( finalBoss && !inflictor->IsType( idSoulCubeMissile::Type ) ) {
return;
}
#endif
#endif
const idDict *damageDef = gameLocal.FindEntityDefDict( damageDefName );
if ( !damageDef ) {
gameLocal.Error( "Unknown damageDef '%s'", damageDefName );
}
int damage = damageDef->GetInt( "damage" ) * damageScale;
damage = GetDamageForLocation( damage, location );
// inform the attacker that they hit someone
attacker->DamageFeedback( this, inflictor, damage );
if ( damage > 0 ) {
health -= damage;
#ifdef _D3XP
//Check the health against any damage cap that is currently set
if(damageCap >= 0 && health < damageCap) {
health = damageCap;
}
#endif
if ( health <= 0 ) {
if ( health < -999 ) {
health = -999;
}
Killed( inflictor, attacker, damage, dir, location );
if ( ( health < -20 ) && spawnArgs.GetBool( "gib" ) && damageDef->GetBool( "gib" ) ) {
Gib( dir, damageDefName );
}
} else {
Pain( inflictor, attacker, damage, dir, location );
}
} else {
// don't accumulate knockback
if ( af.IsLoaded() ) {
// clear impacts
af.Rest();
// physics is turned off by calling af.Rest()
BecomeActive( TH_PHYSICS );
}
}
}
示例15: T_Damage
//.........这里部分代码省略.........
if (ctf->value)
CTFCheckHurtCarrier (targ, attacker);
// do the damage
if (take)
{
// zucc added check for stopAP, if it hit a vest we want sparks
if (((targ->svflags & SVF_MONSTER) || (client)) && !do_sparks)
SpawnDamage (TE_BLOOD, point, normal, take);
else
SpawnDamage (te_sparks, point, normal, take);
// all things that have at least some instantaneous damage, i.e. bruising/falling
if (instant_dam)
targ->health = targ->health - take;
if (targ->health <= 0)
{
if (client && attacker->client)
{
//Added these here also, if this is the last shot and before shots is from
//different attacker, msg's would go to wrong client -M
if (!OnSameTeam (attacker, targ))
attacker->client->resp.damage_dealt += damage;
client->attacker = attacker;
client->attacker_mod = mod;
client->attacker_loc = damage_type;
}
if ((targ->svflags & SVF_MONSTER) || (client))
targ->flags |= FL_NO_KNOCKBACK;
Killed (targ, inflictor, attacker, take, point);
return;
}
}
if (targ->svflags & SVF_MONSTER)
{
M_ReactToDamage (targ, attacker);
if (!(targ->monsterinfo.aiflags & AI_DUCKED) && (take))
{
targ->pain (targ, attacker, knockback, take);
// nightmare mode monsters don't go into pain frames often
if (skill->value == 3)
targ->pain_debounce_time = level.time + 5;
}
}
else if (client)
{
if (!(targ->flags & FL_GODMODE) && (take))
targ->pain (targ, attacker, knockback, take);
}
else if (take)
{
if (targ->pain)
targ->pain (targ, attacker, knockback, take);
}
// add to the damage inflicted on a player this frame
// the total will be turned into screen blends and view angle kicks
// at the end of the frame
if (client)
{
client->damage_parmor += psave;