void CActor::TryToTalk() { if(!IsTalking()) { RunTalkDialog(m_pPersonWeLookingAt, false); } }
bool CActor::CanMove () { if( conditions().IsCantWalk() ) { if(mstate_wishful&mcAnyMove) { HUD().GetUI()->AddInfoMessage("cant_walk"); } return false; }else if( conditions().IsCantWalkWeight() ) { if(mstate_wishful&mcAnyMove) { HUD().GetUI()->AddInfoMessage("cant_walk_weight"); } return false; } if(IsTalking()) return false; else return true; }
bool CActor::CanMove() { if( conditions().IsCantWalk() ) { if(mstate_wishful&mcAnyMove) { CurrentGameUI()->AddCustomStatic("cant_walk", true); } return false; }else if( conditions().IsCantWalkWeight() ) { if(mstate_wishful&mcAnyMove) { CurrentGameUI()->AddCustomStatic("cant_walk_weight", true); } return false; } if(IsTalking()) return false; else return true; }
void CActor::TryToTalk() { VERIFY(m_pPersonWeLookingAt); if(!IsTalking()) { RunTalkDialog(m_pPersonWeLookingAt); } }
void CTalkMonster :: SetActivity ( Activity newActivity ) { if (newActivity == ACT_IDLE && IsTalking() ) newActivity = ACT_SIGNAL3; if ( newActivity == ACT_SIGNAL3 && (LookupActivity ( ACT_SIGNAL3 ) == ACTIVITY_NOT_AVAILABLE)) newActivity = ACT_IDLE; CBaseMonster::SetActivity( newActivity ); }
void CActor::IR_OnKeyboardHold(int cmd) { if(hud_adj_mode && pInput->iGetAsyncKeyState(DIK_LSHIFT)) return; if (Remote() || !g_Alive()) return; if (m_input_external_handler && !m_input_external_handler->authorized(cmd)) return; if (IsTalking()) return; if(m_holder) { m_holder->OnKeyboardHold(cmd); return; } #ifdef DEBUG if(psActorFlags.test(AF_NO_CLIP) && (cmd==kFWD || cmd==kBACK || cmd==kL_STRAFE || cmd==kR_STRAFE || cmd==kJUMP || cmd==kCROUCH)) { NoClipFly(cmd); return; } #endif //DEBUG float LookFactor = GetLookFactor(); switch(cmd) { case kUP: case kDOWN: cam_Active()->Move( (cmd==kUP) ? kDOWN : kUP, 0, LookFactor); break; case kCAM_ZOOM_IN: case kCAM_ZOOM_OUT: cam_Active()->Move(cmd); break; case kLEFT: case kRIGHT: if (eacFreeLook!=cam_active) cam_Active()->Move(cmd, 0, LookFactor); break; case kACCEL: mstate_wishful |= mcAccel; break; case kL_STRAFE: mstate_wishful |= mcLStrafe; break; case kR_STRAFE: mstate_wishful |= mcRStrafe; break; case kL_LOOKOUT:mstate_wishful |= mcLLookout; break; case kR_LOOKOUT:mstate_wishful |= mcRLookout; break; case kFWD: mstate_wishful |= mcFwd; break; case kBACK: mstate_wishful |= mcBack; break; case kCROUCH: { if( !psActorFlags.test(AF_CROUCH_TOGGLE) ) mstate_wishful |= mcCrouch; }break; } }
void CInventoryOwner::UpdateInventoryOwner(u32 deltaT) { inventory().Update(); if(m_pTrade) m_pTrade->UpdateTrade(); if(IsTalking()) { //если наш собеседник перестал говорить с нами, //то и нам нечего ждать. if(!m_pTalkPartner->IsTalking()) { StopTalk(); } //если мы умерли, то тоже не говорить CEntityAlive* pOurEntityAlive = smart_cast<CEntityAlive*>(this); R_ASSERT(pOurEntityAlive); if(!pOurEntityAlive->g_Alive()) StopTalk(); } }
void CActor::IR_OnKeyboardHold(int cmd) { if (m_blocked_actions.find((EGameActions)cmd) != m_blocked_actions.end() ) return; // Real Wolf. 14.10.2014 if (Remote() || !g_Alive()) return; // if (conditions().IsSleeping()) return; if (m_input_external_handler && !m_input_external_handler->authorized(cmd)) return; if (IsTalking()) return; if(m_holder) { m_holder->OnKeyboardHold(cmd); return; } float LookFactor = GetLookFactor(); switch(cmd) { case kUP: case kDOWN: cam_Active()->Move( (cmd==kUP) ? kDOWN : kUP, 0, LookFactor); break; case kCAM_ZOOM_IN: case kCAM_ZOOM_OUT: cam_Active()->Move(cmd); break; case kLEFT: case kRIGHT: if (eacFreeLook!=cam_active) cam_Active()->Move(cmd, 0, LookFactor); break; case kACCEL: mstate_wishful |= mcAccel; break; case kL_STRAFE: mstate_wishful |= mcLStrafe; break; case kR_STRAFE: mstate_wishful |= mcRStrafe; break; case kL_LOOKOUT:mstate_wishful |= mcLLookout; break; case kR_LOOKOUT:mstate_wishful |= mcRLookout; break; case kFWD: mstate_wishful |= mcFwd; break; case kBACK: mstate_wishful |= mcBack; break; case kCROUCH: mstate_wishful |= mcCrouch; break; } }
void CTalkMonster :: Touch( CBaseEntity *pOther ) { // Did the player touch me? if ( pOther->IsPlayer() ) { // Ignore if pissed at player if ( m_afMemory & bits_MEMORY_PROVOKED ) return; // Stay put during speech if ( IsTalking() ) return; // Heuristic for determining if the player is pushing me away float speed = fabs(pOther->GetAbsVelocity().x) + fabs(pOther->GetAbsVelocity().y); if ( speed > 50 ) { SetConditions( bits_COND_CLIENT_PUSH ); MakeIdealYaw( pOther->GetAbsOrigin() ); } } }
void CMTalkMonster :: TalkTouch( edict_t *pOther ) { // Did the player touch me? if ( UTIL_IsPlayer(pOther) ) { // Ignore if pissed at player if ( m_afMemory & bits_MEMORY_PROVOKED ) return; // Stay put during speech if ( IsTalking() ) return; // Heuristic for determining if the player is pushing me away float speed = fabs(pOther->v.velocity.x) + fabs(pOther->v.velocity.y); if ( speed > 50 ) { SetConditions( bits_COND_CLIENT_PUSH ); MakeIdealYaw( pOther->v.origin ); } } }
void CTalkMonster :: RunTask( const Task_t& task ) { switch( task.iTask ) { case TASK_TLK_CLIENT_STARE: case TASK_TLK_LOOK_AT_CLIENT: { edict_t *pPlayer; // track head to the client for a while. if( m_MonsterState == MONSTERSTATE_IDLE && !IsMoving() && !IsTalking() ) { // Get edict for one player pPlayer = g_engfuncs.pfnPEntityOfEntIndex( 1 ); if( pPlayer ) { IdleHeadTurn( pPlayer->v.origin ); } } else { // started moving or talking TaskFail(); return; } if( pPlayer ) { if( task.iTask == TASK_TLK_CLIENT_STARE ) { // fail out if the player looks away or moves away. if( ( pPlayer->v.origin - GetAbsOrigin() ).Length2D() > TLK_STARE_DIST ) { // player moved away. TaskFail(); } UTIL_MakeVectors( pPlayer->v.angles ); if( UTIL_DotPoints( pPlayer->v.origin, GetAbsOrigin(), gpGlobals->v_forward ) < m_flFieldOfView ) { // player looked away TaskFail(); } } } else { TaskFail(); } if( gpGlobals->time > m_flWaitFinished ) { TaskComplete(); } break; } case TASK_FACE_PLAYER: { // Get edict for one player edict_t *pPlayer = g_engfuncs.pfnPEntityOfEntIndex( 1 ); if( pPlayer ) { MakeIdealYaw( pPlayer->v.origin ); ChangeYaw( GetYawSpeed() ); IdleHeadTurn( pPlayer->v.origin ); if( gpGlobals->time > m_flWaitFinished && FlYawDiff() < 10 ) { TaskComplete(); } } else { TaskFail(); } break; } case TASK_TLK_EYECONTACT: { if( !IsMoving() && IsTalking() && m_hTalkTarget != NULL ) { // ALERT( at_console, "waiting %f\n", m_flStopTalkTime - gpGlobals->time ); IdleHeadTurn( m_hTalkTarget->GetAbsOrigin() ); } else { TaskComplete(); } break; } case TASK_WALK_PATH_FOR_UNITS: { float distance; distance = (m_vecLastPosition - GetAbsOrigin()).Length2D(); // Walk path until far enough away if ( distance > task.flData || MovementIsComplete() ) { TaskComplete(); RouteClear(); // Stop moving } break; } case TASK_WAIT_FOR_MOVEMENT: { if( IsTalking() && m_hTalkTarget != NULL ) { // ALERT(at_console, "walking, talking\n"); IdleHeadTurn( m_hTalkTarget->GetAbsOrigin() ); } else { IdleHeadTurn( GetAbsOrigin() ); // override so that during walk, a scientist may talk and greet player FIdleHello(); if( RANDOM_LONG( 0, m_nSpeak * 20 ) == 0 ) { FIdleSpeak(); } } CBaseMonster::RunTask( task ); if( TaskIsComplete() ) IdleHeadTurn( GetAbsOrigin() ); break; } default: { if( IsTalking() && m_hTalkTarget != NULL ) { IdleHeadTurn( m_hTalkTarget->GetAbsOrigin() ); } else { SetBoneController( 0, 0 ); } CBaseMonster::RunTask( task ); break; } } }
Schedule_t* CTalkMonster :: GetScheduleOfType ( int Type ) { switch( Type ) { case SCHED_MOVE_AWAY: return slMoveAway; case SCHED_MOVE_AWAY_FOLLOW: return slMoveAwayFollow; case SCHED_MOVE_AWAY_FAIL: return slMoveAwayFail; case SCHED_TARGET_FACE: // speak during 'use' if (RANDOM_LONG(0,99) < 2) //ALERT ( at_console, "target chase speak\n" ); return slIdleSpeakWait; else return slIdleStand; case SCHED_IDLE_STAND: { // if never seen player, try to greet him if (!FBitSet(m_bitsSaid, bit_saidHelloPlayer)) { return slIdleHello; } // sustained light wounds? if (!FBitSet(m_bitsSaid, bit_saidWoundLight) && ( GetHealth() <= ( GetMaxHealth() * 0.75))) { //SENTENCEG_PlayRndSz( this, m_szGrp[TLK_WOUND], 1.0, ATTN_IDLE, 0, GetVoicePitch() ); //CTalkMonster::g_talkWaitTime = gpGlobals->time + RANDOM_FLOAT(2.8, 3.2); PlaySentence( m_szGrp[TLK_WOUND], RANDOM_FLOAT(2.8, 3.2), VOL_NORM, ATTN_IDLE ); SetBits(m_bitsSaid, bit_saidWoundLight); return slIdleStand; } // sustained heavy wounds? else if (!FBitSet(m_bitsSaid, bit_saidWoundHeavy) && ( GetHealth() <= ( GetMaxHealth() * 0.5))) { //SENTENCEG_PlayRndSz( this, m_szGrp[TLK_MORTAL], 1.0, ATTN_IDLE, 0, GetVoicePitch() ); //CTalkMonster::g_talkWaitTime = gpGlobals->time + RANDOM_FLOAT(2.8, 3.2); PlaySentence( m_szGrp[TLK_MORTAL], RANDOM_FLOAT(2.8, 3.2), VOL_NORM, ATTN_IDLE ); SetBits(m_bitsSaid, bit_saidWoundHeavy); return slIdleStand; } // talk about world if (FOkToSpeak() && RANDOM_LONG(0,m_nSpeak * 2) == 0) { //ALERT ( at_console, "standing idle speak\n" ); return slIdleSpeak; } if ( !IsTalking() && HasConditions ( bits_COND_SEE_CLIENT ) && RANDOM_LONG( 0, 6 ) == 0 ) { edict_t *pPlayer = g_engfuncs.pfnPEntityOfEntIndex( 1 ); if ( pPlayer ) { // watch the client. UTIL_MakeVectors ( pPlayer->v.angles ); if ( ( pPlayer->v.origin - GetAbsOrigin() ).Length2D() < TLK_STARE_DIST && UTIL_DotPoints( pPlayer->v.origin, GetAbsOrigin(), gpGlobals->v_forward ) >= m_flFieldOfView ) { // go into the special STARE schedule if the player is close, and looking at me too. return &slTlkIdleWatchClient[ 1 ]; } return slTlkIdleWatchClient; } } else { if (IsTalking()) // look at who we're talking to return slTlkIdleEyecontact; else // regular standing idle return slIdleStand; } // NOTE - caller must first CTalkMonster::GetScheduleOfType, // then check result and decide what to return ie: if sci gets back // slIdleStand, return slIdleSciStand } break; } return CBaseMonster::GetScheduleOfType( Type ); }
void CActor::IR_OnKeyboardPress(int cmd) { if(hud_adj_mode && pInput->iGetAsyncKeyState(DIK_LSHIFT)) return; if (Remote()) return; if (IsTalking()) return; if (m_input_external_handler && !m_input_external_handler->authorized(cmd)) return; switch (cmd) { case kWPN_FIRE: { /* XEM #95 */ //if( (mstate_wishful & mcLookout) && !IsGameTypeSingle() ) return; u16 slot = inventory().GetActiveSlot(); if(inventory().ActiveItem() && (slot==INV_SLOT_3 || slot==INV_SLOT_2) ) mstate_wishful &=~mcSprint; //----------------------------- if (OnServer()) { NET_Packet P; P.w_begin(M_PLAYER_FIRE); P.w_u16(ID()); u_EventSend(P); } }break; default: { }break; } if (!g_Alive()) return; if(m_holder && kUSE != cmd) { m_holder->OnKeyboardPress (cmd); if(m_holder->allowWeapon() && inventory().Action((u16)cmd, CMD_START)) return; return; }else if(inventory().Action((u16)cmd, CMD_START)) return; #ifdef DEBUG if(psActorFlags.test(AF_NO_CLIP)) { NoClipFly(cmd); return; } #endif //DEBUG switch(cmd) { case kJUMP: { mstate_wishful |= mcJump; }break; case kSPRINT_TOGGLE: { mstate_wishful ^= mcSprint; }break; case kCROUCH: { if( psActorFlags.test(AF_CROUCH_TOGGLE) ) mstate_wishful ^= mcCrouch; }break; case kCAM_1: cam_Set (eacFirstEye); break; case kCAM_2: cam_Set (eacLookAt); break; case kCAM_3: cam_Set (eacFreeLook); break; case kNIGHT_VISION: { SwitchNightVision(); break; } case kTORCH: { SwitchTorch(); break; } case kDETECTOR: { PIItem det_active = inventory().ItemFromSlot(DETECTOR_SLOT); if(det_active) { CCustomDetector* det = smart_cast<CCustomDetector*>(det_active); det->ToggleDetector (g_player_hud->attached_item(0)!=NULL); return; } }break; /* case kFLARE:{ PIItem fl_active = inventory().ItemFromSlot(FLARE_SLOT); if(fl_active) { CFlare* fl = smart_cast<CFlare*>(fl_active); fl->DropFlare (); return ; } PIItem fli = inventory().Get(CLSID_DEVICE_FLARE, true); if(!fli) return; CFlare* fl = smart_cast<CFlare*>(fli); if(inventory().Slot(fl)) fl->ActivateFlare (); }break; */ case kUSE: ActorUse(); break; case kDROP: b_DropActivated = TRUE; f_DropPower = 0; break; case kNEXT_SLOT: { OnNextWeaponSlot(); }break; case kPREV_SLOT: { OnPrevWeaponSlot(); }break; case kQUICK_USE_1: case kQUICK_USE_2: case kQUICK_USE_3: case kQUICK_USE_4: { const shared_str& item_name = g_quick_use_slots[cmd-kQUICK_USE_1]; if(item_name.size()) { PIItem itm = inventory().GetAny(item_name.c_str()); if(itm) { if (IsGameTypeSingle()) { inventory().Eat (itm); } else { inventory().ClientEat (itm); } StaticDrawableWrapper* _s = CurrentGameUI()->AddCustomStatic("item_used", true); string1024 str; strconcat (sizeof(str),str,*CStringTable().translate("st_item_used"),": ", itm->NameItem()); _s->wnd()->TextItemControl()->SetText(str); CurrentGameUI()->GetActorMenu().m_pQuickSlot->ReloadReferences(this); } } }break; } }
void CActor::IR_OnKeyboardPress(int cmd) { if (m_blocked_actions.find((EGameActions)cmd) != m_blocked_actions.end() ) return; // Real Wolf. 14.10.2014 if (Remote()) return; // if (conditions().IsSleeping()) return; if (IsTalking()) return; if (m_input_external_handler && !m_input_external_handler->authorized(cmd)) return; switch (cmd) { case kWPN_FIRE: { mstate_wishful &=~mcSprint; //----------------------------- if (OnServer()) { NET_Packet P; P.w_begin(M_PLAYER_FIRE); P.w_u16(ID()); u_EventSend(P); } }break; default: { }break; } if (!g_Alive()) return; if(m_holder && kUSE != cmd) { m_holder->OnKeyboardPress (cmd); if(m_holder->allowWeapon() && inventory().Action(cmd, CMD_START)) return; return; }else if(inventory().Action(cmd, CMD_START)) return; switch(cmd){ case kJUMP: { mstate_wishful |= mcJump; { // NET_Packet P; // u_EventGen(P, GE_ACTOR_JUMPING, ID()); // u_EventSend(P); } }break; case kCROUCH_TOGGLE: { g_bAutoClearCrouch = !g_bAutoClearCrouch; if (!g_bAutoClearCrouch) mstate_wishful |= mcCrouch; }break; case kSPRINT_TOGGLE: { if (mstate_wishful & mcSprint) mstate_wishful &=~mcSprint; else mstate_wishful |= mcSprint; }break; case kCAM_1: cam_Set (eacFirstEye); break; case kCAM_2: cam_Set (eacLookAt); break; case kCAM_3: cam_Set (eacFreeLook); break; case kNIGHT_VISION: { const xr_vector<CAttachableItem*>& all = CAttachmentOwner::attached_objects(); xr_vector<CAttachableItem*>::const_iterator it = all.begin(); xr_vector<CAttachableItem*>::const_iterator it_e = all.end(); for(;it!=it_e;++it){ CTorch* torch = smart_cast<CTorch*>(*it); if (torch){ torch->SwitchNightVision(); break; } } }break; case kTORCH:{ const xr_vector<CAttachableItem*>& all = CAttachmentOwner::attached_objects(); xr_vector<CAttachableItem*>::const_iterator it = all.begin(); xr_vector<CAttachableItem*>::const_iterator it_e = all.end(); for(;it!=it_e;++it){ CTorch* torch = smart_cast<CTorch*>(*it); if (torch){ torch->Switch(); break; } } }break; case kWPN_1: case kWPN_2: case kWPN_3: case kWPN_4: case kWPN_5: case kWPN_6: case kWPN_RELOAD: //Weapons->ActivateWeaponID (cmd-kWPN_1); break; case kUSE: ActorUse(); break; case kDROP: b_DropActivated = TRUE; f_DropPower = 0; break; case kNEXT_SLOT: { OnNextWeaponSlot(); }break; case kPREV_SLOT: { OnPrevWeaponSlot(); }break; case kUSE_BANDAGE: case kUSE_MEDKIT: { if(IsGameTypeSingle()) { PIItem itm = inventory().item((cmd==kUSE_BANDAGE)? CLSID_IITEM_BANDAGE:CLSID_IITEM_MEDKIT ); if(itm) { inventory().Eat (itm); SDrawStaticStruct* _s = HUD().GetUI()->UIGame()->AddCustomStatic("item_used", true); _s->m_endTime = Device.fTimeGlobal+3.0f;// 3sec string1024 str; strconcat (sizeof(str),str,*CStringTable().translate("st_item_used"),": ", itm->Name()); _s->wnd()->SetText (str); } } }break; #ifdef INV_NEW_SLOTS_SYSTEM case kUSE_SLOT_QUICK_ACCESS_0: case kUSE_SLOT_QUICK_ACCESS_1: case kUSE_SLOT_QUICK_ACCESS_2: case kUSE_SLOT_QUICK_ACCESS_3: { if(IsGameTypeSingle()) { PIItem itm = 0; switch (cmd){ case kUSE_SLOT_QUICK_ACCESS_0: itm = inventory().m_slots[SLOT_QUICK_ACCESS_0].m_pIItem; break; case kUSE_SLOT_QUICK_ACCESS_1: itm = inventory().m_slots[SLOT_QUICK_ACCESS_1].m_pIItem; break; case kUSE_SLOT_QUICK_ACCESS_2: itm = inventory().m_slots[SLOT_QUICK_ACCESS_2].m_pIItem; break; case kUSE_SLOT_QUICK_ACCESS_3: itm = inventory().m_slots[SLOT_QUICK_ACCESS_3].m_pIItem; break; } if (itm){ CMedkit* pMedkit = smart_cast<CMedkit*> (itm); CAntirad* pAntirad = smart_cast<CAntirad*> (itm); CEatableItem* pEatableItem = smart_cast<CEatableItem*> (itm); CBottleItem* pBottleItem = smart_cast<CBottleItem*> (itm); string1024 str; if(pMedkit || pAntirad || pEatableItem || pBottleItem){ PIItem iitm = inventory().Same(itm,true); if(iitm){ inventory().Eat(iitm); strconcat(sizeof(str),str,*CStringTable().translate("st_item_used"),": ", iitm->Name()); }else{ inventory().Eat(itm); strconcat(sizeof(str),str,*CStringTable().translate("st_item_used"),": ", itm->Name()); } SDrawStaticStruct* _s = HUD().GetUI()->UIGame()->AddCustomStatic("item_used", true); _s->m_endTime = Device.fTimeGlobal+3.0f;// 3sec _s->wnd()->SetText (str); } } } }break; #endif } }