Beispiel #1
0
bool CJaw::CanFire() const
{
	bool bCanFire = false;

	bool ai = false;
	bool weaponLowered = false;
	if (CPlayer *pOwnerPlayer = GetOwnerPlayer())
	{
		ai = !pOwnerPlayer->IsPlayer();
		weaponLowered = pOwnerPlayer->IsCinematicFlagActive(SPlayerStats::eCinematicFlag_LowerWeapon) || pOwnerPlayer->IsCinematicFlagActive(SPlayerStats::eCinematicFlag_LowerWeaponMP);
	}

	if (ai || !GetOwnerPlayer() || ((m_firedRockets == 0) && !weaponLowered))
	{
		bCanFire = BaseClass::CanFire();
	}
	
	return bCanFire;
}
//---------------------------------------------------------------------
bool CWeapon::OnActionSpecial(EntityId actorId, const ActionId& actionId, int activationMode, float value)
{
	CPlayer* pOwnerPlayer = GetOwnerPlayer();
	if (pOwnerPlayer && !pOwnerPlayer->CanMelee())
		return true;

	if(gEnv->bMultiplayer && AreAnyItemFlagsSet(eIF_Transitioning)) //Ignore the transition from attachments menu and melee immediately
	{
		ClearItemFlags( eIF_Transitioning );
	}

	if (gEnv->bMultiplayer && !g_pGameCVars->pl_boostedMelee_allowInMP)
	{
		if (activationMode == eAAM_OnPress)
		{
			if (CanMeleeAttack())
			{
				if (PreMeleeAttack())
					MeleeAttack();
			}
			else
			{
				CCCPOINT(Melee_PressedButMeleeNotAllowed);
			}
		}
	}
	else
	{
		if (activationMode == eAAM_OnPress)
		{
			if(CanMeleeAttack())
			{
				if (pOwnerPlayer)
				{
					if (PreMeleeAttack())
					{
						BoostMelee(false);
						MeleeAttack();
					}
				}
			}
			else
			{
				CCCPOINT(Melee_PressedButMeleeNotAllowed);
			}
		}
	}


	return true;
}
//----------------------------------------------------------
bool CWeapon::CanZoomInState(float fallingMinAirTime) const
{
	if (const CPlayer* pPlayer = GetOwnerPlayer())
	{
		if (gEnv->bMultiplayer)
		{
			const bool allowedWhileJumpingFalling = g_pGameCVars->i_ironsight_while_jumping_mp || (!pPlayer->IsJumping() && (g_pGameCVars->i_ironsight_while_falling_mp || !pPlayer->IsInAir() || (pPlayer->CPlayer::GetActorStats()->inAir < fallingMinAirTime)));
			return allowedWhileJumpingFalling && !pPlayer->IsSliding();
		}
		else
			return (GetLowerMode() != eILM_Cinematic) && !pPlayer->IsSliding();
	}

	return true;
}
Beispiel #4
0
void CJaw::StartFire()
{
	if (!CanFire())
		return;

	CActor* pOwner = GetOwnerActor();
#if (USE_DEDICATED_INPUT)
	if (!pOwner || (!pOwner->IsPlayer() || (gEnv->bMultiplayer && strcmp(pOwner->GetEntityClassName(), "DummyPlayer") == 0)))
#else
	if (!pOwner || !pOwner->IsPlayer())
#endif
	{
		BaseClass::StartFire();
		return;
	}

	if (m_controllingRocket)
		return;

	CPlayer *ownerPlayer = GetOwnerPlayer();
	if (ownerPlayer)
	{
		if(ownerPlayer->IsClient() && ownerPlayer->IsWeaponUnderWater())
		{
			return;
		}

		ownerPlayer->StateMachineHandleEventMovement( PLAYER_EVENT_FORCEEXITSLIDE );
	}

	if (!m_firePending && m_zm && g_pGameCVars->cl_zoomToggle > 0)
	{
		m_zoomAlreadyToggled = (m_zm->IsZoomingIn() || m_zm->IsZoomed());
	}
	else
	{
		m_zoomAlreadyToggled = false;
	}

	if(!IsZoomingInOrOut())
	{
		if (m_zm)
			m_zm->ZoomIn();
	}

	m_fireTriggerDown = true;
	m_firePending = true;
}
void CPlayerPlugin_InteractiveEntityMonitor::Register( IEntity* pEntity, uint8 initialFlags )
{
	if(!pEntity)
		return;

	const EntityId entityId = pEntity->GetId();

	//Make sure we aren't registering twice
	InteractiveEntityList::iterator iter = m_interactiveEntityList.begin();
	InteractiveEntityList::iterator end = m_interactiveEntityList.end();
	while(iter != end)
	{
		if(iter->first == entityId)
		{
#ifndef _RELEASE
			CryLog("[ERROR] InteractiveEntityMonitor. Registering the same entity twice: '%s'. Tell Gary (Really this time).", pEntity->GetName());
			DesignerWarning(false, "InteractiveEntityMonitor. Registering the same entity twice: '%s'. Tell Gary (Really this time).", pEntity->GetName());
#endif //_RELEASE
			//Don't crash
			return;
		}
		++iter;
	}

#ifndef _RELEASE
	m_debugMap[pEntity->GetId()] = pEntity->GetName();
#endif //_RELEASE

	m_interactiveEntityList.push_back( InteractiveEntityStatus(entityId, initialFlags) );

	//Check if it should already be on
	if(m_bEnabled && GetOwnerPlayer()->GetEntity()->GetWorldPos().GetSquaredDistance2D(pEntity->GetWorldPos()) < g_pGameCVars->g_highlightingMovementDistanceToUpdateSquared)
	{
		if(IEntityRenderProxy* pRenderProxy = static_cast<IEntityRenderProxy *>(pEntity->GetProxy(ENTITY_PROXY_RENDER)))
		{
			if( (initialFlags & EIES_ShootToInteract) == 0 )
			{
				pRenderProxy->SetHUDSilhouettesParams(m_silhouetteInteractColor.r, m_silhouetteInteractColor.g, m_silhouetteInteractColor.b, m_silhouetteInteractColor.a);
			}
			else
			{
				pRenderProxy->SetHUDSilhouettesParams(m_silhouetteShootColor.r, m_silhouetteShootColor.g, m_silhouetteShootColor.b, m_silhouetteShootColor.a);
			}
		}
	}
}
void CPlayerPlugin_InteractiveEntityMonitor::Update( const float dt )
{
	m_timeUntilRefresh -= dt;

#ifndef _RELEASE
	//Verify entity integrity
	InteractiveEntityDebugMap::iterator mapIter = m_debugMap.begin();
	InteractiveEntityDebugMap::iterator mapEnd = m_debugMap.end();
	while(mapIter != mapEnd)
	{
		if(!gEnv->pEntitySystem->GetEntity(mapIter->first))
		{
			CryLog("[ERROR] InteractiveEntityMonitor. About to crash. Registered entity no longer exists: '%s'. Tell Gary (Really this time).", mapIter->second.c_str());
			DesignerWarning(false, "[ERROR] InteractiveEntityMonitor. About to crash. Registered entity no longer exists: '%s'. Tell Gary (Really this time).", mapIter->second.c_str());
		}

		++mapIter;
	}
#endif //_RELEASE

	IEntitySystem* pEntitySys = gEnv->pEntitySystem;
	const Vec3& playerPos = GetOwnerPlayer()->GetEntity()->GetWorldTM().GetColumn3();
	if(m_bEnabled && (m_timeUntilRefresh < 0.f || playerPos.GetSquaredDistance2D(m_playerPrevPos) > g_pGameCVars->g_highlightingMovementDistanceToUpdateSquared))
	{
		for(InteractiveEntityList::iterator it = m_interactiveEntityList.begin(); it!=m_interactiveEntityList.end(); )
		{
			const EntityId entityId = it->first;
			IEntity* pEntity = pEntitySys->GetEntity(entityId);
			if(!pEntity)
			{
				it=m_interactiveEntityList.erase(it);
				continue;
			}

			if (IEntityRenderProxy* pRenderProxy = static_cast<IEntityRenderProxy *>(pEntity->GetProxy(ENTITY_PROXY_RENDER)))
			{
				const Vec3& entityPos = pEntity->GetWorldTM().GetColumn3();
				const float distSq = entityPos.GetSquaredDistance2D(playerPos);

				const bool withinHighlightDistance = distSq <= g_pGameCVars->g_highlightingMaxDistanceToHighlightSquared;
				if( withinHighlightDistance )
				{
					// Apply intensity fade over outer half distance
					float alpha = distSq * 2.0f - g_pGameCVars->g_highlightingMaxDistanceToHighlightSquared;
					alpha *= __fres(g_pGameCVars->g_highlightingMaxDistanceToHighlightSquared);
					alpha = 1.0f - clamp(alpha, 0.0f, 1.0f);

					if( (it->second & EIES_ShootToInteract) == 0 )
					{
						pRenderProxy->SetHUDSilhouettesParams(m_silhouetteInteractColor.r*alpha, m_silhouetteInteractColor.g*alpha, m_silhouetteInteractColor.b*alpha, m_silhouetteInteractColor.a*alpha);
					}
					else
					{
						pRenderProxy->SetHUDSilhouettesParams(m_silhouetteShootColor.r*alpha, m_silhouetteShootColor.g*alpha, m_silhouetteShootColor.b*alpha, m_silhouetteShootColor.a*alpha);
					}
					it->second |= EIES_Highlighted;
				}
				else if( it->second & EIES_Highlighted )
				{
					pRenderProxy->SetHUDSilhouettesParams(0.f, 0.f, 0.f, 0.f);
					it->second &= ~EIES_Highlighted;
				}
			}

			++it;
		}

		m_playerPrevPos = playerPos;
		m_timeUntilRefresh = g_pGameCVars->g_highlightingTimeBetweenForcedRefresh;
	}
}
bool CWeapon::CanStabilize() const
{
	CPlayer* pPlayer = GetOwnerPlayer();

	return (pPlayer != NULL);
}