161 lines
3.9 KiB
C++
161 lines
3.9 KiB
C++
/*
|
|
* $Header: /HexenWorld/Siege/COMBAT.hc 16 5/25/98 10:56p Mgummelt $
|
|
*/
|
|
void(vector org, vector vel, float damage, entity victim) SpawnPuff;
|
|
|
|
float MetalHitSound (float targettype)
|
|
{
|
|
//entity found;
|
|
|
|
if(targettype==THINGTYPE_FLESH)
|
|
{
|
|
sound (self, CHAN_WEAPON, "weapons/met2flsh.wav", 1, ATTN_NORM);
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
// found=find(world,classname,"misc_ripples");
|
|
// if(found)
|
|
// starteffect(CE_RIPPLE, found.origin,'0 0 0',HX_FRAME_TIME);
|
|
if(targettype==THINGTYPE_WOOD||targettype==THINGTYPE_DIRT)
|
|
{
|
|
sound (self, CHAN_WEAPON, "weapons/met2wd.wav", 1, ATTN_NORM);
|
|
return TRUE;
|
|
}
|
|
else if(targettype==THINGTYPE_METAL)
|
|
{
|
|
sound (self, CHAN_WEAPON, "weapons/met2met.wav", 1, ATTN_NORM);
|
|
return TRUE;
|
|
}
|
|
else if(targettype==THINGTYPE_BROWNSTONE||targettype==THINGTYPE_GREYSTONE)
|
|
{
|
|
sound (self, CHAN_WEAPON, "weapons/met2stn.wav", 1, ATTN_NORM);
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
================
|
|
FireMelee
|
|
================
|
|
*/
|
|
void FireMelee (float damage_base,float damage_mod,float attack_radius)
|
|
{
|
|
vector source;
|
|
vector org;
|
|
float damg;//, backstab;
|
|
float chance,point_chance;
|
|
|
|
makevectors (self.v_angle);
|
|
source = self.origin+self.proj_ofs;
|
|
traceline (source, source + v_forward*64, FALSE, self);
|
|
|
|
if (trace_fraction == 1.0)
|
|
{
|
|
traceline (source, source + v_forward*64 - (v_up * 30), FALSE, self); // 30 down
|
|
|
|
if (trace_fraction == 1.0)
|
|
{
|
|
traceline (source, source + v_forward*64 + v_up * 30, FALSE, self); // 30 up
|
|
|
|
if (trace_fraction == 1.0)
|
|
return;
|
|
}
|
|
}
|
|
|
|
org = trace_endpos + (v_forward * 4);
|
|
|
|
if (trace_ent.takedamage)
|
|
{
|
|
//FIXME:Add multiplier for level and strength
|
|
if(self.playerclass==CLASS_PALADIN&&self.weapon==IT_WEAPON2&&!trace_ent.flags2&FL_ALIVE)
|
|
damage_base*=1.3;
|
|
|
|
if(self.playerclass==CLASS_DWARF)
|
|
if(self.weapon==IT_WEAPON2&&!trace_ent.flags2&FL_ALIVE)
|
|
{
|
|
if(flammable(trace_ent))
|
|
damage_base*=2.2;
|
|
else if(trace_ent.thingtype==THINGTYPE_DIRT)
|
|
damage_base*=1.5;
|
|
else
|
|
damage_base*=1.2;
|
|
}
|
|
else
|
|
damage_base*=1.2;
|
|
|
|
|
|
/* if(trace_ent.flags2&FL_ALIVE&&self.playerclass==CLASS_ASSASSIN)//!fov(self,trace_ent,90)
|
|
{
|
|
vector t_vf,m_vf;
|
|
makevectors(trace_ent.angles);
|
|
t_vf = v_forward;
|
|
makevectors(self.angles);
|
|
m_vf = v_forward;
|
|
makevectors(self.v_angle);
|
|
if(t_vf*m_vf>0.5)//facing generally the same direction
|
|
{
|
|
CreateRedFlash(trace_endpos);
|
|
damage_base=trace_ent.health*random(0.75,1.2);
|
|
if(damage_base>100)
|
|
damage_base = 100;
|
|
backstab=TRUE;
|
|
}
|
|
}*/
|
|
|
|
damg = random(damage_mod+damage_base,damage_base);
|
|
SpawnPuff (org, '0 0 0', damg,trace_ent);
|
|
T_Damage (trace_ent, self, self, damg);
|
|
/* if(backstab)
|
|
{
|
|
if(!trace_ent.flags2&FL_ALIVE)
|
|
centerprint(self,"Critical Hit Backstab!\n");
|
|
else
|
|
centerprint(self,"Backstab!\n");
|
|
}*/
|
|
|
|
if(trace_ent.thingtype==THINGTYPE_FLESH)
|
|
sound (self, CHAN_WEAPON, "weapons/slash.wav", 1, ATTN_NORM);
|
|
else if(!MetalHitSound(trace_ent.thingtype))
|
|
sound (self, CHAN_WEAPON, "weapons/hitwall.wav", 1, ATTN_NORM);
|
|
|
|
// Necromancer stands a chance of vampirically stealing health points
|
|
if (self.playerclass == CLASS_NECROMANCER)
|
|
{
|
|
if ((trace_ent.flags & FL_MONSTER) || (trace_ent.flags & FL_CLIENT))
|
|
{
|
|
chance = self.level * .05;
|
|
|
|
if (chance > random())
|
|
{
|
|
point_chance = self.level;
|
|
point_chance *= random();
|
|
if (point_chance < 1)
|
|
point_chance = 1;
|
|
|
|
sound (self, CHAN_BODY, "weapons/drain.wav", 1, ATTN_NORM);
|
|
|
|
self.health += point_chance;
|
|
if (self.health>self.max_health)
|
|
self.health = self.max_health;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{ // hit wall
|
|
if(!MetalHitSound(trace_ent.thingtype))
|
|
sound (self, CHAN_WEAPON, "weapons/hitwall.wav", 1, ATTN_NORM);
|
|
WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
|
|
WriteByte (MSG_BROADCAST, TE_GUNSHOT);
|
|
WriteByte (MSG_BROADCAST, 1);
|
|
WriteCoord (MSG_BROADCAST, org_x);
|
|
WriteCoord (MSG_BROADCAST, org_y);
|
|
WriteCoord (MSG_BROADCAST, org_z);
|
|
}
|
|
|
|
}
|
|
|