Пример #1
0
void cBeaconEntity::GiveEffects(void)
{
	if (!m_IsActive || (m_BeaconLevel < 0))
	{
		return;
	}

	int Radius = m_BeaconLevel * 10 + 10;
	short EffectLevel = 0;
	if ((m_BeaconLevel >= 4) && (m_PrimaryEffect == m_SecondaryEffect))
	{
		EffectLevel = 1;
	}

	cEntityEffect::eType SecondaryEffect = cEntityEffect::effNoEffect;
	if ((m_BeaconLevel >= 4) && (m_PrimaryEffect != m_SecondaryEffect) && (m_SecondaryEffect > 0))
	{
		SecondaryEffect = m_SecondaryEffect;
	}

	Vector3d BeaconPosition(m_PosX, m_PosY, m_PosZ);
	GetWorld()->ForEachPlayer([=](cPlayer & a_Player)
		{
			auto PlayerPosition = a_Player.GetPosition();
			if (PlayerPosition.y > BeaconPosition.y)
			{
				PlayerPosition.y = BeaconPosition.y;
			}

			// TODO: Vanilla minecraft uses an AABB check instead of a radius one
			if ((PlayerPosition - BeaconPosition).Length() <= Radius)
			{
				a_Player.AddEntityEffect(m_PrimaryEffect, 180, EffectLevel);

				if (m_SecondaryEffect != cEntityEffect::effNoEffect)
				{
					a_Player.AddEntityEffect(m_SecondaryEffect, 180, 0);
				}
			}
			return false;
		}
	);
}
Пример #2
0
void cBeaconEntity::UpdateBeacon(void)
{
	int OldBeaconLevel = m_BeaconLevel;

	if (IsBeaconBlocked())
	{
		m_IsActive = false;
		m_BeaconLevel = 0;
	}
	else
	{
		m_BeaconLevel = CalculatePyramidLevel();
		m_IsActive = (m_BeaconLevel > 0);
	}

	if ((m_BeaconLevel != OldBeaconLevel) && (m_BeaconLevel == 4))
	{
		// Send window update:
		if (GetWindow() != nullptr)
		{
			GetWindow()->SetProperty(0, m_BeaconLevel);
		}

		Vector3d BeaconPosition(m_PosX, m_PosY, m_PosZ);
		GetWorld()->ForEachPlayer([=](cPlayer & a_Player)
			{
				Vector3d Distance = BeaconPosition - a_Player.GetPosition();
				if (
					(std::abs(Distance.y) <= 14) &&
					(std::abs(Distance.x) <= 20) &&
					(std::abs(Distance.z) <= 20)
				)
				{
					a_Player.AwardAchievement(eStatistic::achFullBeacon);
				}
				return false;
			}
		);
	}
}