1
0

Changed everything to callbacks

This commit is contained in:
Tiger Wang 2014-07-05 22:59:22 +01:00
parent f4e11d194e
commit 460d6bd0cb
4 changed files with 53 additions and 82 deletions

View File

@ -142,7 +142,7 @@ public:
{
if (
(a_Entity == m_Projectile) || // Do not check collisions with self
(a_Entity == m_Projectile->GetCreator()) // Do not check whoever shot the projectile
(a_Entity->GetUniqueID() == m_Projectile->GetCreatorUniqueID()) // Do not check whoever shot the projectile
)
{
// TODO: Don't check creator only for the first 5 ticks
@ -299,76 +299,6 @@ void cProjectileEntity::OnHitSolidBlock(const Vector3d & a_HitPos, eBlockFace a_
cEntity * cProjectileEntity::GetCreator()
{
if (m_CreatorData.m_Name.empty() && (m_CreatorData.m_UniqueID >= 1))
{
class cProjectileCreatorCallback : public cEntityCallback
{
public:
cProjectileCreatorCallback(void) :
m_Entity(NULL)
{
}
virtual bool Item(cEntity * a_Entity) override
{
m_Entity = a_Entity;
return true;
}
cEntity * GetEntity(void)
{
return m_Entity;
}
private:
cEntity * m_Entity;
};
cProjectileCreatorCallback PCC;
GetWorld()->DoWithEntityByID(m_CreatorData.m_UniqueID, PCC);
return PCC.GetEntity();
}
else if (!m_CreatorData.m_Name.empty())
{
class cProjectileCreatorCallbackForPlayers : public cPlayerListCallback
{
public:
cProjectileCreatorCallbackForPlayers(void) :
m_Entity(NULL)
{
}
virtual bool Item(cPlayer * a_Entity) override
{
m_Entity = a_Entity;
return true;
}
cPlayer * GetEntity(void)
{
return m_Entity;
}
private:
cPlayer * m_Entity;
};
cProjectileCreatorCallbackForPlayers PCCFP;
GetWorld()->FindAndDoWithPlayer(m_CreatorData.m_Name, PCCFP);
return PCCFP.GetEntity();
}
return NULL;
}
AString cProjectileEntity::GetMCAClassName(void) const
{
switch (m_ProjectileKind)

View File

@ -66,10 +66,10 @@ public:
/// Returns the kind of the projectile (fast class identification)
eKind GetProjectileKind(void) const { return m_ProjectileKind; }
/** Returns the entity who created this projectile through running its Unique ID through cWorld::DoWithEntityByID()
May return NULL; do not store the returned pointer outside the scope of the tick thread!
/** Returns the unique ID of the entity who created this projectile
May return an ID <0
*/
cEntity * GetCreator(void);
int GetCreatorUniqueID(void) { return m_CreatorData.m_UniqueID; }
/** Returns the name of the player that created the projectile
Will be empty for non-player creators

View File

@ -1,6 +1,7 @@
#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
#include "ThrownEnderPearlEntity.h"
#include "Player.h"
@ -46,12 +47,34 @@ void cThrownEnderPearlEntity::OnHitEntity(cEntity & a_EntityHit, const Vector3d
void cThrownEnderPearlEntity::TeleportCreator(const Vector3d & a_HitPos)
{
cEntity * Creator = GetCreator();
// Teleport the creator here, make them take 5 damage:
if (Creator != NULL)
if (m_CreatorData.m_Name.empty())
{
Creator->TeleportToCoords(a_HitPos.x, a_HitPos.y + 0.2, a_HitPos.z);
Creator->TakeDamage(dtEnderPearl, this, 5, 0);
return;
}
class cProjectileCreatorCallbackForPlayers : public cPlayerListCallback
{
public:
cProjectileCreatorCallbackForPlayers(cEntity * a_Attacker, Vector3i a_HitPos) :
m_Attacker(a_Attacker),
m_HitPos(a_HitPos)
{
}
virtual bool Item(cPlayer * a_Entity) override
{
// Teleport the creator here, make them take 5 damage:
a_Entity->TeleportToCoords(m_HitPos.x, m_HitPos.y + 0.2, m_HitPos.z);
a_Entity->TakeDamage(dtEnderPearl, m_Attacker, 5, 0);
return true;
}
private:
cEntity * m_Attacker;
Vector3i m_HitPos;
};
cProjectileCreatorCallbackForPlayers PCCFP(this, a_HitPos);
GetWorld()->FindAndDoWithPlayer(m_CreatorData.m_Name, PCCFP);
}

View File

@ -67,9 +67,27 @@ void cCreeper::GetDrops(cItems & a_Drops, cEntity * a_Killer)
}
AddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_GUNPOWDER);
if ((a_Killer != NULL) && (a_Killer->IsProjectile()))
if ((a_Killer != NULL) && a_Killer->IsProjectile() && (((cProjectileEntity *)a_Killer)->GetCreatorUniqueID() >= 0))
{
if (((cMonster *)((cProjectileEntity *)a_Killer)->GetCreator())->GetMobType() == mtSkeleton)
class cProjectileCreatorCallback : public cEntityCallback
{
public:
cProjectileCreatorCallback(void)
{
}
virtual bool Item(cEntity * a_Entity) override
{
if (a_Entity->IsMob() && ((cMonster *)a_Entity)->GetMobType() == mtSkeleton)
{
return true;
}
return false;
}
};
cProjectileCreatorCallback PCC;
if (GetWorld()->DoWithEntityByID(((cProjectileEntity *)a_Killer)->GetCreatorUniqueID(), PCC))
{
// 12 music discs. TickRand starts from 0 to 11. Disk IDs start at 2256, so add that. There.
AddRandomDropItem(a_Drops, 1, 1, (short)m_World->GetTickRandomNumber(11) + 2256);