nuclide/Source/shared/valve/w_tripmine.c

209 lines
4.1 KiB
C
Raw Normal View History

/***
*
* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved.
*
* See the file LICENSE attached with the sources for usage details.
*
****/
enum
{
TRIPMINE_IDLE1,
TRIPMINE_IDLE2,
TRIPMINE_FIRE1,
TRIPMINE_FIRE2,
TRIPMINE_FIDGET,
TRIPMINE_HOLSTER,
TRIPMINE_DRAW,
TRIPMINE_WORLD,
TRIPMINE_GROUND,
};
void w_tripmine_precache(void)
{
precache_model("models/v_tripmine.mdl");
precache_model("models/p_tripmine.mdl");
2019-08-10 21:37:56 +00:00
precache_sound("weapons/mine_deploy.wav");
precache_sound("weapons/mine_charge.wav");
precache_sound("weapons/mine_activate.wav");
}
string w_tripmine_vmodel(void)
{
return "models/v_tripmine.mdl";
}
string w_tripmine_wmodel(void)
{
return "models/v_tripmine.mdl";
}
string w_tripmine_pmodel(void)
{
return "models/p_tripmine.mdl";
}
string w_tripmine_deathmsg(void)
{
return "";
}
void w_tripmine_draw(void)
{
#ifdef CSQC
Weapons_ViewAnimation(TRIPMINE_DRAW);
#else
player pl = (player)self;
Weapons_UpdateAmmo(pl, __NULL__, pl.ammo_tripmine, __NULL__);
#endif
}
void w_tripmine_holster(void)
{
}
2019-08-10 21:37:56 +00:00
#ifdef SSQC
void w_tripmine_trip(int unused)
{
/* This is to prevent infinite loops in Damage_Radius */
self.vDeath =
self.vPain = __NULL__;
self.takedamage = DAMAGE_NO;
Effect_CreateExplosion(self.origin);
Damage_Radius(self.origin, self.owner, 150, 150 * 2.5f, TRUE);
sound(self, CHAN_WEAPON, sprintf( "weapons/explode%d.wav", floor( random() * 2 ) + 3 ), 1, ATTN_NORM);
remove(self);
}
void w_tripmine_ready(void)
{
makevectors(self.angles);
traceline(self.origin, self.origin + v_forward * 2048, FALSE, self);
if (!self.health) {
self.health = 1;
self.vDeath =
self.vPain = w_tripmine_trip;
self.takedamage = DAMAGE_YES;
self.solid = SOLID_BBOX;
setsize(self, [-8,-8,-8], [8,8,8]);
self.armor = trace_plane_dist;
sound(self, CHAN_WEAPON, "weapons/mine_activate.wav", 1, ATTN_NORM);
}
if (trace_plane_dist != self.armor) {
w_tripmine_trip(0);
}
self.nextthink = time;
}
#endif
void w_tripmine_primary(void)
{
player pl = (player)self;
if (pl.w_attack_next > 0.0) {
return;
}
Weapons_MakeVectors();
traceline(Weapons_GetCameraPos(), Weapons_GetCameraPos() + v_forward * 64, FALSE, pl);
if (trace_fraction == 1.0f) {
return;
}
#ifdef CSQC
Weapons_ViewAnimation(TRIPMINE_FIRE2);
#else
entity mine = spawn();
setmodel(mine, "models/v_tripmine.mdl");
setorigin(mine, trace_endpos);
mine.frame = TRIPMINE_WORLD;
2019-08-10 21:37:56 +00:00
mine.angles = vectoangles( trace_plane_normal );
setorigin(mine, trace_endpos - (v_forward * 4));
2019-08-10 21:37:56 +00:00
mine.think = w_tripmine_ready;
mine.nextthink = time + 4.0f;
//mine.owner = pl;
sound(mine, CHAN_WEAPON, "weapons/mine_charge.wav", 1, ATTN_NORM);
sound(self, CHAN_WEAPON, "weapons/mine_deploy.wav", 1, ATTN_NORM);
#endif
pl.w_attack_next = 0.5f;
pl.w_idle_next = 2.5f;
}
void w_tripmine_secondary(void)
{
}
void w_tripmine_reload(void)
{
}
void w_tripmine_release(void)
{
int r;
player pl = (player)self;
if (pl.w_idle_next > 0.0) {
return;
}
r = floor(random(0,3));
switch (r) {
case 0:
Weapons_ViewAnimation(TRIPMINE_IDLE1);
pl.w_idle_next = 3.0f;
break;
case 1:
Weapons_ViewAnimation(TRIPMINE_IDLE2);
pl.w_idle_next = 2.0f;
break;
default:
Weapons_ViewAnimation(TRIPMINE_FIDGET);
pl.w_idle_next = 3.333333f;
break;
}
}
float w_tripmine_aimanim(void)
{
#ifdef SSQC
return self.flags & FL_CROUCHING ? ANIM_CR_AIMTRIPMINE : ANIM_AIMTRIPMINE;
#endif
}
void w_tripmine_hudpic(int s, vector pos)
{
#ifdef CSQC
if (s) {
drawsubpic(pos, [170,45], "sprites/640hud6.spr_0.tga", [0,90/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE);
} else {
drawsubpic(pos, [170,45], "sprites/640hud3.spr_0.tga", [0,90/256], [170/256,45/256], g_hud_color, 1, DRAWFLAG_ADDITIVE);
}
#endif
}
weapon_t w_tripmine =
{
ITEM_TRIPMINE,
4,
2,
w_tripmine_draw,
w_tripmine_holster,
w_tripmine_primary,
w_tripmine_secondary,
w_tripmine_reload,
w_tripmine_release,
__NULL__,
w_tripmine_precache,
__NULL__,
w_tripmine_vmodel,
w_tripmine_wmodel,
w_tripmine_pmodel,
w_tripmine_deathmsg,
w_tripmine_aimanim,
w_tripmine_hudpic
};
#ifdef SSQC
void weapon_tripmine(void) {
Weapons_InitItem(WEAPON_TRIPMINE);
}
#endif