Add ExpOrb saving.
This commit is contained in:
parent
ccc29c7c6c
commit
28898f710b
@ -5,20 +5,26 @@
|
|||||||
#include "../ClientHandle.h"
|
#include "../ClientHandle.h"
|
||||||
|
|
||||||
|
|
||||||
cExpOrb::cExpOrb(double a_X, double a_Y, double a_Z, int a_Reward) :
|
cExpOrb::cExpOrb(double a_X, double a_Y, double a_Z, int a_Reward)
|
||||||
cEntity(etExpOrb, a_X, a_Y, a_Z, 0.98, 0.98),
|
: cEntity(etExpOrb, a_X, a_Y, a_Z, 0.98, 0.98)
|
||||||
m_Reward(a_Reward)
|
, m_Reward(a_Reward)
|
||||||
|
, m_Timer(0.f)
|
||||||
{
|
{
|
||||||
|
SetMaxHealth(5);
|
||||||
|
SetHealth(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cExpOrb::cExpOrb(const Vector3d & a_Pos, int a_Reward) :
|
cExpOrb::cExpOrb(const Vector3d & a_Pos, int a_Reward)
|
||||||
cEntity(etExpOrb, a_Pos.x, a_Pos.y, a_Pos.z, 0.98, 0.98),
|
: cEntity(etExpOrb, a_Pos.x, a_Pos.y, a_Pos.z, 0.98, 0.98)
|
||||||
m_Reward(a_Reward)
|
, m_Reward(a_Reward)
|
||||||
|
, m_Timer(0.f)
|
||||||
{
|
{
|
||||||
|
SetMaxHealth(5);
|
||||||
|
SetHealth(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -52,7 +58,7 @@ void cExpOrb::Tick(float a_Dt, cChunk & a_Chunk)
|
|||||||
LOGD("Player %s picked up an ExpOrb. His reward is %i", a_ClosestPlayer->GetName().c_str(), m_Reward);
|
LOGD("Player %s picked up an ExpOrb. His reward is %i", a_ClosestPlayer->GetName().c_str(), m_Reward);
|
||||||
a_ClosestPlayer->DeltaExperience(m_Reward);
|
a_ClosestPlayer->DeltaExperience(m_Reward);
|
||||||
|
|
||||||
m_World->BroadcastSoundEffect("random.orb", (int)GetPosX() * 8, (int)GetPosY() * 8, (int)GetPosZ() * 8, 0.5f, (float)(0.75 + ((float)((GetUniqueID() * 23) % 32)) / 64));
|
m_World->BroadcastSoundEffect("random.orb", (int)(GetPosX() * 8), (int)(GetPosY() * 8), (int)(GetPosZ() * 8), 0.5f, (float)(0.75 + ((float)((GetUniqueID() * 23) % 32)) / 64));
|
||||||
|
|
||||||
Destroy();
|
Destroy();
|
||||||
}
|
}
|
||||||
@ -64,4 +70,10 @@ void cExpOrb::Tick(float a_Dt, cChunk & a_Chunk)
|
|||||||
BroadcastMovementUpdate();
|
BroadcastMovementUpdate();
|
||||||
}
|
}
|
||||||
HandlePhysics(a_Dt, a_Chunk);
|
HandlePhysics(a_Dt, a_Chunk);
|
||||||
|
|
||||||
|
m_Timer += a_Dt;
|
||||||
|
if (m_Timer >= 1000 * 60 * 5) // 5 minutes
|
||||||
|
{
|
||||||
|
Destroy(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,10 +21,22 @@ public:
|
|||||||
// Override functions
|
// Override functions
|
||||||
virtual void Tick(float a_Dt, cChunk & a_Chunk) override;
|
virtual void Tick(float a_Dt, cChunk & a_Chunk) override;
|
||||||
virtual void SpawnOn(cClientHandle & a_Client) override;
|
virtual void SpawnOn(cClientHandle & a_Client) override;
|
||||||
|
|
||||||
|
/** Returns the number of ticks that this entity has existed */
|
||||||
|
int GetAge(void) const { return (int)(m_Timer / 50); } // tolua_export
|
||||||
|
|
||||||
|
/** Set the number of ticks that this entity has existed */
|
||||||
|
void SetAge(int a_Age) { m_Timer = (float)(a_Age * 50); } // tolua_export
|
||||||
|
|
||||||
// cExpOrb functions
|
/** Get the exp amount */
|
||||||
int GetReward(void) const { return m_Reward; }
|
int GetReward(void) const { return m_Reward; } // tolua_export
|
||||||
|
|
||||||
|
/** Set the exp amount */
|
||||||
|
void SetReward(int a_Reward) { m_Reward = a_Reward; } // tolua_export
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
int m_Reward;
|
int m_Reward;
|
||||||
|
|
||||||
|
/** The number of ticks that the entity has existed / timer between collect and destroy; in msec */
|
||||||
|
float m_Timer;
|
||||||
} ;
|
} ;
|
@ -82,7 +82,7 @@ cPickup::cPickup(double a_PosX, double a_PosY, double a_PosZ, const cItem & a_It
|
|||||||
|
|
||||||
void cPickup::SpawnOn(cClientHandle & a_Client)
|
void cPickup::SpawnOn(cClientHandle & a_Client)
|
||||||
{
|
{
|
||||||
a_Client.SendPickupSpawn(*this);
|
a_Client.SendPickupSpawn(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#include "../Entities/Pickup.h"
|
#include "../Entities/Pickup.h"
|
||||||
#include "../Entities/ProjectileEntity.h"
|
#include "../Entities/ProjectileEntity.h"
|
||||||
#include "../Entities/TNTEntity.h"
|
#include "../Entities/TNTEntity.h"
|
||||||
|
#include "../Entities/ExpOrb.h"
|
||||||
|
|
||||||
#include "../Mobs/Monster.h"
|
#include "../Mobs/Monster.h"
|
||||||
#include "../Mobs/Bat.h"
|
#include "../Mobs/Bat.h"
|
||||||
@ -596,6 +597,20 @@ void cNBTChunkSerializer::AddTNTEntity(cTNTEntity * a_TNT)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cNBTChunkSerializer::AddExpOrbEntity(cExpOrb* a_ExpOrb)
|
||||||
|
{
|
||||||
|
m_Writer.BeginCompound("");
|
||||||
|
AddBasicEntity(a_ExpOrb, "XPOrb");
|
||||||
|
m_Writer.AddShort("Health", (short)(unsigned char)a_ExpOrb->GetHealth());
|
||||||
|
m_Writer.AddShort("Age", (short)a_ExpOrb->GetAge());
|
||||||
|
m_Writer.AddShort("Value", (short)a_ExpOrb->GetReward());
|
||||||
|
m_Writer.EndCompound();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cNBTChunkSerializer::AddMinecartChestContents(cMinecartWithChest * a_Minecart)
|
void cNBTChunkSerializer::AddMinecartChestContents(cMinecartWithChest * a_Minecart)
|
||||||
{
|
{
|
||||||
m_Writer.BeginList("Items", TAG_Compound);
|
m_Writer.BeginList("Items", TAG_Compound);
|
||||||
@ -676,7 +691,7 @@ void cNBTChunkSerializer::Entity(cEntity * a_Entity)
|
|||||||
case cEntity::etPickup: AddPickupEntity ((cPickup *) a_Entity); break;
|
case cEntity::etPickup: AddPickupEntity ((cPickup *) a_Entity); break;
|
||||||
case cEntity::etProjectile: AddProjectileEntity ((cProjectileEntity *)a_Entity); break;
|
case cEntity::etProjectile: AddProjectileEntity ((cProjectileEntity *)a_Entity); break;
|
||||||
case cEntity::etTNT: AddTNTEntity ((cTNTEntity *) a_Entity); break;
|
case cEntity::etTNT: AddTNTEntity ((cTNTEntity *) a_Entity); break;
|
||||||
case cEntity::etExpOrb: /* TODO */ break;
|
case cEntity::etExpOrb: AddExpOrbEntity ((cExpOrb *) a_Entity); break;
|
||||||
case cEntity::etItemFrame: /* TODO */ break;
|
case cEntity::etItemFrame: /* TODO */ break;
|
||||||
case cEntity::etPainting: /* TODO */ break;
|
case cEntity::etPainting: /* TODO */ break;
|
||||||
case cEntity::etPlayer: return; // Players aren't saved into the world
|
case cEntity::etPlayer: return; // Players aren't saved into the world
|
||||||
|
@ -42,6 +42,7 @@ class cPickup;
|
|||||||
class cItemGrid;
|
class cItemGrid;
|
||||||
class cProjectileEntity;
|
class cProjectileEntity;
|
||||||
class cTNTEntity;
|
class cTNTEntity;
|
||||||
|
class cExpOrb;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -109,6 +110,7 @@ protected:
|
|||||||
void AddPickupEntity (cPickup * a_Pickup);
|
void AddPickupEntity (cPickup * a_Pickup);
|
||||||
void AddProjectileEntity (cProjectileEntity * a_Projectile);
|
void AddProjectileEntity (cProjectileEntity * a_Projectile);
|
||||||
void AddTNTEntity (cTNTEntity * a_TNT);
|
void AddTNTEntity (cTNTEntity * a_TNT);
|
||||||
|
void AddExpOrbEntity (cExpOrb * a_ExpOrb);
|
||||||
|
|
||||||
void AddMinecartChestContents(cMinecartWithChest * a_Minecart);
|
void AddMinecartChestContents(cMinecartWithChest * a_Minecart);
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
#include "../Entities/Pickup.h"
|
#include "../Entities/Pickup.h"
|
||||||
#include "../Entities/ProjectileEntity.h"
|
#include "../Entities/ProjectileEntity.h"
|
||||||
#include "../Entities/TNTEntity.h"
|
#include "../Entities/TNTEntity.h"
|
||||||
|
#include "../Entities/ExpOrb.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1092,6 +1093,14 @@ void cWSSAnvil::LoadEntityFromNBT(cEntityList & a_Entities, const cParsedNBT & a
|
|||||||
{
|
{
|
||||||
LoadPickupFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
|
LoadPickupFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
|
||||||
}
|
}
|
||||||
|
else if (strncmp(a_IDTag, "PrimedTnt", a_IDTagLength) == 0)
|
||||||
|
{
|
||||||
|
LoadTNTFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
|
||||||
|
}
|
||||||
|
else if (strncmp(a_IDTag, "XPOrb", a_IDTagLength) == 0)
|
||||||
|
{
|
||||||
|
LoadExpOrbFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
|
||||||
|
}
|
||||||
else if (strncmp(a_IDTag, "Arrow", a_IDTagLength) == 0)
|
else if (strncmp(a_IDTag, "Arrow", a_IDTagLength) == 0)
|
||||||
{
|
{
|
||||||
LoadArrowFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
|
LoadArrowFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
|
||||||
@ -1232,10 +1241,6 @@ void cWSSAnvil::LoadEntityFromNBT(cEntityList & a_Entities, const cParsedNBT & a
|
|||||||
{
|
{
|
||||||
LoadPigZombieFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
|
LoadPigZombieFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
|
||||||
}
|
}
|
||||||
else if (strncmp(a_IDTag, "PrimedTnt", a_IDTagLength) == 0)
|
|
||||||
{
|
|
||||||
LoadTNTFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
|
|
||||||
}
|
|
||||||
// TODO: other entities
|
// TODO: other entities
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1393,6 +1398,9 @@ void cWSSAnvil::LoadPickupFromNBT(cEntityList & a_Entities, const cParsedNBT & a
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Add health and age
|
||||||
|
|
||||||
a_Entities.push_back(Pickup.release());
|
a_Entities.push_back(Pickup.release());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1400,6 +1408,64 @@ void cWSSAnvil::LoadPickupFromNBT(cEntityList & a_Entities, const cParsedNBT & a
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cWSSAnvil::LoadTNTFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
|
||||||
|
{
|
||||||
|
std::auto_ptr<cTNTEntity> TNT(new cTNTEntity(0.0, 0.0, 0.0, 0));
|
||||||
|
if (!LoadEntityBaseFromNBT(*TNT.get(), a_NBT, a_TagIdx))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load Fuse Ticks:
|
||||||
|
int FuseTicks = a_NBT.FindChildByName(a_TagIdx, "Fuse");
|
||||||
|
if (FuseTicks > 0)
|
||||||
|
{
|
||||||
|
TNT->SetFuseTicks((int) a_NBT.GetByte(FuseTicks));
|
||||||
|
}
|
||||||
|
|
||||||
|
a_Entities.push_back(TNT.release());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cWSSAnvil::LoadExpOrbFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
|
||||||
|
{
|
||||||
|
std::auto_ptr<cExpOrb> ExpOrb(new cExpOrb(0.0, 0.0, 0.0, 0));
|
||||||
|
if (!LoadEntityBaseFromNBT(*ExpOrb.get(), a_NBT, a_TagIdx))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load Health:
|
||||||
|
int Health = a_NBT.FindChildByName(a_TagIdx, "Health");
|
||||||
|
if (Health > 0)
|
||||||
|
{
|
||||||
|
ExpOrb->SetHealth((int) (a_NBT.GetShort(Health) & 0xFF));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load Age:
|
||||||
|
int Age = a_NBT.FindChildByName(a_TagIdx, "Age");
|
||||||
|
if (Age > 0)
|
||||||
|
{
|
||||||
|
ExpOrb->SetAge(a_NBT.GetShort(Age));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load Reward (Value):
|
||||||
|
int Reward = a_NBT.FindChildByName(a_TagIdx, "Value");
|
||||||
|
if (Reward > 0)
|
||||||
|
{
|
||||||
|
ExpOrb->SetReward(a_NBT.GetShort(Reward));
|
||||||
|
}
|
||||||
|
|
||||||
|
a_Entities.push_back(ExpOrb.release());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cWSSAnvil::LoadArrowFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
|
void cWSSAnvil::LoadArrowFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
|
||||||
{
|
{
|
||||||
std::auto_ptr<cArrowEntity> Arrow(new cArrowEntity(NULL, 0, 0, 0, Vector3d(0, 0, 0)));
|
std::auto_ptr<cArrowEntity> Arrow(new cArrowEntity(NULL, 0, 0, 0, Vector3d(0, 0, 0)));
|
||||||
@ -2172,28 +2238,6 @@ void cWSSAnvil::LoadPigZombieFromNBT(cEntityList & a_Entities, const cParsedNBT
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cWSSAnvil::LoadTNTFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
|
|
||||||
{
|
|
||||||
std::auto_ptr<cTNTEntity> TNT(new cTNTEntity(0.0, 0.0, 0.0, 0));
|
|
||||||
if (!LoadEntityBaseFromNBT(*TNT.get(), a_NBT, a_TagIdx))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load Fuse Ticks:
|
|
||||||
int FuseTicks = a_NBT.FindChildByName(a_TagIdx, "Fuse");
|
|
||||||
if (FuseTicks > 0)
|
|
||||||
{
|
|
||||||
TNT->SetFuseTicks((int) a_NBT.GetByte(FuseTicks));
|
|
||||||
}
|
|
||||||
|
|
||||||
a_Entities.push_back(TNT.release());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cWSSAnvil::LoadEntityBaseFromNBT(cEntity & a_Entity, const cParsedNBT & a_NBT, int a_TagIdx)
|
bool cWSSAnvil::LoadEntityBaseFromNBT(cEntity & a_Entity, const cParsedNBT & a_NBT, int a_TagIdx)
|
||||||
{
|
{
|
||||||
double Pos[3];
|
double Pos[3];
|
||||||
|
@ -149,6 +149,8 @@ protected:
|
|||||||
void LoadBoatFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
|
void LoadBoatFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
|
||||||
void LoadFallingBlockFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
|
void LoadFallingBlockFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
|
||||||
void LoadPickupFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
|
void LoadPickupFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
|
||||||
|
void LoadTNTFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
|
||||||
|
void LoadExpOrbFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
|
||||||
|
|
||||||
void LoadMinecartRFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
|
void LoadMinecartRFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
|
||||||
void LoadMinecartCFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
|
void LoadMinecartCFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
|
||||||
@ -192,7 +194,6 @@ protected:
|
|||||||
void LoadWolfFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
|
void LoadWolfFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
|
||||||
void LoadZombieFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
|
void LoadZombieFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
|
||||||
void LoadPigZombieFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
|
void LoadPigZombieFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
|
||||||
void LoadTNTFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
|
|
||||||
|
|
||||||
/// Loads entity common data from the NBT compound; returns true if successful
|
/// Loads entity common data from the NBT compound; returns true if successful
|
||||||
bool LoadEntityBaseFromNBT(cEntity & a_Entity, const cParsedNBT & a_NBT, int a_TagIdx);
|
bool LoadEntityBaseFromNBT(cEntity & a_Entity, const cParsedNBT & a_NBT, int a_TagIdx);
|
||||||
|
Loading…
Reference in New Issue
Block a user