void CUIActorMenu::SetPartner(CInventoryOwner* io) { R_ASSERT (!IsShown()); m_pPartnerInvOwner = io; if ( m_pPartnerInvOwner ) { CBaseMonster* monster = smart_cast<CBaseMonster*>( m_pPartnerInvOwner ); if ( monster || m_pPartnerInvOwner->use_simplified_visual() ) { m_PartnerCharacterInfo->ClearInfo(); if ( monster ) { shared_str monster_tex_name = pSettings->r_string( monster->cNameSect(), "icon" ); // m_PartnerCharacterInfo->UIIcon().InitTexture( monster_tex_name.c_str() ); // m_PartnerCharacterInfo->UIIcon().SetStretchTexture( true ); m_PartnerCharacterInfo->InitMonsterCharacter(monster_tex_name); } } else { m_PartnerCharacterInfo->InitCharacter( m_pPartnerInvOwner->object_id() ); } SetInvBox( NULL ); } else { m_PartnerCharacterInfo->ClearInfo(); } }
void ScriptEntityCancel(edict_t *pentCine) { // make sure they are a scripted_sequence if(FClassnameIs(pentCine, CLASSNAME)) { CCineMonster *pCineTarget = GetClassPtr((CCineMonster *)VARS(pentCine)); // make sure they have a monster in mind for the script CBaseEntity * pEntity = pCineTarget->m_hTargetEnt; CBaseMonster *pTarget = NULL; if(pEntity) pTarget = pEntity->MyMonsterPointer(); if(pTarget) { // make sure their monster is actually playing a script if(pTarget->m_MonsterState == MONSTERSTATE_SCRIPT) { // tell them do die pTarget->m_scriptState = CCineMonster::SCRIPT_CLEANUP; // do it now pTarget->CineCleanup(); } } } }
//========================================================= // Leader boid calls this to form a flock from surrounding boids //========================================================= void CFlockingFlyer :: FormFlock( void ) { if ( !InSquad() ) { // I am my own leader m_pSquadLeader = this; m_pSquadNext = NULL; int squadCount = 1; CBaseEntity *pEntity = NULL; while ((pEntity = UTIL_FindEntityInSphere( pEntity, pev->origin, AFLOCK_MAX_RECRUIT_RADIUS )) != NULL) { CBaseMonster *pRecruit = pEntity->MyMonsterPointer( ); if ( pRecruit && pRecruit != this && pRecruit->IsAlive() && !pRecruit->m_pCine ) { // Can we recruit this guy? if ( FClassnameIs ( pRecruit->pev, "monster_flyer" ) ) { squadCount++; SquadAdd( (CFlockingFlyer *)pRecruit ); } } } } SetThink( &CFlockingFlyer::IdleThink );// now that flock is formed, go to idle and wait for a player to come along. pev->nextthink = gpGlobals->time; }
void CTriggerSubModel :: ChangeSub ( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) { if ( FStringNull ( pev->target ) ) return; edict_t *pentTarget = FIND_ENTITY_BY_TARGETNAME ( NULL, STRING(pev->target) ); if ( FNullEnt(pentTarget) ) { ALERT ( at_console, "CTriggerSubModel : pas d'entite s appelant %s\n", STRING(pev->target) ); return; } CBaseEntity *pTarget = Instance( pentTarget ); if ( pTarget->MyMonsterPointer() == NULL ) { ALERT ( at_console, "CTriggerSubModel : %s n est pas un monstre\n", STRING(pev->target) ); return; } CBaseMonster *pMonster = (CBaseMonster*)pTarget; pMonster->SetBodygroup( m_iBodygroup, m_iSubmodel); }
//========================================================= // Killed. //========================================================= void CBarnacle :: Killed( entvars_t *pevAttacker, int iGib ) { CBaseMonster *pVictim; pev->solid = SOLID_NOT; pev->takedamage = DAMAGE_NO; if ( m_hEnemy != NULL ) { pVictim = m_hEnemy->MyMonsterPointer(); if ( pVictim ) { pVictim->BarnacleVictimReleased(); } } // CGib::SpawnRandomGibs( pev, 4, 1 ); switch ( RANDOM_LONG ( 0, 1 ) ) { case 0: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_die1.wav", 1, ATTN_NORM ); break; case 1: EMIT_SOUND( ENT(pev), CHAN_WEAPON, "barnacle/bcl_die3.wav", 1, ATTN_NORM ); break; } SetActivity ( ACT_DIESIMPLE ); SetBoneController( 0, 0 ); StudioFrameAdvance( 0.1 ); SetNextThink( 0.1 ); SetThink(&CBarnacle :: WaitTillDead ); }
void CScriptGameObject::jump(const Fvector &position, float factor) { CBaseMonster *monster = smart_cast<CBaseMonster*>(&object()); if (!monster) { ai().script_engine().script_log (ScriptStorage::eLuaMessageTypeError,"CScriptGameObject : cannot process jump for not a monster!"); return; } monster->jump(position, factor); }
void CUICarBodyWnd::InitCarBody(CInventoryOwner* pOur, CInventoryOwner* pOthers) { m_pOurObject = pOur; m_pOthersObject = pOthers; m_pInventoryBox = NULL; u16 our_id = smart_cast<CGameObject*>(m_pOurObject)->ID(); u16 other_id = smart_cast<CGameObject*>(m_pOthersObject)->ID(); m_pUICharacterInfoLeft->InitCharacter (our_id); m_pUIOthersIcon->Show (true); CBaseMonster *monster = NULL; if(m_pOthersObject) { monster = smart_cast<CBaseMonster *>(m_pOthersObject); if (monster || m_pOthersObject->use_simplified_visual() ) { m_pUICharacterInfoRight->ClearInfo (); if(monster) { shared_str monster_tex_name = pSettings->r_string(monster->cNameSect(),"icon"); m_pUICharacterInfoRight->UIIcon().InitTexture(monster_tex_name.c_str()); m_pUICharacterInfoRight->UIIcon().SetStretchTexture(true); } }else { m_pUICharacterInfoRight->InitCharacter (other_id); } } m_pUIPropertiesBox->Hide (); EnableAll (); UpdateLists (); if(!monster){ CInfoPortionWrapper *known_info_registry = xr_new<CInfoPortionWrapper>(); known_info_registry->registry().init (other_id); KNOWN_INFO_VECTOR& known_info = known_info_registry->registry().objects(); KNOWN_INFO_VECTOR_IT it = known_info.begin(); for(int i=0;it!=known_info.end();++it,++i){ (*it).info_id; NET_Packet P; CGameObject::u_EventGen (P,GE_INFO_TRANSFER, our_id); P.w_u16 (0);//not used P.w_stringZ ((*it).info_id); //сообщение P.w_u8 (1); //добавление сообщения CGameObject::u_EventSend (P); } known_info.clear (); xr_delete (known_info_registry); } }
int CScriptGameObject::CharacterRank () { // rank support for monster CBaseMonster *monster = smart_cast<CBaseMonster*>(&object()); if (!monster) { CInventoryOwner* pInventoryOwner = smart_cast<CInventoryOwner*>(&object()); if (!pInventoryOwner) { ai().script_engine().script_log (ScriptStorage::eLuaMessageTypeError,"CharacterRank available only for InventoryOwner and BaseMonster"); return 0; } return pInventoryOwner->Rank(); } return monster->Rank(); }
virtual void Execute(LPCSTR args) { string128 param1, param2; _GetItem(args,0,param1,' '); _GetItem(args,1,param2,' '); CObject *obj = Level().Objects.FindObjectByName(param1); CBaseMonster *monster = smart_cast<CBaseMonster *>(obj); if (!monster) return; u32 value2; sscanf (param2,"%u",&value2); monster->set_show_debug_info (u8(value2)); }
// find a viable entity int CCineMonster::FindEntity(void) { edict_t *pentTarget; pentTarget = FIND_ENTITY_BY_TARGETNAME(NULL, STRING(m_iszEntity)); m_hTargetEnt = NULL; CBaseMonster *pTarget = NULL; while(!FNullEnt(pentTarget)) { if(FBitSet(VARS(pentTarget)->flags, FL_MONSTER)) { pTarget = GetMonsterPointer(pentTarget); if(pTarget && pTarget->CanPlaySequence(FCanOverrideState(), SS_INTERRUPT_BY_NAME)) { m_hTargetEnt = pTarget; return TRUE; } ALERT(at_console, "Found %s, but can't play!\n", STRING(m_iszEntity)); } pentTarget = FIND_ENTITY_BY_TARGETNAME(pentTarget, STRING(m_iszEntity)); pTarget = NULL; } if(!pTarget) { CBaseEntity *pEntity = NULL; while((pEntity = UTIL_FindEntityInSphere(pEntity, pev->origin, m_flRadius)) != NULL) { if(FClassnameIs(pEntity->pev, STRING(m_iszEntity))) { if(FBitSet(pEntity->pev->flags, FL_MONSTER)) { pTarget = pEntity->MyMonsterPointer(); if(pTarget && pTarget->CanPlaySequence(FCanOverrideState(), SS_INTERRUPT_IDLE)) { m_hTargetEnt = pTarget; return TRUE; } } } } } pTarget = NULL; m_hTargetEnt = NULL; return FALSE; }
// find a viable entity bool CCineMonster::FindEntity() { m_hTargetEnt = nullptr; CBaseEntity* pTargetEnt = nullptr; CBaseMonster* pTarget = nullptr; while( ( pTargetEnt = UTIL_FindEntityByTargetname( pTargetEnt, STRING( m_iszEntity ) ) ) != nullptr ) { if( pTargetEnt->GetFlags().Any( FL_MONSTER ) ) { pTarget = pTargetEnt->MyMonsterPointer(); if( pTarget && pTarget->CanPlaySequence( FCanOverrideState(), SS_INTERRUPT_BY_NAME ) ) { m_hTargetEnt = pTarget; return true; } ALERT( at_console, "Found %s, but can't play!\n", STRING( m_iszEntity ) ); } pTarget = nullptr; } if( !pTarget ) { pTargetEnt = nullptr; while( ( pTargetEnt = UTIL_FindEntityInSphere( pTargetEnt, GetAbsOrigin(), m_flRadius ) ) != nullptr ) { if( pTargetEnt->ClassnameIs( STRING( m_iszEntity ) ) ) { if( pTargetEnt->GetFlags().Any( FL_MONSTER ) ) { pTarget = pTargetEnt->MyMonsterPointer(); if( pTarget && pTarget->CanPlaySequence( FCanOverrideState(), SS_INTERRUPT_IDLE ) ) { m_hTargetEnt = pTarget; return true; } } } } } m_hTargetEnt = nullptr; return false; }
void CTalkMonster::ShutUpFriends( void ) { CBaseEntity *pFriend = NULL; int i; // for each friend in this bsp... for ( i = 0; i < TLK_CFRIENDS; i++ ) { while( ( pFriend = EnumFriends( pFriend, i, true ) ) != nullptr ) { CBaseMonster *pMonster = pFriend->MyMonsterPointer(); if ( pMonster ) { pMonster->SentenceStop(); } } } }
void CTalkMonster::AlertFriends( void ) { CBaseEntity *pFriend = NULL; int i; // for each friend in this bsp... for ( i = 0; i < TLK_CFRIENDS; i++ ) { while( ( pFriend = EnumFriends( pFriend, i, true ) ) != nullptr ) { CBaseMonster *pMonster = pFriend->MyMonsterPointer(); if ( pMonster->IsAlive() ) { // don't provoke a friend that's playing a death animation. They're a goner pMonster->m_afMemory |= bits_MEMORY_PROVOKED; } } } }
// Find an entity that I'm interested in and precache the sounds he'll need in the sequence. void CCineMonster::Activate(void) { edict_t * pentTarget; CBaseMonster *pTarget; // The entity name could be a target name or a classname // Check the targetname pentTarget = FIND_ENTITY_BY_TARGETNAME(NULL, STRING(m_iszEntity)); pTarget = NULL; while(!pTarget && !FNullEnt(pentTarget)) { if(FBitSet(VARS(pentTarget)->flags, FL_MONSTER)) { pTarget = GetMonsterPointer(pentTarget); } pentTarget = FIND_ENTITY_BY_TARGETNAME(pentTarget, STRING(m_iszEntity)); } // If no entity with that targetname, check the classname if(!pTarget) { pentTarget = FIND_ENTITY_BY_CLASSNAME(NULL, STRING(m_iszEntity)); while(!pTarget && !FNullEnt(pentTarget)) { pTarget = GetMonsterPointer(pentTarget); pentTarget = FIND_ENTITY_BY_TARGETNAME(pentTarget, STRING(m_iszEntity)); } } // Found a compatible entity if(pTarget) { void *pmodel; pmodel = GET_MODEL_PTR(pTarget->edict()); if(pmodel) { // Look through the event list for stuff to precache SequencePrecache(pmodel, STRING(m_iszIdle)); SequencePrecache(pmodel, STRING(m_iszPlay)); } } }
CBaseMonster *COsprey :: MakeGrunt( Vector vecSrc ) { CBaseEntity *pEntity; CBaseMonster *pGrunt; TraceResult tr; UTIL_TraceLine( vecSrc, vecSrc + Vector( 0, 0, -4096.0), dont_ignore_monsters, ENT(pev), &tr); if ( tr.pHit && Instance( tr.pHit )->pev->solid != SOLID_BSP) return NULL; for (int i = 0; i < m_iUnits; i++) { if (m_hGrunt[i] == NULL || !m_hGrunt[i]->IsAlive()) { if (m_hGrunt[i] != NULL && m_hGrunt[i]->pev->rendermode == kRenderNormal) { m_hGrunt[i]->SUB_StartFadeOut( ); } pEntity = Create( "monster_human_grunt", vecSrc, GetAbsAngles() ); pGrunt = pEntity->MyMonsterPointer( ); pGrunt->pev->movetype = MOVETYPE_FLY; pGrunt->SetAbsVelocity( Vector( 0, 0, RANDOM_FLOAT( -196, -128 ) )); pGrunt->SetActivity( ACT_GLIDE ); CBeam *pBeam = CBeam::BeamCreate( "sprites/rope.spr", 10 ); pBeam->PointEntInit( vecSrc + Vector(0,0,112), pGrunt->entindex() ); pBeam->SetFlags( BEAM_FSOLID ); pBeam->SetColor( 255, 255, 255 ); pBeam->SetThink( SUB_Remove ); pBeam->pev->nextthink = gpGlobals->time + -4096.0 * tr.flFraction / pGrunt->GetAbsVelocity().z + 0.5; // ALERT( at_console, "%d at %.0f %.0f %.0f\n", i, m_vecOrigin[i].x, m_vecOrigin[i].y, m_vecOrigin[i].z ); pGrunt->m_vecLastPosition = m_vecOrigin[i]; m_hGrunt[i] = pGrunt; return pGrunt; } } // ALERT( at_console, "none dead\n"); return NULL; }
// Find an entity that I'm interested in and precache the sounds he'll need in the sequence. void CCineMonster::Activate( void ) { CBaseMonster* pTarget = nullptr; CBaseEntity* pNextTarget = nullptr; // The entity name could be a target name or a classname // Check the targetname while( !pTarget && ( pNextTarget = UTIL_FindEntityByTargetname( pNextTarget, STRING( m_iszEntity ) ) ) != nullptr ) { if( pNextTarget->GetFlags().Any( FL_MONSTER ) ) { pTarget = pNextTarget->MyMonsterPointer(); } } // If no entity with that targetname, check the classname if( !pTarget ) { pNextTarget = nullptr; while( !pTarget && ( pNextTarget = UTIL_FindEntityByClassname( pNextTarget, STRING( m_iszEntity ) ) ) != nullptr ) { pTarget = pNextTarget->MyMonsterPointer(); } } // Found a compatible entity if( pTarget ) { void *pmodel; pmodel = GET_MODEL_PTR( pTarget->edict() ); if( pmodel ) { // Look through the event list for stuff to precache SequencePrecache( pmodel, STRING( m_iszIdle ) ); SequencePrecache( pmodel, STRING( m_iszPlay ) ); } } }
//========================================================= // CheckMeleeAttack1 //========================================================= BOOL CFriend :: CheckMeleeAttack1 ( float flDot, float flDist ) { CBaseMonster *pEnemy; if ( m_hEnemy != NULL ) { pEnemy = m_hEnemy->MyMonsterPointer(); if ( !pEnemy ) { return FALSE; } } if ( flDist <= 64 && flDot >= 0.7 && pEnemy->Classify() != CLASS_ALIEN_BIOWEAPON && pEnemy->Classify() != CLASS_PLAYER_BIOWEAPON ) { return TRUE; } return FALSE; }
void CNihilanth :: TargetSphere( USE_TYPE useType, float value ) { CBaseMonster *pSphere; for (int i = 0; i < N_SPHERES; i++) { if (m_hSphere[i] != NULL) { pSphere = m_hSphere[i]->MyMonsterPointer(); if (pSphere->m_hEnemy == NULL) break; } } if (i == N_SPHERES) { return; } Vector vecSrc, vecAngles; GetAttachment( 2, vecSrc, vecAngles ); UTIL_SetOrigin( pSphere->pev, vecSrc ); pSphere->Use( this, this, useType, value ); pSphere->pev->velocity = m_vecDesired * RANDOM_FLOAT( 50, 100 ) + Vector( RANDOM_FLOAT( -50, 50 ), RANDOM_FLOAT( -50, 50 ), RANDOM_FLOAT( -50, 50 ) ); }
void CISlave::CallForHelp(char *szClassname, float flDist, EHANDLE hEnemy, Vector &vecLocation) { // ALERT( at_aiconsole, "help " ); // skip ones not on my netname if(FStringNull(pev->netname)) return; CBaseEntity *pEntity = NULL; while((pEntity = UTIL_FindEntityByString(pEntity, "netname", STRING(pev->netname))) != NULL) { float d = (pev->origin - pEntity->pev->origin).Length(); if(d < flDist) { CBaseMonster *pMonster = pEntity->MyMonsterPointer(); if(pMonster) { pMonster->m_afMemory |= bits_MEMORY_PROVOKED; pMonster->PushEnemy(hEnemy, vecLocation); } } } }
// UNDONE: Keep a follow time in each follower, make a list of followers in this function and do LRU // UNDONE: Check this in Restore to keep restored monsters from joining a full list of followers void CTalkMonster::LimitFollowers( CBaseEntity *pPlayer, int maxFollowers ) { CBaseEntity *pFriend = NULL; int i, count; count = 0; // for each friend in this bsp... for ( i = 0; i < TLK_CFRIENDS; i++ ) { while( ( pFriend = EnumFriends( pFriend, i, false ) ) != nullptr ) { CBaseMonster *pMonster = pFriend->MyMonsterPointer(); if ( pMonster ) { if ( pMonster->m_hTargetEnt == pPlayer ) { count++; if ( count > maxFollowers ) pMonster->StopFollowing( true ); } } } } }
////////////////////////////////////////////////////////////////////////// // CBaseMonster void CScriptGameObject::skip_transfer_enemy(bool val) { CBaseMonster *monster = smart_cast<CBaseMonster *>(&object()); if (monster) monster->skip_transfer_enemy(val); }
void CScriptGameObject::set_default_panic_threshold() { CBaseMonster *monster = smart_cast<CBaseMonster *>(&object()); if (monster) monster->set_default_panic_threshold(); }
void CScriptGameObject::set_custom_panic_threshold(float value) { CBaseMonster *monster = smart_cast<CBaseMonster *>(&object()); if (monster) monster->set_custom_panic_threshold(value); }
void CScriptGameObject::berserk() { CBaseMonster *monster = smart_cast<CBaseMonster *>(&object()); if (monster) monster->set_berserk(); }
void CLevel::IR_OnKeyboardPress (int key) { bool b_ui_exist = (pHUD && pHUD->GetUI()); if (!g_bDisableAllInput) { if (auto ui = HUD().GetUI()) { if (ui->UIMainIngameWnd) { ui->UIMainIngameWnd->HudAdjustMode(key); // Real Wolf. 07.09.2014. } } /************************************************** added by Ray Twitty (aka Shadows) START **************************************************/ // Колбек на нажатие клавиши if (g_actor) Actor()->callback(GameObject::eOnKeyPress)(key); /*************************************************** added by Ray Twitty (aka Shadows) END ***************************************************/ } EGameActions _curr = get_binded_action(key); switch ( _curr ) { case kSCREENSHOT: Render->Screenshot(); return; break; case kCONSOLE: Console->Show (); return; break; case kQUIT: { if(b_ui_exist && HUD().GetUI()->MainInputReceiver() ){ if(HUD().GetUI()->MainInputReceiver()->IR_OnKeyboardPress(key)) return;//special case for mp and main_menu HUD().GetUI()->StartStopMenu( HUD().GetUI()->MainInputReceiver(), true); }else Console->Execute ("main_menu"); return; }break; case kPAUSE: if(!g_block_pause) { if ( IsGameTypeSingle() ) { Device.Pause(!Device.Paused(), TRUE, TRUE, "li_pause_key"); } } return; break; }; if( g_bDisableAllInput ) return; if ( !b_ui_exist ) return; if ( b_ui_exist && pHUD->GetUI()->IR_OnKeyboardPress(key)) return; if( Device.Paused() ) return; if ( game && Game().IR_OnKeyboardPress(key) ) return; if(_curr == kQUICK_SAVE && IsGameTypeSingle()) { Console->Execute ("save"); return; } if(_curr == kQUICK_LOAD && IsGameTypeSingle()) { #ifdef DEBUG FS.get_path ("$game_config$")->m_Flags.set(FS_Path::flNeedRescan, TRUE); FS.get_path ("$game_scripts$")->m_Flags.set(FS_Path::flNeedRescan, TRUE); FS.rescan_pathes (); #endif // DEBUG string_path saved_game,command; strconcat (sizeof(saved_game),saved_game,Core.UserName,"_","quicksave"); if (!CSavedGameWrapper::valid_saved_game(saved_game)) return; strconcat (sizeof(command),command,"load ",saved_game); Console->Execute (command); return; } #ifndef MASTER_GOLD switch (key) { case DIK_NUMPAD5: { if (GameID() != GAME_SINGLE) { Msg("For this game type Demo Record is disabled."); /// return; }; Console->Hide (); Console->Execute("demo_record 1"); } break; #endif // MASTER_GOLD #ifdef DEBUG case DIK_RETURN: bDebug = !bDebug; return; case DIK_BACK: if (GameID() == GAME_SINGLE) HW.Caps.SceneMode = (HW.Caps.SceneMode+1)%3; return; case DIK_F4: { if (pInput->iGetAsyncKeyState(DIK_LALT)) break; if (pInput->iGetAsyncKeyState(DIK_RALT)) break; bool bOk = false; u32 i=0, j, n=Objects.o_count(); if (pCurrentEntity) for ( ; i<n; ++i) if (Objects.o_get_by_iterator(i) == pCurrentEntity) break; if (i < n) { j = i; bOk = false; for (++i; i <n; ++i) { CEntityAlive* tpEntityAlive = smart_cast<CEntityAlive*>(Objects.o_get_by_iterator(i)); if (tpEntityAlive) { bOk = true; break; } } if (!bOk) for (i = 0; i <j; ++i) { CEntityAlive* tpEntityAlive = smart_cast<CEntityAlive*>(Objects.o_get_by_iterator(i)); if (tpEntityAlive) { bOk = true; break; } } if (bOk) { CObject *tpObject = CurrentEntity(); CObject *__I = Objects.o_get_by_iterator(i); CObject **I = &__I; SetEntity(*I); if (tpObject != *I) { CActor* pActor = smart_cast<CActor*> (tpObject); if (pActor) pActor->inventory().Items_SetCurrentEntityHud(false); } if (tpObject) { Engine.Sheduler.Unregister (tpObject); Engine.Sheduler.Register (tpObject, TRUE); }; Engine.Sheduler.Unregister (*I); Engine.Sheduler.Register (*I, TRUE); CActor* pActor = smart_cast<CActor*> (*I); if (pActor) { pActor->inventory().Items_SetCurrentEntityHud(true); CHudItem* pHudItem = smart_cast<CHudItem*>(pActor->inventory().ActiveItem()); if (pHudItem) { pHudItem->OnStateSwitch(pHudItem->GetState()); } } } } return; } case MOUSE_1: { if (GameID() != GAME_SINGLE) break; if (pInput->iGetAsyncKeyState(DIK_LALT)) { if (CurrentEntity()->CLS_ID == CLSID_OBJECT_ACTOR) try_change_current_entity (); else restore_actor (); return; } break; } /**/ case DIK_DIVIDE: if( OnServer() ){ // float NewTimeFactor = pSettings->r_float("alife","time_factor"); if (GameID() == GAME_SINGLE) Server->game->SetGameTimeFactor(g_fTimeFactor); else { Server->game->SetEnvironmentGameTimeFactor(g_fTimeFactor); Server->game->SetGameTimeFactor(g_fTimeFactor); }; } break; case DIK_MULTIPLY: if( OnServer() ){ float NewTimeFactor = 1000.f; if (GameID() == GAME_SINGLE) Server->game->SetGameTimeFactor(NewTimeFactor); else { Server->game->SetEnvironmentGameTimeFactor(NewTimeFactor); // Server->game->SetGameTimeFactor(NewTimeFactor); }; } break; #endif #ifdef DEBUG case DIK_F9:{ // if (!ai().get_alife()) // break; // const_cast<CALifeSimulatorHeader&>(ai().alife().header()).set_state(ALife::eZoneStateSurge); if (GameID() != GAME_SINGLE) { extern INT g_sv_SendUpdate; g_sv_SendUpdate = 1; }; break; } return; // case DIK_F10:{ // ai().level_graph().set_dest_point(); // ai().level_graph().build_detail_path(); // if (!Objects.FindObjectByName("m_stalker_e0000") || !Objects.FindObjectByName("localhost/dima")) // return; // if (!m_bSynchronization) { // m_bSynchronization = true; // ai().level_graph().set_start_point(); // m_bSynchronization = false; // } // luabind::functor<void> functor; // ai().script_engine().functor("alife_test.set_switch_online",functor); // functor(0,false); // } // return; // case DIK_F11: // ai().level_graph().build_detail_path(); // if (!Objects.FindObjectByName("m_stalker_e0000") || !Objects.FindObjectByName("localhost/dima")) // return; // if (!m_bSynchronization) { // m_bSynchronization = true; // ai().level_graph().set_dest_point(); // ai().level_graph().select_cover_point(); // m_bSynchronization = false; // } // return; #endif // DEBUG #ifndef MASTER_GOLD } #endif // MASTER_GOLD if (bindConsoleCmds.execute(key)) return; if( b_ui_exist && HUD().GetUI()->MainInputReceiver() )return; if (CURRENT_ENTITY()) { IInputReceiver* IR = smart_cast<IInputReceiver*> (smart_cast<CGameObject*>(CURRENT_ENTITY())); if (IR) IR->IR_OnKeyboardPress(get_binded_action(key)); } #ifdef _DEBUG CObject *obj = Level().Objects.FindObjectByName("monster"); if (obj) { CBaseMonster *monster = smart_cast<CBaseMonster *>(obj); if (monster) monster->debug_on_key(key); } #endif }
// make the entity carry out the scripted sequence instructions, but without // destroying the monster's state. void CCineAI::PossessEntity(void) { Schedule_t *pNewSchedule; CBaseEntity * pEntity = m_hTargetEnt; CBaseMonster *pTarget = NULL; if(pEntity) pTarget = pEntity->MyMonsterPointer(); if(pTarget) { if(!pTarget->CanPlaySequence(FCanOverrideState(), SS_INTERRUPT_AI)) { ALERT(at_aiconsole, "(AI)Can't possess entity %s\n", STRING(pTarget->pev->classname)); return; } pTarget->m_pGoalEnt = this; pTarget->m_pCine = this; pTarget->m_hTargetEnt = this; m_saved_movetype = pTarget->pev->movetype; m_saved_solid = pTarget->pev->solid; m_saved_effects = pTarget->pev->effects; pTarget->pev->effects |= pev->effects; switch(m_fMoveTo) { case 0: case 5: pTarget->m_scriptState = SCRIPT_WAIT; break; case 1: pTarget->m_scriptState = SCRIPT_WALK_TO_MARK; break; case 2: pTarget->m_scriptState = SCRIPT_RUN_TO_MARK; break; case 4: // zap the monster instantly to the site of the script entity. UTIL_SetOrigin(pTarget->pev, pev->origin); pTarget->pev->ideal_yaw = pev->angles.y; pTarget->pev->avelocity = Vector(0, 0, 0); pTarget->pev->velocity = Vector(0, 0, 0); pTarget->pev->effects |= EF_NOINTERP; pTarget->pev->angles.y = pev->angles.y; pTarget->m_scriptState = SCRIPT_WAIT; m_startTime = gpGlobals->time + 1E6; // UNDONE: Add a flag to do this so people can fixup physics after teleporting monsters pTarget->pev->flags &= ~FL_ONGROUND; break; default: ALERT(at_aiconsole, "aiscript: invalid Move To Position value!"); break; } ALERT(at_aiconsole, "\"%s\" found and used\n", STRING(pTarget->pev->targetname)); pTarget->m_IdealMonsterState = MONSTERSTATE_SCRIPT; /* if (m_iszIdle) { StartSequence( pTarget, m_iszIdle, FALSE ); if (FStrEq( STRING(m_iszIdle), STRING(m_iszPlay))) { pTarget->pev->framerate = 0; } } */ // Already in a scripted state? if(pTarget->m_MonsterState == MONSTERSTATE_SCRIPT) { pNewSchedule = pTarget->GetScheduleOfType(SCHED_AISCRIPT); pTarget->ChangeSchedule(pNewSchedule); } } }
// make the entity enter a scripted sequence void CCineMonster::PossessEntity(void) { CBaseEntity * pEntity = m_hTargetEnt; CBaseMonster *pTarget = NULL; if(pEntity) pTarget = pEntity->MyMonsterPointer(); if(pTarget) { // FindEntity() just checked this! #if 0 if ( !pTarget->CanPlaySequence( FCanOverrideState() ) ) { ALERT( at_aiconsole, "Can't possess entity %s\n", STRING(pTarget->pev->classname) ); return; } #endif pTarget->m_pGoalEnt = this; pTarget->m_pCine = this; pTarget->m_hTargetEnt = this; m_saved_movetype = pTarget->pev->movetype; m_saved_solid = pTarget->pev->solid; m_saved_effects = pTarget->pev->effects; pTarget->pev->effects |= pev->effects; switch(m_fMoveTo) { case 0: pTarget->m_scriptState = SCRIPT_WAIT; break; case 1: pTarget->m_scriptState = SCRIPT_WALK_TO_MARK; DelayStart(1); break; case 2: pTarget->m_scriptState = SCRIPT_RUN_TO_MARK; DelayStart(1); break; case 4: UTIL_SetOrigin(pTarget->pev, pev->origin); pTarget->pev->ideal_yaw = pev->angles.y; pTarget->pev->avelocity = Vector(0, 0, 0); pTarget->pev->velocity = Vector(0, 0, 0); pTarget->pev->effects |= EF_NOINTERP; pTarget->pev->angles.y = pev->angles.y; pTarget->m_scriptState = SCRIPT_WAIT; m_startTime = gpGlobals->time + 1E6; // UNDONE: Add a flag to do this so people can fixup physics after teleporting monsters // pTarget->pev->flags &= ~FL_ONGROUND; break; } // ALERT( at_aiconsole, "\"%s\" found and used (INT: %s)\n", STRING( pTarget->pev->targetname ), FBitSet(pev->spawnflags, SF_SCRIPT_NOINTERRUPT)?"No":"Yes" ); pTarget->m_IdealMonsterState = MONSTERSTATE_SCRIPT; if(m_iszIdle) { StartSequence(pTarget, m_iszIdle, FALSE); if(FStrEq(STRING(m_iszIdle), STRING(m_iszPlay))) { pTarget->pev->framerate = 0; } } } }
// make the entity carry out the scripted sequence instructions, but without // destroying the monster's state. void CCineAI::PossessEntity( void ) { Schedule_t *pNewSchedule; CBaseEntity *pEntity = m_hTargetEnt; CBaseMonster *pTarget = NULL; if( pEntity ) pTarget = pEntity->MyMonsterPointer(); if( pTarget ) { if( !pTarget->CanPlaySequence( FCanOverrideState(), SS_INTERRUPT_AI ) ) { ALERT( at_aiconsole, "(AI)Can't possess entity %s\n", pTarget->GetClassname() ); return; } pTarget->m_hGoalEnt = this; pTarget->m_pCine = this; pTarget->m_hTargetEnt = this; m_saved_movetype = pTarget->GetMoveType(); m_saved_solid = pTarget->GetSolidType(); m_saved_effects = pTarget->GetEffects(); pTarget->GetEffects() |= GetEffects(); switch( m_fMoveTo ) { case 0: case 5: pTarget->m_scriptState = SCRIPT_WAIT; break; case 1: pTarget->m_scriptState = SCRIPT_WALK_TO_MARK; break; case 2: pTarget->m_scriptState = SCRIPT_RUN_TO_MARK; break; case 4: { // zap the monster instantly to the site of the script entity. pTarget->SetAbsOrigin( GetAbsOrigin() ); pTarget->SetIdealYaw( GetAbsAngles().y ); pTarget->SetAngularVelocity( g_vecZero ); pTarget->SetAbsVelocity( Vector( 0, 0, 0 ) ); pTarget->GetEffects() |= EF_NOINTERP; Vector vecAngles = pTarget->GetAbsAngles(); vecAngles.y = GetAbsAngles().y; pTarget->SetAbsAngles( vecAngles ); pTarget->m_scriptState = SCRIPT_WAIT; m_startTime = gpGlobals->time + 1E6; // UNDONE: Add a flag to do this so people can fixup physics after teleporting monsters pTarget->GetFlags().ClearFlags( FL_ONGROUND ); break; } default: ALERT( at_aiconsole, "aiscript: invalid Move To Position value!" ); break; } ALERT( at_aiconsole, "\"%s\" found and used\n", pTarget->GetTargetname() ); pTarget->m_IdealMonsterState = MONSTERSTATE_SCRIPT; /* if (m_iszIdle) { StartSequence( pTarget, m_iszIdle, false ); if (FStrEq( STRING(m_iszIdle), STRING(m_iszPlay))) { pTarget->SetFrameRate( 0 ); } } */ // Already in a scripted state? if( pTarget->m_MonsterState == MONSTERSTATE_SCRIPT ) { pNewSchedule = pTarget->GetScheduleOfType( SCHED_AISCRIPT ); pTarget->ChangeSchedule( pNewSchedule ); } } }
void CLevel::IR_OnKeyboardPress (int key) { if(Device.dwPrecacheFrame) return; #ifdef INGAME_EDITOR if (Device.editor() && (pInput->iGetAsyncKeyState(DIK_LALT) || pInput->iGetAsyncKeyState(DIK_RALT))) return; #endif // #ifdef INGAME_EDITOR bool b_ui_exist = (!!CurrentGameUI()); EGameActions _curr = get_binded_action(key); if(_curr==kPAUSE) { #ifdef INGAME_EDITOR if (Device.editor()) return; #endif // INGAME_EDITOR if (!g_block_pause && (IsGameTypeSingle() || IsDemoPlay())) { #ifdef DEBUG if(psActorFlags.test(AF_NO_CLIP)) Device.Pause(!Device.Paused(), TRUE, TRUE, "li_pause_key_no_clip"); else #endif //DEBUG Device.Pause(!Device.Paused(), TRUE, TRUE, "li_pause_key"); } return; } if( g_bDisableAllInput ) return; switch ( _curr ) { case kSCREENSHOT: Render->Screenshot(); return; break; case kCONSOLE: Console->Show (); return; break; case kQUIT: { if(b_ui_exist && CurrentGameUI()->TopInputReceiver() ) { if(CurrentGameUI()->IR_UIOnKeyboardPress(key)) return;//special case for mp and main_menu CurrentGameUI()->TopInputReceiver()->HideDialog(); }else { Console->Execute("main_menu"); }return; }break; }; if ( !bReady || !b_ui_exist ) return; if ( b_ui_exist && CurrentGameUI()->IR_UIOnKeyboardPress(key)) return; if ( Device.Paused() && !IsDemoPlay() #ifdef DEBUG && !psActorFlags.test(AF_NO_CLIP) #endif //DEBUG ) return; if ( game && game->OnKeyboardPress(get_binded_action(key)) ) return; if(_curr == kQUICK_SAVE && IsGameTypeSingle()) { Console->Execute ("save"); return; } if(_curr == kQUICK_LOAD && IsGameTypeSingle()) { #ifdef DEBUG FS.get_path ("$game_config$")->m_Flags.set(FS_Path::flNeedRescan, TRUE); FS.get_path ("$game_scripts$")->m_Flags.set(FS_Path::flNeedRescan, TRUE); FS.rescan_pathes (); #endif // DEBUG string_path saved_game,command; strconcat (sizeof(saved_game),saved_game,Core.UserName," - ","quicksave"); if (!CSavedGameWrapper::valid_saved_game(saved_game)) return; strconcat (sizeof(command),command,"load ",saved_game); Console->Execute (command); return; } #ifndef MASTER_GOLD switch (key) { case DIK_F7: { if (GameID() != eGameIDSingle) return; FS.get_path ("$game_config$")->m_Flags.set(FS_Path::flNeedRescan, TRUE); FS.get_path ("$game_scripts$")->m_Flags.set(FS_Path::flNeedRescan, TRUE); FS.rescan_pathes (); NET_Packet net_packet; net_packet.w_begin (M_RELOAD_GAME); Send (net_packet,net_flags(TRUE)); return; } case DIK_DIVIDE: { if (!Server) break; SetGameTimeFactor (g_fTimeFactor); #ifdef DEBUG if(!m_bEnvPaused) SetEnvironmentGameTimeFactor(GetEnvironmentGameTime(), g_fTimeFactor); #else //DEBUG SetEnvironmentGameTimeFactor(GetEnvironmentGameTime(), g_fTimeFactor); #endif //DEBUG break; } case DIK_MULTIPLY: { if (!Server) break; SetGameTimeFactor (1000.f); #ifdef DEBUG if(!m_bEnvPaused) SetEnvironmentGameTimeFactor(GetEnvironmentGameTime(), 1000.f); #else //DEBUG SetEnvironmentGameTimeFactor(GetEnvironmentGameTime(), 1000.f); #endif //DEBUG break; } #ifdef DEBUG case DIK_SUBTRACT:{ if (!Server) break; if(m_bEnvPaused) SetEnvironmentGameTimeFactor(GetEnvironmentGameTime(), g_fTimeFactor); else SetEnvironmentGameTimeFactor(GetEnvironmentGameTime(), 0.00001f); m_bEnvPaused = !m_bEnvPaused; break; } #endif //DEBUG case DIK_NUMPAD5: { if (GameID()!=eGameIDSingle) { Msg("For this game type Demo Record is disabled."); /// return; }; if(!pInput->iGetAsyncKeyState(DIK_LSHIFT)) { Console->Hide (); Console->Execute("demo_record 1"); } } break; #ifdef DEBUG // Lain: added TEMP!!! case DIK_UP: { g_separate_factor /= 0.9f; break; } case DIK_DOWN: { g_separate_factor *= 0.9f; if ( g_separate_factor < 0.1f ) { g_separate_factor = 0.1f; } break; } case DIK_LEFT: { g_separate_radius *= 0.9f; if ( g_separate_radius < 0 ) { g_separate_radius = 0; } break; } case DIK_RIGHT: { g_separate_radius /= 0.9f; break; } case DIK_RETURN: { bDebug = !bDebug; return; } case DIK_BACK: if (GameID() == eGameIDSingle) DRender->NextSceneMode(); //HW.Caps.SceneMode = (HW.Caps.SceneMode+1)%3; return; case DIK_F4: { if (pInput->iGetAsyncKeyState(DIK_LALT)) break; if (pInput->iGetAsyncKeyState(DIK_RALT)) break; bool bOk = false; u32 i=0, j, n=Objects.o_count(); if (pCurrentEntity) for ( ; i<n; ++i) if (Objects.o_get_by_iterator(i) == pCurrentEntity) break; if (i < n) { j = i; bOk = false; for (++i; i <n; ++i) { CEntityAlive* tpEntityAlive = smart_cast<CEntityAlive*>(Objects.o_get_by_iterator(i)); if (tpEntityAlive) { bOk = true; break; } } if (!bOk) for (i = 0; i <j; ++i) { CEntityAlive* tpEntityAlive = smart_cast<CEntityAlive*>(Objects.o_get_by_iterator(i)); if (tpEntityAlive) { bOk = true; break; } } if (bOk) { CObject *tpObject = CurrentEntity(); CObject *__I = Objects.o_get_by_iterator(i); CObject **I = &__I; SetEntity(*I); if (tpObject != *I) { CActor* pActor = smart_cast<CActor*> (tpObject); if (pActor) pActor->inventory().Items_SetCurrentEntityHud(false); } if (tpObject) { Engine.Sheduler.Unregister (tpObject); Engine.Sheduler.Register (tpObject, TRUE); }; Engine.Sheduler.Unregister (*I); Engine.Sheduler.Register (*I, TRUE); CActor* pActor = smart_cast<CActor*> (*I); if (pActor) { pActor->inventory().Items_SetCurrentEntityHud(true); CHudItem* pHudItem = smart_cast<CHudItem*>(pActor->inventory().ActiveItem()); if (pHudItem) { pHudItem->OnStateSwitch(pHudItem->GetState()); } } } } return; } // Lain: added case DIK_F5: { if ( CBaseMonster* pBM = smart_cast<CBaseMonster*>(CurrentEntity())) { DBG().log_debug_info(); } break; } case MOUSE_1: { if (GameID() != eGameIDSingle) break; if (pInput->iGetAsyncKeyState(DIK_LALT)) { if (smart_cast<CActor*>(CurrentEntity())) try_change_current_entity (); else restore_actor (); return; } break; } /**/ #endif #ifdef DEBUG case DIK_F9:{ // if (!ai().get_alife()) // break; // const_cast<CALifeSimulatorHeader&>(ai().alife().header()).set_state(ALife::eZoneStateSurge); break; } return; // case DIK_F10:{ // ai().level_graph().set_dest_point(); // ai().level_graph().build_detail_path(); // if (!Objects.FindObjectByName("m_stalker_e0000") || !Objects.FindObjectByName("localhost/dima")) // return; // if (!m_bSynchronization) { // m_bSynchronization = true; // ai().level_graph().set_start_point(); // m_bSynchronization = false; // } // luabind::functor<void> functor; // ai().script_engine().functor("alife_test.set_switch_online",functor); // functor(0,false); // } // return; // case DIK_F11: // ai().level_graph().build_detail_path(); // if (!Objects.FindObjectByName("m_stalker_e0000") || !Objects.FindObjectByName("localhost/dima")) // return; // if (!m_bSynchronization) { // m_bSynchronization = true; // ai().level_graph().set_dest_point(); // ai().level_graph().select_cover_point(); // m_bSynchronization = false; // } // return; #endif // DEBUG } #endif // MASTER_GOLD if (bindConsoleCmds.execute(key)) return; if (CURRENT_ENTITY()) { IInputReceiver* IR = smart_cast<IInputReceiver*> (smart_cast<CGameObject*>(CURRENT_ENTITY())); if (IR) IR->IR_OnKeyboardPress(get_binded_action(key)); } #ifdef _DEBUG CObject *obj = Level().Objects.FindObjectByName("monster"); if (obj) { CBaseMonster *monster = smart_cast<CBaseMonster *>(obj); if (monster) monster->debug_on_key(key); } #endif }
void CBaseHumanRepel::RepelUse ( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) { TraceResult tr; UTIL_TraceLine( pev->origin, pev->origin + Vector( 0, 0, -4096.0), dont_ignore_monsters, ENT(pev), &tr); /* if ( tr.pHit && Instance( tr.pHit )->pev->solid != SOLID_BSP) return NULL; */ edict_t *pent; CBaseEntity *pEntity; pent = CREATE_NAMED_ENTITY( MAKE_STRING( EntityName() )); if ( FNullEnt( pent ) ) { ALERT ( at_console, "NULL Ent in HumanRepel Create!\n" ); return; } pEntity = Instance( pent ); pEntity->pev->owner = NULL; // pEntity->pev->origin = pev->origin; pEntity->pev->angles = pev->angles; pEntity->pev->spawnflags = pev->spawnflags; pEntity->pev->weapons = pev->weapons; pEntity->pev->scale = pev->scale; pEntity->pev->health = pev->health; pEntity->pev->skin = pev->skin; pEntity->pev->frags = pev->frags;//HL2 model compatibility (not used anymore) pEntity->pev->dmg = pev->dmg;//for monster breakpoint pEntity->pev->message = pev->message;//when a surrender terrorist fires a trigger pEntity->pev->target = pev->noise; //LRC - custom monster behaviour // CBaseEntity *pEntity = CBaseEntity::Instance( pEntity ); CBaseMonster *pMonst = NULL; if (pEntity && (pMonst = pEntity->MyMonsterPointer()) != NULL) { pMonst->m_iClass = this->m_iClass; pMonst->m_iPlayerReact = this->m_iPlayerReact; pMonst->m_iTriggerCondition = this->m_iTriggerCondition; //AJH pMonst->m_iszTriggerTarget = this->m_iszTriggerTarget; //AJH } // /* pEntity->pev->origin = pev->origin; pEntity->pev->angles = pev->angles; pEntity->pev->spawnflags = pev->spawnflags; pEntity->pev->body = pev->body; pEntity->pev->weapons = pev->weapons; pEntity->pev->netname = pev->netname; */ DispatchSpawn( pEntity->edict() ); pEntity->pev->movetype = MOVETYPE_FLY; pEntity->pev->velocity = Vector( 0, 0, RANDOM_FLOAT( -196, -128 ) ); CBaseMonster *pHuman = pEntity->MyMonsterPointer( ); pHuman->SetActivity( ACT_GLIDE ); pHuman->m_vecLastPosition = tr.vecEndPos; CBeam *pBeam = CBeam::BeamCreate( "sprites/rope.spr", 10 ); pBeam->PointEntInit( pev->origin/* + Vector(0,0,112)*/, pEntity->entindex() ); pBeam->SetFlags( BEAM_FSOLID ); pBeam->SetColor( 255, 255, 255 ); pBeam->SetThink( SUB_Remove ); pBeam->pev->nextthink = gpGlobals->time + -4096.0 * tr.flFraction / pEntity->pev->velocity.z + 0.5; UTIL_Remove( this ); }