Четверг, 28.03.2024, 11:25
 
Приветствую Вас Guest | RSS
Главная страница | ar2 - Форум | Регистрация | Вход
[Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум » Игровая мастерская » Программирование » ar2 (npc не могут стрелять)
ar2
source-modsДата: Воскресенье, 20.06.2010, 21:18 | Сообщение # 1
Demolition man
Группа: Проверенные
Сообщений: 231
Репутация: 20
Статус: Offline
короче... у меня модель с анимацией для ar2... вставил модель заточенную под ар2... все вроде правильно! но вот одно НО! нпс стреляют тупо и не убивают и не перезаряжаются...и я не пойму в чем дело((( помогитЕ! вот код:
Code
//=============================================================================//
//stalker mod
//andrey malyshev
//==========================================
#include "cbase.h"
#include "basehlcombatweapon.h"
#include "NPCevent.h"
#include "basecombatcharacter.h"
#include "AI_BaseNPC.h"
#include "player.h"
#include "game.h"
#include "in_buttons.h"
#include "grenade_ar2.h"
#include "explode.h"
#include "AI_Memory.h"
#include "soundent.h"
#include "rumble_shared.h"

// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"

extern ConVar    sk_plr_dmg_smg1_grenade;  

class CWeaponak74 : public CHLSelectFireMachineGun
{
  DECLARE_DATADESC();
public:
  DECLARE_CLASS( CWeaponak74, CHLSelectFireMachineGun );

  CWeaponak74();

  DECLARE_SERVERCLASS();
   
  void    Precache( void );
  void    AddViewKick( void );
  //void    PrimaryAttack( void ); //Функция взрыва
  void    SecondaryAttack( void );

  int  GetMinBurst() { return 3; }
  int  GetMaxBurst() { return 5; }

  virtual void Equip( CBaseCombatCharacter *pOwner );
  bool    Reload( void );

  float    GetFireRate( void ) { return 0.100f; }    // 13.3hz
  int  CapabilitiesGet( void ) { return bits_CAP_WEAPON_RANGE_ATTACK1; }
  int  WeaponRangeAttack2Condition( float flDot, float flDist );
  Activity    GetPrimaryAttackActivity( void );

  virtual const Vector& GetBulletSpread( void )
  {
   static const Vector cone = VECTOR_CONE_4DEGREES;
   return cone;
  }

  const WeaponProficiencyInfo_t *GetProficiencyValues();

  void FireNPCPrimaryAttack( CBaseCombatCharacter *pOperator, Vector &vecShootOrigin, Vector &vecShootDir );
  void Operator_ForceNPCFire( CBaseCombatCharacter  *pOperator, bool bSecondary );
  void Operator_HandleAnimEvent( animevent_t *pEvent, CBaseCombatCharacter *pOperator );

  DECLARE_ACTTABLE();

protected:

  Vector    m_vecTossVelocity;
  float    m_flNextGrenadeCheck;
};

IMPLEMENT_SERVERCLASS_ST(CWeaponak74, DT_Weaponak74)
END_SEND_TABLE()

LINK_ENTITY_TO_CLASS( weapon_ak74, CWeaponak74 );
PRECACHE_WEAPON_REGISTER(weapon_ak74);

BEGIN_DATADESC( CWeaponak74 )

  DEFINE_FIELD( m_vecTossVelocity, FIELD_VECTOR ),
  DEFINE_FIELD( m_flNextGrenadeCheck, FIELD_TIME ),

END_DATADESC()

acttable_t    CWeaponak74::m_acttable[] =  
{
  { ACT_RANGE_ATTACK1,   ACT_RANGE_ATTACK_AR2,   true },
  { ACT_RELOAD,     ACT_RELOAD_SMG1,    true },  // FIXME: hook to AR2 unique
  { ACT_IDLE,      ACT_IDLE_SMG1,     true },  // FIXME: hook to AR2 unique
  { ACT_IDLE_ANGRY,    ACT_IDLE_ANGRY_SMG1,   true },  // FIXME: hook to AR2 unique

  { ACT_WALK,      ACT_WALK_RIFLE,     true },

// Readiness activities (not aiming)
  { ACT_IDLE_RELAXED,    ACT_IDLE_SMG1_RELAXED,   false },//never aims
  { ACT_IDLE_STIMULATED,   ACT_IDLE_SMG1_STIMULATED,  false },
  { ACT_IDLE_AGITATED,   ACT_IDLE_ANGRY_SMG1,   false },//always aims

  { ACT_WALK_RELAXED,    ACT_WALK_RIFLE_RELAXED,   false },//never aims
  { ACT_WALK_STIMULATED,   ACT_WALK_RIFLE_STIMULATED,  false },
  { ACT_WALK_AGITATED,   ACT_WALK_AIM_RIFLE,    false },//always aims

  { ACT_RUN_RELAXED,    ACT_RUN_RIFLE_RELAXED,   false },//never aims
  { ACT_RUN_STIMULATED,   ACT_RUN_RIFLE_STIMULATED,  false },
  { ACT_RUN_AGITATED,    ACT_RUN_AIM_RIFLE,    false },//always aims

// Readiness activities (aiming)
  { ACT_IDLE_AIM_RELAXED,   ACT_IDLE_SMG1_RELAXED,   false },//never aims  
  { ACT_IDLE_AIM_STIMULATED,  ACT_IDLE_AIM_RIFLE_STIMULATED,    false },
  { ACT_IDLE_AIM_AGITATED,  ACT_IDLE_ANGRY_SMG1,   false },//always aims

  { ACT_WALK_AIM_RELAXED,   ACT_WALK_RIFLE_RELAXED,   false },//never aims
  { ACT_WALK_AIM_STIMULATED,  ACT_WALK_AIM_RIFLE_STIMULATED,    false },
  { ACT_WALK_AIM_AGITATED,  ACT_WALK_AIM_RIFLE,    false },//always aims

  { ACT_RUN_AIM_RELAXED,   ACT_RUN_RIFLE_RELAXED,   false },//never aims
  { ACT_RUN_AIM_STIMULATED,  ACT_RUN_AIM_RIFLE_STIMULATED,    false },
  { ACT_RUN_AIM_AGITATED,   ACT_RUN_AIM_RIFLE,    false },//always aims
//End readiness activities

  { ACT_WALK_AIM,     ACT_WALK_AIM_RIFLE,    true },
  { ACT_WALK_CROUCH,    ACT_WALK_CROUCH_RIFLE,   true },
  { ACT_WALK_CROUCH_AIM,   ACT_WALK_CROUCH_AIM_RIFLE,  true },
  { ACT_RUN,      ACT_RUN_RIFLE,     true },
  { ACT_RUN_AIM,     ACT_RUN_AIM_RIFLE,    true },
  { ACT_RUN_CROUCH,    ACT_RUN_CROUCH_RIFLE,   true },
  { ACT_RUN_CROUCH_AIM,   ACT_RUN_CROUCH_AIM_RIFLE,  true },
  { ACT_GESTURE_RANGE_ATTACK1,    ACT_GESTURE_RANGE_ATTACK_AR2,    false },
  { ACT_COVER_LOW,    ACT_COVER_SMG1_LOW,    false },  // FIXME: hook to AR2 unique
  { ACT_RANGE_AIM_LOW,   ACT_RANGE_AIM_AR2_LOW,   false },
  { ACT_RANGE_ATTACK1_LOW,  ACT_RANGE_ATTACK_SMG1_LOW,  true },  // FIXME: hook to AR2 unique
  { ACT_RELOAD_LOW,    ACT_RELOAD_SMG1_LOW,   false },
  { ACT_GESTURE_RELOAD,   ACT_GESTURE_RELOAD_SMG1,  true },
//    { ACT_RANGE_ATTACK2, ACT_RANGE_ATTACK_AR2_GRENADE, true },
};

IMPLEMENT_ACTTABLE(CWeaponak74);

//=========================================================
CWeaponak74::CWeaponak74( )
{
  m_fMinRange1  = 0;// No minimum range.  
  m_fMaxRange1  = 1400;

  m_bAltFiresUnderwater = false;
}

//-----------------------------------------------------------------------------
// Purpose:  
//-----------------------------------------------------------------------------
void CWeaponak74::Precache( void )
{
  UTIL_PrecacheOther("grenade_ar2");
   
  BaseClass::Precache();
}

  /*   
//-----------------------------------------------------------------------------  
// Purpose: Функция взрыва: чисто потрубить <img src="http://s6.ucoz.net/sm/23/smile.gif" border="0" align="absmiddle" alt="smile">
//-----------------------------------------------------------------------------  
void CWeaponSMG1::PrimaryAttack( void )  
{  

int Damage = 100; //the damage  
int Radius = 100; //the radius  
int physicforce = 100; //pushing of objects  
float timebetweenshots = 1.0f;//in seconds  
CBasePlayer *pDude = ToBasePlayer( GetOwner() );  
Vector *pvecAiming;  
pvecAiming = new Vector;  
Vector vecAiming;  
Vector vecSrc = pDude->Weapon_ShootPosition();  
pDude->EyeVectors(&vecAiming,0,0);  
trace_t tr;  
UTIL_TraceLine( vecSrc, vecSrc + vecAiming * 2000, MASK_SHOT, pDude, COLLISION_GROUP_NONE, &tr );  
SendWeaponAnim( ACT_VM_PRIMARYATTACK );  
WeaponSound( SPECIAL2 );//Sound effect  
pDude->ViewPunch( QAngle( -2, 0, 0 ) );//View Punch  
m_flNextPrimaryAttack = m_flNextSecondaryAttack = gpGlobals->curtime + 0.5f;  

/*
//Damage options  

//1. Explosion  
ExplosionCreate( tr.endpos, GetAbsAngles(), pDude, Damage, Radius,  
SF_ENVEXPLOSION_NOSPARKS | SF_ENVEXPLOSION_NODLIGHTS | SF_ENVEXPLOSION_NOSMOKE, physicforce,  

this);  

//2. AoE //  
ExplosionCreate( tr.endpos, GetAbsAngles(), pDude, Damage, Radius,  
SF_ENVEXPLOSION_NOSPARKS | SF_ENVEXPLOSION_NODLIGHTS | SF_ENVEXPLOSION_NOSMOKE |  

SF_ENVEXPLOSION_NOFIREBALL | SF_ENVEXPLOSION_NODECAL, physicforce, this);  

}
*/

//-----------------------------------------------------------------------------
// Purpose: Give this weapon longer range when wielded by an ally NPC.
//-----------------------------------------------------------------------------
void CWeaponak74::Equip( CBaseCombatCharacter *pOwner )
{
  if( pOwner->Classify() == CLASS_PLAYER_ALLY )
  {
   m_fMaxRange1 = 3000;
  }
  else
  {
   m_fMaxRange1 = 1400;
  }

  BaseClass::Equip( pOwner );
}

//-----------------------------------------------------------------------------
// Purpose:  
//-----------------------------------------------------------------------------
void CWeaponak74::FireNPCPrimaryAttack( CBaseCombatCharacter *pOperator, Vector &vecShootOrigin, Vector &vecShootDir )
{
  // FIXME: use the returned number of bullets to account for >10hz firerate
  WeaponSoundRealtime( SINGLE_NPC );

  CSoundEnt::InsertSound( SOUND_COMBAT|SOUND_CONTEXT_GUNFIRE, pOperator->GetAbsOrigin(), SOUNDENT_VOLUME_MACHINEGUN, 0.2, pOperator, SOUNDENT_CHANNEL_WEAPON, pOperator->GetEnemy() );
  pOperator->FireBullets( 1, vecShootOrigin, vecShootDir, VECTOR_CONE_PRECALCULATED,
   MAX_TRACE_LENGTH, m_iPrimaryAmmoType, 2, entindex(), 0 );

  pOperator->DoMuzzleFlash();
  m_iClip1 = m_iClip1 - 1;
}

//-----------------------------------------------------------------------------
// Purpose:  
//-----------------------------------------------------------------------------
void CWeaponak74::Operator_ForceNPCFire( CBaseCombatCharacter *pOperator, bool bSecondary )
{
  // Ensure we have enough rounds in the clip
  m_iClip1++;

  Vector vecShootOrigin, vecShootDir;
  QAngle    angShootDir;
  GetAttachment( LookupAttachment( "muzzle" ), vecShootOrigin, angShootDir );
  AngleVectors( angShootDir, &vecShootDir );
  FireNPCPrimaryAttack( pOperator, vecShootOrigin, vecShootDir );
}

//-----------------------------------------------------------------------------
// Purpose:  
//-----------------------------------------------------------------------------
void CWeaponak74::Operator_HandleAnimEvent( animevent_t *pEvent, CBaseCombatCharacter *pOperator )
{
  switch( pEvent->event )
  {
  case EVENT_WEAPON_AR2:
   {
    Vector vecShootOrigin, vecShootDir;
    QAngle angDiscard;

    // Support old style attachment point firing
    if ((pEvent->options == NULL) || (pEvent->options[0] == '\0') || (!pOperator->GetAttachment(pEvent->options, vecShootOrigin, angDiscard)))
    {
     vecShootOrigin = pOperator->Weapon_ShootPosition();
    }

    CAI_BaseNPC *npc = pOperator->MyNPCPointer();
    ASSERT( npc != NULL );
    vecShootDir = npc->GetActualShootTrajectory( vecShootOrigin );

    FireNPCPrimaryAttack( pOperator, vecShootOrigin, vecShootDir );
   }
   break;

   /*//FIXME: Re-enable
   case EVENT_WEAPON_AR2_GRENADE:
   {
   CAI_BaseNPC *npc = pOperator->MyNPCPointer();

   Vector vecShootOrigin, vecShootDir;
   vecShootOrigin = pOperator->Weapon_ShootPosition();
   vecShootDir = npc->GetShootEnemyDir( vecShootOrigin );

   Vector vecThrow = m_vecTossVelocity;

   CGrenadeAR2 *pGrenade = (CGrenadeAR2*)Create( "grenade_ar2", vecShootOrigin, vec3_angle, npc );
   pGrenade->SetAbsVelocity( vecThrow );
   pGrenade->SetLocalAngularVelocity( QAngle( 0, 400, 0 ) );
   pGrenade->SetMoveType( MOVETYPE_FLYGRAVITY );  
   pGrenade->m_hOwner   = npc;
   pGrenade->m_pMyWeaponAR2    = this;
   pGrenade->SetDamage(sk_npc_dmg_ar2_grenade.GetFloat());

   // FIXME: arrgg ,this is hard coded into the weapon???
   m_flNextGrenadeCheck = gpGlobals->curtime + 6;// wait six seconds before even looking again to see if a grenade can be thrown.

   m_iClip2--;
   }
   break;
   */

  default:
   BaseClass::Operator_HandleAnimEvent( pEvent, pOperator );
   break;
  }
}

//-----------------------------------------------------------------------------
// Purpose:  
// Output : Activity
//-----------------------------------------------------------------------------
Activity CWeaponak74::GetPrimaryAttackActivity( void )
{
  if ( m_nShotsFired < 2 )
   return ACT_VM_PRIMARYATTACK;

  if ( m_nShotsFired < 3 )
   return ACT_VM_RECOIL1;
   
  if ( m_nShotsFired < 4 )
   return ACT_VM_RECOIL2;

  return ACT_VM_RECOIL3;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
bool CWeaponak74::Reload( void )
{
  bool fRet;
  float fCacheTime = m_flNextSecondaryAttack;

  fRet = DefaultReload( GetMaxClip1(), GetMaxClip2(), ACT_VM_RELOAD );
  if ( fRet )
  {
   // Undo whatever the reload process has done to our secondary
   // attack timer. We allow you to interrupt reloading to fire
   // a grenade.
   m_flNextSecondaryAttack = GetOwner()->m_flNextAttack = fCacheTime;

   WeaponSound( RELOAD );
  }

  return fRet;
}

//-----------------------------------------------------------------------------
// Purpose:  
//-----------------------------------------------------------------------------
void CWeaponak74::AddViewKick( void )
{
  #define    EASY_DAMPEN   0.9f
  #define    MAX_VERTICAL_KICK    2.0f    //Degrees
  #define    SLIDE_LIMIT   2.0f    //Seconds
   
  //Get the view kick
  CBasePlayer *pPlayer = ToBasePlayer( GetOwner() );

  if ( pPlayer == NULL )
   return;

//Поднятие прицела вверх
  pPlayer->SnapEyeAngles( pPlayer->EyeAngles() + pPlayer->GetPunchAngle() );

  QAngle    viewPunch;

  viewPunch.x = random->RandomFloat( 0.25f, 0.5f );
  viewPunch.y = random->RandomFloat( -.2f, .2f );
  viewPunch.z = 0.0f;

  pPlayer->ViewPunch( viewPunch );

  DoMachineGunKick( pPlayer, EASY_DAMPEN, MAX_VERTICAL_KICK, m_fFireDuration, SLIDE_LIMIT );
}

//-----------------------------------------------------------------------------
// Purpose:  
//-----------------------------------------------------------------------------
void CWeaponak74::SecondaryAttack( void )
{
  // Only the player fires this way so we can cast
  CBasePlayer *pPlayer = ToBasePlayer( GetOwner() );
   
  if ( pPlayer == NULL )
   return;

  //Must have ammo
  if ( ( pPlayer->GetAmmoCount( m_iSecondaryAmmoType ) <= 0 ) || ( pPlayer->GetWaterLevel() == 3 ) )
  {
   SendWeaponAnim( ACT_VM_DRYFIRE );
   BaseClass::WeaponSound( EMPTY );
   m_flNextSecondaryAttack = gpGlobals->curtime + 0.5f;
   return;
  }

  if( m_bInReload )
   m_bInReload = false;

  // MUST call sound before removing a round from the clip of a CMachineGun
  BaseClass::WeaponSound( WPN_DOUBLE );

  pPlayer->RumbleEffect( RUMBLE_357, 0, RUMBLE_FLAGS_NONE );

  Vector vecSrc = pPlayer->Weapon_ShootPosition();
  Vector    vecThrow;
  // Don't autoaim on grenade tosses
  AngleVectors( pPlayer->EyeAngles() + pPlayer->GetPunchAngle(), &vecThrow );
  VectorScale( vecThrow, 1000.0f, vecThrow );
   
  //Create the grenade
  QAngle angles;
  VectorAngles( vecThrow, angles );
  CGrenadeAR2 *pGrenade = (CGrenadeAR2*)Create( "grenade_ar2", vecSrc, angles, pPlayer );
  pGrenade->SetAbsVelocity( vecThrow );

  pGrenade->SetLocalAngularVelocity( RandomAngle( -400, 400 ) );
  pGrenade->SetMoveType( MOVETYPE_FLYGRAVITY, MOVECOLLIDE_FLY_BOUNCE );  
  pGrenade->SetThrower( GetOwner() );
  pGrenade->SetDamage( sk_plr_dmg_smg1_grenade.GetFloat() );

  SendWeaponAnim( ACT_VM_SECONDARYATTACK );

  // player "shoot" animation
  pPlayer->SetAnimation( PLAYER_ATTACK1 );

  // Decrease ammo
  pPlayer->RemoveAmmo( 1, m_iSecondaryAmmoType );

  // Can shoot again immediately
  m_flNextPrimaryAttack = gpGlobals->curtime + 0.5f;

  // Can blow up after a short delay (so have time to release mouse button)
  m_flNextSecondaryAttack = gpGlobals->curtime + 1.0f;

  // Register a muzzleflash for the AI.
  pPlayer->SetMuzzleFlashTime( gpGlobals->curtime + 0.5 );  
}

#define    COMBINE_MIN_GRENADE_CLEAR_DIST 256

//-----------------------------------------------------------------------------
// Purpose:  
// Input  : flDot -  
//   flDist -  
// Output : int
//-----------------------------------------------------------------------------
int CWeaponak74::WeaponRangeAttack2Condition( float flDot, float flDist )
{
  CAI_BaseNPC *npcOwner = GetOwner()->MyNPCPointer();

  return COND_NONE;

  if ( npcOwner->IsMoving())
   return COND_NONE;

  CBaseEntity *pEnemy = npcOwner->GetEnemy();

  if (!pEnemy)
   return COND_NONE;

  Vector vecEnemyLKP = npcOwner->GetEnemyLKP();
  if ( !( pEnemy->GetFlags() & FL_ONGROUND ) && pEnemy->GetWaterLevel() == 0 && vecEnemyLKP.z > (GetAbsOrigin().z + WorldAlignMaxs().z) )
  {
   //!!!BUGBUG - we should make this check movetype and make sure it isn't FLY? Players who jump a lot are unlikely to  
   // be grenaded.
   // don't throw grenades at anything that isn't on the ground!
   return COND_NONE;
  }
   
  // --------------------------------------
  //  Get target vector
  // --------------------------------------
  Vector vecTarget;
  if (random->RandomInt(0,1))
  {
   // magically know where they are
   vecTarget = pEnemy->WorldSpaceCenter();
  }
  else
  {
   // toss it to where you last saw them
   vecTarget = vecEnemyLKP;
  }
  // vecTarget = m_vecEnemyLKP + (pEnemy->BodyTarget( GetLocalOrigin() ) - pEnemy->GetLocalOrigin());
  // estimate position
  // vecTarget = vecTarget + pEnemy->m_vecVelocity * 2;

  if ( ( vecTarget - npcOwner->GetLocalOrigin() ).Length2D() <= COMBINE_MIN_GRENADE_CLEAR_DIST )
  {
   // crap, I don't want to blow myself up
   m_flNextGrenadeCheck = gpGlobals->curtime + 1; // one full second.
   return (COND_NONE);
  }

  // ---------------------------------------------------------------------
  // Are any friendlies near the intended grenade impact area?
  // ---------------------------------------------------------------------
  CBaseEntity *pTarget = NULL;

  while ( ( pTarget = gEntList.FindEntityInSphere( pTarget, vecTarget, COMBINE_MIN_GRENADE_CLEAR_DIST ) ) != NULL )
  {
   //Check to see if the default relationship is hatred, and if so intensify that
   if ( npcOwner->IRelationType( pTarget ) == D_LI )
   {
    // crap, I might blow my own guy up. Don't throw a grenade and don't check again for a while.
    m_flNextGrenadeCheck = gpGlobals->curtime + 1; // one full second.
    return (COND_WEAPON_BLOCKED_BY_FRIEND);
   }
  }

  // ---------------------------------------------------------------------
  // Check that throw is legal and clear
  // ---------------------------------------------------------------------
  // FIXME: speed is based on difficulty...

  Vector vecToss = VecCheckThrow( this, npcOwner->GetLocalOrigin() + Vector(0,0,60), vecTarget, 600.0, 0.5 );
  if ( vecToss != vec3_origin )
  {
   m_vecTossVelocity = vecToss;

   // don't check again for a while.
   // JAY: HL1 keeps checking - test?
   //m_flNextGrenadeCheck = gpGlobals->curtime;
   m_flNextGrenadeCheck = gpGlobals->curtime + 0.3; // 1/3 second.
   return COND_CAN_RANGE_ATTACK2;
  }
  else
  {
   // don't check again for a while.
   m_flNextGrenadeCheck = gpGlobals->curtime + 1; // one full second.
   return COND_WEAPON_SIGHT_OCCLUDED;
  }
}

//-----------------------------------------------------------------------------
const WeaponProficiencyInfo_t *CWeaponak74::GetProficiencyValues()
{
  static WeaponProficiencyInfo_t proficiencyTable[] =
  {
   { 7.0,  0.75    },
   { 5.00,  0.75    },
   { 10.0/3.0, 0.75    },
   { 5.0/3.0,    0.75    },
   { 1.00,  1.0  },
  };

  COMPILE_TIME_ASSERT( ARRAYSIZE(proficiencyTable) == WEAPON_PROFICIENCY_PERFECT + 1);

  return proficiencyTable;
}

Добавлено (20.06.2010, 21:18)
---------------------------------------------
ПОМОГИТЕ КТО НИБУТЬ!(


все полезно что в рот полезло.
только в дерево с плодами бросают камни!
====================================
In shadow....I can be...this a crime...all this things....is gone... this is pain....moving on now...moving fast...this gone....Iam Lost!...Iam Lost!!........
====================================


-----------------------------------------------------------------------------


Было отредактированно - source-mods - Воскресенье, 20.06.2010, 13:21
 
HitmenДата: Воскресенье, 20.06.2010, 22:00 | Сообщение # 2
Spy
Группа: Проверенные
Сообщений: 2104
Репутация: 84
Статус: Offline
source-mods, А скрипт нормально пашет?

Туториалы по программированию, мои и слегка изменённые чужие. :)

Sp@ce Project Blog
Sp@ce Project Web-Site

I'm in spaaace!
Я в контакте
Я в Facebook'е

 
AndreazzzДата: Воскресенье, 20.06.2010, 22:05 | Сообщение # 3
Spy
Группа: Проверенные
Сообщений: 996
Репутация: 55
Статус: Offline
Hitmen, дык я ему уже переделал, просто он не отписался)

 
source-modsДата: Воскресенье, 20.06.2010, 22:10 | Сообщение # 4
Demolition man
Группа: Проверенные
Сообщений: 231
Репутация: 20
Статус: Offline
ВСЕ РАВНО НЕ РАБОТАЕТ...а скрипт пашет ок! а вот нпс не могут наносить урон другому юниту.... даже не перезаряжается а просто тупо стоит и стреляет без звука!

все полезно что в рот полезло.
только в дерево с плодами бросают камни!
====================================
In shadow....I can be...this a crime...all this things....is gone... this is pain....moving on now...moving fast...this gone....Iam Lost!...Iam Lost!!........
====================================


-----------------------------------------------------------------------------
 
AndreazzzДата: Воскресенье, 20.06.2010, 22:19 | Сообщение # 5
Spy
Группа: Проверенные
Сообщений: 996
Репутация: 55
Статус: Offline
source-mods, тыж говорил что работало?

 
source-modsДата: Воскресенье, 20.06.2010, 22:23 | Сообщение # 6
Demolition man
Группа: Проверенные
Сообщений: 231
Репутация: 20
Статус: Offline
нет(( как раз таки не работает...

все полезно что в рот полезло.
только в дерево с плодами бросают камни!
====================================
In shadow....I can be...this a crime...all this things....is gone... this is pain....moving on now...moving fast...this gone....Iam Lost!...Iam Lost!!........
====================================


-----------------------------------------------------------------------------
 
AndreazzzДата: Воскресенье, 20.06.2010, 22:26 | Сообщение # 7
Spy
Группа: Проверенные
Сообщений: 996
Репутация: 55
Статус: Offline
source-mods, блин тогда я нефига непонимаю, всётаки думаю из-за патронов

 
source-modsДата: Понедельник, 21.06.2010, 13:02 | Сообщение # 8
Demolition man
Группа: Проверенные
Сообщений: 231
Репутация: 20
Статус: Offline
HELP! HELP! =(

все полезно что в рот полезло.
только в дерево с плодами бросают камни!
====================================
In shadow....I can be...this a crime...all this things....is gone... this is pain....moving on now...moving fast...this gone....Iam Lost!...Iam Lost!!........
====================================


-----------------------------------------------------------------------------
 
AndreazzzДата: Понедельник, 21.06.2010, 13:29 | Сообщение # 9
Spy
Группа: Проверенные
Сообщений: 996
Репутация: 55
Статус: Offline
source-mods, ar2 это OCIW а ar1 это калаш! Так тебе что нужно?????

 
source-modsДата: Понедельник, 21.06.2010, 14:15 | Сообщение # 10
Demolition man
Группа: Проверенные
Сообщений: 231
Репутация: 20
Статус: Offline
ЗАРАБОТАЛО! просто нада было кое че поменять! Сам нашел - сам зделал! Вот вам исходник может кому нибуть понадобится!:
Code
//=============================================================================//
//stalker mod
//andrey malyshev
//=============================================================================//

#include "cbase.h"
#include "basehlcombatweapon.h"
#include "NPCevent.h"
#include "basecombatcharacter.h"
#include "AI_BaseNPC.h"
#include "player.h"
#include "game.h"
#include "in_buttons.h"
#include "grenade_ar2.h"
#include "explode.h"
#include "AI_Memory.h"
#include "soundent.h"
#include "rumble_shared.h"

// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"

extern ConVar    sk_plr_dmg_smg1_grenade;  

class CWeaponak74 : public CHLSelectFireMachineGun
{
  DECLARE_DATADESC();
public:
  DECLARE_CLASS( CWeaponak74, CHLSelectFireMachineGun );

  CWeaponak74();

  DECLARE_SERVERCLASS();
   
  void    Precache( void );
  void    AddViewKick( void );
  //void    PrimaryAttack( void ); //Функция взрыва
  void    SecondaryAttack( void );

  int  GetMinBurst() { return 3; }
  int  GetMaxBurst() { return 5; }

  virtual void Equip( CBaseCombatCharacter *pOwner );
  bool    Reload( void );

  float    GetFireRate( void ) { return 0.100f; }    // 13.3hz
  int  CapabilitiesGet( void ) { return bits_CAP_WEAPON_RANGE_ATTACK1; }
  int  WeaponRangeAttack2Condition( float flDot, float flDist );
  Activity    GetPrimaryAttackActivity( void );

  virtual const Vector& GetBulletSpread( void )
  {
   static const Vector cone = VECTOR_CONE_4DEGREES;
   return cone;
  }

  const WeaponProficiencyInfo_t *GetProficiencyValues();

  void FireNPCPrimaryAttack( CBaseCombatCharacter *pOperator, Vector &vecShootOrigin, Vector &vecShootDir );
  void Operator_ForceNPCFire( CBaseCombatCharacter  *pOperator, bool bSecondary );
  void Operator_HandleAnimEvent( animevent_t *pEvent, CBaseCombatCharacter *pOperator );

  DECLARE_ACTTABLE();

protected:

  Vector    m_vecTossVelocity;
  float    m_flNextGrenadeCheck;
};

IMPLEMENT_SERVERCLASS_ST(CWeaponak74, DT_Weaponak74)
END_SEND_TABLE()

LINK_ENTITY_TO_CLASS( weapon_ak74, CWeaponak74 );
PRECACHE_WEAPON_REGISTER(weapon_ak74);

BEGIN_DATADESC( CWeaponak74 )

  DEFINE_FIELD( m_vecTossVelocity, FIELD_VECTOR ),
  DEFINE_FIELD( m_flNextGrenadeCheck, FIELD_TIME ),

END_DATADESC()

acttable_t    CWeaponak74::m_acttable[] =  
{
  { ACT_RANGE_ATTACK1,   ACT_RANGE_ATTACK_AR2,   true },
  { ACT_RELOAD,     ACT_RELOAD_SMG1,    true },  // FIXME: hook to AR2 unique
  { ACT_IDLE,      ACT_IDLE_SMG1,     true },  // FIXME: hook to AR2 unique
  { ACT_IDLE_ANGRY,    ACT_IDLE_ANGRY_SMG1,   true },  // FIXME: hook to AR2 unique

  { ACT_WALK,      ACT_WALK_RIFLE,     true },

// Readiness activities (not aiming)
  { ACT_IDLE_RELAXED,    ACT_IDLE_SMG1_RELAXED,   false },//never aims
  { ACT_IDLE_STIMULATED,   ACT_IDLE_SMG1_STIMULATED,  false },
  { ACT_IDLE_AGITATED,   ACT_IDLE_ANGRY_SMG1,   false },//always aims

  { ACT_WALK_RELAXED,    ACT_WALK_RIFLE_RELAXED,   false },//never aims
  { ACT_WALK_STIMULATED,   ACT_WALK_RIFLE_STIMULATED,  false },
  { ACT_WALK_AGITATED,   ACT_WALK_AIM_RIFLE,    false },//always aims

  { ACT_RUN_RELAXED,    ACT_RUN_RIFLE_RELAXED,   false },//never aims
  { ACT_RUN_STIMULATED,   ACT_RUN_RIFLE_STIMULATED,  false },
  { ACT_RUN_AGITATED,    ACT_RUN_AIM_RIFLE,    false },//always aims

// Readiness activities (aiming)
  { ACT_IDLE_AIM_RELAXED,   ACT_IDLE_SMG1_RELAXED,   false },//never aims  
  { ACT_IDLE_AIM_STIMULATED,  ACT_IDLE_AIM_RIFLE_STIMULATED,    false },
  { ACT_IDLE_AIM_AGITATED,  ACT_IDLE_ANGRY_SMG1,   false },//always aims

  { ACT_WALK_AIM_RELAXED,   ACT_WALK_RIFLE_RELAXED,   false },//never aims
  { ACT_WALK_AIM_STIMULATED,  ACT_WALK_AIM_RIFLE_STIMULATED,    false },
  { ACT_WALK_AIM_AGITATED,  ACT_WALK_AIM_RIFLE,    false },//always aims

  { ACT_RUN_AIM_RELAXED,   ACT_RUN_RIFLE_RELAXED,   false },//never aims
  { ACT_RUN_AIM_STIMULATED,  ACT_RUN_AIM_RIFLE_STIMULATED,    false },
  { ACT_RUN_AIM_AGITATED,   ACT_RUN_AIM_RIFLE,    false },//always aims
//End readiness activities

  { ACT_WALK_AIM,     ACT_WALK_AIM_RIFLE,    true },
  { ACT_WALK_CROUCH,    ACT_WALK_CROUCH_RIFLE,   true },
  { ACT_WALK_CROUCH_AIM,   ACT_WALK_CROUCH_AIM_RIFLE,  true },
  { ACT_RUN,      ACT_RUN_RIFLE,     true },
  { ACT_RUN_AIM,     ACT_RUN_AIM_RIFLE,    true },
  { ACT_RUN_CROUCH,    ACT_RUN_CROUCH_RIFLE,   true },
  { ACT_RUN_CROUCH_AIM,   ACT_RUN_CROUCH_AIM_RIFLE,  true },
  { ACT_GESTURE_RANGE_ATTACK1,    ACT_GESTURE_RANGE_ATTACK_AR2,    false },
  { ACT_COVER_LOW,    ACT_COVER_SMG1_LOW,    false },  // FIXME: hook to AR2 unique
  { ACT_RANGE_AIM_LOW,   ACT_RANGE_AIM_AR2_LOW,   false },
  { ACT_RANGE_ATTACK1_LOW,  ACT_RANGE_ATTACK_SMG1_LOW,  true },  // FIXME: hook to AR2 unique
  { ACT_RELOAD_LOW,    ACT_RELOAD_SMG1_LOW,   false },
  { ACT_GESTURE_RELOAD,   ACT_GESTURE_RELOAD_SMG1,  true },
//    { ACT_RANGE_ATTACK2, ACT_RANGE_ATTACK_AR2_GRENADE, true },
};

IMPLEMENT_ACTTABLE(CWeaponak74);

//=========================================================
CWeaponak74::CWeaponak74( )
{
  m_fMinRange1  = 0;// No minimum range.  
  m_fMaxRange1  = 1400;

  m_bAltFiresUnderwater = false;
}

//-----------------------------------------------------------------------------
// Purpose:  
//-----------------------------------------------------------------------------
void CWeaponak74::Precache( void )
{
  UTIL_PrecacheOther("grenade_ar2");
   
  BaseClass::Precache();
}

  /*   
//-----------------------------------------------------------------------------  
// Purpose: Функция взрыва: чисто потрубить <img src="http://s6.ucoz.net/sm/23/smile.gif" border="0" align="absmiddle" alt="smile">
//-----------------------------------------------------------------------------  
void CWeaponSMG1::PrimaryAttack( void )  
{  

int Damage = 100; //the damage  
int Radius = 100; //the radius  
int physicforce = 100; //pushing of objects  
float timebetweenshots = 1.0f;//in seconds  
CBasePlayer *pDude = ToBasePlayer( GetOwner() );  
Vector *pvecAiming;  
pvecAiming = new Vector;  
Vector vecAiming;  
Vector vecSrc = pDude->Weapon_ShootPosition();  
pDude->EyeVectors(&vecAiming,0,0);  
trace_t tr;  
UTIL_TraceLine( vecSrc, vecSrc + vecAiming * 2000, MASK_SHOT, pDude, COLLISION_GROUP_NONE, &tr );  
SendWeaponAnim( ACT_VM_PRIMARYATTACK );  
WeaponSound( SPECIAL2 );//Sound effect  
pDude->ViewPunch( QAngle( -2, 0, 0 ) );//View Punch  
m_flNextPrimaryAttack = m_flNextSecondaryAttack = gpGlobals->curtime + 0.5f;  

/*
//Damage options  

//1. Explosion  
ExplosionCreate( tr.endpos, GetAbsAngles(), pDude, Damage, Radius,  
SF_ENVEXPLOSION_NOSPARKS | SF_ENVEXPLOSION_NODLIGHTS | SF_ENVEXPLOSION_NOSMOKE, physicforce,  

this);  

//2. AoE //  
ExplosionCreate( tr.endpos, GetAbsAngles(), pDude, Damage, Radius,  
SF_ENVEXPLOSION_NOSPARKS | SF_ENVEXPLOSION_NODLIGHTS | SF_ENVEXPLOSION_NOSMOKE |  

SF_ENVEXPLOSION_NOFIREBALL | SF_ENVEXPLOSION_NODECAL, physicforce, this);  

}
*/

//-----------------------------------------------------------------------------
// Purpose: Give this weapon longer range when wielded by an ally NPC.
//-----------------------------------------------------------------------------
void CWeaponak74::Equip( CBaseCombatCharacter *pOwner )
{
  if( pOwner->Classify() == CLASS_PLAYER_ALLY )
  {
   m_fMaxRange1 = 3000;
  }
  else
  {
   m_fMaxRange1 = 1400;
  }

  BaseClass::Equip( pOwner );
}

//-----------------------------------------------------------------------------
// Purpose:  
//-----------------------------------------------------------------------------
void CWeaponak74::FireNPCPrimaryAttack( CBaseCombatCharacter *pOperator, Vector &vecShootOrigin, Vector &vecShootDir )
{
  // FIXME: use the returned number of bullets to account for >10hz firerate
  WeaponSoundRealtime( SINGLE_NPC );

  CSoundEnt::InsertSound( SOUND_COMBAT|SOUND_CONTEXT_GUNFIRE, pOperator->GetAbsOrigin(), SOUNDENT_VOLUME_MACHINEGUN, 0.2, pOperator, SOUNDENT_CHANNEL_WEAPON, pOperator->GetEnemy() );
  pOperator->FireBullets( 1, vecShootOrigin, vecShootDir, VECTOR_CONE_PRECALCULATED,
   MAX_TRACE_LENGTH, m_iPrimaryAmmoType, 2, entindex(), 0 );

  pOperator->DoMuzzleFlash();
  m_iClip1 = m_iClip1 - 1;
}

//-----------------------------------------------------------------------------
// Purpose:  
//-----------------------------------------------------------------------------
void CWeaponak74::Operator_ForceNPCFire( CBaseCombatCharacter *pOperator, bool bSecondary )
{
  // Ensure we have enough rounds in the clip
  m_iClip1++;

  Vector vecShootOrigin, vecShootDir;
  QAngle    angShootDir;
  GetAttachment( LookupAttachment( "muzzle" ), vecShootOrigin, angShootDir );
  AngleVectors( angShootDir, &vecShootDir );
  FireNPCPrimaryAttack( pOperator, vecShootOrigin, vecShootDir );
}

//-----------------------------------------------------------------------------
// Purpose:  
//-----------------------------------------------------------------------------
void CWeaponak74::Operator_HandleAnimEvent( animevent_t *pEvent, CBaseCombatCharacter *pOperator )
{
  switch( pEvent->event )
  {
  case EVENT_WEAPON_AR2: //ИЗМЕНИТЬ ДЛЯ ОПРЕДЕЛЕННОГО КЛАССА АИМКИ
   {
    Vector vecShootOrigin, vecShootDir;
    QAngle angDiscard;

    // Support old style attachment point firing
    if ((pEvent->options == NULL) || (pEvent->options[0] == '\0') || (!pOperator->GetAttachment(pEvent->options, vecShootOrigin, angDiscard)))
    {
     vecShootOrigin = pOperator->Weapon_ShootPosition();
    }

    CAI_BaseNPC *npc = pOperator->MyNPCPointer();
    ASSERT( npc != NULL );
    vecShootDir = npc->GetActualShootTrajectory( vecShootOrigin );

    FireNPCPrimaryAttack( pOperator, vecShootOrigin, vecShootDir );
   }
   break;

   /*//FIXME: Re-enable
   case EVENT_WEAPON_AR2_GRENADE:
   {
   CAI_BaseNPC *npc = pOperator->MyNPCPointer();

   Vector vecShootOrigin, vecShootDir;
   vecShootOrigin = pOperator->Weapon_ShootPosition();
   vecShootDir = npc->GetShootEnemyDir( vecShootOrigin );

   Vector vecThrow = m_vecTossVelocity;

   CGrenadeAR2 *pGrenade = (CGrenadeAR2*)Create( "grenade_ar2", vecShootOrigin, vec3_angle, npc );
   pGrenade->SetAbsVelocity( vecThrow );
   pGrenade->SetLocalAngularVelocity( QAngle( 0, 400, 0 ) );
   pGrenade->SetMoveType( MOVETYPE_FLYGRAVITY );  
   pGrenade->m_hOwner   = npc;
   pGrenade->m_pMyWeaponAR2    = this;
   pGrenade->SetDamage(sk_npc_dmg_ar2_grenade.GetFloat());

   // FIXME: arrgg ,this is hard coded into the weapon???
   m_flNextGrenadeCheck = gpGlobals->curtime + 6;// wait six seconds before even looking again to see if a grenade can be thrown.

   m_iClip2--;
   }
   break;
   */

  default:
   BaseClass::Operator_HandleAnimEvent( pEvent, pOperator );
   break;
  }
}

//-----------------------------------------------------------------------------
// Purpose:  
// Output : Activity
//-----------------------------------------------------------------------------
Activity CWeaponak74::GetPrimaryAttackActivity( void )
{
  if ( m_nShotsFired < 2 )
   return ACT_VM_PRIMARYATTACK;

  if ( m_nShotsFired < 3 )
   return ACT_VM_RECOIL1;
   
  if ( m_nShotsFired < 4 )
   return ACT_VM_RECOIL2;

  return ACT_VM_RECOIL3;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
bool CWeaponak74::Reload( void )
{
  bool fRet;
  float fCacheTime = m_flNextSecondaryAttack;

  fRet = DefaultReload( GetMaxClip1(), GetMaxClip2(), ACT_VM_RELOAD );
  if ( fRet )
  {
   // Undo whatever the reload process has done to our secondary
   // attack timer. We allow you to interrupt reloading to fire
   // a grenade.
   m_flNextSecondaryAttack = GetOwner()->m_flNextAttack = fCacheTime;

   WeaponSound( RELOAD );
  }

  return fRet;
}

//-----------------------------------------------------------------------------
// Purpose:  
//-----------------------------------------------------------------------------
void CWeaponak74::AddViewKick( void )
{
  #define    EASY_DAMPEN   0.9f
  #define    MAX_VERTICAL_KICK    2.0f    //Degrees
  #define    SLIDE_LIMIT   2.0f    //Seconds
   
  //Get the view kick
  CBasePlayer *pPlayer = ToBasePlayer( GetOwner() );

  if ( pPlayer == NULL )
   return;

//Поднятие прицела вверх
  pPlayer->SnapEyeAngles( pPlayer->EyeAngles() + pPlayer->GetPunchAngle() );

  QAngle    viewPunch;

  viewPunch.x = random->RandomFloat( 0.25f, 0.5f );
  viewPunch.y = random->RandomFloat( -.2f, .2f );
  viewPunch.z = 0.0f;

  pPlayer->ViewPunch( viewPunch );

  DoMachineGunKick( pPlayer, EASY_DAMPEN, MAX_VERTICAL_KICK, m_fFireDuration, SLIDE_LIMIT );
}

//-----------------------------------------------------------------------------
// Purpose:  
//-----------------------------------------------------------------------------
void CWeaponak74::SecondaryAttack( void )
{
  // Only the player fires this way so we can cast
  CBasePlayer *pPlayer = ToBasePlayer( GetOwner() );
   
  if ( pPlayer == NULL )
   return;

  //Must have ammo
  if ( ( pPlayer->GetAmmoCount( m_iSecondaryAmmoType ) <= 0 ) || ( pPlayer->GetWaterLevel() == 3 ) )
  {
   SendWeaponAnim( ACT_VM_DRYFIRE );
   BaseClass::WeaponSound( EMPTY );
   m_flNextSecondaryAttack = gpGlobals->curtime + 0.5f;
   return;
  }

  if( m_bInReload )
   m_bInReload = false;

  // MUST call sound before removing a round from the clip of a CMachineGun
  BaseClass::WeaponSound( WPN_DOUBLE );

  pPlayer->RumbleEffect( RUMBLE_357, 0, RUMBLE_FLAGS_NONE );

  Vector vecSrc = pPlayer->Weapon_ShootPosition();
  Vector    vecThrow;
  // Don't autoaim on grenade tosses
  AngleVectors( pPlayer->EyeAngles() + pPlayer->GetPunchAngle(), &vecThrow );
  VectorScale( vecThrow, 1000.0f, vecThrow );
   
  //Create the grenade
  QAngle angles;
  VectorAngles( vecThrow, angles );
  CGrenadeAR2 *pGrenade = (CGrenadeAR2*)Create( "grenade_ar2", vecSrc, angles, pPlayer );
  pGrenade->SetAbsVelocity( vecThrow );

  pGrenade->SetLocalAngularVelocity( RandomAngle( -400, 400 ) );
  pGrenade->SetMoveType( MOVETYPE_FLYGRAVITY, MOVECOLLIDE_FLY_BOUNCE );  
  pGrenade->SetThrower( GetOwner() );
  pGrenade->SetDamage( sk_plr_dmg_smg1_grenade.GetFloat() );

  SendWeaponAnim( ACT_VM_SECONDARYATTACK );

  // player "shoot" animation
  pPlayer->SetAnimation( PLAYER_ATTACK1 );

  // Decrease ammo
  pPlayer->RemoveAmmo( 1, m_iSecondaryAmmoType );

  // Can shoot again immediately
  m_flNextPrimaryAttack = gpGlobals->curtime + 0.5f;

  // Can blow up after a short delay (so have time to release mouse button)
  m_flNextSecondaryAttack = gpGlobals->curtime + 1.0f;

  // Register a muzzleflash for the AI.
  pPlayer->SetMuzzleFlashTime( gpGlobals->curtime + 0.5 );  
}

#define    COMBINE_MIN_GRENADE_CLEAR_DIST 256

//-----------------------------------------------------------------------------
// Purpose:  
// Input  : flDot -  
//   flDist -  
// Output : int
//-----------------------------------------------------------------------------
int CWeaponak74::WeaponRangeAttack2Condition( float flDot, float flDist )
{
  CAI_BaseNPC *npcOwner = GetOwner()->MyNPCPointer();

  return COND_NONE;

  if ( npcOwner->IsMoving())
   return COND_NONE;

  CBaseEntity *pEnemy = npcOwner->GetEnemy();

  if (!pEnemy)
   return COND_NONE;

  Vector vecEnemyLKP = npcOwner->GetEnemyLKP();
  if ( !( pEnemy->GetFlags() & FL_ONGROUND ) && pEnemy->GetWaterLevel() == 0 && vecEnemyLKP.z > (GetAbsOrigin().z + WorldAlignMaxs().z) )
  {
   //!!!BUGBUG - we should make this check movetype and make sure it isn't FLY? Players who jump a lot are unlikely to  
   // be grenaded.
   // don't throw grenades at anything that isn't on the ground!
   return COND_NONE;
  }
   
  // --------------------------------------
  //  Get target vector
  // --------------------------------------
  Vector vecTarget;
  if (random->RandomInt(0,1))
  {
   // magically know where they are
   vecTarget = pEnemy->WorldSpaceCenter();
  }
  else
  {
   // toss it to where you last saw them
   vecTarget = vecEnemyLKP;
  }
  // vecTarget = m_vecEnemyLKP + (pEnemy->BodyTarget( GetLocalOrigin() ) - pEnemy->GetLocalOrigin());
  // estimate position
  // vecTarget = vecTarget + pEnemy->m_vecVelocity * 2;

  if ( ( vecTarget - npcOwner->GetLocalOrigin() ).Length2D() <= COMBINE_MIN_GRENADE_CLEAR_DIST )
  {
   // crap, I don't want to blow myself up
   m_flNextGrenadeCheck = gpGlobals->curtime + 1; // one full second.
   return (COND_NONE);
  }

  // ---------------------------------------------------------------------
  // Are any friendlies near the intended grenade impact area?
  // ---------------------------------------------------------------------
  CBaseEntity *pTarget = NULL;

  while ( ( pTarget = gEntList.FindEntityInSphere( pTarget, vecTarget, COMBINE_MIN_GRENADE_CLEAR_DIST ) ) != NULL )
  {
   //Check to see if the default relationship is hatred, and if so intensify that
   if ( npcOwner->IRelationType( pTarget ) == D_LI )
   {
    // crap, I might blow my own guy up. Don't throw a grenade and don't check again for a while.
    m_flNextGrenadeCheck = gpGlobals->curtime + 1; // one full second.
    return (COND_WEAPON_BLOCKED_BY_FRIEND);
   }
  }

  // ---------------------------------------------------------------------
  // Check that throw is legal and clear
  // ---------------------------------------------------------------------
  // FIXME: speed is based on difficulty...

  Vector vecToss = VecCheckThrow( this, npcOwner->GetLocalOrigin() + Vector(0,0,60), vecTarget, 600.0, 0.5 );
  if ( vecToss != vec3_origin )
  {
   m_vecTossVelocity = vecToss;

   // don't check again for a while.
   // JAY: HL1 keeps checking - test?
   //m_flNextGrenadeCheck = gpGlobals->curtime;
   m_flNextGrenadeCheck = gpGlobals->curtime + 0.3; // 1/3 second.
   return COND_CAN_RANGE_ATTACK2;
  }
  else
  {
   // don't check again for a while.
   m_flNextGrenadeCheck = gpGlobals->curtime + 1; // one full second.
   return COND_WEAPON_SIGHT_OCCLUDED;
  }
}

//-----------------------------------------------------------------------------
const WeaponProficiencyInfo_t *CWeaponak74::GetProficiencyValues()
{
  static WeaponProficiencyInfo_t proficiencyTable[] =
  {
   { 7.0,  0.75    },
   { 5.00,  0.75    },
   { 10.0/3.0, 0.75    },
   { 5.0/3.0,    0.75    },
   { 1.00,  1.0  },
  };

  COMPILE_TIME_ASSERT( ARRAYSIZE(proficiencyTable) == WEAPON_PROFICIENCY_PERFECT + 1);

  return proficiencyTable;
}

блин вот это у меня голова!! =) Andreazzz, спасибо ЗА ВСЕ! С МЕНЯ ПИВО!

Добавлено (21.06.2010, 14:15)
---------------------------------------------
а можете дать исходник ар1 и модель в придачу! очень нужно!


все полезно что в рот полезло.
только в дерево с плодами бросают камни!
====================================
In shadow....I can be...this a crime...all this things....is gone... this is pain....moving on now...moving fast...this gone....Iam Lost!...Iam Lost!!........
====================================


-----------------------------------------------------------------------------
 
HitmenДата: Понедельник, 21.06.2010, 14:23 | Сообщение # 11
Spy
Группа: Проверенные
Сообщений: 2104
Репутация: 84
Статус: Offline
source-mods, Что-то какие-то странные вопросы у тебя пошли, серьёзно говорю. По сути в скрипте вся проблема могла быть. Если только ты не напутал в коде (но тогда бы ствол не компилился бы). О_о Как-то так...

Туториалы по программированию, мои и слегка изменённые чужие. :)

Sp@ce Project Blog
Sp@ce Project Web-Site

I'm in spaaace!
Я в контакте
Я в Facebook'е

 
HellMapperДата: Понедельник, 21.06.2010, 14:56 | Сообщение # 12
Scout
Группа: Проверенные
Сообщений: 588
Репутация: 27
Статус: Offline
Hitmen, я могу написать код так, что C++ компилит, но в игре ни хрена не работает (Пример Agrunt)

Я живу в будущем City 15







Если Вы можете, играя в "Counter-Strike: Sourсe", посадить хедшот ножом через стену в попу своему противнику, который находится на другом конце карты, на другом сервере, и который играет в "Team Fortress 2" и находится под действием убер-заряда, то знайте, что в плане читерства вы достигли совершенства. ©IPa
 
HitmenДата: Понедельник, 21.06.2010, 15:17 | Сообщение # 13
Spy
Группа: Проверенные
Сообщений: 2104
Репутация: 84
Статус: Offline
HellMapper, Дык писать код нужно грамотно. Руки корявые в программировании неуместны. Но новечки уместны.
Однако всё ровно иногда убивают некоторые вопросы, которые криво заданы. О_о


Туториалы по программированию, мои и слегка изменённые чужие. :)

Sp@ce Project Blog
Sp@ce Project Web-Site

I'm in spaaace!
Я в контакте
Я в Facebook'е

 
AndreazzzДата: Понедельник, 21.06.2010, 17:50 | Сообщение # 14
Spy
Группа: Проверенные
Сообщений: 996
Репутация: 55
Статус: Offline
source-mods, с тебя не булылка пива, а модель вертолёта с костями HellMapper'у

 
StriderДата: Понедельник, 21.06.2010, 17:57 | Сообщение # 15
Spy
Группа: Проверенные
Сообщений: 1465
Репутация: 51
Статус: Offline
Вообще у сорс-мода ОЧЕНЬ странный код. Тонны ненужного кода, объявленного итак. Ужс. Чисто помойка в коде. Примари аттак это капец. Даже BaseClass:PrimaryAttack(); нету!! Куча разных интов и флоатов, совершенно не нужных...
 
AndreazzzДата: Понедельник, 21.06.2010, 18:24 | Сообщение # 16
Spy
Группа: Проверенные
Сообщений: 996
Репутация: 55
Статус: Offline
Strider, он говорит на примере смг делал) вот я ему переписывал

 
source-modsДата: Понедельник, 21.06.2010, 18:39 | Сообщение # 17
Demolition man
Группа: Проверенные
Сообщений: 231
Репутация: 20
Статус: Offline
да ссори за кривые вопросы...сам разобрался.... просто психанул что не получилось и был в шоке))0 страйдер между прочим некоторый код в смг1 от web-monstra ну я его туторы тож читал))

все полезно что в рот полезло.
только в дерево с плодами бросают камни!
====================================
In shadow....I can be...this a crime...all this things....is gone... this is pain....moving on now...moving fast...this gone....Iam Lost!...Iam Lost!!........
====================================


-----------------------------------------------------------------------------
 
StriderДата: Понедельник, 21.06.2010, 19:02 | Сообщение # 18
Spy
Группа: Проверенные
Сообщений: 1465
Репутация: 51
Статус: Offline
Видимо веб-монстр не знает сорса. Никогда такого кода не было в смг1. Вообще там нет кода примари.
 
HitmenДата: Понедельник, 21.06.2010, 19:08 | Сообщение # 19
Spy
Группа: Проверенные
Сообщений: 2104
Репутация: 84
Статус: Offline
Strider, Веб-монстр по сути долго и не работал с сурсом. Простите, сделать огненные стрелы арбалета - смешно. При выстреле игрок зависает на месте и получает урон хД

Туториалы по программированию, мои и слегка изменённые чужие. :)

Sp@ce Project Blog
Sp@ce Project Web-Site

I'm in spaaace!
Я в контакте
Я в Facebook'е

 
AndreazzzДата: Понедельник, 21.06.2010, 19:50 | Сообщение # 20
Spy
Группа: Проверенные
Сообщений: 996
Репутация: 55
Статус: Offline
Hitmen, не огненные стрелы эт смесь сигнальной рокеты с прутьями арбалета, у меня не зависало, а убивало и поджигало

 
Форум » Игровая мастерская » Программирование » ar2 (npc не могут стрелять)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Помощь в разработке форума: HOMiE7