Merge pull request #534 from mc-server/SpawnMinecart
Added cWorld::SpawnMinecart.
This commit is contained in:
commit
79c1f6f438
@ -54,6 +54,7 @@ void cMinecart::SpawnOn(cClientHandle & a_ClientHandle)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
a_ClientHandle.SendSpawnVehicle(*this, 10, SubType); // 10 = Minecarts, SubType = What type of Minecart
|
a_ClientHandle.SendSpawnVehicle(*this, 10, SubType); // 10 = Minecarts, SubType = What type of Minecart
|
||||||
|
a_ClientHandle.SendEntityMetadata(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -672,10 +673,12 @@ void cMinecart::Destroyed()
|
|||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// cEmptyMinecart:
|
// cRideableMinecart:
|
||||||
|
|
||||||
cEmptyMinecart::cEmptyMinecart(double a_X, double a_Y, double a_Z) :
|
cRideableMinecart::cRideableMinecart(double a_X, double a_Y, double a_Z, const cItem & a_Content, int a_Height) :
|
||||||
super(mpNone, a_X, a_Y, a_Z)
|
super(mpNone, a_X, a_Y, a_Z),
|
||||||
|
m_Content(a_Content),
|
||||||
|
m_Height(a_Height)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -683,7 +686,7 @@ cEmptyMinecart::cEmptyMinecart(double a_X, double a_Y, double a_Z) :
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cEmptyMinecart::OnRightClicked(cPlayer & a_Player)
|
void cRideableMinecart::OnRightClicked(cPlayer & a_Player)
|
||||||
{
|
{
|
||||||
if (m_Attachee != NULL)
|
if (m_Attachee != NULL)
|
||||||
{
|
{
|
||||||
|
@ -90,18 +90,24 @@ protected:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
class cEmptyMinecart :
|
class cRideableMinecart :
|
||||||
public cMinecart
|
public cMinecart
|
||||||
{
|
{
|
||||||
typedef cMinecart super;
|
typedef cMinecart super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CLASS_PROTODEF(cEmptyMinecart);
|
CLASS_PROTODEF(cRideableMinecart);
|
||||||
|
|
||||||
cEmptyMinecart(double a_X, double a_Y, double a_Z);
|
cRideableMinecart(double a_X, double a_Y, double a_Z, const cItem & a_Content, int a_Height);
|
||||||
|
|
||||||
|
const cItem & GetContent(void) const {return m_Content;}
|
||||||
|
int GetBlockHeight(void) const {return m_Height;}
|
||||||
// cEntity overrides:
|
// cEntity overrides:
|
||||||
virtual void OnRightClicked(cPlayer & a_Player) override;
|
virtual void OnRightClicked(cPlayer & a_Player) override;
|
||||||
|
protected:
|
||||||
|
|
||||||
|
cItem m_Content;
|
||||||
|
int m_Height;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ public:
|
|||||||
cMinecart * Minecart = NULL;
|
cMinecart * Minecart = NULL;
|
||||||
switch (m_ItemType)
|
switch (m_ItemType)
|
||||||
{
|
{
|
||||||
case E_ITEM_MINECART: Minecart = new cEmptyMinecart (x, y, z); break;
|
case E_ITEM_MINECART: Minecart = new cRideableMinecart (x, y, z, cItem(), 1); break;
|
||||||
case E_ITEM_CHEST_MINECART: Minecart = new cMinecartWithChest (x, y, z); break;
|
case E_ITEM_CHEST_MINECART: Minecart = new cMinecartWithChest (x, y, z); break;
|
||||||
case E_ITEM_FURNACE_MINECART: Minecart = new cMinecartWithFurnace (x, y, z); break;
|
case E_ITEM_FURNACE_MINECART: Minecart = new cMinecartWithFurnace (x, y, z); break;
|
||||||
case E_ITEM_MINECART_WITH_TNT: Minecart = new cMinecartWithTNT (x, y, z); break;
|
case E_ITEM_MINECART_WITH_TNT: Minecart = new cMinecartWithTNT (x, y, z); break;
|
||||||
|
@ -1890,8 +1890,23 @@ void cProtocol172::cPacketizer::WriteEntityMetadata(const cEntity & a_Entity)
|
|||||||
WriteInt(1); // Shaking direction, doesn't seem to affect anything
|
WriteInt(1); // Shaking direction, doesn't seem to affect anything
|
||||||
WriteByte(0x73);
|
WriteByte(0x73);
|
||||||
WriteFloat((float)(((const cMinecart &)a_Entity).LastDamage() + 10)); // Damage taken / shake effect multiplyer
|
WriteFloat((float)(((const cMinecart &)a_Entity).LastDamage() + 10)); // Damage taken / shake effect multiplyer
|
||||||
|
|
||||||
if (((cMinecart &)a_Entity).GetPayload() == cMinecart::mpFurnace)
|
if (((cMinecart &)a_Entity).GetPayload() == cMinecart::mpNone)
|
||||||
|
{
|
||||||
|
cRideableMinecart & RideableMinecart = ((cRideableMinecart &)a_Entity);
|
||||||
|
if (!RideableMinecart.GetContent().IsEmpty())
|
||||||
|
{
|
||||||
|
WriteByte(0x54);
|
||||||
|
int Content = RideableMinecart.GetContent().m_ItemType;
|
||||||
|
Content |= RideableMinecart.GetContent().m_ItemDamage << 8;
|
||||||
|
WriteInt(Content);
|
||||||
|
WriteByte(0x55);
|
||||||
|
WriteInt(RideableMinecart.GetBlockHeight());
|
||||||
|
WriteByte(0x56);
|
||||||
|
WriteByte(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (((cMinecart &)a_Entity).GetPayload() == cMinecart::mpFurnace)
|
||||||
{
|
{
|
||||||
WriteByte(0x10);
|
WriteByte(0x10);
|
||||||
WriteByte(((const cMinecartWithFurnace &)a_Entity).IsFueled() ? 1 : 0);
|
WriteByte(((const cMinecartWithFurnace &)a_Entity).IsFueled() ? 1 : 0);
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
// Entities (except mobs):
|
// Entities (except mobs):
|
||||||
#include "Entities/ExpOrb.h"
|
#include "Entities/ExpOrb.h"
|
||||||
#include "Entities/FallingBlock.h"
|
#include "Entities/FallingBlock.h"
|
||||||
|
#include "Entities/Minecart.h"
|
||||||
#include "Entities/Pickup.h"
|
#include "Entities/Pickup.h"
|
||||||
#include "Entities/Player.h"
|
#include "Entities/Player.h"
|
||||||
#include "Entities/TNTEntity.h"
|
#include "Entities/TNTEntity.h"
|
||||||
@ -1673,6 +1674,29 @@ int cWorld::SpawnExperienceOrb(double a_X, double a_Y, double a_Z, int a_Reward)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int cWorld::SpawnMinecart(double a_X, double a_Y, double a_Z, int a_MinecartType, const cItem & a_Content, int a_BlockHeight)
|
||||||
|
{
|
||||||
|
cMinecart * Minecart;
|
||||||
|
switch (a_MinecartType)
|
||||||
|
{
|
||||||
|
case E_ITEM_MINECART: Minecart = new cRideableMinecart (a_X, a_Y, a_Z, a_Content, a_BlockHeight); break;
|
||||||
|
case E_ITEM_CHEST_MINECART: Minecart = new cMinecartWithChest (a_X, a_Y, a_Z); break;
|
||||||
|
case E_ITEM_FURNACE_MINECART: Minecart = new cMinecartWithFurnace (a_X, a_Y, a_Z); break;
|
||||||
|
case E_ITEM_MINECART_WITH_TNT: Minecart = new cMinecartWithTNT (a_X, a_Y, a_Z); break;
|
||||||
|
case E_ITEM_MINECART_WITH_HOPPER: Minecart = new cMinecartWithHopper (a_X, a_Y, a_Z); break;
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} // switch (a_MinecartType)
|
||||||
|
Minecart->Initialize(this);
|
||||||
|
return Minecart->GetUniqueID();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cWorld::SpawnPrimedTNT(double a_X, double a_Y, double a_Z, double a_FuseTimeInSec, double a_InitialVelocityCoeff)
|
void cWorld::SpawnPrimedTNT(double a_X, double a_Y, double a_Z, double a_FuseTimeInSec, double a_InitialVelocityCoeff)
|
||||||
{
|
{
|
||||||
UNUSED(a_InitialVelocityCoeff);
|
UNUSED(a_InitialVelocityCoeff);
|
||||||
|
@ -374,6 +374,9 @@ public:
|
|||||||
/// Spawns an falling block entity at the given position. It returns the UniqueID of the spawned falling block.
|
/// Spawns an falling block entity at the given position. It returns the UniqueID of the spawned falling block.
|
||||||
int SpawnFallingBlock(int a_X, int a_Y, int a_Z, BLOCKTYPE BlockType, NIBBLETYPE BlockMeta);
|
int SpawnFallingBlock(int a_X, int a_Y, int a_Z, BLOCKTYPE BlockType, NIBBLETYPE BlockMeta);
|
||||||
|
|
||||||
|
/// Spawns an minecart at the given coordinates.
|
||||||
|
int SpawnMinecart(double a_X, double a_Y, double a_Z, int a_MinecartType, const cItem & a_Content = cItem(), int a_BlockHeight = 1);
|
||||||
|
|
||||||
/// Spawns an experience orb at the given location with the given reward. It returns the UniqueID of the spawned experience orb.
|
/// Spawns an experience orb at the given location with the given reward. It returns the UniqueID of the spawned experience orb.
|
||||||
int SpawnExperienceOrb(double a_X, double a_Y, double a_Z, int a_Reward);
|
int SpawnExperienceOrb(double a_X, double a_Y, double a_Z, int a_Reward);
|
||||||
|
|
||||||
|
@ -1150,7 +1150,7 @@ void cWSSAnvil::LoadFallingBlockFromNBT(cEntityList & a_Entities, const cParsedN
|
|||||||
|
|
||||||
void cWSSAnvil::LoadMinecartRFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
|
void cWSSAnvil::LoadMinecartRFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
|
||||||
{
|
{
|
||||||
std::auto_ptr<cEmptyMinecart> Minecart(new cEmptyMinecart(0, 0, 0));
|
std::auto_ptr<cRideableMinecart> Minecart(new cRideableMinecart(0, 0, 0, cItem(), 1)); // TODO: Load the block and the height
|
||||||
if (!LoadEntityBaseFromNBT(*Minecart.get(), a_NBT, a_TagIdx))
|
if (!LoadEntityBaseFromNBT(*Minecart.get(), a_NBT, a_TagIdx))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user