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) --------------------------------------------- извиняюсь, забыл, надо было скилы прописать кидал без патронов теперь спавнится
|
|
| |
Hitmen | Дата: Понедельник, 11.07.2011, 23:51 | Сообщение # 4 |
Spy
Группа: Проверенные
Сообщений: 2104
Репутация: 84
Статус: Offline
| kon_alex, так обычно и бывает, из-за 1 фигни кажется, что что-то совсем не так.
Туториалы по программированию, мои и слегка изменённые чужие. :)
Sp@ce Project Blog Sp@ce Project Web-Site
I'm in spaaace! Я в контакте Я в Facebook'е
|
|
| |