void CKnife::SecondaryAttack(void) { if (ShieldSecondaryFire(KNIFE_SHIELD_UP, KNIFE_SHIELD_DOWN) == true) return; Stab(TRUE); pev->nextthink = UTIL_WeaponTimeBase() + 0.35; }
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; } }
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); }