Exemplo n.º 1
0
void cProjectileEntity::OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_HitPos)
{
	if (a_EntityHit.IsPawn() && (GetCreatorName() != ""))  // If we're hitting a mob or a player and we were created by a player
	{

		class cNotifyWolves : public cEntityCallback
		{
		public:
			cPawn * m_EntityHit;

			cNotifyWolves(cPawn * a_Entity) :
				m_EntityHit(a_Entity)
			{
			}

			virtual bool Item(cEntity * a_Player) override
			{
				static_cast<cPlayer*>(a_Player)->NotifyFriendlyWolves(m_EntityHit);
				return true;
			}
		} Callback(static_cast<cPawn*>(&a_EntityHit));

		m_World->DoWithEntityByID(GetCreatorUniqueID(), Callback);
	}
}
Exemplo n.º 2
0
void cArrowEntity::OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_HitPos)
{
	super::OnHitEntity(a_EntityHit, a_HitPos);

	int Damage = static_cast<int>(GetSpeed().Length() / 20 * m_DamageCoeff + 0.5);
	if (m_IsCritical)
	{
		Damage += m_World->GetTickRandomNumber(Damage / 2 + 2);
	}

	unsigned int PowerLevel = m_CreatorData.m_Enchantments.GetLevel(cEnchantments::enchPower);
	if (PowerLevel > 0)
	{
		int ExtraDamage = static_cast<int>(ceil(0.25 * (PowerLevel + 1)));
		Damage += ExtraDamage;
	}

	// int KnockbackAmount = 1;
	unsigned int PunchLevel = m_CreatorData.m_Enchantments.GetLevel(cEnchantments::enchPunch);
	if (PunchLevel > 0)
	{
		Vector3d LookVector = GetLookVector();
		Vector3f FinalSpeed = Vector3f(0, 0, 0);
		switch (PunchLevel)
		{
			case 1: FinalSpeed = LookVector * Vector3d(5, 0.3, 5); break;
			case 2: FinalSpeed = LookVector * Vector3d(8, 0.3, 8); break;
			default: break;
		}
		a_EntityHit.SetSpeed(FinalSpeed);
	}

	// a_EntityHit.TakeDamage(dtRangedAttack, this, Damage, KnockbackAmount);  // TODO fix knockback.
	a_EntityHit.TakeDamage(dtRangedAttack, GetCreatorUniqueID(), Damage, 0);  // Until knockback is fixed.

	if (IsOnFire() && !a_EntityHit.IsSubmerged() && !a_EntityHit.IsSwimming())
	{
		a_EntityHit.StartBurning(100);
	}

	// Broadcast successful hit sound
	GetWorld()->BroadcastSoundEffect("random.successful_hit", GetPosX(), GetPosY(), GetPosZ(), 0.5, static_cast<float>(0.75 + (static_cast<float>((GetUniqueID() * 23) % 32)) / 64));

	Destroy();
}
Exemplo n.º 3
0
void cProjectileEntity::OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_HitPos)
{
    UNUSED(a_HitPos);

    // If we were created by a player and we hit a pawn, notify attacking player's wolves
    if (a_EntityHit.IsPawn() && (GetCreatorName() != ""))
    {
        class cNotifyWolves : public cEntityCallback
        {
        public:
            cPawn * m_EntityHit;

            virtual bool Item(cEntity * a_Hitter) override
            {
                static_cast<cPlayer*>(a_Hitter)->NotifyNearbyWolves(m_EntityHit, true);
                return true;
            }
        } Callback;

        Callback.m_EntityHit = static_cast<cPawn*>(&a_EntityHit);
        m_World->DoWithEntityByID(GetCreatorUniqueID(), Callback);
    }
}