|
|
npc_crabsynth
| |
Hitmen | Дата: Среда, 09.12.2009, 15:33 | Сообщение # 1 |
Spy
Группа: Проверенные
Сообщений: 2104
Репутация: 84
Статус: Offline
| Никто не знает, как лечить такие ошибки? Code 2>npc_crabsynth.cpp 2>.\npc_crabsynth.cpp(22) : error C3861: SetAbsMins: идентификатор не найден 2>.\npc_crabsynth.cpp(23) : error C3861: SetAbsMaxs: идентификатор не найден 2>.\npc_crabsynth.cpp(201) : error C2228: выражение слева от ".z" должно представлять класс, структуру или объединение 2> тип: 'unknown-type' 2>.\npc_crabsynth.cpp(201) : error C2228: выражение слева от ".z" должно представлять класс, структуру или объединение 2> тип: 'unknown-type' 2>.\npc_crabsynth.cpp(201) : error C3861: GetAbsMaxs: идентификатор не найден 2>.\npc_crabsynth.cpp(201) : error C3861: GetAbsMins: идентификатор не найден Если не айс, то вот полный код CrabSynth, только известные мне ошибки смог исправить: Code #include "cbase.h" #include "ai_basenpc.h" #include "ai_hull.h" #include "ai_route.h" #include "AI_Navigator.h" #include "AI_Memory.h" #include "IEffects.h"
class CCrabSynth : public CAI_BaseNPC { DECLARE_CLASS( CCrabSynth, CAI_BaseNPC ); DECLARE_DATADESC();
public: void Spawn( void ); void Precache( void );
Class_T Classify( void ) { return CLASS_COMBINE; } virtual void SetObjectCollisionBox( void ) { // HACKHACK: Crab is much bigger than this! SetAbsMins( GetAbsOrigin() + Vector( -64.f, -64.f, 0.f) ); SetAbsMaxs( GetAbsOrigin() + Vector(64.f, 64.f, 80.f) ); } virtual void TraceAttack( const CTakeDamageInfo &info, const Vector &vecDir, trace_t *ptr ); virtual int OnTakeDamage_Alive( const CTakeDamageInfo &info ); virtual int SelectSchedule( void ); virtual int TranslateSchedule( int scheduleType ); virtual void StartTask( const Task_t *pTask ); virtual void RunTask( const Task_t *pTask ); virtual float MaxYawSpeed( void );
#if 0 void HandleAnimEvent( animevent_t *pEvent );
void PainSound( void ); void AlertSound( void ); void IdleSound( void ); void AttackSound( void );
#endif
protected: DEFINE_CUSTOM_AI; #if 0 DECLARE_DATADESC();
#endif
float m_nextCharge; };
LINK_ENTITY_TO_CLASS( npc_crabsynth, CCrabSynth ); IMPLEMENT_CUSTOM_AI( npc_crabsynth, CCrabSynth );
//--------------------------------------------------------- // Save/Restore //--------------------------------------------------------- BEGIN_DATADESC( CCrabSynth )
DEFINE_FIELD( m_nextCharge, FIELD_TIME ),
END_DATADESC()
//========================================================= // private activities //========================================================= int ACT_CHARGE_START; int ACT_CHARGE_START_MOVE; int ACT_CHARGE_LOOP; int ACT_CHARGE_END; int ACT_BODY_THROW; int ACT_CHARGE_HITLEFT; int ACT_CHARGE_HITRIGHT;
//========================================================= // schedules //========================================================= enum { SCHED_CRAB_CHARGE = LAST_SHARED_SCHEDULE, SCHED_CRAB_CHARGE_STOP, SCHED_CRAB_FLINCH, SCHED_CRAB_CHARGE_HITLEFT, SCHED_CRAB_CHARGE_HITRIGHT, };
//========================================================= // tasks //========================================================= enum { TASK_CHARGE = LAST_SHARED_TASK, TASK_GET_CHARGE_PATH, TASK_CHARGE_HIT, TASK_CHARGE_HITLEFT, TASK_CHARGE_HITRIGHT, };
//========================================================= //========================================================= #if 0 BEGIN_DATADESC( CCrabSynth )
END_DATADESC() #endif
void CCrabSynth::Precache( void ) { engine->PrecacheModel( "models/synth.mdl" ); BaseClass::Precache(); }
void CCrabSynth::Spawn( void ) { Precache(); SetModel( "models/synth.mdl" ); SetHullType(HULL_HUMAN); SetHullSizeNormal(); SetDefaultEyeOffset();
SetSolid( SOLID_BBOX ); AddSolidFlags( FSOLID_NOT_STANDABLE ); SetMoveType( MOVETYPE_STEP ); SetBloodColor( BLOOD_COLOR_GREEN ); m_iHealth = 251; m_flFieldOfView = 0.5f; m_NPCState = NPC_STATE_NONE;
m_nextCharge = 0.f;
CapabilitiesClear(); CapabilitiesAdd( bits_CAP_MOVE_GROUND | bits_CAP_INNATE_MELEE_ATTACK1 );
NPCInit(); }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CCrabSynth::InitCustomSchedules( void ) { INIT_CUSTOM_AI( CCrabSynth );
ADD_CUSTOM_TASK(CCrabSynth, TASK_CHARGE); ADD_CUSTOM_TASK(CCrabSynth, TASK_GET_CHARGE_PATH); ADD_CUSTOM_TASK(CCrabSynth, TASK_CHARGE_HIT); ADD_CUSTOM_TASK(CCrabSynth, TASK_CHARGE_HITLEFT); ADD_CUSTOM_TASK(CCrabSynth, TASK_CHARGE_HITRIGHT);
ADD_CUSTOM_SCHEDULE(CCrabSynth, SCHED_CRAB_CHARGE); ADD_CUSTOM_SCHEDULE(CCrabSynth, SCHED_CRAB_CHARGE_STOP); ADD_CUSTOM_SCHEDULE(CCrabSynth, SCHED_CRAB_FLINCH); ADD_CUSTOM_SCHEDULE(CCrabSynth, SCHED_CRAB_CHARGE_HITLEFT); ADD_CUSTOM_SCHEDULE(CCrabSynth, SCHED_CRAB_CHARGE_HITRIGHT);
// ADD_CUSTOM_CONDITION(CCrabSynth, COND_);
ADD_CUSTOM_ACTIVITY(CCrabSynth, ACT_CHARGE_START); ADD_CUSTOM_ACTIVITY(CCrabSynth, ACT_CHARGE_START_MOVE); ADD_CUSTOM_ACTIVITY(CCrabSynth, ACT_CHARGE_LOOP); ADD_CUSTOM_ACTIVITY(CCrabSynth, ACT_CHARGE_END); ADD_CUSTOM_ACTIVITY(CCrabSynth, ACT_BODY_THROW); ADD_CUSTOM_ACTIVITY(CCrabSynth, ACT_CHARGE_HITLEFT); ADD_CUSTOM_ACTIVITY(CCrabSynth, ACT_CHARGE_HITRIGHT);
AI_LOAD_SCHEDULE(CCrabSynth, SCHED_CRAB_CHARGE); AI_LOAD_SCHEDULE(CCrabSynth, SCHED_CRAB_CHARGE_STOP); AI_LOAD_SCHEDULE(CCrabSynth, SCHED_CRAB_FLINCH); AI_LOAD_SCHEDULE(CCrabSynth, SCHED_CRAB_CHARGE_HITLEFT); AI_LOAD_SCHEDULE(CCrabSynth, SCHED_CRAB_CHARGE_HITRIGHT); }
void CCrabSynth::TraceAttack( const CTakeDamageInfo &inputInfo, const Vector &vecDir, trace_t *ptr ) { CTakeDamageInfo info = inputInfo;
if (info.GetDamageType() & (DMG_BULLET | DMG_SLASH | DMG_CLUB)) { g_pEffects->Ricochet( ptr->endpos, (vecDir*-1.0f) ); info.SetDamage( 0.01 ); }
BaseClass::TraceAttack( info, vecDir, ptr ); }
int CCrabSynth::OnTakeDamage_Alive( const CTakeDamageInfo &inputInfo ) { CTakeDamageInfo info = inputInfo; info.SetDamage( 0.01f ); if ( info.GetDamageType() & DMG_BLAST ) { if ( info.GetInflictor() ) { // damage from roughly below? if ( info.GetInflictor()->GetAbsOrigin().z - GetAbsOrigin().z < ((GetAbsMaxs().z-GetAbsMins().z)*0.5f) ) { info.SetDamage( inputInfo.GetDamage() ); } } } return BaseClass::OnTakeDamage_Alive( info ); }
int CCrabSynth::SelectSchedule( void ) { switch ( m_NPCState ) { case NPC_STATE_COMBAT: if( HasCondition( COND_HEAVY_DAMAGE ) ) { return SCHED_CRAB_FLINCH; } if ( HasCondition( COND_SEE_ENEMY ) ) { if ( m_nextCharge < gpGlobals->curtime ) { m_nextCharge = gpGlobals->curtime + 20.f; return SCHED_CRAB_CHARGE; } } break;
default: return BaseClass::SelectSchedule(); break; }
return BaseClass::SelectSchedule(); }
int CCrabSynth::TranslateSchedule( int scheduleType ) { return BaseClass::TranslateSchedule( scheduleType ); }
float CCrabSynth::MaxYawSpeed( void ) { if ( GetActivity() == ACT_CHARGE_LOOP ) { return 20.f; } return 90.f; }
void CCrabSynth::StartTask( const Task_t *pTask ) { switch ( pTask->iTask ) { case TASK_CHARGE: break; case TASK_GET_CHARGE_PATH: { if (IsUnreachable(GetEnemy())) { TaskFail(FAIL_NO_ROUTE); return; } Vector flEnemyLKP = GetEnemyLKP(); if ( !GetNavigator()->SetGoal( flEnemyLKP, AIN_CLEAR_TARGET ) ) { // no way to get there =( DevWarning( 2, "GetPathToEnemyLKP failed!!\n" ); RememberUnreachable(GetEnemy()); TaskFail(FAIL_NO_ROUTE); } GetNavigator()->SetMovementActivity( (Activity)ACT_CHARGE_LOOP ); TaskComplete(); break; } break;
case TASK_CHARGE_HIT: GetNavigator()->SetMovementActivity( (Activity)ACT_CHARGE_END ); SetIdealActivity( (Activity)ACT_CHARGE_END ); break; case TASK_CHARGE_HITLEFT: GetNavigator()->SetMovementActivity( (Activity)ACT_CHARGE_HITLEFT ); SetIdealActivity( (Activity)ACT_CHARGE_HITLEFT ); break; case TASK_CHARGE_HITRIGHT: GetNavigator()->SetMovementActivity( (Activity)ACT_CHARGE_HITRIGHT ); SetIdealActivity( (Activity)ACT_CHARGE_HITRIGHT ); break;
default: BaseClass::StartTask( pTask ); } }
#define CHARGE_ATTACK_HIT 120.f #define CHARGE_ATTACK_WIDTH 100.f #define CHARGE_ATTACK_TRAMPLE 40.f
void CCrabSynth::RunTask( const Task_t *pTask ) { switch ( pTask->iTask ) { case TASK_CHARGE: { CBaseEntity *pEnemy = GetEnemy(); if ( GetNavigator()->GetGoalType() == GOALTYPE_NONE || !GetNavigator()->IsGoalActive() || !pEnemy ) { TaskComplete(); GetNavigator()->ClearGoal(); // Stop moving SetSchedule( SCHED_CRAB_CHARGE_STOP ); } else { // Check validity of goal type ValidateNavGoal(); SetIdealActivity( GetNavigator()->GetMovementActivity() );
Vector forward, right; AngleVectors( GetLocalAngles(), &forward, &right, NULL ); float dot = DotProduct( forward, pEnemy->GetAbsOrigin() ); float dist = dot - DotProduct( forward, GetAbsOrigin() ); // about to cross player // HACKHACK: Tune this magic number if ( dist < CHARGE_ATTACK_HIT ) { float lateral = DotProduct( right, pEnemy->GetAbsOrigin() ) - DotProduct( right, GetAbsOrigin() ); Msg( "Lateral dist: %.2f\n", lateral ); if ( lateral < -CHARGE_ATTACK_WIDTH || lateral > CHARGE_ATTACK_WIDTH ) { Msg( "Stop!\n" ); // play miss/stop animation. No damage to enemy SetSchedule( SCHED_CRAB_CHARGE_STOP ); } else if ( lateral < -CHARGE_ATTACK_TRAMPLE ) { Msg( "Hit left!\n" ); // hit left side SetSchedule( SCHED_CRAB_CHARGE_HITLEFT ); } else if ( lateral > CHARGE_ATTACK_TRAMPLE ) { Msg( "Hit Right!\n" ); // hit right side SetSchedule( SCHED_CRAB_CHARGE_HITLEFT ); } else { Msg( "Head On!!\n" ); // head on collision TaskComplete(); } } } } break; case TASK_CHARGE_HITRIGHT: case TASK_CHARGE_HITLEFT: case TASK_CHARGE_HIT: if ( IsActivityFinished() ) { GetNavigator()->ClearGoal(); TaskComplete(); } break;
default: BaseClass::RunTask( pTask ); } }
//----------------------------------------------------------------------------- // // Schedules // //-----------------------------------------------------------------------------
//========================================================= // Charge! //========================================================= AI_DEFINE_SCHEDULE ( SCHED_CRAB_CHARGE,
" Tasks" " TASK_FACE_ENEMY 0 " " TASK_GET_CHARGE_PATH 0" " TASK_CHARGE 0" " TASK_CHARGE_HIT 0" " " " Interrupts" " COND_HEAVY_DAMAGE" );
//========================================================= // Charge Hit Left! //========================================================= AI_DEFINE_SCHEDULE ( SCHED_CRAB_CHARGE_HITLEFT,
" Tasks" " TASK_CHARGE_ HITLEFT 0" " " " Interrupts" );
//========================================================= // Charge Hit Right! //========================================================= AI_DEFINE_SCHEDULE ( SCHED_CRAB_CHARGE_HITRIGHT,
" Tasks" " TASK_CHARGE _HITRIGHT 0" " " " Interrupts" );
//========================================================= // Charge Stop //========================================================= AI_DEFINE_SCHEDULE ( SCHED_CRAB_CHARGE_STOP,
" Tasks" " TASK_PLAY_PRIVA TE_SEQUENCE ACTIVITY:ACT_CHARGE_END" " " " Interrupts" );
//========================================================= // Flop / Flinch //========================================================= AI_DEFINE_SCHEDULE ( SCHED_CRAB_FLINCH,
" Tasks" " TASK_PLAY_PRIVATE_SE QUENCE ACTIVITY:ACT_BODY_THROW" " " " Interrupts" );
Туториалы по программированию, мои и слегка изменённые чужие. :)
Sp@ce Project Blog Sp@ce Project Web-Site
I'm in spaaace! Я в контакте Я в Facebook'е
Было отредактированно - Hitmen - Среда, 09.12.2009, 15:33 |
|
| |
DetLeR | Дата: Среда, 09.12.2009, 15:45 | Сообщение # 2 |
Engineer
Группа: Администраторы
Сообщений: 1731
Статус: Offline
| Hitmen, в релизном коде вырезали функции SetAbsMins и SetAbsMaxs, а в бете они остались, просто скопируй в соответствующие файлы это функции из кода беты и обязательно сделай Rebuild.
|
|
| |
Hitmen | Дата: Среда, 09.12.2009, 16:47 | Сообщение # 3 |
Spy
Группа: Проверенные
Сообщений: 2104
Репутация: 84
Статус: Offline
| DetLeR, Окей, ща пробну. =) P.S. Можешь дать наводку, а то малость сложновато найти. Добавлено (09.12.2009, 16:47) --------------------------------------------- Что-то малость недопонимаю....
Туториалы по программированию, мои и слегка изменённые чужие. :)
Sp@ce Project Blog Sp@ce Project Web-Site
I'm in spaaace! Я в контакте Я в Facebook'е
Было отредактированно - Hitmen - Среда, 09.12.2009, 16:03 |
|
| |
DetLeR | Дата: Среда, 09.12.2009, 17:27 | Сообщение # 4 |
Engineer
Группа: Администраторы
Сообщений: 1731
Статус: Offline
| У меня студия не стоит. Открывай серверный проект хл2бета кода и там в поисковике по проекту ищи эти функции. По-моему они прописаны в двух файлах.
|
|
| |
Hitmen | Дата: Среда, 09.12.2009, 17:43 | Сообщение # 5 |
Spy
Группа: Проверенные
Сообщений: 2104
Репутация: 84
Статус: Offline
| Я так и сделал, но проблема в том, что поисковик мне выдал более 2 файлов. Я методом научного тыка начал каждый открывать и смотреть, в итоге решил из c_baseentity.cpp брать их, но ничего не вышло. =(
Туториалы по программированию, мои и слегка изменённые чужие. :)
Sp@ce Project Blog Sp@ce Project Web-Site
I'm in spaaace! Я в контакте Я в Facebook'е
|
|
| |
DetLeR | Дата: Среда, 09.12.2009, 18:12 | Сообщение # 6 |
Engineer
Группа: Администраторы
Сообщений: 1731
Статус: Offline
| Ну а я чем могу помочь, ищи там где эта функция обозначается и копируй в релиз, а потом делай Rebuild, а то не увидит изменений.
|
|
| |
NightSTalk | Дата: Воскресенье, 10.03.2013, 15:15 | Сообщение # 7 |
Newbie
Группа: Пользователи
Сообщений: 1
Репутация: 0
Статус: Offline
| Все правильно, у меня все работает. Т.К не вижу смысла его восстанавливать, там код недоделанный, и это просто без полезный статический предмет. Время от времени , при его существовании на карте, пишет в консоли какие-то фразы типо (20.19 TARGET HIT RIGHT) - скорее всего он шмалялся ракетами, и был бы доволно пафосный нпс, но так как мы не Valve, и не професиональные кодеры, восстановить его у нас не выйдет ... - ИМХО
|
|
| |
|
|
Помощь в разработке форума: HOMiE7 |
|
| |
|