TextDialog::TextDialog(TextType type, QWidget* parent, const char* name, bool modal, WFlags fl ) : QDialog( parent, name, modal, fl ) { if ( !name ) setName( "TextDialog" ); setCaption( tr( "QtiPlot - Text options" ) ); setSizeGripEnabled( true ); text_type = type; GroupBox1 = new QButtonGroup(3,QGroupBox::Horizontal, QString::null, this); new QLabel(tr( "Color" ), GroupBox1); colorBox = new ColorButton(GroupBox1); buttonOk = new QPushButton( GroupBox1); buttonOk->setText( tr( "&OK" ) ); buttonOk->setAutoDefault( TRUE ); buttonOk->setDefault( TRUE ); new QLabel(tr( "Font" ),GroupBox1); buttonFont = new QPushButton( GroupBox1, "buttonFont" ); buttonFont->setText( tr( "&Font" ) ); buttonApply = new QPushButton( GroupBox1, "buttonApply" ); buttonApply->setText( tr( "&Apply" ) ); buttonApply->setDefault( TRUE ); if (text_type) { new QLabel(tr( "Alignement" ),GroupBox1, "TextLabel1_22",0); alignementBox = new QComboBox( FALSE, GroupBox1, "alignementBox" ); alignementBox->insertItem( tr( "Center" ) ); alignementBox->insertItem( tr( "Left" ) ); alignementBox->insertItem( tr( "Right" ) ); } else { new QLabel(tr( "Frame" ), GroupBox1, "TextLabel1",0 ); backgroundBox = new QComboBox( FALSE, GroupBox1, "backgroundBox" ); backgroundBox->insertItem( tr( "None" ) ); backgroundBox->insertItem( tr( "Rectangle" ) ); backgroundBox->insertItem( tr( "Shadow" ) ); } buttonCancel = new QPushButton( GroupBox1, "buttonCancel" ); buttonCancel->setText( tr( "&Cancel" ) ); if (text_type == TextMarker) { new QLabel(tr("Background"), GroupBox1, "TextLabel2",0 ); backgroundBtn = new ColorButton(GroupBox1); connect(backgroundBtn, SIGNAL(clicked()), this, SLOT(pickBackgroundColor())); buttonDefault = new QPushButton( GroupBox1); buttonDefault->setText( tr( "Set &Default" ) ); connect(buttonDefault, SIGNAL(clicked()), this, SLOT(setDefaultValues())); } QLabel* rotate=new QLabel(tr( "Rotate (deg.)" ),GroupBox1, "TextLabel1_2",0); rotate->hide(); rotateBox = new QComboBox( FALSE, GroupBox1, "rotateBox" ); rotateBox->insertItem( tr( "0" ) ); rotateBox->insertItem( tr( "45" ) ); rotateBox->insertItem( tr( "90" ) ); rotateBox->insertItem( tr( "135" ) ); rotateBox->insertItem( tr( "180" ) ); rotateBox->insertItem( tr( "225" ) ); rotateBox->insertItem( tr( "270" ) ); rotateBox->insertItem( tr( "315" ) ); rotateBox->setEditable (TRUE); rotateBox->setCurrentItem(0); rotateBox->hide(); GroupBox2= new QButtonGroup(8, QGroupBox::Horizontal, QString::null,this, "GroupBox2" ); if (text_type == TextMarker) { buttonCurve = new QPushButton( GroupBox2, "buttonCurve" ); buttonCurve->setPixmap (QPixmap(lineSymbol_xpm)); connect( buttonCurve, SIGNAL( clicked() ), this, SLOT(addCurve() ) ); } buttonIndice = new QPushButton( GroupBox2, "buttonIndice" ); buttonIndice->setPixmap (QPixmap(index_xpm)); buttonExp = new QPushButton( GroupBox2, "buttonExp" ); buttonExp->setPixmap (QPixmap(exp_xpm)); buttonMinGreek = new QPushButton(QChar(0x3B1), GroupBox2, "buttonMinGreek" ); buttonMinGreek->setMaximumWidth(40); buttonMajGreek = new QPushButton(QChar(0x393), GroupBox2, "buttonMajGreek" ); buttonMajGreek->setMaximumWidth(40); QFont font = this->font(); font.setBold(true); buttonB = new QPushButton(tr("B"), GroupBox2, "buttonB" ); buttonB->setFont(font); buttonB->setMaximumWidth(40); font = this->font(); font.setItalic(true); buttonI = new QPushButton(tr("It"), GroupBox2, "buttonI" ); buttonI->setFont(font); buttonI->setMaximumWidth(40); font = this->font(); font.setUnderline(true); buttonU = new QPushButton(tr("U"), GroupBox2, "buttonU" ); buttonU->setFont(font); buttonU->setMaximumWidth(40); textEditBox = new QTextEdit( this); textEditBox->setTextFormat(QTextEdit::PlainText); setFocusPolicy(QWidget::StrongFocus); setFocusProxy(textEditBox); QVBoxLayout* vlayout = new QVBoxLayout(this,5,5, "vlayout"); vlayout->addWidget(GroupBox1); vlayout->addWidget(GroupBox2); vlayout->addWidget(textEditBox); // signals and slots connections connect( colorBox, SIGNAL( clicked() ), this, SLOT( pickTextColor() ) ); connect( buttonOk, SIGNAL( clicked() ), this, SLOT( accept() ) ); connect( buttonApply, SIGNAL( clicked() ), this, SLOT( apply() ) ); connect( buttonCancel, SIGNAL( clicked() ), this, SLOT( reject() ) ); connect( buttonFont, SIGNAL( clicked() ), this, SLOT(customFont() ) ); connect( buttonExp, SIGNAL( clicked() ), this, SLOT(addExp() ) ); connect( buttonIndice, SIGNAL( clicked() ), this, SLOT(addIndex() ) ); connect( buttonU, SIGNAL( clicked() ), this, SLOT(addUnderline() ) ); connect( buttonI, SIGNAL( clicked() ), this, SLOT(addItalic() ) ); connect( buttonB, SIGNAL( clicked() ), this, SLOT(addBold() ) ); connect( buttonMinGreek, SIGNAL(clicked()), this, SLOT(showMinGreek())); connect( buttonMajGreek, SIGNAL(clicked()), this, SLOT(showMajGreek())); }
int T_Damage (edict_t *targ, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t normal, int damage, int knockback, int dflags, int mod) { qboolean mod_magic = false; gclient_t *client; int take = 0; int save = 0; int asave = 0; int psave = 0; int rsave = 0; int sasave = 0; int te_sparks; if (!targ->takedamage) return 0; // Can't heal monsters if ((damage < 0) && (targ->svflags & SVF_MONSTER)) { return 0; } if (mod & MOD_MAGIC) { //damage dealt by magic mod_magic = true; mod &= ~MOD_MAGIC; } // friendly fire avoidance // if enabled you can't hurt teammates (but you can hurt yourself) // knockback still occurs // team damage avoidance, if not telefrag if (mod != MOD_TELEFRAG) { if (deathmatch->value && attacker->client && targ->client && (targ != attacker) && (((targ->count == attacker->count) && teams->value) || (game.monsterhunt == 10)) && (damage > 0)) { // Two players on same team damage *= teamdamage->value; } if (coop->value && attacker->client && targ->client && (targ != attacker)) { damage *= teamdamage->value; } } meansOfDeath = mod; client = targ->client; if (dflags & DAMAGE_BULLET) te_sparks = TE_BULLET_SPARKS; else te_sparks = TE_SPARKS; VectorNormalize(dir); if (targ->flags & FL_NO_KNOCKBACK) knockback = 0; // Simulate armor pierce and armor breaker on monsters // This has been disabled, since it applies bonus AFTER all other bonuses, resulting in crazy total bonuses /* if ((targ->svflags & SVF_MONSTER) && (attacker->client) && (!mod_magic)) { if (attacker->client->pers.skill[2] > 0) { if (mod == MOD_BLASTER) { iteminfo_t *winfo = getWornItemInfo(attacker, 0); damage *= 1 + 0.75 * (winfo->arg4 + winfo->arg5 * attacker->client->pers.skill[2]); } else { damage *= 1 + 0.02 * attacker->client->pers.skill[2]; } } if (attacker->client->pers.skill[72] > 0) { damage *= 1 + 0.02 * attacker->client->pers.skill[72]; } }*/ if ((targ->svflags & SVF_MONSTER) && (targ->health > 0)) { float manaburn_mult = 0.0f; float manaleech_mult = 0.0f; if ((targ->radius_dmg) && (targ->monsterinfo.ability) && (damage > 0)) { rsave = 0; if ((targ->monsterinfo.ability & GIEX_MABILITY_RES_EXPL) && ((mod == MOD_GRENADE) || (mod == MOD_G_SPLASH) || (mod == MOD_ROCKET) || (mod == MOD_R_SPLASH) || (mod == MOD_HANDGRENADE) || (mod == MOD_HG_SPLASH))) { rsave += 0.33 * damage; } if ((targ->monsterinfo.ability & GIEX_MABILITY_RES_IMPACT) && ((mod == MOD_MACHINEGUN) || (mod == MOD_CHAINGUN) || (mod == MOD_SHOTGUN) || (mod == MOD_SSHOTGUN))) { rsave += 0.33 * damage; } if ((targ->monsterinfo.ability & GIEX_MABILITY_RES_ENERGY) && ((mod == MOD_BLASTER) || (mod == MOD_HYPERBLASTER) || (mod == MOD_LASERMINE) || (mod == MOD_RAILGUN) || (mod == MOD_BFG_LASER) || (mod == MOD_BFG_BLAST) || (mod == MOD_BFG_EFFECT))) { rsave += 0.33 * damage; } if ((targ->monsterinfo.ability & GIEX_MABILITY_RES_BMAGIC) && ((mod == MOD_PLAGUEBOMB) || (mod == MOD_DRAIN) || (mod == MOD_SPORE))) { rsave += 0.33 * damage; } if ((targ->monsterinfo.ability & GIEX_MABILITY_RES_FMAGIC) && ((mod == MOD_INFERNO) || (mod == MOD_FIREBOLT) || (mod == MOD_FIREBALL) || (mod == MOD_CORPSEEXPLOSION))) { rsave += 0.33 * damage; } if ((targ->monsterinfo.ability & GIEX_MABILITY_RES_LMAGIC) && ((mod == MOD_LIGHTNING) || (mod == MOD_SPARK) || (mod == MOD_BOLT) || (mod == MOD_STORM))) { rsave += 0.33 * damage; } if (rsave > 0) { //Anti-resist int arlvl = getAuraLevel(attacker, 84); if (arlvl > 0) { int slot = getAuraSlot(attacker, 84); if (attacker->client->aura_caster[slot]->client->magic > 0) { attacker->client->aura_caster[slot]->client->magic -= 0.1 * rsave; attacker->client->aura_caster[slot]->client->magregentime = level.time + 1.0; rsave *= 1 - (arlvl * 0.02); } } damage -= rsave; } } if (attacker->client) { if (dflags & DAMAGE_10_MANABURN) // 10% manaburn_mult += 0.1; if (dflags & DAMAGE_25_MANABURN) // 25% manaburn_mult += 0.25; if (dflags & DAMAGE_50_MANABURN) // 50% manaburn_mult += 0.5; if (dflags & DAMAGE_100_MANABURN) // 100% manaburn_mult += 1.0; if (dflags & DAMAGE_200_MANABURN) // 200% manaburn_mult += 2.0; if (dflags & DAMAGE_400_MANABURN) // 400% manaburn_mult += 4.0; if (dflags & DAMAGE_50_MANALEECH) // 50% manaleech_mult += 0.5; if (dflags & DAMAGE_100_MANALEECH) // 100% manaleech_mult += 1.0; if (dflags & DAMAGE_200_MANALEECH) // 200% manaleech_mult += 2.0; if ((manaburn_mult > 0.0) && (attacker->client->magic < attacker->client->max_magic * 4)) { attacker->client->magic += (int) ceil(damage * manaburn_mult); if (attacker->client->magic > attacker->client->max_magic * 4) { attacker->client->magic = attacker->client->max_magic * 4; } gi.WriteByte (svc_muzzleflash); gi.WriteShort (targ-g_edicts); gi.WriteByte (MZ_NUKE4); gi.multicast (targ->s.origin, MULTICAST_PVS); } if (manaleech_mult > 0.0) { if (attacker->client->magic < attacker->client->max_magic * 4) { attacker->client->magic += (int) ceil(damage * manaleech_mult); if (attacker->client->magic > attacker->client->max_magic * 4) { attacker->client->magic = attacker->client->max_magic * 4; } } if (manaburn_mult == 0.0) { gi.WriteByte (svc_muzzleflash); gi.WriteShort (targ-g_edicts); gi.WriteByte (MZ_NUKE4); gi.multicast (targ->s.origin, MULTICAST_PVS); } } } } if (client && (damage > 0) && (targ->health > 0)) { int pre_damage = damage; int nosanc_damage = damage; int pre_magic = targ->client->magic; float res_boost = 0.15 * targ->client->pers.skill[45]; //Resistance boost float manaburn_mult = 0.0f; float manaleech_mult = 0.0f; if (targ->client->magic <= 0) res_boost = 0; //Sanctuary aura if ((getAuraLevel(targ, 65) > 0) && (damage > 0)) { int slot = getAuraSlot(targ, 65); if (targ->client->aura_caster[slot]->client->magic > 0) { float bonus = getMagicBonuses(targ->client->aura_caster[slot], 65); float dmg_mult = 1.0; float cost_mult = 0.0; dmg_mult = (0.004 * targ->client->aura_level[slot] * (0.2 + bonus * 0.8)); if (dmg_mult > 1) dmg_mult = 1.0; cost_mult = 0.002 * targ->client->aura_level[slot]; if (targ->client->aura_level[slot] > 40) { cost_mult += 0.002 * (targ->client->aura_level[slot] - 40); } cost_mult *= ((float) (targ->client->aura_caster[slot]->client->max_magic + 800.0)) / 800.0; if (cost_mult * damage > targ->client->aura_caster[slot]->client->magic) { int dmgsave = (int) targ->client->aura_caster[slot]->client->magic / cost_mult; //gi.dprintf("%d %d %f %d %d\n", damage, dmgsave, cost_mult, targ->client->aura_caster[slot]->client->magic, (int) dmgsave * cost_mult); sasave += dmgsave * dmg_mult; damage -= dmgsave * dmg_mult; targ->client->aura_caster[slot]->client->magic -= dmgsave * cost_mult; } else { targ->client->aura_caster[slot]->client->magic -= cost_mult * damage; sasave += dmg_mult * damage; damage *= 1.0 - dmg_mult; } targ->client->aura_caster[slot]->client->magregentime = level.time + 1.0; gi.sound(targ, CHAN_ITEM, gi.soundindex("giex/magarm1.wav"), 0.5, ATTN_NORM, 0); } } rsave = 0; // Global (Damage resist) if (targ->client->pers.skill[46] > 0) { rsave += damage * 0.01 * targ->client->pers.skill[46]; } // Bullet if ((targ->client->pers.skill[36] > 0) && ((mod == MOD_MACHINEGUN) || (mod == MOD_CHAINGUN))) { rsave += damage * 0.015 * targ->client->pers.skill[36] * res_boost; targ->client->magic -= RESBOOT_MAGUSE_MULT * ceil((pre_damage - damage) * res_boost); } // Pellet else if ((targ->client->pers.skill[37] > 0) && ((mod == MOD_SHOTGUN) || (mod == MOD_SSHOTGUN))) { rsave += damage * 0.015 * targ->client->pers.skill[37] * res_boost; targ->client->magic -= RESBOOT_MAGUSE_MULT * ceil((pre_damage - damage) * res_boost); } // Explosion else if ((targ->client->pers.skill[38] > 0) && ((mod == MOD_GRENADE) || (mod == MOD_G_SPLASH) || (mod == MOD_ROCKET) || (mod == MOD_R_SPLASH) || (mod == MOD_HANDGRENADE) || (mod == MOD_HG_SPLASH))) { rsave += damage * 0.015 * targ->client->pers.skill[38] * res_boost; targ->client->magic -= RESBOOT_MAGUSE_MULT * ceil((pre_damage - damage) * res_boost); } // Energy else if ((targ->client->pers.skill[39] > 0) && ((mod == MOD_BLASTER) || (mod == MOD_HYPERBLASTER) || (mod == MOD_LASERMINE))) { rsave += damage * 0.015 * targ->client->pers.skill[39] * res_boost; targ->client->magic -= RESBOOT_MAGUSE_MULT * ceil((pre_damage - damage) * res_boost); } // High energy else if ((targ->client->pers.skill[40] > 0) && ((mod == MOD_RAILGUN) || (mod == MOD_BFG_LASER) || (mod == MOD_BFG_BLAST) || (mod == MOD_BFG_EFFECT))) { rsave += damage * 0.015 * targ->client->pers.skill[40] * res_boost; targ->client->magic -= RESBOOT_MAGUSE_MULT * ceil((pre_damage - damage) * res_boost); } // World and hit damage else if (targ->client->pers.skill[41] > 0) { if ((mod == MOD_WATER) || (mod == MOD_SLIME) || (mod == MOD_FALLING) || (mod == MOD_LAVA) || (mod == MOD_CRUSH)) { rsave += damage * 0.1 * targ->client->pers.skill[41]; } else if (mod == MOD_HIT) { rsave += damage * 0.015 * targ->client->pers.skill[41] * res_boost; targ->client->magic -= RESBOOT_MAGUSE_MULT * ceil((pre_damage - damage) * res_boost); } } // Blood magic else if ((targ->client->pers.skill[42] > 0) && ((mod == MOD_PLAGUEBOMB) || (mod == MOD_DRAIN) || (mod == MOD_SPORE))) { rsave += damage * 0.015 * targ->client->pers.skill[42] * res_boost; targ->client->magic -= RESBOOT_MAGUSE_MULT * ceil((pre_damage - damage) * res_boost); } // Fire magic else if ((targ->client->pers.skill[43] > 0) && ((mod == MOD_INFERNO) || (mod == MOD_FIREBOLT) || (mod == MOD_FIREBALL) || (mod == MOD_CORPSEEXPLOSION))) { rsave += damage * 0.015 * targ->client->pers.skill[43] * res_boost; targ->client->magic -= RESBOOT_MAGUSE_MULT * ceil((pre_damage - damage) * res_boost); } // Lightning magic else if ((targ->client->pers.skill[69] > 0) && ((mod == MOD_LIGHTNING) || (mod == MOD_SPARK) || (mod == MOD_BOLT))) { rsave += damage * 0.015 * targ->client->pers.skill[69] * res_boost; targ->client->magic -= RESBOOT_MAGUSE_MULT * ceil((pre_damage - damage) * res_boost); } if (rsave > 0) { //Anti-resist int arlvl = getAuraLevel(attacker, 84); if (arlvl > 0) { int slot = getAuraSlot(attacker, 84); if (attacker->client->aura_caster[slot]->client->magic > 0) { attacker->client->aura_caster[slot]->client->magic -= 0.1 * rsave; attacker->client->aura_caster[slot]->client->magregentime = level.time + 1.0; rsave *= 1 - (arlvl * 0.02); } } damage -= rsave; nosanc_damage -= rsave; } if (dflags & DAMAGE_10_MANABURN) // 10% manaburn_mult += 0.1; if (dflags & DAMAGE_25_MANABURN) // 25% manaburn_mult += 0.25; if (dflags & DAMAGE_50_MANABURN) // 50% manaburn_mult += 0.5; if (dflags & DAMAGE_100_MANABURN) // 100% manaburn_mult += 1.0; if (dflags & DAMAGE_200_MANABURN) // 200% manaburn_mult += 2.0; if (dflags & DAMAGE_400_MANABURN) // 400% manaburn_mult += 4.0; if (dflags & DAMAGE_50_MANALEECH) // 50% manaleech_mult += 0.5; if (dflags & DAMAGE_100_MANALEECH) // 100% manaleech_mult += 1.0; if (dflags & DAMAGE_200_MANALEECH) // 200% manaleech_mult += 2.0; if ((attacker->svflags & SVF_MONSTER) && (attacker->monsterinfo.ability & GIEX_MABILITY_MANABURN)) { manaburn_mult += 1.0; } if (manaburn_mult > 0.0) { targ->client->magic -= nosanc_damage * manaburn_mult; if (targ->client->magic < 0) targ->client->magic = 0; if ((attacker->client) && (attacker->client->magic < attacker->client->max_magic * 4)) { attacker->client->magic += nosanc_damage * manaburn_mult; if (attacker->client->magic > attacker->client->max_magic * 4) { attacker->client->magic = attacker->client->max_magic * 4; } } gi.WriteByte (svc_muzzleflash); gi.WriteShort (targ-g_edicts); gi.WriteByte (MZ_NUKE4); gi.multicast (targ->s.origin, MULTICAST_PVS); } if (manaleech_mult > 0.0) { if (attacker->client->magic < attacker->client->max_magic * 4) { attacker->client->magic += (int) ceil(nosanc_damage * manaleech_mult); if (attacker->client->magic > attacker->client->max_magic * 4) { attacker->client->magic = attacker->client->max_magic * 4; } } if (manaburn_mult == 0.0) { gi.WriteByte (svc_muzzleflash); gi.WriteShort (targ-g_edicts); gi.WriteByte (MZ_NUKE4); gi.multicast (targ->s.origin, MULTICAST_PVS); } } if ((pre_magic != targ->client->magic) && (targ->client->magregentime < level.time + 1.0)) { targ->client->magregentime = level.time + 1.0; } if (damage < 0) { damage = 0; } } // figure momentum add if (!(dflags & DAMAGE_NO_KNOCKBACK)) { if ((knockback) && (targ->movetype != MOVETYPE_NONE) && (targ->movetype != MOVETYPE_BOUNCE) && (targ->movetype != MOVETYPE_PUSH) && (targ->movetype != MOVETYPE_STOP)) { vec3_t kvel; float mass; if (targ->mass < 50) mass = 50; else mass = targ->mass; if (targ->client && attacker == targ) VectorScale (dir, 1600.0 * (float)knockback / mass, kvel); // the rocket jump hack... else VectorScale (dir, 500.0 * (float)knockback / mass, kvel); VectorAdd (targ->velocity, kvel, targ->velocity); } } take = damage; save = 0; // check for godmode if ((targ->flags & FL_GODMODE) && !(dflags & DAMAGE_NO_PROTECTION) && (damage > 0)) { take = 0; save = damage; SpawnDamage (te_sparks, point, normal, save); } // check for invincibility if ((client && client->invincible_framenum > level.framenum ) && !(dflags & DAMAGE_NO_PROTECTION) && (damage > 0)) { if (targ->pain_debounce_time < level.time) { gi.sound(targ, CHAN_ITEM, gi.soundindex("items/protect4.wav"), 1, ATTN_NORM, 0); targ->pain_debounce_time = level.time + 2; } take = 0; save = damage; } if (take > 0) { if ((targ->client) && (targ->client->damage_time < level.time + 0.5 + take * 0.001)) { targ->client->damage_time = level.time + 0.5 + take * 0.001; } psave = CheckPowerArmor (targ, point, normal, take, dflags); take -= psave; asave = CheckArmor (targ, attacker, point, normal, take, te_sparks, dflags, mod, mod_magic); take -= asave; } // do the damage /* if ((attacker->client) && (targ->svflags & SVF_MONSTER)) { if (take <= 0) { gi.dprintf("NO DAMAGE\n", take); _asm int 3; } }*/ 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; }