BOOL CAI_Rat::feel_vision_isRelevant(CObject* O) { CEntityAlive* E = smart_cast<CEntityAlive*> (O); if (!E) return FALSE; if ((E->g_Team() == g_Team()) && (E->g_Alive())) return FALSE; return TRUE; }
BOOL CBastArtefact::feel_touch_contact(CObject* O) { CEntityAlive* pEntityAlive = smart_cast<CEntityAlive*>(O); if(pEntityAlive && pEntityAlive->g_Alive()) return TRUE; else return FALSE; }
void CBastArtefact::feel_touch_new(CObject* O) { CEntityAlive* pEntityAlive = smart_cast<CEntityAlive*>(O); if(pEntityAlive && pEntityAlive->g_Alive()) { m_AliveList.push_back(pEntityAlive); } }
void CCameraLook2::Update(Fvector& point, Fvector&) { if(!m_locked_enemy) {//autoaim if( pInput->iGetAsyncKeyState(cam_dik) ) { const CVisualMemoryManager::VISIBLES& vVisibles = Actor()->memory().visual().objects(); CVisualMemoryManager::VISIBLES::const_iterator v_it = vVisibles.begin(); float _nearest_dst = flt_max; for (; v_it!=vVisibles.end(); ++v_it) { const CObject* _object_ = (*v_it).m_object; if (!Actor()->memory().visual().visible_now(smart_cast<const CGameObject*>(_object_))) continue; CObject* object_ = const_cast<CObject*>(_object_); CEntityAlive* EA = smart_cast<CEntityAlive*>(object_); if(!EA || !EA->g_Alive()) continue; float d = object_->Position().distance_to_xz(Actor()->Position()); if( !m_locked_enemy || d<_nearest_dst) { m_locked_enemy = object_; _nearest_dst = d; } } //. if(m_locked_enemy) Msg("enemy is %s", *m_locked_enemy->cNameSect() ); } }else { if( !pInput->iGetAsyncKeyState(cam_dik) ){ m_locked_enemy = NULL; //. Msg ("enemy is NILL"); } } if(m_locked_enemy) UpdateAutoAim (); Fmatrix mR; mR.setHPB (-yaw,-pitch,-roll); vDirection.set (mR.k); vNormal.set (mR.j); Fmatrix a_xform; a_xform.setXYZ (0, -yaw, 0); a_xform.translate_over (point); Fvector _off = m_cam_offset; a_xform.transform_tiny (_off); vPosition.set (_off); }
//нам предлагают поговорить, //проверяем наше отношение //и если не враг начинаем разговор bool CInventoryOwner::OfferTalk(CInventoryOwner* talk_partner) { if(!IsTalkEnabled()) return false; //проверить отношение к собеседнику CEntityAlive* pOurEntityAlive = smart_cast<CEntityAlive*>(this); R_ASSERT(pOurEntityAlive); CEntityAlive* pPartnerEntityAlive = smart_cast<CEntityAlive*>(talk_partner); R_ASSERT(pPartnerEntityAlive); // ALife::ERelationType relation = RELATION_REGISTRY().GetRelationType(this, talk_partner); // if(relation == ALife::eRelationTypeEnemy) return false; if(!pOurEntityAlive->g_Alive() || !pPartnerEntityAlive->g_Alive()) return false; StartTalk(talk_partner); return true; }
void CBaseGraviZone::AffectPull(CPhysicsShellHolder* GO,const Fvector& throw_in_dir,float dist) { CEntityAlive* EA = smart_cast<CEntityAlive*>(GO); if(EA && EA->g_Alive()) { AffectPullAlife(EA,throw_in_dir,dist); } else if(GO && GO->PPhysicsShell()) { AffectPullDead(GO,throw_in_dir,dist); } }
void CPda::UpdateActiveContacts () { m_active_contacts.clear_not_free(); xr_vector<CObject*>::iterator it= feel_touch.begin(); for(;it!=feel_touch.end();++it){ CEntityAlive* pEA = smart_cast<CEntityAlive*>(*it); if(!!pEA->g_Alive() && !pEA->cast_base_monster()) { m_active_contacts.push_back(*it); } } }
bool CBaseMonster::bfAssignMonsterAction(CScriptEntityAction *tpEntityAction) { if (!inherited::bfAssignMonsterAction(tpEntityAction)) return false; CScriptMonsterAction &l_tAction = tpEntityAction->m_tMonsterAction; if (l_tAction.completed()) return false; CEntityAlive *pE = smart_cast<CEntityAlive *>(l_tAction.m_tObject); switch(l_tAction.m_tAction) { case eGA_Rest: StateMan->force_script_state(eStateRest); break; case eGA_Eat: if (pE && !pE->getDestroy() && !pE->g_Alive()){ CorpseMan.force_corpse(pE); StateMan->force_script_state(eStateEat); } else StateMan->force_script_state(eStateRest); break; case eGA_Attack: if (pE && !pE->getDestroy() && pE->g_Alive()){ EnemyMan.force_enemy(pE); StateMan->force_script_state(eStateAttack); } else StateMan->force_script_state(eStateRest); break; case eGA_Panic: if (pE && !pE->getDestroy() && pE->g_Alive()){ EnemyMan.force_enemy (pE); StateMan->force_script_state (eStatePanic); } else StateMan->force_script_state (eStateRest); break; } m_script_state_must_execute = true; return (!l_tAction.m_bCompleted); }
void CInventoryOwner::UpdateInventoryOwner(u32 deltaT) { inventory().Update(); if ( m_pTrade ) { m_pTrade->UpdateTrade(); } if ( IsTrading() ) { //если мы умерли, то нет "trade" CEntityAlive* pOurEntityAlive = smart_cast<CEntityAlive*>(this); R_ASSERT(pOurEntityAlive); if ( !pOurEntityAlive->g_Alive() ) { StopTrading(); } } if ( IsTalking() ) { //если наш собеседник перестал говорить с нами, //то и нам нечего ждать. if ( !m_pTalkPartner->IsTalking() ) { StopTalk(); } //если мы умерли, то тоже не говорить CEntityAlive* pOurEntityAlive = smart_cast<CEntityAlive*>(this); R_ASSERT(pOurEntityAlive); if ( !pOurEntityAlive->g_Alive() ) { StopTalk(); } } }
void CInventoryOwner::SetCommunity (CHARACTER_COMMUNITY_INDEX new_community) { CEntityAlive* EA = smart_cast<CEntityAlive*>(this); VERIFY(EA); CSE_Abstract* e_entity = ai().alife().objects().object(EA->ID(), false); if(!e_entity) return; CharacterInfo().SetCommunity( new_community ); if( EA->g_Alive() ) { EA->ChangeTeam(CharacterInfo().Community().team(), EA->g_Squad(), EA->g_Group()); } CSE_ALifeTraderAbstract* trader = smart_cast<CSE_ALifeTraderAbstract*>(e_entity); if(!trader) return; // EA->id_Team = CharacterInfo().Community().team(); trader->m_community_index = new_community; }
void CPda::shedule_Update(u32 dt) { inherited::shedule_Update (dt); if(!H_Parent()) return; Position().set (H_Parent()->Position()); if( IsOn() && Level().CurrentEntity() && Level().CurrentEntity()->ID()==H_Parent()->ID() ) { CEntityAlive* EA = smart_cast<CEntityAlive*>(H_Parent()); if(!EA || !EA->g_Alive()) { TurnOff(); return; } feel_touch_update(Position(),m_fRadius); UpdateActiveContacts (); } }
BOOL CBaseMonster::feel_vision_isRelevant(CObject* O) { if (!g_Alive()) return FALSE; if (0==smart_cast<CEntity*>(O)) return FALSE; if ((O->spatial.type & STYPE_VISIBLEFORAI) != STYPE_VISIBLEFORAI) return FALSE; // если спит, то ничего не видит if (m_bSleep) return FALSE; // если не враг - не видит CEntityAlive* entity = smart_cast<CEntityAlive*> (O); if (entity && entity->g_Alive()) { if (!EnemyMan.is_enemy(entity)) { // если видит друга - проверить наличие у него врагов CBaseMonster *monster = smart_cast<CBaseMonster *>(entity); if (monster && !m_skip_transfer_enemy) EnemyMan.transfer_enemy(monster); return FALSE; } } return TRUE; }
void CCustomZone::feel_touch_new (CObject* O) { // if(smart_cast<CActor*>(O) && O == Level().CurrentEntity()) // m_pLocalActor = smart_cast<CActor*>(O); CGameObject* pGameObject = smart_cast<CGameObject*>(O); CEntityAlive* pEntityAlive = smart_cast<CEntityAlive*>(pGameObject); CArtefact* pArtefact = smart_cast<CArtefact*>(pGameObject); SZoneObjectInfo object_info ; object_info.object = pGameObject; if(pEntityAlive && pEntityAlive->g_Alive()) object_info.nonalive_object = false; else object_info.nonalive_object = true; if(pGameObject->Radius()<SMALL_OBJECT_RADIUS) object_info.small_object = true; else object_info.small_object = false; if((object_info.small_object && m_zone_flags.test(eIgnoreSmall)) || (object_info.nonalive_object && m_zone_flags.test(eIgnoreNonAlive)) || (pArtefact && m_zone_flags.test(eIgnoreArtefact))) object_info.zone_ignore = true; else object_info.zone_ignore = false; enter_Zone(object_info); m_ObjectInfoMap.push_back(object_info); if (IsEnabled()) { PlayEntranceParticles(pGameObject); PlayObjectIdleParticles(pGameObject); } };
void CHUDTarget::Render() { VERIFY (g_bRendering); CObject* O = Level().CurrentEntity(); if (0==O) return; CEntity* E = smart_cast<CEntity*>(O); if (0==E) return; Fvector p1 = Device.vCameraPosition; Fvector dir = Device.vCameraDirection; // Render cursor u32 C = C_DEFAULT; FVF::TL PT; Fvector p2; p2.mad (p1,dir,RQ.range); PT.transform (p2,Device.mFullTransform); float di_size = C_SIZE/powf(PT.p.w,.2f); CGameFont* F = HUD().Font().pFontGraffiti19Russian; F->SetAligment (CGameFont::alCenter); F->OutSetI (0.f,0.05f); if (psHUD_Flags.test(HUD_CROSSHAIR_DIST)){ F->SetColor (C); F->OutNext ("%4.1f",RQ.range); } if (psHUD_Flags.test(HUD_INFO)){ if (RQ.O){ CEntityAlive* E = smart_cast<CEntityAlive*> (RQ.O); CEntityAlive* pCurEnt = smart_cast<CEntityAlive*> (Level().CurrentEntity()); PIItem l_pI = smart_cast<PIItem> (RQ.O); if (IsGameTypeSingle()) { CInventoryOwner* our_inv_owner = smart_cast<CInventoryOwner*>(pCurEnt); if (E && E->g_Alive() && !E->cast_base_monster()) { //. CInventoryOwner* our_inv_owner = smart_cast<CInventoryOwner*>(pCurEnt); CInventoryOwner* others_inv_owner = smart_cast<CInventoryOwner*>(E); if(our_inv_owner && others_inv_owner){ switch(RELATION_REGISTRY().GetRelationType(others_inv_owner, our_inv_owner)) { case ALife::eRelationTypeEnemy: C = C_ON_ENEMY; break; case ALife::eRelationTypeNeutral: C = C_ON_NEUTRAL; break; case ALife::eRelationTypeFriend: C = C_ON_FRIEND; break; } if (fuzzyShowInfo>0.5f){ CStringTable strtbl ; F->SetColor (subst_alpha(C,u8(iFloor(255.f*(fuzzyShowInfo-0.5f)*2.f)))); F->OutNext ("%s", *strtbl.translate(others_inv_owner->Name()) ); F->OutNext ("%s", *strtbl.translate(others_inv_owner->CharacterInfo().Community().id()) ); } } fuzzyShowInfo += SHOW_INFO_SPEED*Device.fTimeDelta; } else if (l_pI && our_inv_owner && RQ.range < 2.0f*our_inv_owner->inventory().GetTakeDist()) { if (fuzzyShowInfo>0.5f){ F->SetColor (subst_alpha(C,u8(iFloor(255.f*(fuzzyShowInfo-0.5f)*2.f)))); F->OutNext ("%s",l_pI->Name/*Complex*/()); } fuzzyShowInfo += SHOW_INFO_SPEED*Device.fTimeDelta; } } else { if (E && (E->GetfHealth()>0)) { if (pCurEnt && GameID() == GAME_SINGLE){ if (GameID() == GAME_DEATHMATCH) C = C_ON_ENEMY; else{ if (E->g_Team() != pCurEnt->g_Team()) C = C_ON_ENEMY; else C = C_ON_FRIEND; }; if (RQ.range >= recon_mindist() && RQ.range <= recon_maxdist()){ float ddist = (RQ.range - recon_mindist())/(recon_maxdist() - recon_mindist()); float dspeed = recon_minspeed() + (recon_maxspeed() - recon_minspeed())*ddist; fuzzyShowInfo += Device.fTimeDelta/dspeed; }else{ if (RQ.range < recon_mindist()) fuzzyShowInfo += recon_minspeed()*Device.fTimeDelta; else fuzzyShowInfo = 0; }; if (fuzzyShowInfo>0.5f){ clamp(fuzzyShowInfo,0.f,1.f); int alpha_C = iFloor(255.f*(fuzzyShowInfo-0.5f)*2.f); u8 alpha_b = u8(alpha_C & 0x00ff); F->SetColor (subst_alpha(C,alpha_b)); F->OutNext ("%s",*RQ.O->cName()); } } }; }; }else{ fuzzyShowInfo -= HIDE_INFO_SPEED*Device.fTimeDelta; } clamp(fuzzyShowInfo,0.f,1.f); } //отрендерить кружочек или крестик if(!m_bShowCrosshair){ // actual rendering u32 vOffset; FVF::TL* pv = (FVF::TL*)RCache.Vertex.Lock(4,hGeom.stride(),vOffset); float size_x = float(Device.dwWidth) * di_size; float size_y = float(Device.dwHeight) * di_size; size_y = size_x; float w_2 = Device.fWidth_2; float h_2 = Device.fHeight_2; // Convert to screen coords float cx = (PT.p.x+1)*w_2; float cy = (PT.p.y+1)*h_2; pv->set (cx - size_x, cy + size_y, C, 0, 1); ++pv; pv->set (cx - size_x, cy - size_y, C, 0, 0); ++pv; pv->set (cx + size_x, cy + size_y, C, 1, 1); ++pv; pv->set (cx + size_x, cy - size_y, C, 1, 0); ++pv; // unlock VB and Render it as triangle LIST RCache.Vertex.Unlock(4,hGeom.stride()); RCache.set_Shader (hShader); RCache.set_Geometry (hGeom); RCache.Render (D3DPT_TRIANGLELIST,vOffset,0,4,0,2); }else{ //отрендерить прицел HUDCrosshair.cross_color = C; HUDCrosshair.OnRender (); } }
void CActor::ActorUse() { //mstate_real = 0; PickupModeOn(); if (m_holder) { CGameObject* GO = smart_cast<CGameObject*>(m_holder); NET_Packet P; CGameObject::u_EventGen (P, GEG_PLAYER_DETACH_HOLDER, ID()); P.w_u32 (GO->ID()); CGameObject::u_EventSend (P); return; } if(character_physics_support()->movement()->PHCapture()) character_physics_support()->movement()->PHReleaseObject(); if(m_pUsableObject)m_pUsableObject->use(this); if(m_pInvBoxWeLookingAt && m_pInvBoxWeLookingAt->nonscript_usable()) { CUIGameSP* pGameSP = smart_cast<CUIGameSP*>(HUD().GetUI()->UIGame()); if(pGameSP) pGameSP->StartCarBody(this, m_pInvBoxWeLookingAt ); return; } if(!m_pUsableObject||m_pUsableObject->nonscript_usable()) { if(m_pPersonWeLookingAt) { CEntityAlive* pEntityAliveWeLookingAt = smart_cast<CEntityAlive*>(m_pPersonWeLookingAt); VERIFY(pEntityAliveWeLookingAt); if (GameID()==GAME_SINGLE) { if(pEntityAliveWeLookingAt->g_Alive()) { TryToTalk(); } //обыск трупа else if(!Level().IR_GetKeyState(DIK_LSHIFT)) { //только если находимся в режиме single CUIGameSP* pGameSP = smart_cast<CUIGameSP*>(HUD().GetUI()->UIGame()); if(pGameSP)pGameSP->StartCarBody(this, m_pPersonWeLookingAt ); } } } collide::rq_result& RQ = HUD().GetCurrentRayQuery(); CPhysicsShellHolder* object = smart_cast<CPhysicsShellHolder*>(RQ.O); u16 element = BI_NONE; if(object) element = (u16)RQ.element; if(object && Level().IR_GetKeyState(DIK_LSHIFT)) { bool b_allow = !!pSettings->line_exist("ph_capture_visuals",object->cNameVisual()); if(b_allow && !character_physics_support()->movement()->PHCapture()) { character_physics_support()->movement()->PHCaptureObject(object,element); } } else { if (object && smart_cast<CHolderCustom*>(object)) { NET_Packet P; CGameObject::u_EventGen (P, GEG_PLAYER_ATTACH_HOLDER, ID()); P.w_u32 (object->ID()); CGameObject::u_EventSend (P); return; } } } }
// called as usual void CCustomZone::shedule_Update(u32 dt) { m_zone_flags.set(eZoneIsActive, FALSE); if (IsEnabled()) { const Fsphere& s = CFORM()->getSphere(); Fvector P; XFORM().transform_tiny (P,s.P); // update feel_touch_update (P,s.R); //пройтись по всем объектам в зоне //и проверить их состояние for(OBJECT_INFO_VEC_IT it = m_ObjectInfoMap.begin(); m_ObjectInfoMap.end() != it; ++it) { CGameObject* pObject = (*it).object; if (!pObject) continue; CEntityAlive* pEntityAlive = smart_cast<CEntityAlive*>(pObject); SZoneObjectInfo& info = (*it); info.dw_time_in_zone += dt; if((!info.small_object && m_iDisableHitTime != -1 && (int)info.dw_time_in_zone > m_iDisableHitTime) || (info.small_object && m_iDisableHitTimeSmall != -1 && (int)info.dw_time_in_zone > m_iDisableHitTimeSmall)) { if(!pEntityAlive || !pEntityAlive->g_Alive()) info.zone_ignore = true; } if(m_iDisableIdleTime != -1 && (int)info.dw_time_in_zone > m_iDisableIdleTime) { if(!pEntityAlive || !pEntityAlive->g_Alive()) StopObjectIdleParticles( pObject ); } //если есть хотя бы один не дисабленый объект, то //зона считается активной if(info.zone_ignore == false) m_zone_flags.set(eZoneIsActive,TRUE); } if(eZoneStateIdle == m_eZoneState) CheckForAwaking(); inherited::shedule_Update(dt); // check "fast-mode" border float cam_distance = Device.vCameraPosition.distance_to(P)-s.R; if (cam_distance>FASTMODE_DISTANCE && !m_zone_flags.test(eAlwaysFastmode) ) o_switch_2_slow (); else o_switch_2_fast (); if (!m_zone_flags.test(eFastMode)) UpdateWorkload (dt); }; UpdateOnOffState (); if( !IsGameTypeSingle() && Local() ) { if(Device.dwTimeGlobal > m_ttl) DestroyObject (); } }
void CActor::shedule_Update (u32 DT) { setSVU(OnServer()); //установить режим показа HUD для текущего активного слота CHudItem* pHudItem = smart_cast<CHudItem*>(inventory().ActiveItem()); if(pHudItem && !pHudItem->object().getDestroy()) pHudItem->SetHUDmode(HUDview()); //обновление инвентаря UpdateInventoryOwner (DT); if (GameID() == GAME_SINGLE) GameTaskManager().UpdateTasks (); if(m_holder || !getEnabled() || !Ready()) { m_sDefaultObjAction = NULL; inherited::shedule_Update (DT); /* if (OnServer()) { Check_Weapon_ShowHideState(); }; */ return; } // clamp (DT,0u,100u); float dt = float(DT)/1000.f; // Check controls, create accel, prelimitary setup "mstate_real" //----------- for E3 ----------------------------- // if (Local() && (OnClient() || Level().CurrentEntity()==this)) if (Level().CurrentControlEntity() == this && (!Level().IsDemoPlay() || Level().IsServerDemo())) //------------------------------------------------ { g_cl_CheckControls (mstate_wishful,NET_SavedAccel,NET_Jump,dt); { /* if (mstate_real & mcJump) { NET_Packet P; u_EventGen(P, GE_ACTOR_JUMPING, ID()); P.w_sdir(NET_SavedAccel); P.w_float(NET_Jump); u_EventSend(P); } */ } g_cl_Orientate (mstate_real,dt); g_Orientate (mstate_real,dt); g_Physics (NET_SavedAccel,NET_Jump,dt); g_cl_ValidateMState (dt,mstate_wishful); g_SetAnimation (mstate_real); // Check for game-contacts Fvector C; float R; //m_PhysicMovementControl->GetBoundingSphere (C,R); Center(C); R=Radius(); feel_touch_update (C,R); // Dropping if (b_DropActivated) { f_DropPower += dt*0.1f; clamp (f_DropPower,0.f,1.f); } else { f_DropPower = 0.f; } if (!Level().IsDemoPlay()) { //----------------------------------------------------- mstate_wishful &=~mcAccel; mstate_wishful &=~mcLStrafe; mstate_wishful &=~mcRStrafe; mstate_wishful &=~mcLLookout; mstate_wishful &=~mcRLookout; mstate_wishful &=~mcFwd; mstate_wishful &=~mcBack; extern bool g_bAutoClearCrouch; if (g_bAutoClearCrouch) mstate_wishful &=~mcCrouch; //----------------------------------------------------- } } else { make_Interpolation(); if (NET.size()) { // NET_SavedAccel = NET_Last.p_accel; // mstate_real = mstate_wishful = NET_Last.mstate; g_sv_Orientate (mstate_real,dt ); g_Orientate (mstate_real,dt ); g_Physics (NET_SavedAccel,NET_Jump,dt ); if (!m_bInInterpolation) g_cl_ValidateMState (dt,mstate_wishful); g_SetAnimation (mstate_real); if (NET_Last.mstate & mcCrouch) { if (isActorAccelerated(mstate_real, IsZoomAimingMode())) character_physics_support()->movement()->ActivateBox(1, true); else character_physics_support()->movement()->ActivateBox(2, true); } else character_physics_support()->movement()->ActivateBox(0, true); } mstate_old = mstate_real; } if (this == Level().CurrentViewEntity()) { UpdateMotionIcon (mstate_real); }; NET_Jump = 0; inherited::shedule_Update (DT); //эффектор включаемый при ходьбе if (!pCamBobbing) { pCamBobbing = xr_new<CEffectorBobbing> (); Cameras().AddCamEffector (pCamBobbing); } pCamBobbing->SetState (mstate_real, conditions().IsLimping(), IsZoomAimingMode()); //звук тяжелого дыхания при уталости и хромании if(this==Level().CurrentControlEntity() && !g_pGamePersistent->bDedicatedServer ) { if(conditions().IsLimping() && g_Alive()){ if(!m_HeavyBreathSnd._feedback()){ m_HeavyBreathSnd.play_at_pos(this, Fvector().set(0,ACTOR_HEIGHT,0), sm_Looped | sm_2D); }else{ m_HeavyBreathSnd.set_position(Fvector().set(0,ACTOR_HEIGHT,0)); } }else if(m_HeavyBreathSnd._feedback()){ m_HeavyBreathSnd.stop (); } float bs = conditions().BleedingSpeed(); if(bs>0.6f) { Fvector snd_pos; snd_pos.set(0,ACTOR_HEIGHT,0); if(!m_BloodSnd._feedback()) m_BloodSnd.play_at_pos(this, snd_pos, sm_Looped | sm_2D); else m_BloodSnd.set_position(snd_pos); float v = bs+0.25f; m_BloodSnd.set_volume (v); }else{ if(m_BloodSnd._feedback()) m_BloodSnd.stop(); } } //если в режиме HUD, то сама модель актера не рисуется if(!character_physics_support()->IsRemoved()) setVisible (!HUDview ()); //что актер видит перед собой collide::rq_result& RQ = HUD().GetCurrentRayQuery(); if(!input_external_handler_installed() && RQ.O && RQ.range<inventory().GetTakeDist()) { m_pObjectWeLookingAt = smart_cast<CGameObject*>(RQ.O); CGameObject *game_object = smart_cast<CGameObject*>(RQ.O); m_pUsableObject = smart_cast<CUsableScriptObject*>(game_object); m_pInvBoxWeLookingAt = smart_cast<CInventoryBox*>(game_object); inventory().m_pTarget = smart_cast<PIItem>(game_object); m_pPersonWeLookingAt = smart_cast<CInventoryOwner*>(game_object); m_pVehicleWeLookingAt = smart_cast<CHolderCustom*>(game_object); CEntityAlive* pEntityAlive = smart_cast<CEntityAlive*>(game_object); if (GameID() == GAME_SINGLE ) { if (m_pUsableObject && m_pUsableObject->tip_text()) { m_sDefaultObjAction = CStringTable().translate( m_pUsableObject->tip_text() ); } else { if (m_pPersonWeLookingAt && pEntityAlive->g_Alive()) m_sDefaultObjAction = m_sCharacterUseAction; else if (pEntityAlive && !pEntityAlive->g_Alive()) { bool b_allow_drag = !!pSettings->line_exist("ph_capture_visuals",pEntityAlive->cNameVisual()); if(b_allow_drag) m_sDefaultObjAction = m_sDeadCharacterUseOrDragAction; else m_sDefaultObjAction = m_sDeadCharacterUseAction; }else if (m_pVehicleWeLookingAt) m_sDefaultObjAction = m_sCarCharacterUseAction; else if (inventory().m_pTarget && inventory().m_pTarget->CanTake() ) m_sDefaultObjAction = m_sInventoryItemUseAction; //. else if (m_pInvBoxWeLookingAt) //. m_sDefaultObjAction = m_sInventoryBoxUseAction; else m_sDefaultObjAction = NULL; } } } else { inventory().m_pTarget = NULL; m_pPersonWeLookingAt = NULL; m_sDefaultObjAction = NULL; m_pUsableObject = NULL; m_pObjectWeLookingAt = NULL; m_pVehicleWeLookingAt = NULL; m_pInvBoxWeLookingAt = NULL; } // UpdateSleep (); //для свойст артефактов, находящихся на поясе UpdateArtefactsOnBelt (); m_pPhysics_support->in_shedule_Update (DT); Check_for_AutoPickUp (); };
void CActor::ActorUse() { if (m_holder) { CGameObject* GO = smart_cast<CGameObject*>(m_holder); NET_Packet P; CGameObject::u_EventGen (P, GEG_PLAYER_DETACH_HOLDER, ID()); P.w_u16 (GO->ID()); CGameObject::u_EventSend (P); return; } if(character_physics_support()->movement()->PHCapture()) character_physics_support()->movement()->PHReleaseObject(); if(m_pUsableObject && NULL==m_pObjectWeLookingAt->cast_inventory_item()) { m_pUsableObject->use(this); } if ( m_pInvBoxWeLookingAt && m_pInvBoxWeLookingAt->nonscript_usable() ) { CUIGameSP* pGameSP = smart_cast<CUIGameSP*>(CurrentGameUI()); if ( pGameSP ) //single { if ( !m_pInvBoxWeLookingAt->closed() ) { pGameSP->StartCarBody( this, m_pInvBoxWeLookingAt ); } } return; } if(!m_pUsableObject||m_pUsableObject->nonscript_usable()) { if(m_pPersonWeLookingAt) { CEntityAlive* pEntityAliveWeLookingAt = smart_cast<CEntityAlive*>(m_pPersonWeLookingAt); VERIFY(pEntityAliveWeLookingAt); if (IsGameTypeSingle()) { if(pEntityAliveWeLookingAt->g_Alive()) { TryToTalk(); }else { //только если находимся в режиме single CUIGameSP* pGameSP = smart_cast<CUIGameSP*>(CurrentGameUI()); if ( pGameSP ) { if ( !m_pPersonWeLookingAt->deadbody_closed_status() ) { if(pEntityAliveWeLookingAt->AlreadyDie() && pEntityAliveWeLookingAt->GetLevelDeathTime()+3000 < Device.dwTimeGlobal) // 99.9% dead pGameSP->StartCarBody(this, m_pPersonWeLookingAt ); } } } } } collide::rq_result& RQ = HUD().GetCurrentRayQuery(); CPhysicsShellHolder* object = smart_cast<CPhysicsShellHolder*>(RQ.O); u16 element = BI_NONE; if(object) element = (u16)RQ.element; if(object && Level().IR_GetKeyState(DIK_LSHIFT)) { bool b_allow = !!pSettings->line_exist("ph_capture_visuals",object->cNameVisual()); if(b_allow && !character_physics_support()->movement()->PHCapture()) { character_physics_support()->movement()->PHCaptureObject( object, element ); } } else { if (object && smart_cast<CHolderCustom*>(object)) { NET_Packet P; CGameObject::u_EventGen (P, GEG_PLAYER_ATTACH_HOLDER, ID()); P.w_u16 (object->ID()); CGameObject::u_EventSend (P); return; } } } }
bool CRelationMapLocation::Update() { if (false==inherited::Update() ) return false; bool bAlive = true; m_last_relation = ALife::eRelationTypeFriend; if(m_owner_se_object) { CSE_ALifeTraderAbstract* pEnt = NULL; CSE_ALifeTraderAbstract* pAct = NULL; pEnt = smart_cast<CSE_ALifeTraderAbstract*>(m_owner_se_object); pAct = smart_cast<CSE_ALifeTraderAbstract*>(ai().alife().objects().object(m_pInvOwnerActorID,true)); if(!pEnt || !pAct) return false; m_last_relation = RELATION_REGISTRY().GetRelationType(pEnt, pAct); CSE_ALifeCreatureAbstract* pCreature = smart_cast<CSE_ALifeCreatureAbstract*>(m_owner_se_object); if(pCreature) //maybe trader ? bAlive = pCreature->g_Alive (); }else { CInventoryOwner* pEnt = NULL; CInventoryOwner* pAct = NULL; pEnt = smart_cast<CInventoryOwner*>(Level().Objects.net_Find(m_objectID)); pAct = smart_cast<CInventoryOwner*>(Level().Objects.net_Find(m_pInvOwnerActorID)); if(!pEnt || !pAct) return false; m_last_relation = RELATION_REGISTRY().GetRelationType(pEnt, pAct); CEntityAlive* pEntAlive = smart_cast<CEntityAlive*>(pEnt); if(pEntAlive) bAlive = !!pEntAlive->g_Alive (); } shared_str sname; if(bAlive==false) sname = "deadbody_location"; else sname = RELATION_REGISTRY().GetSpotName(m_last_relation); if(m_curr_spot_name != sname){ LoadSpot(*sname, true); m_curr_spot_name = sname; } // update visibility bool vis_res = true; if(m_last_relation==ALife::eRelationTypeEnemy || m_last_relation==ALife::eRelationTypeWorstEnemy) { CObject* _object_ = Level().Objects.net_Find(m_objectID); if(_object_) { CEntityAlive* ea = smart_cast<CEntityAlive*>(_object_); if(ea&&!ea->g_Alive()) vis_res = true; else { const CGameObject* pObj = smart_cast<const CGameObject*>(_object_); CActor* pAct = smart_cast<CActor*>(Level().Objects.net_Find(m_pInvOwnerActorID)); CHelmet* helm = smart_cast<CHelmet*>(pAct->inventory().ItemFromSlot(HELMET_SLOT)); if(helm && helm->m_fShowNearestEnemiesDistance) { if(pAct->Position().distance_to(pObj->Position()) < helm->m_fShowNearestEnemiesDistance) vis_res = true; else vis_res = Actor()->memory().visual().visible_now(pObj); } else vis_res = Actor()->memory().visual().visible_now(pObj); } } else vis_res = false; } if(bAlive==false) { CObject* _object_ = Level().Objects.net_Find(m_objectID); if(_object_) { const CGameObject* pObj = smart_cast<const CGameObject*>(_object_); CActor* pAct = smart_cast<CActor*>(Level().Objects.net_Find(m_pInvOwnerActorID)); if(/*pAct->Position().distance_to_sqr(pObj->Position()) < 100.0F && */abs(pObj->Position().y-pAct->Position().y)<3.0f) vis_res = true; else vis_res = false; } else vis_res = false; } if(m_b_visible==false && vis_res==true) m_minimap_spot->ResetXformAnimation(); m_b_visible = vis_res; if(m_b_visible) { m_b_minimap_visible = true; m_b_levelmap_visible = true; if (Level().MapManager().GetMapLocationsForObject(m_objectID, find_locations_res) ) { xr_vector<CMapLocation*>::iterator it = find_locations_res.begin(); xr_vector<CMapLocation*>::iterator it_e = find_locations_res.end(); for(;it!=it_e;++it) { CMapLocation* ml = (*it); if(ml==this) continue; m_b_minimap_visible = m_b_minimap_visible && (ml->MiniMapSpot()==NULL); m_b_levelmap_visible= m_b_levelmap_visible && (ml->LevelMapSpot()==NULL); } } } return true; }
void CWeapon::UpdateXForm () { if (Device.dwFrame == dwXF_Frame) return; dwXF_Frame = Device.dwFrame; if (!H_Parent()) return; // Get access to entity and its visual CEntityAlive* E = smart_cast<CEntityAlive*>(H_Parent()); if (!E) { if (!IsGameTypeSingle()) UpdatePosition (H_Parent()->XFORM()); return; } const CInventoryOwner *parent = smart_cast<const CInventoryOwner*>(E); if (parent && parent->use_simplified_visual()) return; if (parent->attached(this)) return; IKinematics* V = smart_cast<IKinematics*> (E->Visual()); VERIFY (V); // Get matrices int boneL = -1, boneR = -1, boneR2 = -1; // this ugly case is possible in case of a CustomMonster, not a Stalker, nor an Actor E->g_WeaponBones (boneL,boneR,boneR2); if (boneR == -1) return; if ((HandDependence() == hd1Hand) || (GetState() == eReload) || (!E->g_Alive())) boneL = boneR2; V->CalculateBones (); Fmatrix& mL = V->LL_GetTransform(u16(boneL)); Fmatrix& mR = V->LL_GetTransform(u16(boneR)); // Calculate Fmatrix mRes; Fvector R,D,N; D.sub (mL.c,mR.c); if(fis_zero(D.magnitude())) { mRes.set (E->XFORM()); mRes.c.set (mR.c); } else { D.normalize (); R.crossproduct (mR.j,D); N.crossproduct (D,R); N.normalize (); mRes.set (R,N,D,mR.c); mRes.mulA_43 (E->XFORM()); } UpdatePosition (mRes); }
void CBlackGraviArtefact::GraviStrike() { xr_list<s16> elements_list; xr_list<Fvector> bone_position_list; Fvector object_pos ; Fvector strike_dir ; rq_storage.r_clear (); for(GAME_OBJECT_LIST_it it = m_GameObjectList.begin(); m_GameObjectList.end() != it; ++it) { CPhysicsShellHolder* pGameObject = *it; if(pGameObject->Visual()) pGameObject->Center(object_pos); else object_pos.set(pGameObject->Position()); strike_dir.sub(object_pos, Position()); float distance = strike_dir.magnitude(); float impulse = 100.f*m_fStrikeImpulse * (1.f - (distance/m_fRadius)* (distance/m_fRadius)); if(impulse > .001f) { //? BOOL enabled = getEnabled(); //? setEnabled (FALSE); impulse *= CExplosive::ExplosionEffect (rq_storage,NULL,pGameObject, Position(),m_fRadius); //? setEnabled (enabled); } float hit_power ; CEntityAlive* pEntityAlive = smart_cast<CEntityAlive*>(pGameObject); if(pGameObject->m_pPhysicsShell) hit_power = 0; else if(pEntityAlive && pEntityAlive->g_Alive() && pEntityAlive->character_physics_support()->movement()->CharacterExist()) hit_power = 0; else hit_power = impulse; if(impulse > .001f) { while(!elements_list.empty()) { s16 element = elements_list.front(); Fvector bone_pos = bone_position_list.front(); NET_Packet P; SHit HS; HS.GenHeader(GE_HIT, pGameObject->ID()); // u_EventGen (P,GE_HIT, pGameObject->ID()); HS.whoID =ID(); // P.w_u16 (ID()); HS.weaponID = ID(); // P.w_u16 (ID()); HS.dir = strike_dir; // P.w_dir (strike_dir); HS.power = hit_power; // P.w_float (hit_power); HS.boneID = element; // P.w_s16 (element); HS.p_in_bone_space = bone_pos; // P.w_vec3 (bone_pos); HS.impulse = impulse; // P.w_float (impulse); HS.hit_type = (ALife::eHitTypeWound); // P.w_u16 (u16(ALife::eHitTypeWound)); HS.Write_Packet(P); u_EventSend (P); elements_list.pop_front(); bone_position_list.pop_front(); } } } }