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; } ); }
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; } ); } }