void Blaster_Fire (edict_t *ent, vec3_t g_offset, int damage, qboolean hyper, int effect) { vec3_t forward, right; vec3_t start; vec3_t offset; if (is_quad) damage *= 4; AngleVectors (ent->client->v_angle, forward, right, NULL); VectorSet(offset, 24, 8, ent->viewheight-8); VectorAdd (offset, g_offset, offset); P_ProjectSource (ent->client, ent->s.origin, offset, forward, right, start); VectorScale (forward, -2, ent->client->kick_origin); ent->client->kick_angles[0] = -1; //WF // fire_blaster (ent, start, forward, damage, 1000, effect, hyper); if(hyper) fire_blaster (ent, start, forward, damage, hyperblaster_speed->value, effect, hyper); else fire_blaster (ent, start, forward, damage, blaster_speed->value, effect, hyper); //WF // send muzzle flash gi.WriteByte (svc_muzzleflash); gi.WriteShort (ent-g_edicts); if (hyper) gi.WriteByte (MZ_HYPERBLASTER | is_silenced); else gi.WriteByte (MZ_BLASTER | is_silenced); gi.multicast (ent->s.origin, MULTICAST_PVS); PlayerNoise(ent, start, PNOISE_WEAPON); }
void monster_fire_blaster (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int effect, int proj_type, float duration, qboolean bounce, int flashtype) { int mod; float chance; qboolean hyperblaster = false; // holy freeze reduces firing rate by 50% if (que_typeexists(self->curses, AURA_HOLYFREEZE)) { if (random() <= 0.5) return; } // chill effect reduces attack rate/refire if (self->chill_time > level.time) { chance = 1 / (1 + CHILL_DEFAULT_BASE + CHILL_DEFAULT_ADDON * self->chill_level); if (random() > chance) return; } if (proj_type == BLASTER_PROJ_BLAST) mod = MOD_BLASTER; else mod = MOD_HYPERBLASTER; damage = monster_increaseDamageByTalent(self->activator, damage); fire_blaster(self, start, dir, damage, speed, effect, proj_type, mod, duration, bounce); gi.WriteByte (svc_muzzleflash2); gi.WriteShort (self - g_edicts); gi.WriteByte (flashtype); gi.multicast (start, MULTICAST_PVS); }
void use_target_blaster (edict_t *self, edict_t *other, edict_t *activator) { int effect; if (!self) { return; } if (self->spawnflags & 2) { effect = 0; } else if (self->spawnflags & 1) { effect = EF_HYPERBLASTER; } else { effect = EF_BLASTER; } fire_blaster (self, self->s.origin, self->movedir, self->dmg, self->speed, effect, MOD_TARGET_BLASTER); gi.sound (self, CHAN_VOICE, self->noise_index, 1, ATTN_NORM, 0); }
void p_medic_firebolt (edict_t *ent) { int min_dmg; int damage = MEDIC_BOLT_INITIAL_DMG+MEDIC_BOLT_ADDON_DMG*ent->myskills.abilities[MEDIC].current_level; int speed = MEDIC_BOLT_INITIAL_SPEED+MEDIC_BOLT_ADDON_SPEED*ent->myskills.abilities[MEDIC].current_level; vec3_t forward, right, start; // is this a firing frame? if (ent->s.frame != 188 && ent->s.frame != 185) return; // check for adequate ammo if (ent->myskills.abilities[MEDIC].ammo < MEDIC_BOLT_AMMO) return; ent->myskills.abilities[MEDIC].ammo -= MEDIC_BOLT_AMMO; AngleVectors(ent->client->v_angle, forward, right, NULL); G_ProjectSource(ent->s.origin, monster_flash_offset[MZ2_MEDIC_BLASTER_1], forward, right, start); min_dmg = floattoint(0.111*damage); damage = GetRandom(min_dmg, damage); fire_blaster(ent, start, forward, damage, speed, EF_BLASTER, BLASTER_PROJ_BLAST, MOD_BLASTER, 2.0, false); gi.WriteByte (svc_muzzleflash2); gi.WriteShort (ent-g_edicts); gi.WriteByte (MZ2_MEDIC_BLASTER_1); gi.multicast (start, MULTICAST_PVS); gi.sound (ent, CHAN_WEAPON, gi.soundindex("weapons/photon.wav"), 1, ATTN_NORM, 0); }
void Blaster_Fire (edict_t *ent, vec3_t g_offset, int damage, qboolean hyper, int effect) { vec3_t forward, right; vec3_t start; vec3_t offset; if (is_quad == ent) damage *= 4; AngleVectors (ent->client->v_angle, forward, right, NULL); VectorSet(offset, 24, 8, ent->viewheight-8); VectorAdd (offset, g_offset, offset); P_ProjectSource (ent->client, ent->s.origin, offset, forward, right, start); VectorScale (forward, -2, ent->client->kick_origin_final); ent->client->kick_angles_final[0] = -1; ent->client->kick_origin_start = 0; ent->client->kick_origin_end = 0.1f * SERVER_FPS; fire_blaster (ent, start, forward, damage, 1000, effect, hyper); // send muzzle flash gi.WriteByte (svc_muzzleflash); gi.WriteShort (ent-g_edicts); if (hyper) gi.WriteByte (MZ_HYPERBLASTER | is_silenced); else gi.WriteByte (MZ_BLASTER | is_silenced); gi.multicast (ent->s.origin, MULTICAST_PVS); }
void Blaster_Fire(edict_t *ent, vec3_t g_offset, int damage, qboolean hyper, int effect) { vec3_t forward, right; vec3_t start; vec3_t offset; if (!ent) { return; } AngleVectors(ent->client->v_angle, forward, right, NULL); VectorSet(offset, 24, 8, ent->viewheight - 8); VectorAdd(offset, g_offset, offset); P_ProjectSource(ent->client, ent->s.origin, offset, forward, right, start); VectorScale(forward, -2, ent->client->kick_origin); ent->client->kick_angles[0] = -1; fire_blaster(ent, start, forward, damage, 1000, effect, hyper); /* send muzzle flash */ PF_WriteByte(svc_muzzleflash); PF_WriteShort(ent - g_edicts); if (hyper) { PF_WriteByte(MZ_HYPERBLASTER); } else { PF_WriteByte(MZ_BLASTER); } SV_Multicast(ent->s.origin, MULTICAST_PVS); PlayerNoise(ent, start, PNOISE_WEAPON); }
void blasterFire( gentity_t *ent ) { gentity_t *m; m = fire_blaster( ent, muzzle, forward ); // VectorAdd( m->s.pos.trDelta, ent->client->ps.velocity, m->s.pos.trDelta ); // "real" physics }
void monster_fire_blaster(edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int flashtype, int effect){ fire_blaster(self, start, dir, damage, speed, effect, false); gi.WriteByte(svc_muzzleflash2); gi.WriteShort(self - g_edicts); gi.WriteByte(flashtype); gi.multicast(start, MULTICAST_PVS); }
void Blaster_Fire (edict_t *ent, vec3_t g_offset, int damage, int speed, qboolean hyper, int effect) { vec3_t forward, right; vec3_t start; vec3_t offset; damage = applyWeaponBonuses(ent, damage, 1); AngleVectors (ent->client->v_angle, forward, right, NULL); VectorSet(offset, 24, 8, ent->viewheight-8); VectorAdd (offset, g_offset, offset); P_ProjectSource (ent->client, ent->s.origin, offset, forward, right, start); VectorScale (forward, -2, ent->client->kick_origin); ent->client->kick_angles[0] = -1; if (speed > 0) { // No flight speed => Hitscan if (hyper) { fire_blaster (ent, start, forward, damage, speed, 0, hyper); ent->client->silencer_shots-=1; } else { fire_blaster (ent, start, forward, damage, speed, effect, hyper); ent->client->silencer_shots-=3; } } else { fire_lead(ent, start, forward, damage, 0, TE_BLASTER, 0, 0, MOD_BLASTER); } // send muzzle flash if ((ent->client->silencer_shots > 0) && (ent->client->pers.skill[58]> 5)) { ent->client->silencer_shots -= 1; } else { gi.WriteByte (svc_muzzleflash); gi.WriteShort (ent-g_edicts); if (hyper) gi.WriteByte (MZ_HYPERBLASTER | is_silenced); else gi.WriteByte (MZ_BLASTER | is_silenced); gi.multicast (ent->s.origin, MULTICAST_PVS); } PlayerNoise(ent, start, PNOISE_WEAPON); }
void use_target_blaster (edict_t *self, edict_t *other, edict_t *activator) { if (!self) { return; } fire_blaster(self, self->s.origin, self->movedir, self->dmg, self->speed, EF_BLASTER, MOD_TARGET_BLASTER); gi.sound(self, CHAN_VOICE, self->noise_index, 1, ATTN_NORM, 0); }
void use_target_blaster (edict_t *self, edict_t *other, edict_t *activator) { int effect; if (self->spawnflags & 2) effect = 0; else if (self->spawnflags & 1) effect = EF_HYPERBLASTER; else effect = EF_BLASTER; fire_blaster (self, self->s.origin, self->movedir, self->dmg, (int)self->speed, EF_BLASTER, MOD_TARGET_BLASTER); gi.sound (self, CHAN_VOICE, self->noise_index, 1, ATTN_NORM, 0); }
void monster_fire_blaster (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int flashtype, int effect) { if(EMPNukeCheck(self, start)) { gi.sound (self, CHAN_AUTO, gi.soundindex("items/empnuke/emp_missfire.wav"), 1, ATTN_NORM, 0); return; } ANIM_AIM(self, dir); fire_blaster (self, start, dir, damage, speed, effect, false); gi.WriteByte (svc_muzzleflash2); gi.WriteShort (self - g_edicts); gi.WriteByte (flashtype); gi.multicast (start, MULTICAST_PVS); }
void monster_autocannon_fire(edict_t *self) { vec3_t forward, right, start; // fire straight ahead AngleVectors (self->s.angles, forward, right, NULL); if (self->onFloor) VectorNegate(right, right); VectorMA(self->s.origin, 24, forward, start); G_ProjectSource (self->s.origin, fireOffset[self->style], forward, right, start); if(EMPNukeCheck(self, start)) { gi.sound (self, CHAN_AUTO, gi.soundindex("items/empnuke/emp_missfire.wav"), 1, ATTN_NORM, 0); return; } // what to fire? switch(self->style) { case 1: default: fire_bullet(self, start, forward, AC_BULLET_DMG, AC_BULLET_KICK, DEFAULT_BULLET_HSPREAD, DEFAULT_BULLET_VSPREAD, MOD_AUTOCANNON); gi.WriteByte (svc_muzzleflash); gi.WriteShort (self - g_edicts); gi.WriteByte (MZ_CHAINGUN2); gi.multicast (self->s.origin, MULTICAST_PVS); break; case 2: fire_rocket(self, start, forward, AC_ROCKET_DMG, AC_ROCKET_SPEED, AC_ROCKET_RADIUS_DMG, AC_ROCKET_DMG_RADIUS); gi.WriteByte (svc_muzzleflash); gi.WriteShort (self - g_edicts); gi.WriteByte (MZ_ROCKET); gi.multicast (self->s.origin, MULTICAST_PVS); break; case 3: case 4: fire_blaster (self, start, forward, AC_BLASTER_DMG, AC_BLASTER_SPEED, EF_HYPERBLASTER, true); gi.WriteByte (svc_muzzleflash); gi.WriteShort (self - g_edicts); gi.WriteByte (MZ_HYPERBLASTER); gi.multicast (self->s.origin, MULTICAST_PVS); break; } }
int Blaster_Fire (edict_t *ent, vec3_t g_offset, int damage, qboolean hyper, int effect) { vec3_t forward, right; vec3_t start; vec3_t offset; int ret = 1; if (is_quad) damage *= 4; AngleVectors (ent->client->v_angle, forward, right, NULL); VectorSet(offset, 24, 8, ent->viewheight-8); VectorAdd (offset, g_offset, offset); P_ProjectSource (ent->client, ent->s.origin, offset, forward, right, start); VectorScale (forward, -2, ent->client->kick_origin); ent->client->kick_angles[0] = -1; if(EMPNukeCheck(ent, start)) { gi.sound (ent, CHAN_AUTO, gi.soundindex("items/empnuke/emp_missfire.wav"), 1, ATTN_NORM, 0); ret = 0; } else { fire_blaster (ent, start, forward, damage, 1000, effect, hyper); // send muzzle flash gi.WriteByte (svc_muzzleflash); gi.WriteShort (ent-g_edicts); if (hyper) gi.WriteByte (MZ_HYPERBLASTER | is_silenced); else gi.WriteByte (MZ_BLASTER | is_silenced); gi.multicast (ent->s.origin, MULTICAST_PVS); PlayerNoise(ent, start, PNOISE_WEAPON); // play quad damage sound playQuadSound(ent); } return ret; }
void p_medic_firehb (edict_t *ent) { int damage = MEDIC_HB_INITIAL_DMG+MEDIC_HB_ADDON_DMG*ent->myskills.abilities[MEDIC].current_level; int speed = MEDIC_HB_INITIAL_SPEED+MEDIC_HB_ADDON_SPEED*ent->myskills.abilities[MEDIC].current_level; vec3_t forward, right, start; if (!ent->myskills.abilities[MEDIC].ammo) return; ent->myskills.abilities[MEDIC].ammo--; AngleVectors(ent->client->v_angle, forward, right, NULL); G_ProjectSource(ent->s.origin, monster_flash_offset[MZ2_MEDIC_BLASTER_1], forward, right, start); fire_blaster(ent, start, forward, damage, speed, EF_HYPERBLASTER, BLASTER_PROJ_BOLT, MOD_HYPERBLASTER, 2.0, false); gi.WriteByte (svc_muzzleflash2); gi.WriteShort (ent-g_edicts); gi.WriteByte (MZ2_MEDIC_BLASTER_1); gi.multicast (start, MULTICAST_PVS); }
void actorHyperblaster (edict_t *self) { vec3_t start, target; vec3_t forward, right, up; int damage; int effect; int color; if(!self->enemy || !self->enemy->inuse) { self->monsterinfo.pausetime = 0; self->s.sound = 0; return; } self->s.sound = gi.soundindex("weapons/hyprbl1a.wav"); #ifdef LOOP_SOUND_ATTENUATION self->s.attenuation = ATTN_IDLE; #endif if (level.time >= self->monsterinfo.pausetime) { self->actor_gunframe++; } else { // Knightmare- select color if (hyperblaster_color->value == 2) //green color = BLASTER_GREEN; else if (hyperblaster_color->value == 3) //blue color = BLASTER_BLUE; #ifdef KMQUAKE2_ENGINE_MOD else if (hyperblaster_color->value == 4) //red color = BLASTER_RED; #endif else //standard yellow color = BLASTER_ORANGE; AngleVectors (self->s.angles, forward, right, up); G_ProjectSource2 (self->s.origin, self->muzzle, forward, right, up, start); ActorTarget(self,target); VectorSubtract (target, start, forward); VectorNormalize (forward); if ((random() * 3) < 1) { if (hyperblaster_color->value == 2) //green effect = (EF_HYPERBLASTER|EF_TRACKER); else if (hyperblaster_color->value == 3) //blue effect = EF_BLUEHYPERBLASTER; #ifdef KMQUAKE2_ENGINE_MOD else if (hyperblaster_color->value == 4) //red effect = EF_HYPERBLASTER|EF_IONRIPPER; #endif else //standard yellow effect = EF_HYPERBLASTER; } else effect = 0; gi.positioned_sound(start,self,CHAN_WEAPON,gi.soundindex("weapons/hyprbf1a.wav"),1,ATTN_NORM,0); if(self->monsterinfo.aiflags & AI_TWO_GUNS) damage = 8; else damage = 15; fire_blaster (self, start, forward, damage, 1000, effect, true, color); if(developer->value) TraceAimPoint(start,target); if(self->monsterinfo.aiflags & AI_TWO_GUNS) { G_ProjectSource2 (self->s.origin, self->muzzle2, forward, right, up, start); ActorTarget(self,target); VectorSubtract (target, start, forward); VectorNormalize (forward); if ((random() * 3) < 1) { if (hyperblaster_color->value == 2) //green effect = (EF_HYPERBLASTER|EF_TRACKER); else if (hyperblaster_color->value == 3) //blue effect = EF_BLUEHYPERBLASTER; #ifdef KMQUAKE2_ENGINE_MOD else if (hyperblaster_color->value == 4) //red effect = EF_HYPERBLASTER|EF_IONRIPPER; #endif else //standard yellow effect = EF_HYPERBLASTER; } else effect = 0; fire_blaster (self, start, forward, damage, 1000, effect, true, color); } self->actor_gunframe++; if (self->actor_gunframe == 12) self->actor_gunframe = 6; } if (self->actor_gunframe == 12) { gi.sound(self, CHAN_AUTO, gi.soundindex("weapons/hyprbd1a.wav"), 1, ATTN_NORM, 0); self->s.sound = 0; } }
void blasterFire( gentity_t *ent ) { G_CombatStats_Fire( ent, CSW_BLASTER, BLASTER_DMG ); fire_blaster( ent, muzzle, forward ); }
void blasterFire( gentity_t *ent ) { fire_blaster( ent, muzzle, forward ); }