예제 #1
0
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);
}
예제 #2
0
파일: g_target.c 프로젝트: AJenbo/Quake-2
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);
}
예제 #3
0
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);
}
예제 #4
0
파일: g_target.c 프로젝트: AJenbo/Quake-2
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);
}
예제 #5
0
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);
}
예제 #6
0
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 );
}
예제 #7
0
파일: g_target.c 프로젝트: boutetnico/ETrun
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);
	}
}
예제 #8
0
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);
}
예제 #9
0
파일: g_target.c 프로젝트: basecq/q2dos
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);
	}
}
예제 #10
0
파일: laserstuff.c 프로젝트: zardoru/vrxcl
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);
}
예제 #11
0
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;
    }
}