void fire_rocket (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, float damage_radius, int radius_damage) { edict_t *rocket; rocket = G_Spawn(); VectorCopy (start, rocket->s.origin); VectorCopy (dir, rocket->movedir); vectoangles (dir, rocket->s.angles); VectorScale (dir, speed, rocket->velocity); rocket->movetype = MOVETYPE_FLYMISSILE; rocket->clipmask = MASK_SHOT; rocket->solid = SOLID_BBOX; rocket->s.effects |= EF_ROCKET; VectorClear (rocket->mins); VectorClear (rocket->maxs); rocket->s.modelindex = gi.modelindex ("models/objects/rocket/tris.md2"); rocket->owner = self; rocket->touch = rocket_touch; rocket->nextthink = level.time + 8000/speed; rocket->think = G_FreeEdict; rocket->dmg = damage; rocket->radius_dmg = radius_damage; rocket->dmg_radius = damage_radius; rocket->s.sound = gi.soundindex ("weapons/rockfly.wav"); rocket->classname = "rocket"; rocket->s.renderfx |= RF_IR_VISIBLE|RF_NOSHADOW; // Aaron - RF_NOSHADOW if (self->client) check_dodge (self, rocket->s.origin, dir, speed); gi.linkentity (rocket); }
// RAFAEL void fire_plasma (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, float damage_radius, int radius_damage) { edict_t *plasma; plasma = G_Spawn(); VectorCopy (start, plasma->s.origin); VectorCopy (dir, plasma->movedir); vectoangles (dir, plasma->s.angles); VectorScale (dir, speed, plasma->velocity); plasma->movetype = MOVETYPE_FLYMISSILE; plasma->clipmask = MASK_SHOT; plasma->solid = SOLID_BBOX; VectorClear (plasma->mins); VectorClear (plasma->maxs); plasma->owner = self; plasma->touch = plasma_touch; plasma->nextthink = level.time + 8000/speed; plasma->think = G_FreeEdict; plasma->dmg = damage; plasma->radius_dmg = radius_damage; plasma->dmg_radius = damage_radius; plasma->s.sound = gi.soundindex ("weapons/rockfly.wav"); plasma->s.modelindex = gi.modelindex ("sprites/s_photon.sp2"); plasma->s.effects |= EF_PLASMA | EF_ANIM_ALLFAST; if (self->client) check_dodge (self, plasma->s.origin, dir, speed); gi.linkentity (plasma); }
void fire_bfg (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, float damage_radius) { edict_t *bfg; bfg = G_Spawn(); VectorCopy (start, bfg->s.origin); VectorCopy (dir, bfg->movedir); vectoangles (dir, bfg->s.angles); VectorScale (dir, speed, bfg->velocity); bfg->movetype = MOVETYPE_FLYMISSILE; bfg->clipmask = MASK_SHOT; bfg->solid = SOLID_BBOX; bfg->s.effects |= EF_BFG | EF_ANIM_ALLFAST; VectorClear (bfg->mins); VectorClear (bfg->maxs); bfg->s.modelindex = gi.modelindex ("sprites/s_bfg1.sp2"); bfg->owner = self; bfg->touch = bfg_touch; bfg->nextthink = level.time + 8000/speed; bfg->think = G_FreeEdict; bfg->radius_dmg = damage; bfg->dmg_radius = damage_radius; bfg->classname = "bfg blast"; bfg->s.sound = gi.soundindex ("weapons/bfg__l1a.wav"); bfg->think = bfg_think; bfg->nextthink = level.time + FRAMETIME; bfg->teammaster = bfg; bfg->teamchain = NULL; if (self->client) check_dodge (self, bfg->s.origin, dir, speed); gi.linkentity (bfg); }
// RAFAEL void fire_heat (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, float damage_radius, int radius_damage) { edict_t *heat; heat = G_Spawn(); VectorCopy (start, heat->s.origin); VectorCopy (dir, heat->movedir); vectoangles (dir, heat->s.angles); VectorScale (dir, speed, heat->velocity); heat->movetype = MOVETYPE_FLYMISSILE; heat->clipmask = MASK_SHOT; heat->solid = SOLID_BBOX; heat->s.effects |= EF_ROCKET; VectorClear (heat->mins); VectorClear (heat->maxs); heat->s.modelindex = gi.modelindex ("models/objects/rocket/tris.md2"); heat->owner = self; heat->touch = rocket_touch; heat->nextthink = level.time + 0.1; heat->think = heat_think; heat->dmg = damage; heat->radius_dmg = radius_damage; heat->dmg_radius = damage_radius; heat->s.sound = gi.soundindex ("weapons/rockfly.wav"); if (self->client) check_dodge (self, heat->s.origin, dir, speed); gi.linkentity (heat); }
void fire_blaster (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int effect, qboolean hyper) { edict_t *bolt; trace_t tr; if (!self) { return; } VectorNormalize(dir); bolt = G_Spawn(); bolt->svflags = SVF_DEADMONSTER; /* yes, I know it looks weird that projectiles are deadmonsters what this means is that when prediction is used against the object (blaster/hyperblaster shots), the player won't be solid clipped against the object. Right now trying to run into a firing hyperblaster is very jerky since you are predicted 'against' the shots. */ VectorCopy(start, bolt->s.origin); VectorCopy(start, bolt->s.old_origin); vectoangles(dir, bolt->s.angles); VectorScale(dir, speed, bolt->velocity); bolt->movetype = MOVETYPE_FLYMISSILE; bolt->clipmask = MASK_SHOT; bolt->solid = SOLID_BBOX; bolt->s.effects |= effect; VectorClear(bolt->mins); VectorClear(bolt->maxs); bolt->s.modelindex = gi.modelindex("models/objects/laser/tris.md2"); bolt->s.sound = gi.soundindex("misc/lasfly.wav"); bolt->owner = self; bolt->touch = blaster_touch; bolt->nextthink = level.time + 2; bolt->think = G_FreeEdict; bolt->dmg = damage; bolt->classname = "bolt"; if (hyper) { bolt->spawnflags = 1; } gi.linkentity(bolt); if (self->client) { check_dodge(self, bolt->s.origin, dir, speed); } tr = gi.trace(self->s.origin, NULL, NULL, bolt->s.origin, bolt, MASK_SHOT); if (tr.fraction < 1.0) { VectorMA(bolt->s.origin, -10, dir, bolt->s.origin); bolt->touch(bolt, tr.ent, NULL, NULL); } }
void fire_ionripper(edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int effect) { edict_t *ion; trace_t tr; if (!self) { return; } VectorNormalize(dir); ion = G_Spawn(); VectorCopy(start, ion->s.origin); VectorCopy(start, ion->s.old_origin); vectoangles(dir, ion->s.angles); VectorScale(dir, speed, ion->velocity); ion->movetype = MOVETYPE_WALLBOUNCE; ion->clipmask = MASK_SHOT; ion->solid = SOLID_BBOX; ion->s.effects |= effect; ion->s.renderfx |= RF_FULLBRIGHT; VectorClear(ion->mins); VectorClear(ion->maxs); ion->s.modelindex = gi.modelindex("models/objects/boomrang/tris.md2"); ion->s.sound = gi.soundindex("misc/lasfly.wav"); ion->owner = self; ion->touch = ionripper_touch; ion->nextthink = level.time + 3; ion->think = ionripper_sparks; ion->dmg = damage; ion->dmg_radius = 100; gi.linkentity(ion); if (self->client) { check_dodge(self, ion->s.origin, dir, speed); } tr = gi.trace(self->s.origin, NULL, NULL, ion->s.origin, ion, MASK_SHOT); if (tr.fraction < 1.0) { VectorMA(ion->s.origin, -10, dir, ion->s.origin); ion->touch(ion, tr.ent, NULL, NULL); } }
bool spell_corrosion(int sn, int level, CHAR_DATA * ch, void * vo, int target) { // Check for dodging CHAR_DATA * victim(static_cast<CHAR_DATA*>(vo)); act("You spray a slurry of corroding minerals at $N!", ch, NULL, victim, TO_CHAR); act("$n sprays a slurry of corroding minerals at you!", ch, NULL, victim, TO_VICT); act("$n sprays a slurry of corroding minerals at $N!", ch, NULL, victim, TO_NOTVICT); if (check_dodge(ch, victim, NULL)) return true; // Failed to dodge; build a list of candidate objects std::vector<OBJ_DATA*> wornObjects; for (OBJ_DATA * obj(victim->carrying); obj != NULL; obj = obj->next_content) { // Candidate objects must be worn, metal, and not already corroding if (obj->worn_on && !obj_is_affected(obj, sn) && material_table[obj->material].metal && !IS_SET(obj->extra_flags[0], ITEM_NODESTROY)) wornObjects.push_back(obj); } if (wornObjects.empty()) { act("The corrosive magics strike you, but can find no purchase on your equipment!", victim, NULL, NULL, TO_CHAR); act("The corrosive magics strike $n, but can find no purchase on $s equipment!", victim, NULL, NULL, TO_ROOM); return true; } // Prepare the effect AFFECT_DATA af = {0}; af.where = TO_OBJECT; af.type = sn; af.level = level; af.duration = (level / 8); // Hit some of the objects unsigned int count(number_range(2, 5)); for (unsigned int i(0); i < count && !wornObjects.empty(); ++i) { // Apply the effect size_t index(number_range(0, wornObjects.empty() - 1)); act("$p is struck by the corrosive magics!", ch, wornObjects[index], NULL, TO_ALL); affect_to_obj(wornObjects[index], &af); // Remove this object from the candidate set wornObjects[index] = wornObjects[wornObjects.size() - 1]; wornObjects.pop_back(); } return true; }
void fire_blueblaster(edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int effect) { edict_t *bolt; trace_t tr; if (!self) { return; } VectorNormalize(dir); bolt = G_Spawn(); VectorCopy(start, bolt->s.origin); VectorCopy(start, bolt->s.old_origin); vectoangles(dir, bolt->s.angles); VectorScale(dir, speed, bolt->velocity); bolt->movetype = MOVETYPE_FLYMISSILE; bolt->clipmask = MASK_SHOT; bolt->solid = SOLID_BBOX; bolt->s.effects |= effect; VectorClear(bolt->mins); VectorClear(bolt->maxs); bolt->s.modelindex = gi.modelindex("models/objects/blaser/tris.md2"); bolt->s.sound = gi.soundindex("misc/lasfly.wav"); bolt->owner = self; bolt->touch = blaster_touch; bolt->nextthink = level.time + 2; bolt->think = G_FreeEdict; bolt->dmg = damage; bolt->classname = "bolt"; gi.linkentity(bolt); if (self->client) { check_dodge(self, bolt->s.origin, dir, speed); } tr = gi.trace(self->s.origin, NULL, NULL, bolt->s.origin, bolt, MASK_SHOT); if (tr.fraction < 1.0) { VectorMA(bolt->s.origin, -10, dir, bolt->s.origin); bolt->touch(bolt, tr.ent, NULL, NULL); } }
void fire_blaster(edict_t *self, vec3_t start, vec3_t dir, int damage, int speed, int effect, qboolean hyper){ edict_t *bolt; trace_t tr; VectorNormalize(dir); bolt = G_Spawn(); bolt->svflags = SVF_PROJECTILE; // special net code is used for projectiles VectorCopy(start, bolt->s.origin); VectorCopy(start, bolt->s.old_origin); vectoangles(dir, bolt->s.angles); VectorScale(dir, speed, bolt->velocity); bolt->movetype = MOVETYPE_FLYMISSILE; bolt->clipmask = MASK_SHOT; bolt->solid = SOLID_BBOX; bolt->s.effects |= effect; VectorClear(bolt->mins); VectorClear(bolt->maxs); bolt->s.modelindex = gi.modelindex("models/objects/laser/tris.md2"); bolt->s.sound = gi.soundindex("misc/lasfly.wav"); bolt->owner = self; bolt->touch = blaster_touch; bolt->nextthink = level.time + 2; bolt->think = G_FreeEdict; bolt->dmg = damage; bolt->classname = "bolt"; bolt->s.renderfx = RF_NOSHADOW; if(hyper) bolt->spawnflags = 1; gi.linkentity(bolt); if(self->client) check_dodge(self, bolt->s.origin, dir, speed); tr = gi.trace(self->s.origin, NULL, NULL, bolt->s.origin, bolt, MASK_SHOT); if(tr.fraction < 1.0){ VectorMA(bolt->s.origin, -10, dir, bolt->s.origin); bolt->touch(bolt, tr.ent, NULL, NULL); } }
void fire_fireball (edict_t *self, vec3_t start, vec3_t dir, int damage, int speed) { edict_t *bolt; trace_t tr; VectorNormalize (dir); bolt = G_Spawn(); bolt->svflags = SVF_DEADMONSTER; VectorCopy (start, bolt->s.origin); VectorCopy (start, bolt->s.old_origin); vectoangles (dir, bolt->s.angles); VectorScale (dir, speed, bolt->velocity); bolt->movetype = MOVETYPE_FLYMISSILE; bolt->clipmask = MASK_SHOT; bolt->solid = SOLID_BBOX; VectorClear (bolt->mins); VectorClear (bolt->maxs); bolt->s.effects = EF_BLASTER; bolt->s.modelindex = gi.modelindex ("models/objects/laser/tris.md2"); bolt->owner = self; bolt->touch = fireball_touch; bolt->nextthink = level.time + 2; bolt->think = G_FreeEdict; bolt->dmg = damage; bolt->classname = "bolt"; gi.linkentity (bolt); if (self->client) check_dodge (self, bolt->s.origin, dir, speed); tr = gi.trace (self->s.origin, NULL, NULL, bolt->s.origin, bolt, MASK_SHOT); if (tr.fraction < 1.0) { VectorMA (bolt->s.origin, -10, dir, bolt->s.origin); bolt->touch (bolt, tr.ent, NULL, NULL); } }