Пятница, 22.09.2017, 14:42
 
Приветствую Вас Guest | RSS
Главная страница | Динамический спавн нпс - Форум | Регистрация | Вход
[Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум » Игровая мастерская » Программирование » Динамический спавн нпс (снарк и хорнет)
Динамический спавн нпс
kon_alexДата: Понедельник, 11.07.2011, 12:04 | Сообщение # 1
Newbie
Группа: Пользователи
Сообщений: 9
Репутация: 0
Статус: Offline
Уже не первый раз сталкивался: при CBaseEntity:Create() нпс создаются невидимыми и неподвижными.
Помогите пожалуйста пофиксить

Код пушки:

Code
//========= Copyright © 1996-2001, Valve LLC, All rights reserved. ============
//
// Purpose:  Snark
//
// $NoKeywords: $
//=============================================================================

#include "cbase.h"
#include "NPCEvent.h"
#include "basehlcombatweapon.h"
#include "basecombatcharacter.h"
#include "AI_BaseNPC.h"
#include "player.h"
#include "gamerules.h"
#include "in_buttons.h"
#include "soundent.h"
#include "game.h"
#include "vstdlib/random.h"
#include "engine/IEngineSound.h"
#include "npc_snark.h"
#include "beam_shared.h"

//-----------------------------------------------------------------------------
// CWeaponSnark
//-----------------------------------------------------------------------------

#define SNARK_NEST_MODEL    "models/w_sqknest.mdl"

class CWeaponSnark : public CBaseHLCombatWeapon
{
   DECLARE_CLASS( CWeaponSnark, CBaseHLCombatWeapon );
public:

   CWeaponSnark( void );

   void    Spawn( void );
   void    Precache( void );
   void    PrimaryAttack( void );
   void    WeaponIdle( void );
   bool    Deploy( void );
   bool    Holster( CBaseCombatWeapon *pSwitchingTo = NULL );
   void    Equip( CBaseCombatCharacter *pOwner );

   DECLARE_SERVERCLASS();
   DECLARE_DATADESC();

private:
   bool    m_bJustThrown;
   int  m_iNestIndex;
   int  m_iPickedUpIndex;
};

LINK_ENTITY_TO_CLASS( weapon_snark, CWeaponSnark );

PRECACHE_WEAPON_REGISTER( weapon_snark );

IMPLEMENT_SERVERCLASS_ST( CWeaponSnark, DT_WeaponSnark )
END_SEND_TABLE()

BEGIN_DATADESC( CWeaponSnark )
   DEFINE_FIELD( m_bJustThrown, FIELD_BOOLEAN ),
END_DATADESC()

//-----------------------------------------------------------------------------
// Purpose: Constructor
//-----------------------------------------------------------------------------
CWeaponSnark::CWeaponSnark( void )
{
   m_bReloadsSingly    = false;
   m_bFiresUnderwater    = true;
   m_bJustThrown  = false;
}

void CWeaponSnark::Spawn( void )
{
   BaseClass::Spawn();

   m_iWorldModelIndex = m_iNestIndex;
   SetModel( SNARK_NEST_MODEL );
}

//-----------------------------------------------------------------------------
// Purpose:   
//-----------------------------------------------------------------------------
void CWeaponSnark::Precache( void )
{

   BaseClass::Precache();

   m_iNestIndex  = PrecacheModel( SNARK_NEST_MODEL );
   m_iPickedUpIndex    = PrecacheModel( GetWorldModel() );

   enginesound->PrecacheSound( "squeek/sqk_hunt2.wav" );
   enginesound->PrecacheSound( "squeek/sqk_hunt3.wav" );

   UTIL_PrecacheOther("monster_snark");
}

void CWeaponSnark::Equip( CBaseCombatCharacter *pOwner )
{
   m_iWorldModelIndex = m_iPickedUpIndex;

   BaseClass::Equip( pOwner );
}

//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CWeaponSnark::PrimaryAttack( void )
{
   // Only the player fires this way so we can cast
   CBasePlayer *pPlayer = ToBasePlayer( GetOwner() );

   if ( !pPlayer )
   {
    return;
   }

   if ( pPlayer->GetAmmoCount( m_iPrimaryAmmoType ) <= 0 )
    return;

   Vector vecForward;
   pPlayer->EyeVectors( &vecForward );

   // find place to toss monster
   // Does this need to consider a crouched player?
   Vector vecStart    = pPlayer->WorldSpaceCenter() + (vecForward * 20);
   Vector vecEnd    = vecStart + (vecForward * 44);
   trace_t tr;
   UTIL_TraceLine( vecStart, vecEnd, MASK_SOLID, this, COLLISION_GROUP_NONE, &tr );
   if ( tr.allsolid || tr.startsolid || tr.fraction <= 0.25 )
    return;

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

   CSnark *pSnark = (CSnark*)Create( "monster_snark", tr.endpos, pPlayer->EyeAngles(), GetOwner() );
   if ( pSnark )
   {
    pSnark->SetAbsVelocity( vecForward * 200 + pPlayer->GetAbsVelocity() );
   }

   // play hunt sound
   CPASAttenuationFilter filter( this );

   switch ( random->RandomInt( 0, 1 ) )
   {
   case 0:
    enginesound->EmitSound( filter, entindex(), CHAN_VOICE, "squeek/sqk_hunt2.wav", 1, ATTN_NORM, 0, 105 );    break;
   case 1:
    enginesound->EmitSound( filter, entindex(), CHAN_VOICE, "squeek/sqk_hunt3.wav", 1, ATTN_NORM, 0, 105 );    break;
   }

   CSoundEnt::InsertSound( SOUND_DANGER, GetAbsOrigin(), 200, 0.2 );

   pPlayer->RemoveAmmo( 1, m_iPrimaryAmmoType );

   m_bJustThrown = true;

   m_flNextPrimaryAttack = gpGlobals->curtime + 0.3;
   SetWeaponIdleTime( gpGlobals->curtime + 1.0 );
}

void CWeaponSnark::WeaponIdle( void )
{
   CBasePlayer *pPlayer = ToBasePlayer( GetOwner() );

   if ( !pPlayer )
   {
    return;
   }

   if ( !HasWeaponIdleTimeElapsed() )
    return;

   if ( m_bJustThrown )
   {
    m_bJustThrown = false;

    if ( pPlayer->GetAmmoCount( m_iPrimaryAmmoType ) <= 0 )
    {
     if ( !pPlayer->SwitchToNextBestWeapon( pPlayer->GetActiveWeapon() ) )
      Holster();
    }
    else
    {
     SendWeaponAnim( ACT_VM_DRAW );
     SetWeaponIdleTime( gpGlobals->curtime + random->RandomFloat( 10, 15 ) );
    }
   }
   else
   {
    BaseClass::WeaponIdle();
   }
}

bool CWeaponSnark::Deploy( void )
{
   CPASAttenuationFilter filter( this );

   switch ( random->RandomInt( 0, 1 ) )
   {
   case 0:
    enginesound->EmitSound( filter, entindex(), CHAN_VOICE, "squeek/sqk_hunt2.wav", 1, ATTN_NORM, 0, 100 );    break;
   case 1:
    enginesound->EmitSound( filter, entindex(), CHAN_VOICE, "squeek/sqk_hunt3.wav", 1, ATTN_NORM, 0, 100 );    break;
   }

   return BaseClass::Deploy();
}

bool CWeaponSnark::Holster( CBaseCombatWeapon *pSwitchingTo )
{
   CBasePlayer *pPlayer = ToBasePlayer( GetOwner() );
   if ( !pPlayer )
   {
    return false;
   }

   if ( !BaseClass::Holster( pSwitchingTo ) )
   {
    return false;
   }

   if ( pPlayer->GetAmmoCount( m_iPrimaryAmmoType ) <= 0 )
   {
    SetThink( &CWeaponSnark::DestroyItem );
    SetNextThink( gpGlobals->curtime + 0.1 );
   }

   pPlayer->SetNextAttack( gpGlobals->curtime + 0.5 );

   return true;
}


Код Прекеш-Спавн нпс:

Code
void CSnark::Precache( void )
{
   BaseClass::Precache();

   engine->PrecacheModel( "models/w_squeak.mdl" );

   enginesound->PrecacheSound( "squeek/sqk_blast1.wav" );
   enginesound->PrecacheSound( "common/bodysplat.wav" );
   enginesound->PrecacheSound( "squeek/sqk_die1.wav" );
   enginesound->PrecacheSound( "squeek/sqk_hunt1.wav" );
   enginesound->PrecacheSound( "squeek/sqk_hunt2.wav" );
   enginesound->PrecacheSound( "squeek/sqk_hunt3.wav" );
   enginesound->PrecacheSound( "squeek/sqk_deploy1.wav" );
}

void CSnark::Spawn( void )
{
   Precache();

   SetSolid( SOLID_BBOX );
   AddSolidFlags( FSOLID_NOT_STANDABLE );
   SetMoveType( MOVETYPE_FLYGRAVITY, MOVECOLLIDE_FLY_BOUNCE );

   SetModel( "models/w_squeak.mdl" );
   UTIL_SetSize( this, Vector( -4, -4, 0 ), Vector( 4, 4, 8 ) );

   SetBloodColor( BLOOD_COLOR_YELLOW );

   SetTouch( &CSnark::SuperBounceTouch );
   SetThink( &CSnark::HuntThink );
   SetNextThink( gpGlobals->curtime + 0.1f );

   m_flNextHit    = gpGlobals->curtime;
   m_flNextHunt   = gpGlobals->curtime + 1E6;
   m_flNextBounceSoundTime    = gpGlobals->curtime;

   AddFlag( FL_AIMTARGET | FL_NPC );
   m_takedamage = DAMAGE_YES;

   m_iHealth  = sk_snark_health.GetFloat();
   m_iMaxHealth    = m_iHealth;

   SetGravity( 0.5 );
   SetFriction( 0.5 );

   SetDamage( sk_snark_dmg_pop.GetFloat() );

   m_flDie = gpGlobals->curtime + SQUEEK_DETONATE_DELAY;

   m_flFieldOfView = 0; // 180 degrees

   if ( GetOwnerEntity() )
    m_hOwner = GetOwnerEntity();

   m_flNextBounceSoundTime = gpGlobals->curtime;// reset each time a snark is spawned.

   SetSequence( WSQUEAK_RUN );
   ResetSequenceInfo( );

   m_iMyClass = CLASS_NONE;

   m_posPrev = Vector( 0, 0, 0 );
}


сам снарк спокойно спавнится через npc_create


Было отредактированно - kon_alex - Понедельник, 11.07.2011, 13:33
 
HitmenДата: Понедельник, 11.07.2011, 18:01 | Сообщение # 2
Spy
Группа: Проверенные
Сообщений: 2104
Репутация: 84
Статус: Offline
kon_alex, а сам npc_snark рабочий хоть?

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

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

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

 
kon_alexДата: Понедельник, 11.07.2011, 21:23 | Сообщение # 3
Newbie
Группа: Пользователи
Сообщений: 9
Репутация: 0
Статус: Offline
рабочий, брал из беты, через npc_create создается, а так-нет

Добавлено (11.07.2011, 21:23)
---------------------------------------------
извиняюсь, забыл, надо было скилы прописать biggrin кидал без патронов biggrin теперь спавнится smile

 
HitmenДата: Понедельник, 11.07.2011, 23:51 | Сообщение # 4
Spy
Группа: Проверенные
Сообщений: 2104
Репутация: 84
Статус: Offline
kon_alex, smile так обычно и бывает, из-за 1 фигни кажется, что что-то совсем не так.

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

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

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

 
Форум » Игровая мастерская » Программирование » Динамический спавн нпс (снарк и хорнет)
Страница 1 из 11
Поиск:

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