Пример #1
0
void CKnife::SecondaryAttack(void)
{
	if (ShieldSecondaryFire(KNIFE_SHIELD_UP, KNIFE_SHIELD_DOWN) == true)
		return;

	Stab(TRUE);
	pev->nextthink = UTIL_WeaponTimeBase() + 0.35;
}
Пример #2
0
void CNPC_Hydra::MoveBody( )
{
	int i;

	int iFirst = 2;
	int iLast = m_body.Count() - 1;

	// clear stuck flags
	for (i = 0; i <= iLast; i++)
	{
		m_body[i].bStuck = false;
	}

	// try to move all the nodes
	for (i = iFirst; i <= iLast; i++)
	{
		trace_t tr;

		// check direct movement
		AI_TraceHull(m_body[i].vecPos, m_body[i].vecPos + m_body[i].vecDelta, 
			Vector( -2, -2, -2 ), Vector( 2, 2, 2 ), 
			MASK_NPCSOLID, this, COLLISION_GROUP_NONE, &tr);
	
		Vector direct = tr.endpos;
		Vector delta = Vector( 0, 0, 0 );

		Vector slide = m_body[i].vecDelta;
		if (tr.fraction != 1.0)
		{
			// slow down and remove all motion in the direction of the plane
			direct += tr.plane.normal;
			Vector impactSpeed = (slide * tr.plane.normal) * tr.plane.normal;

			slide = (slide - impactSpeed) * 0.8;

			if (tr.m_pEnt)
			{
				if (i == iLast)
				{
					Stab( tr.m_pEnt, impactSpeed, tr );
				}
				else
				{
					Nudge( tr.m_pEnt, direct, impactSpeed );
				}
			}

			// slow down and remove all motion in the direction of the plane
			slide = (slide - (slide * tr.plane.normal) * tr.plane.normal) * 0.8;

			// try to move the remaining distance anyways
			AI_TraceHull(direct, direct + slide * (1 - tr.fraction), 
				Vector( -2, -2, -2 ), Vector( 2, 2, 2 ), 
				MASK_NPCSOLID, this, COLLISION_GROUP_NONE, &tr);

			// NDebugOverlay::Line( m_body[i].vecPos, tr.endpos, 255, 255, 0, true, 1);

			direct = tr.endpos;

			m_body[i].bStuck = true;

		}

		// make sure the new segment doesn't intersect the world
		AI_TraceHull(direct, m_body[i-1].vecPos, 
			Vector( -2, -2, -2 ), Vector( 2, 2, 2 ), 
			MASK_NPCSOLID, this, COLLISION_GROUP_NONE, &tr);

		if (tr.fraction == 1.0)
		{
			if (i+1 < iLast)
			{
				AI_TraceHull(direct, m_body[i+1].vecPos, 
					Vector( -2, -2, -2 ), Vector( 2, 2, 2 ), 
					MASK_NPCSOLID, this, COLLISION_GROUP_NONE, &tr);
			}

			if (tr.fraction == 1.0)
			{
				m_body[i].vecPos = direct;
				delta = slide;
			}
			else
			{
				// FIXME: compute nudge force
				m_body[i].bStuck = true;
				//m_body[i+1].bStuck = true;
			}
		}
		else
		{
			// FIXME: compute nudge force
			m_body[i].bStuck = true;
			//m_body[i-1].bStuck = true;
		}

		// m_body[i-1].vecDelta += (m_body[i].vecDelta - delta) * 0.25;
		// m_body[i+1].vecDelta += (m_body[i].vecDelta - delta) * 0.25;
		m_body[i].vecDelta = delta;
	}
}
Пример #3
0
void UpdateMonster(Entity *self)
{
  int *frames;
  if(self->state == MS_Deadbody)
  {
    return;
  }
  if(self->state == MS_Dead)
  {
    /*run death animation*/
    if((self->frame < deadframes[0])||(self->frame > deadframes[1]))
    {
      self->frame = deadframes[0] - 1;
    }
    self->frame++;
    if(self->frame != deadframes[1])return;
    if(GetObjKey(self->data,"persists",NULL))
    {
      SetPlayerProgress(level.name,self->name, self->objindex,"dead");
    }
    /*spawndeadbody, unless nocorpse*/
    self->state = MS_Deadbody;
    self->update = NULL;
    self->think = NULL;
    self->solid = 0;
    self->FloorDraw = 1;
    self->activate = NULL;
    return;
  }
  if(self->attacking)
  {
    /*this is going to become a lot more robust*/
    self->attackframe++;
      switch(self->attacktype)
      {
        case AT_Slash:
          frames = slashframes;
          if(self->attackframe >=4)
          {
            if((self->attackframe > (8 * self->attackspeed))||(Slash(self,self->p,self->targetpoint,self->attackrange,35,-35,2, self->attackframe/8.0, 1, 1, self->damagetype)))
            {
              self->attacking = 0;
              AddDelays(self,8);
              self->Rcd = 8  + (8 * self->attackspeed);
              self->Acd = 4 + (4 * self->attackspeed);
            }
          }
          break;
        case AT_Crush:
          frames = crushframes;
          if(self->attackframe >=4)
          {
            if((self->attackframe > (8 * self->attackspeed))||(Crush(self,self->p,self->targetpoint,self->attackrange,35,-35,2, self->attackframe/8.0, 1, 1, self->damagetype)))
            {
              self->attacking = 0;
              AddDelays(self,8);
              self->Rcd = 8  + (8 * self->attackspeed);
              self->Acd = 4 + (4 * self->attackspeed);
            }
          }
          break;
        case AT_Stab:
          frames = stabframes;
          if(self->attackframe >=4)
          {
            if((self->attackframe > (8 * self->attackspeed))||(Stab(self,self->p,self->targetpoint,self->attackrange,2, self->attackframe/8.0, 1, 1, self->damagetype)))
            {
              self->attacking = 0;
              AddDelays(self,8);
              self->Rcd = 8  + (8 * self->attackspeed);
              self->Acd = 4 + (4 * self->attackspeed);
            }
          }
          break;
        case AT_Shoot:
          frames = shootframes;
          if((int)self->attackframe == 6)
          {
            ShootArrow(self);
          }
          if(self->attackframe > 8)
          {
            self->attacking = 0;
            AddDelays(self,8);
            self->Rcd = 8  + (8 * self->attackspeed);
            self->Acd = 4 + (4 * self->attackspeed);
          }
          break;
      }

    self->frame = frames[0] + ((frames[1] - frames[0])*(self->attackframe/(8 * self->attackspeed)));
  }
  else if(self->guard)
  {
    /*using the shield, Set left arm sprite to guard*/
    self->frame = 1;
  }
  else
  {
    /*when idle*/
    if(self->frame < idleframes[0])self->frame = idleframes[0];
    else if (self->frame > idleframes[1])self->frame = idleframes[0];
    else
    {
      self->frame = self->frame + 0.2;
    }
  }
  if(RelativeSize(self->v.x, self->v.y) > 0)
  {
    UpdateEntityPosition(self,NULL);
  }
  CoolDowns(self);
}