void target_laser_start (gentity_t *self) { gentity_t *ent; self->s.eType = ET_BEAM; if (self->target) { ent = G_Find (NULL, FOFS(targetname), self->target); if (!ent) { G_Printf ("%s at %s: %s is a bad target\n", self->classname, vtos(self->s.origin), self->target); } self->enemy = ent; } else { G_SetMovedir (self->s.angles, self->movedir); } self->use = target_laser_use; self->think = target_laser_think; if ( !self->damage ) { self->damage = 1; } if (self->spawnflags & 1) target_laser_on (self); else target_laser_off (self); }
void target_laser_use (edict_t *self, edict_t *other, edict_t *activator) { self->activator = activator; if (self->spawnflags & 1) target_laser_off (self); else target_laser_on (self); }
void target_laser_use (gentity_t *self, gentity_t *other, gentity_t *activator) { self->activator = activator; if ( self->nextthink > 0 ) target_laser_off (self); else target_laser_on (self); }
void target_laser_start (edict_t *self) { edict_t *ent; self->movetype = MOVETYPE_NONE; self->solid = SOLID_NOT; self->s.renderfx |= RF_BEAM|RF_TRANSLUCENT; self->s.modelindex = 1; // must be non-zero // set the beam diameter if (self->spawnflags & 64) self->s.frame = 16; else self->s.frame = 4; // set the color if (self->spawnflags & 2) self->s.skinnum = 0xf2f2f0f0; else if (self->spawnflags & 4) self->s.skinnum = 0xd0d1d2d3; else if (self->spawnflags & 8) self->s.skinnum = 0xf3f3f1f1; else if (self->spawnflags & 16) self->s.skinnum = 0xdcdddedf; else if (self->spawnflags & 32) self->s.skinnum = 0xe0e1e2e3; if (!self->enemy) { if (self->target) { ent = G_Find (NULL, FOFS(targetname), self->target); if (!ent) gi.dprintf ("%s at %s: %s is a bad target\n", self->classname, vtos(self->s.origin), self->target); self->enemy = ent; } else { G_SetMovedir (self->s.angles, self->movedir); } } self->use = target_laser_use; self->think = target_laser_think; if (!self->dmg) self->dmg = 1; VectorSet (self->mins, -8, -8, -8); VectorSet (self->maxs, 8, 8, 8); gi.linkentity (self); if (self->spawnflags & 1) target_laser_on (self); else target_laser_off (self); }
void target_laser_use (gentity_t *self, gentity_t *other, gentity_t *activator) { G_ActivateBehavior(self,BSET_USE); self->activator = activator; if ( self->nextthink > 0 ) target_laser_off (self); else target_laser_on (self); }
void target_laser_start( edict_t *self ) { edict_t *ent; self->movetype = MOVETYPE_NONE; self->r.solid = SOLID_NOT; self->s.type = ET_BEAM; self->s.modelindex = 1; // must be non-zero self->r.svflags = SVF_TRANSMITORIGIN2; // set the beam diameter if( self->spawnflags & 64 ) self->s.frame = 16; else self->s.frame = 4; // set the color if( self->spawnflags & 2 ) self->s.colorRGBA = COLOR_RGBA( 220, 0, 0, 76 ); else if( self->spawnflags & 4 ) self->s.colorRGBA = COLOR_RGBA( 0, 220, 0, 76 ); else if( self->spawnflags & 8 ) self->s.colorRGBA = COLOR_RGBA( 0, 0, 220, 76 ); else if( self->spawnflags & 16 ) self->s.colorRGBA = COLOR_RGBA( 220, 220, 0, 76 ); else if( self->spawnflags & 32 ) self->s.colorRGBA = COLOR_RGBA( 255, 255, 0, 76 ); if( !self->enemy ) { if( self->target ) { ent = G_Find( NULL, FOFS( targetname ), self->target ); if( !ent ) if( developer->integer ) G_Printf( "%s at %s: %s is a bad target\n", self->classname, vtos( self->s.origin ), self->target ); self->enemy = ent; } else { G_SetMovedir( self->s.angles, self->moveinfo.movedir ); } } self->use = target_laser_use; self->think = target_laser_think; if( !self->dmg ) self->dmg = 1; if( self->spawnflags & 1 ) target_laser_on( self ); else target_laser_off( self ); }
void target_laser_use(gentity_t *self, gentity_t *other, gentity_t *activator) { // Nico, silent GCC (void)other; self->activator = activator; if (self->nextthink > 0) { target_laser_off(self); } else { target_laser_on(self); } }
void target_laser_use (gentity_t *self, gentity_t *other, gentity_t *activator) { /* LQ3A */ UNREFERENCED_PARAMETER(other); self->activator = activator; if ( self->nextthink > 0 ) target_laser_off (self); else target_laser_on (self); }
void target_laser_use (edict_t *self, edict_t *other, edict_t *activator) { if (!self || !activator) { return; } self->activator = activator; if (self->spawnflags & 1) { target_laser_off(self); } else { target_laser_on(self); } }
void PlaceLaser (edict_t *ent) { edict_t *laser, *grenade; edict_t *blip = NULL;//GHz vec3_t forward, wallp, start, end; trace_t tr; trace_t endTrace; int health=0; if (debuginfo->value) gi.dprintf("DEBUG: %s just called PlaceLaser()\n", ent->client->pers.netname); health = LASER_INITIAL_HEALTH+LASER_ADDON_HEALTH*ent->myskills.abilities[BUILD_LASER].current_level; // valid ent ? if ((!ent->client) || (ent->health<=0)) return; if ((deathmatch->value) && (level.time < pregame_time->value)) { if (ent->client) safe_cprintf(ent, PRINT_HIGH, "You cannot use this ability in pre-game!\n"); return; } if (Q_strcasecmp (gi.args(), "remove") == 0) { RemoveLaserDefense(ent); return; } if(ent->myskills.abilities[BUILD_LASER].disable) return; //3.0 amnesia disables lasers if (que_findtype(ent->curses, NULL, AMNESIA) != NULL) return; if (ent->myskills.abilities[BUILD_LASER].current_level < 1) { safe_cprintf(ent, PRINT_HIGH, "You can't make lasers due to not training in it!\n"); return; } // cells for laser ? if (ent->client->pers.inventory[power_cube_index] < LASER_COST) { safe_cprintf(ent, PRINT_HIGH, "Not enough Power Cubes for laser.\n"); return; } if (ent->client->ability_delay > level.time) { safe_cprintf (ent, PRINT_HIGH, "You can't use abilities for another %2.1f seconds\n", ent->client->ability_delay - level.time); return; } ent->client->ability_delay = level.time + DELAY_LASER; //gi.dprintf("DEBUG: %s is attempting to place a laser...\n", ent->client->pers.netname); // GHz: Reached max number allowed ? if (ent->num_lasers >= MAX_LASERS) { safe_cprintf(ent, PRINT_HIGH, "You have reached the max of %d lasers\n", MAX_LASERS); return; } // Setup "little look" to close wall VectorCopy(ent->s.origin,wallp); // Cast along view angle AngleVectors (ent->client->v_angle, forward, NULL, NULL); // Setup end point wallp[0]=ent->s.origin[0]+forward[0]*128; wallp[1]=ent->s.origin[1]+forward[1]*128; wallp[2]=ent->s.origin[2]+forward[2]*128; // trace tr = gi.trace (ent->s.origin, NULL, NULL, wallp, ent, MASK_SOLID); // Line complete ? (ie. no collision) if (tr.fraction == 1.0) { safe_cprintf (ent, PRINT_HIGH, "Too far from wall.\n"); return; } // Hit sky ? if (tr.surface) if (tr.surface->flags & SURF_SKY) return; /* while (blip = findradius (blip, ent->s.origin, 64)) { if (!visible(ent, blip)) continue; if ( (!strcmp(blip->classname, "worldspawn") ) || (!strcmp(blip->classname, "info_player_start") ) || (!strcmp(blip->classname, "info_player_deathmatch") ) || (!strcmp(blip->classname, "item_flagreturn_team1") ) || (!strcmp(blip->classname, "item_flagreturn_team2") ) || (!strcmp(blip->classname, "misc_teleporter_dest") ) || (!strcmp(blip->classname, "info_teleport_destination") ) ) { safe_cprintf (ent, PRINT_HIGH, "Laser is too close to a spawnpoint or flag.\n"); return ; } } */ // Ok, lets stick one on then ... safe_cprintf (ent, PRINT_HIGH, "Laser attached.\n"); /* if (! ( (int)dmflags->value & DF_INFINITE_AMMO ) ) { ent->client->pers.inventory[power_cube_index] -= LASER_COST; ent->client->pers.inventory[ITEM_INDEX(FindItem("Lasers"))]--; }*/ // get entities for both objects grenade = G_Spawn(); laser = G_Spawn(); // setup the Grenade VectorClear (grenade->mins); VectorClear (grenade->maxs); VectorCopy (tr.endpos, grenade->s.origin); vectoangles(tr.plane.normal, grenade->s.angles); grenade -> movetype = MOVETYPE_NONE; grenade -> clipmask = MASK_SHOT; grenade->solid = SOLID_BBOX; VectorSet(grenade->mins, -3, -3, 0); VectorSet(grenade->maxs, 3, 3, 6); grenade -> takedamage = DAMAGE_NO; grenade -> s.modelindex = gi.modelindex ("models/objects/grenade2/tris.md2"); grenade -> owner = ent; grenade -> creator = laser; grenade -> monsterinfo.aiflags = AI_NOSTEP; grenade -> classname = "laser_defense_gr"; grenade -> nextthink = level.time + LASER_TIMEUP+GetRandom(0,30);//GetRandom((LASER_TIMEUP/2),(2*LASER_TIMEUP)); grenade -> think = laser_cleanup; // Now lets find the other end of the laser // by starting at the grenade position VectorCopy (grenade->s.origin, start); // setup laser movedir (projection of laser) G_SetMovedir (grenade->s.angles, laser->movedir); gi.linkentity (grenade); VectorMA (start, 2048, laser->movedir, end); endTrace = gi.trace (start, NULL, NULL, end, ent, MASK_SOLID); // ----------- // Setup laser // ----------- laser->movetype = MOVETYPE_NONE; laser->solid = SOLID_NOT; laser->s.renderfx = RF_BEAM|RF_TRANSLUCENT; laser->s.modelindex = 1; // must be non-zero laser->s.sound = gi.soundindex ("world/laser.wav"); laser->classname = "laser_defense"; laser->s.frame = 2 /* ent->myskills.build_lasers*/; // as it gets higher in levels, the bigger it gets. beam diameter laser->owner = laser; laser->s.skinnum = laser_colour[LASER_DEFENSE_COLOR]; laser->dmg = LASER_INITIAL_DMG+LASER_ADDON_DMG*ent->myskills.abilities[BUILD_LASER].current_level; laser->think = pre_target_laser_def_think; //laser->delay = level.time + LASER_TIMEUP; laser->health = health; laser->creator = grenade; laser->activator = ent; // start off ... target_laser_off (laser); VectorCopy (endTrace.endpos, laser->s.old_origin); // ... but make automatically come on laser -> nextthink = level.time + 2; // Set orgin of laser to point of contact with wall VectorCopy(endTrace.endpos,laser->s.origin); /* while (blip = findradius (blip, laser->s.origin, 64)) { if (!visible(laser, blip)) continue; if ( (!strcmp(blip->classname, "worldspawn") ) || (!strcmp(blip->classname, "info_player_start") ) || (!strcmp(blip->classname, "info_player_deathmatch") ) || (!strcmp(blip->classname, "item_flagreturn_team1") ) || (!strcmp(blip->classname, "item_flagreturn_team2") ) || (!strcmp(blip->classname, "misc_teleporter_dest") ) || (!strcmp(blip->classname, "info_teleport_destination") ) ) { safe_cprintf (ent, PRINT_HIGH, "Laser is too close to a spawnpoint or flag.\nLaser Removed.\n"); G_FreeEdict(laser); G_FreeEdict(grenade); return ; } } */ // convert normal at point of contact to laser angles vectoangles(tr.plane.normal,laser->s.angles); // setup laser movedir (projection of laser) G_SetMovedir (laser->s.angles, laser->movedir); VectorSet (laser->mins, -18, -18, -18); VectorSet (laser->maxs, 18, 18, 18); // link to world gi.linkentity (laser); ent->num_lasers++; // GHz: add to laser counter //If you use this spell, you uncloak! ent->svflags &= ~SVF_NOCLIENT; ent->client->cloaking = false; ent->client->cloakable = 0; ent->client->pers.inventory[power_cube_index] -= LASER_COST; //gi.dprintf("DEBUG: %s successfully created a laser.\n", ent->client->pers.netname); }
void Cmd_Trigger_f (edict_t *ent) { char *targetname; edict_t *t; int arg2; arg2 = atoi (gi.argv(2)); targetname = gi.argv(1); t = G_Find (NULL, FOFS(targetname), targetname); switch (arg2) { /* ============= Turn target off ============= */ case 1: if (!t) return; if (!strncmp(t->classname,"target_mappack_laser",sizeof("target_mappack_laser"))) { if (t->spawnflags & 1) target_laser_off (t); } if (!strncmp(t->classname,"mappack_light",sizeof("mappack_light"))) { if (!t->spawnflags & 1) { gi.configstring (CS_LIGHTS+t->style, "a"); t->spawnflags |= 1; } } break; /* ============= Turn target on ============= */ case 2: if (!t) return; if (!strncmp(t->classname,"target_satan_laser",sizeof("target_satan_laser"))) { if (t->spawnflags & 1) { } else target_laser_on (t); } if (!strncmp(t->classname,"satan_light", sizeof("satan_light"))) { if (t->spawnflags & 1) { gi.configstring (CS_LIGHTS+t->style, "m"); t->spawnflags &= ~1; } } break; /* ============= Just swap em around, or trigger em if not toggleable ============= */ default: if (!t) return; t = G_Spawn(); t->classname = "DelayedUse"; t->nextthink = level.time + 0.01; t->think = Think_Delay; t->activator = ent; t->target = gi.argv(1); break; } }