Ejemplo n.º 1
0
/*
======================
SV_StepDirection

Turns to the movement direction, and walks the current distance if
facing it.

======================
*/
qboolean SV_StepDirection (edict_t *ent, float yaw, float dist)
{
	vec3_t		move, oldorigin;
	float		delta;
	
	ent->ideal_yaw = yaw;
	M_ChangeYaw (ent);
	
	yaw = yaw*M_PI*2 / 360;
	move[0] = cos(yaw)*dist;
	move[1] = sin(yaw)*dist;
	move[2] = 0;

	VectorCopy (ent->s.origin, oldorigin);
	if (SV_movestep (ent, move, false))
	{
		delta = ent->s.angles[YAW] - ent->ideal_yaw;
		if (delta > 45 && delta < 315)
		{		// not turned far enough, so don't take the step
			VectorCopy (oldorigin, ent->s.origin);
		}
		gi.linkentity (ent);
		G_TouchTriggers (ent);
		return true;
	}
	gi.linkentity (ent);
	G_TouchTriggers (ent);
	return false;
}
Ejemplo n.º 2
0
qboolean SV_StepDirection (edict_t *ent, float yaw, float dist)
{
	vec3_t		move, oldorigin;
	float		delta;
	
	ent->v.ideal_yaw = yaw;
	PF_changeyaw();
	
	yaw = yaw*Q_PI*2 / 360;
	move[0] = cosf(yaw)*dist;
	move[1] = sinf(yaw)*dist;
	move[2] = 0;

	VectorCopy (ent->v.origin, oldorigin);
	if (SV_movestep (ent, move, FALSE))
	{
		delta = ent->v.angles[YAW] - ent->v.ideal_yaw;
		if (delta > 45 && delta < 315)
		{		// not turned far enough, so don't take the step
			VectorCopy (oldorigin, ent->v.origin);
		}
		SV_LinkEdict (ent, TRUE);
		return TRUE;
	}
	SV_LinkEdict (ent, TRUE);
		
	return FALSE;
}
Ejemplo n.º 3
0
qboolean SV_StepDirection (edict_t *ent, float yaw, float dist)
{
	vec3_t		move, oldorigin;
	float		delta;
	qboolean    set_trace_plane;
	
	ent->v.ideal_yaw = yaw;
	PF_changeyaw();
	
	yaw = yaw*M_PI*2 / 360;
	move[0] = cos(yaw)*dist;
	move[1] = sin(yaw)*dist;
	move[2] = 0;//FIXME: Make wallcrawlers and flying monsters use this!

	VectorCopy (ent->v.origin, oldorigin);
	if((int)ent->v.flags & FL_SET_TRACE)
		set_trace_plane = true;
	else
		set_trace_plane = false;

	if (SV_movestep (ent, move, false, false, set_trace_plane))
	{
		delta = ent->v.angles[YAW] - ent->v.ideal_yaw;
		if (delta > 45 && delta < 315)
		{		// not turned far enough, so don't take the step
			VectorCopy (oldorigin, ent->v.origin);
		}
		SV_LinkEdict (ent, true);
		return true;
	}
	SV_LinkEdict (ent, true);
		
	return false;
}
Ejemplo n.º 4
0
/*
===============
M_walkmove
===============
*/
qboolean M_walkmove (edict_t *ent, float yaw, float dist)
{
	vec3_t	 move;
	qboolean rval;
//	qboolean changezval = false;

	if (ent->svflags & SVF_MONSTER && dist >= 28)
		dist = 28;
		// gi.dprintf ("%s: tried to move %5.2f\n", ent->classname, dist);
	
	if (!ent->groundentity && !(ent->flags & (FL_FLY|FL_SWIM)))
		return false;

	yaw = yaw*M_PI*2 / 360;
	
	move[0] = cos(yaw)*dist;
	move[1] = sin(yaw)*dist;
	move[2] = 0;
/*
	if (ent->maxs[2] == DUCKING_MAX_Z)
	{
		ent->maxs[2] = 8;//4; // Ridah, as requested
		changezval = true;
	}
*/	
	rval = SV_movestep(ent, move, true);
/*
	if (changezval)
	{
		ent->maxs[2] = DUCKING_MAX_Z;
	}
*/		
		
	return rval;
}
Ejemplo n.º 5
0
qboolean SV_FlyDirection(edict_t *ent, vec3_t move) {

   int ret;


   ret = SV_movestep(ent, move, 0);
   SV_LinkEdict(ent, 1);

   return(ret);
}
Ejemplo n.º 6
0
/*
===============
M_walkmove
===============
*/
bool M_walkmove(edict_t *ent, float yaw, float dist)
{
    vec3_t  move;

    if (!ent->groundentity && !(ent->flags & (FL_FLY | FL_SWIM)))
        return false;

    yaw = DEG2RAD(yaw);
    move[0] = cos(yaw) * dist;
    move[1] = sin(yaw) * dist;
    move[2] = 0;

    return SV_movestep(ent, move, true);
}
Ejemplo n.º 7
0
/*
===============
M_walkmove
===============
*/
qboolean M_walkmove (edict_t *ent, float yaw, float dist)
{
    vec3_t  move;

    if (!ent->groundentity && !(ent->flags & (FL_FLY|FL_SWIM)))
        return qfalse;

    yaw = yaw*M_PI*2 / 360;

    move[0] = cos(yaw)*dist;
    move[1] = sin(yaw)*dist;
    move[2] = 0;

    return SV_movestep(ent, move, qtrue);
}
Ejemplo n.º 8
0
qboolean SV_StepDirection(edict_t *ent, float yaw, float dist) {

   int ret;
   vec3_t move;


   yaw = yaw * M_PI * 2.0 / 360.0;
   move[0] = cos(yaw) * dist;
   move[1] = sin(yaw) * dist;
   move[2] = 0;

   ret = SV_movestep(ent, move, 0);
   SV_LinkEdict(ent, 1);

   return(ret);
}
Ejemplo n.º 9
0
/*
===============
M_walkmove
===============
*/
qboolean M_walkmove (edict_t *ent, float yaw, float dist)
{
    vec3_t	move;
    // PMM
    qboolean	retval;

    if (!ent->groundentity && !(ent->flags & (FL_FLY|FL_SWIM)))
        return false;

    yaw = yaw*M_PI*2 / 360;

    move[0] = cos(yaw)*dist;
    move[1] = sin(yaw)*dist;
    move[2] = 0;

    // PMM
    retval = SV_movestep(ent, move, true);
    ent->monsterinfo.aiflags &= ~AI_BLOCKED;
    return retval;
    // pmm
}
Ejemplo n.º 10
0
/*
======================
SV_StepDirection

Turns to the movement direction, and walks the current distance if
facing it.

======================
*/
qboolean SV_StepDirection (edict_t *ent, float yaw, float dist)
{
    vec3_t		move, oldorigin;
    float		delta;

    if(!ent->inuse)	return true;		// PGM g_touchtrigger free problem

    ent->ideal_yaw = yaw;
    M_ChangeYaw (ent);

    yaw = yaw*M_PI*2 / 360;
    move[0] = cos(yaw)*dist;
    move[1] = sin(yaw)*dist;
    move[2] = 0;

    VectorCopy (ent->s.origin, oldorigin);
    if (SV_movestep (ent, move, false))
    {
        ent->monsterinfo.aiflags &= ~AI_BLOCKED;
        if(!ent->inuse)	return true;		// PGM g_touchtrigger free problem

        delta = ent->s.angles[YAW] - ent->ideal_yaw;
        if (strncmp(ent->classname, "monster_widow", 13))
        {
            if (delta > 45 && delta < 315)
            {   // not turned far enough, so don't take the step
                VectorCopy (oldorigin, ent->s.origin);
            }
        }
        gi.linkentity (ent);
        G_TouchTriggers (ent);
        return true;
    }
    gi.linkentity (ent);
    G_TouchTriggers (ent);
    return false;
}
Ejemplo n.º 11
0
void barrel_touch (edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)

{
	float	ratio;
	vec3_t	v;
	vec3_t	move;
	float yaw, dist;

	if (other->groundentity == self || !other->client)
		return;

	ratio = (float)other->mass / (float)self->mass;
	VectorSubtract (self->s.origin, other->s.origin, v);
	yaw = vectoyaw(v);
	dist = 20 * ratio * FRAMETIME;

	yaw = yaw*M_PI*2 / 360;
	
	move[0] = cos(yaw)*dist;
	move[1] = sin(yaw)*dist;
	move[2] = 0;

	SV_movestep(self, move, true);
}
Ejemplo n.º 12
0
/*
======================
SV_StepDirection

Turns to the movement direction, and walks the current distance if
facing it.

======================
*/
qboolean SV_StepDirection (edict_t *ent, float yaw, float dist, qboolean try_smallstep)
{
	vec3_t		move, oldorigin;
	//float		delta;
	float		old_dist;
	
	// dist = dist);

	//gi.dprintf("SV_StepDirection\n");
	old_dist = dist;
	ent->ideal_yaw = yaw;
	M_ChangeYaw (ent);

	if (!dist || fabs(dist) < 1)
		return true;

	yaw = yaw*M_PI*2 / 360;
	VectorCopy (ent->s.origin, oldorigin);

	// loop until we can move successfully
	while ((int)dist != 0)
	{
		move[0] = cos(yaw)*dist;
		move[1] = sin(yaw)*dist;
		move[2] = 0;

		
		if (SV_movestep (ent, move, false))
		{
			/*
			delta = ent->s.angles[YAW] - ent->ideal_yaw;
			if (delta > 45 && delta < 315)
			{		// not turned far enough, so don't take the step
				VectorCopy (oldorigin, ent->s.origin);
				gi.dprintf("not turned far enough!\n");
			}
			*/
			gi.linkentity (ent);
			G_TouchTriggers (ent);
			/*
			if (old_dist != dist)
				gi.dprintf("took a smaller step of %d instead of %d\n", (int)dist, (int)old_dist);
			else
				gi.dprintf("moved full distance\n");
			*/
			return true;
		}

		if (!try_smallstep)
			break;
		if (dist > 0)
			dist--;
		else
			dist++;
	}

	gi.linkentity (ent);
	G_TouchTriggers (ent);
	//gi.dprintf("%d: %s can't walk forward!\n", level.framenum, V_GetMonsterName(ent));
	return false;
}
Ejemplo n.º 13
0
/*
===============
M_walkmove
===============
*/
qboolean M_walkmove (edict_t *ent, float yaw, float dist)
{
	float	original_yaw=yaw;//GHz
	vec3_t	move;
	
	if (!ent->groundentity && !(ent->flags & (FL_FLY|FL_SWIM)))
		return false;

	yaw = yaw*M_PI*2 / 360;
	
	move[0] = cos(yaw)*dist;
	move[1] = sin(yaw)*dist;
	move[2] = 0;
	
	if (IsABoss(ent) || ent->mtype == P_TANK)
	{
		//return M_Move(ent, move, true);
		if (!M_Move(ent, move, true))
		{
			float	angle1, angle2, delta1, delta2, cl_yaw, ideal_yaw, mult;
			vec3_t	start, end, angles, right;
			trace_t tr;

			// get monster angles
			AngleVectors(ent->s.angles, NULL, right, NULL);
			//vectoangles(forward, forward);
			vectoangles(right, right);

			// get client yaw (FIXME: use mons yaw instead?)
			cl_yaw = ent->s.angles[YAW];
			AngleCheck(&cl_yaw);

			// trace from monster to wall
			VectorCopy(ent->s.origin, start);
			VectorMA(start, 64, move, end);
			tr = gi.trace(start, ent->mins, ent->maxs, end, ent, MASK_SHOT);

			// get monster angles in relation to wall
			VectorCopy(tr.plane.normal, angles);
			vectoangles(angles, angles);

			// monster is moving sideways, so use sideways vector instead
			if ((int)original_yaw==(int)right[YAW])
			{
				cl_yaw = right[YAW];
				AngleCheck(&cl_yaw);
			}

			// delta between monster yaw and wall yaw should be no more than 90 degrees
			// else, turn wall angles around 180 degrees
			if (fabs(cl_yaw-angles[YAW]) > 90)
				angles[YAW]+=180;
			ValidateAngles(angles);

			// possible escape angle 1
			angle1 = angles[YAW]+90;
			AngleCheck(&angle1);
			delta1 = fabs(angle1-cl_yaw);
			// possible escape angle 2
			angle2 = angles[YAW]-90;
			AngleCheck(&angle2);
			delta2 = fabs(angle2-cl_yaw);

			// take the shorter route
			if (delta1 > delta2)
			{
				ideal_yaw = angle2;
				mult = 1.0-delta2/90.0;
			}
			else
			{
				ideal_yaw = angle1;
				mult = 1.0-delta1/90.0;
			}
			
			// go full speed if we are turned at least half way towards ideal yaw
			if (mult >= 0.5)
				mult = 1.0;

			// modify speed
			dist*=mult;

			// recalculate with new heading
			yaw = ideal_yaw*M_PI*2 / 360;
			move[0] = cos(yaw)*dist;
			move[1] = sin(yaw)*dist;
			move[2] = 0;
				
			//gi.dprintf("can't walk wall@%.1f you@%.1f ideal@%.1f\n", angles[YAW], cl_yaw, ideal_yaw);

			return M_Move(ent, move, true);
		}
		return true;
	}
	else if (level.time > ent->holdtime) // stay in-place for medic healing
		return SV_movestep(ent, move, true);
	else
		return false;
}