Properly exported cItemFrame and cHangingEntity to Lua.
This commit is contained in:
parent
881bc66233
commit
a42fa071bc
@ -41,6 +41,8 @@ $cfile "../Entities/FireChargeEntity.h"
|
|||||||
$cfile "../Entities/FireworkEntity.h"
|
$cfile "../Entities/FireworkEntity.h"
|
||||||
$cfile "../Entities/Floater.h"
|
$cfile "../Entities/Floater.h"
|
||||||
$cfile "../Entities/GhastFireballEntity.h"
|
$cfile "../Entities/GhastFireballEntity.h"
|
||||||
|
$cfile "../Entities/HangingEntity.h"
|
||||||
|
$cfile "../Entities/ItemFrame.h"
|
||||||
$cfile "../Entities/Pawn.h"
|
$cfile "../Entities/Pawn.h"
|
||||||
$cfile "../Entities/Player.h"
|
$cfile "../Entities/Player.h"
|
||||||
$cfile "../Entities/Painting.h"
|
$cfile "../Entities/Painting.h"
|
||||||
|
@ -82,6 +82,8 @@ set(BINDING_DEPENDENCIES
|
|||||||
../Entities/FireworkEntity.h
|
../Entities/FireworkEntity.h
|
||||||
../Entities/Floater.h
|
../Entities/Floater.h
|
||||||
../Entities/GhastFireballEntity.h
|
../Entities/GhastFireballEntity.h
|
||||||
|
../Entities/HangingEntity.h
|
||||||
|
../Entities/ItemFrame.h
|
||||||
../Entities/Pawn.h
|
../Entities/Pawn.h
|
||||||
../Entities/Player.h
|
../Entities/Player.h
|
||||||
../Entities/Painting.h
|
../Entities/Painting.h
|
||||||
|
@ -9,9 +9,9 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
cHangingEntity::cHangingEntity(eEntityType a_EntityType, eBlockFace a_BlockFace, double a_X, double a_Y, double a_Z)
|
cHangingEntity::cHangingEntity(eEntityType a_EntityType, eBlockFace a_Facing, double a_X, double a_Y, double a_Z) :
|
||||||
: cEntity(a_EntityType, a_X, a_Y, a_Z, 0.8, 0.8)
|
cEntity(a_EntityType, a_X, a_Y, a_Z, 0.8, 0.8),
|
||||||
, m_BlockFace(a_BlockFace)
|
m_Facing(a_Facing)
|
||||||
{
|
{
|
||||||
SetMaxHealth(1);
|
SetMaxHealth(1);
|
||||||
SetHealth(1);
|
SetHealth(1);
|
||||||
@ -21,15 +21,23 @@ cHangingEntity::cHangingEntity(eEntityType a_EntityType, eBlockFace a_BlockFace,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cHangingEntity::SetDirection(eBlockFace a_BlockFace)
|
void cHangingEntity::SetFacing(eBlockFace a_Facing)
|
||||||
{
|
{
|
||||||
if ((a_BlockFace < 2) || (a_BlockFace > 5))
|
// Y-based faces are not allowed:
|
||||||
|
switch (a_Facing)
|
||||||
{
|
{
|
||||||
ASSERT(!"Tried to set a bad direction!");
|
case BLOCK_FACE_NONE:
|
||||||
|
case BLOCK_FACE_YM:
|
||||||
|
case BLOCK_FACE_YP:
|
||||||
|
{
|
||||||
|
LOGWARNING("%s: Invalid facing: %d. Ignoring.", __FUNCTION__, a_Facing);
|
||||||
|
ASSERT(!"Tried to set a bad facing!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
|
||||||
m_BlockFace = a_BlockFace;
|
m_Facing = a_Facing;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -41,7 +49,7 @@ void cHangingEntity::SpawnOn(cClientHandle & a_ClientHandle)
|
|||||||
int Dir = 0;
|
int Dir = 0;
|
||||||
|
|
||||||
// The client uses different values for item frame directions and block faces. Our constants are for the block faces, so we convert them here to item frame faces
|
// The client uses different values for item frame directions and block faces. Our constants are for the block faces, so we convert them here to item frame faces
|
||||||
switch (m_BlockFace)
|
switch (m_Facing)
|
||||||
{
|
{
|
||||||
case BLOCK_FACE_ZP: Dir = 0; break;
|
case BLOCK_FACE_ZP: Dir = 0; break;
|
||||||
case BLOCK_FACE_ZM: Dir = 2; break;
|
case BLOCK_FACE_ZM: Dir = 2; break;
|
||||||
@ -49,8 +57,8 @@ void cHangingEntity::SpawnOn(cClientHandle & a_ClientHandle)
|
|||||||
case BLOCK_FACE_XP: Dir = 3; break;
|
case BLOCK_FACE_XP: Dir = 3; break;
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
LOGINFO("Invalid face (%d) in a cHangingEntity at {%d, %d, %d}, adjusting to BLOCK_FACE_XP.",
|
LOGINFO("Invalid facing (%d) in a cHangingEntity at {%d, %d, %d}, adjusting to BLOCK_FACE_XP.",
|
||||||
m_BlockFace, (int)GetPosX(), (int)GetPosY(), (int)GetPosZ()
|
m_Facing, (int)GetPosX(), (int)GetPosY(), (int)GetPosZ()
|
||||||
);
|
);
|
||||||
Dir = 3;
|
Dir = 3;
|
||||||
}
|
}
|
||||||
|
@ -11,36 +11,41 @@
|
|||||||
class cHangingEntity :
|
class cHangingEntity :
|
||||||
public cEntity
|
public cEntity
|
||||||
{
|
{
|
||||||
// tolua_end
|
|
||||||
typedef cEntity super;
|
typedef cEntity super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
// tolua_end
|
||||||
|
|
||||||
CLASS_PROTODEF(cHangingEntity)
|
CLASS_PROTODEF(cHangingEntity)
|
||||||
|
|
||||||
cHangingEntity(eEntityType a_EntityType, eBlockFace a_BlockFace, double a_X, double a_Y, double a_Z);
|
cHangingEntity(eEntityType a_EntityType, eBlockFace a_BlockFace, double a_X, double a_Y, double a_Z);
|
||||||
|
|
||||||
/** Returns the orientation from the hanging entity */
|
// tolua_begin
|
||||||
eBlockFace GetDirection() const { return m_BlockFace; } // tolua_export
|
|
||||||
|
|
||||||
/** Set the orientation from the hanging entity */
|
/** Returns the direction in which the entity is facing. */
|
||||||
void SetDirection(eBlockFace a_BlockFace); // tolua_export
|
eBlockFace GetFacing() const { return m_Facing; }
|
||||||
|
|
||||||
/** Returns the X coord. */
|
/** Set the direction in which the entity is facing. */
|
||||||
int GetTileX() const { return POSX_TOINT; } // tolua_export
|
void SetFacing(eBlockFace a_Facing);
|
||||||
|
|
||||||
/** Returns the Y coord. */
|
/** Returns the X coord of the block in which the entity resides. */
|
||||||
int GetTileY() const { return POSY_TOINT; } // tolua_export
|
int GetBlockX() const { return POSX_TOINT; }
|
||||||
|
|
||||||
/** Returns the Z coord. */
|
/** Returns the Y coord of the block in which the entity resides. */
|
||||||
int GetTileZ() const { return POSZ_TOINT; } // tolua_export
|
int GetBlockY() const { return POSY_TOINT; }
|
||||||
|
|
||||||
|
/** Returns the Z coord of the block in which the entity resides. */
|
||||||
|
int GetBlockZ() const { return POSZ_TOINT; }
|
||||||
|
|
||||||
|
// tolua_end
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
virtual void SpawnOn(cClientHandle & a_ClientHandle) override;
|
virtual void SpawnOn(cClientHandle & a_ClientHandle) override;
|
||||||
virtual void Tick(float a_Dt, cChunk & a_Chunk) override {}
|
virtual void Tick(float a_Dt, cChunk & a_Chunk) override {}
|
||||||
|
|
||||||
eBlockFace m_BlockFace;
|
eBlockFace m_Facing;
|
||||||
|
|
||||||
}; // tolua_export
|
}; // tolua_export
|
||||||
|
|
||||||
|
@ -9,10 +9,10 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
cItemFrame::cItemFrame(eBlockFace a_BlockFace, double a_X, double a_Y, double a_Z)
|
cItemFrame::cItemFrame(eBlockFace a_BlockFace, double a_X, double a_Y, double a_Z) :
|
||||||
: cHangingEntity(etItemFrame, a_BlockFace, a_X, a_Y, a_Z)
|
cHangingEntity(etItemFrame, a_BlockFace, a_X, a_Y, a_Z),
|
||||||
, m_Item(E_BLOCK_AIR)
|
m_Item(E_BLOCK_AIR),
|
||||||
, m_Rotation(0)
|
m_ItemRotation(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -27,10 +27,10 @@ void cItemFrame::OnRightClicked(cPlayer & a_Player)
|
|||||||
if (!m_Item.IsEmpty())
|
if (!m_Item.IsEmpty())
|
||||||
{
|
{
|
||||||
// Item not empty, rotate, clipping values to zero to three inclusive
|
// Item not empty, rotate, clipping values to zero to three inclusive
|
||||||
m_Rotation++;
|
m_ItemRotation++;
|
||||||
if (m_Rotation >= 8)
|
if (m_ItemRotation >= 8)
|
||||||
{
|
{
|
||||||
m_Rotation = 0;
|
m_ItemRotation = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!a_Player.GetEquippedItem().IsEmpty())
|
else if (!a_Player.GetEquippedItem().IsEmpty())
|
||||||
@ -72,7 +72,7 @@ void cItemFrame::KilledBy(TakeDamageInfo & a_TDI)
|
|||||||
|
|
||||||
SetHealth(GetMaxHealth());
|
SetHealth(GetMaxHealth());
|
||||||
m_Item.Empty();
|
m_Item.Empty();
|
||||||
m_Rotation = 0;
|
m_ItemRotation = 0;
|
||||||
SetInvulnerableTicks(0);
|
SetInvulnerableTicks(0);
|
||||||
GetWorld()->BroadcastEntityMetadata(*this);
|
GetWorld()->BroadcastEntityMetadata(*this);
|
||||||
}
|
}
|
||||||
|
@ -11,26 +11,31 @@
|
|||||||
class cItemFrame :
|
class cItemFrame :
|
||||||
public cHangingEntity
|
public cHangingEntity
|
||||||
{
|
{
|
||||||
// tolua_end
|
|
||||||
typedef cHangingEntity super;
|
typedef cHangingEntity super;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
// tolua_end
|
||||||
|
|
||||||
CLASS_PROTODEF(cItemFrame)
|
CLASS_PROTODEF(cItemFrame)
|
||||||
|
|
||||||
cItemFrame(eBlockFace a_BlockFace, double a_X, double a_Y, double a_Z);
|
cItemFrame(eBlockFace a_BlockFace, double a_X, double a_Y, double a_Z);
|
||||||
|
|
||||||
|
// tolua_begin
|
||||||
|
|
||||||
/** Returns the item in the frame */
|
/** Returns the item in the frame */
|
||||||
const cItem & GetItem(void) { return m_Item; } // tolua_export
|
const cItem & GetItem(void) { return m_Item; }
|
||||||
|
|
||||||
/** Set the item in the frame */
|
/** Set the item in the frame */
|
||||||
void SetItem(cItem & a_Item) { m_Item = a_Item; } // tolua_export
|
void SetItem(cItem & a_Item) { m_Item = a_Item; }
|
||||||
|
|
||||||
/** Returns the rotation from the item in the frame */
|
/** Returns the rotation from the item in the frame */
|
||||||
Byte GetRotation(void) const { return m_Rotation; } // tolua_export
|
Byte GetItemRotation(void) const { return m_ItemRotation; }
|
||||||
|
|
||||||
/** Set the rotation from the item in the frame */
|
/** Set the rotation from the item in the frame */
|
||||||
void SetRotation(Byte a_Rotation) { m_Rotation = a_Rotation; } // tolua_export
|
void SetRotation(Byte a_ItemRotation) { m_ItemRotation = a_ItemRotation; }
|
||||||
|
|
||||||
|
// tolua_end
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@ -39,7 +44,7 @@ private:
|
|||||||
virtual void GetDrops(cItems & a_Items, cEntity * a_Killer) override;
|
virtual void GetDrops(cItems & a_Items, cEntity * a_Killer) override;
|
||||||
|
|
||||||
cItem m_Item;
|
cItem m_Item;
|
||||||
Byte m_Rotation;
|
Byte m_ItemRotation;
|
||||||
|
|
||||||
}; // tolua_export
|
}; // tolua_export
|
||||||
|
|
||||||
|
@ -2803,7 +2803,7 @@ void cProtocol172::cPacketizer::WriteEntityMetadata(const cEntity & a_Entity)
|
|||||||
WriteByte(0xA2);
|
WriteByte(0xA2);
|
||||||
WriteItem(Frame.GetItem());
|
WriteItem(Frame.GetItem());
|
||||||
WriteByte(0x3);
|
WriteByte(0x3);
|
||||||
WriteByte(Frame.GetRotation() / 2);
|
WriteByte(Frame.GetItemRotation() / 2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: break;
|
default: break;
|
||||||
|
@ -3109,7 +3109,7 @@ void cProtocol180::cPacketizer::WriteEntityMetadata(const cEntity & a_Entity)
|
|||||||
WriteByte(0xA8);
|
WriteByte(0xA8);
|
||||||
WriteItem(Frame.GetItem());
|
WriteItem(Frame.GetItem());
|
||||||
WriteByte(0x09);
|
WriteByte(0x09);
|
||||||
WriteByte(Frame.GetRotation());
|
WriteByte(Frame.GetItemRotation());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: break;
|
default: break;
|
||||||
|
@ -685,21 +685,21 @@ void cNBTChunkSerializer::AddProjectileEntity(cProjectileEntity * a_Projectile)
|
|||||||
|
|
||||||
void cNBTChunkSerializer::AddHangingEntity(cHangingEntity * a_Hanging)
|
void cNBTChunkSerializer::AddHangingEntity(cHangingEntity * a_Hanging)
|
||||||
{
|
{
|
||||||
m_Writer.AddByte("Direction", (unsigned char)a_Hanging->GetDirection());
|
m_Writer.AddInt("TileX", a_Hanging->GetBlockX());
|
||||||
m_Writer.AddInt("TileX", a_Hanging->GetTileX());
|
m_Writer.AddInt("TileY", a_Hanging->GetBlockY());
|
||||||
m_Writer.AddInt("TileY", a_Hanging->GetTileY());
|
m_Writer.AddInt("TileZ", a_Hanging->GetBlockZ());
|
||||||
m_Writer.AddInt("TileZ", a_Hanging->GetTileZ());
|
switch (a_Hanging->GetFacing())
|
||||||
switch (a_Hanging->GetDirection())
|
|
||||||
{
|
{
|
||||||
case BLOCK_FACE_YM: m_Writer.AddByte("Dir", (unsigned char)2); break;
|
case BLOCK_FACE_XM: m_Writer.AddByte("Facing", 1); break;
|
||||||
case BLOCK_FACE_YP: m_Writer.AddByte("Dir", (unsigned char)1); break;
|
case BLOCK_FACE_XP: m_Writer.AddByte("Facing", 3); break;
|
||||||
case BLOCK_FACE_ZM: m_Writer.AddByte("Dir", (unsigned char)0); break;
|
case BLOCK_FACE_ZM: m_Writer.AddByte("Facing", 2); break;
|
||||||
case BLOCK_FACE_ZP: m_Writer.AddByte("Dir", (unsigned char)3); break;
|
case BLOCK_FACE_ZP: m_Writer.AddByte("Facing", 0); break;
|
||||||
|
|
||||||
case BLOCK_FACE_XM:
|
case BLOCK_FACE_YM:
|
||||||
case BLOCK_FACE_XP:
|
case BLOCK_FACE_YP:
|
||||||
case BLOCK_FACE_NONE:
|
case BLOCK_FACE_NONE:
|
||||||
{
|
{
|
||||||
|
// These directions are invalid, but they may have been previously loaded, so keep them.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -740,7 +740,7 @@ void cNBTChunkSerializer::AddItemFrameEntity(cItemFrame * a_ItemFrame)
|
|||||||
AddBasicEntity(a_ItemFrame, "ItemFrame");
|
AddBasicEntity(a_ItemFrame, "ItemFrame");
|
||||||
AddHangingEntity(a_ItemFrame);
|
AddHangingEntity(a_ItemFrame);
|
||||||
AddItem(a_ItemFrame->GetItem(), -1, "Item");
|
AddItem(a_ItemFrame->GetItem(), -1, "Item");
|
||||||
m_Writer.AddByte("ItemRotation", (unsigned char)a_ItemFrame->GetRotation());
|
m_Writer.AddByte("ItemRotation", (unsigned char)a_ItemFrame->GetItemRotation());
|
||||||
m_Writer.AddFloat("ItemDropChance", 1.0F);
|
m_Writer.AddFloat("ItemDropChance", 1.0F);
|
||||||
m_Writer.EndCompound();
|
m_Writer.EndCompound();
|
||||||
}
|
}
|
||||||
|
@ -1660,30 +1660,41 @@ void cWSSAnvil::LoadExpOrbFromNBT(cEntityList & a_Entities, const cParsedNBT & a
|
|||||||
|
|
||||||
void cWSSAnvil::LoadHangingFromNBT(cHangingEntity & a_Hanging, const cParsedNBT & a_NBT, int a_TagIdx)
|
void cWSSAnvil::LoadHangingFromNBT(cHangingEntity & a_Hanging, const cParsedNBT & a_NBT, int a_TagIdx)
|
||||||
{
|
{
|
||||||
int Direction = a_NBT.FindChildByName(a_TagIdx, "Direction");
|
// "Facing" tag is the prime source of the Facing; if not available, translate from older "Direction" or "Dir"
|
||||||
if (Direction > 0)
|
int Facing = a_NBT.FindChildByName(a_TagIdx, "Facing");
|
||||||
|
if (Facing > 0)
|
||||||
{
|
{
|
||||||
Direction = (int)a_NBT.GetByte(Direction);
|
Facing = (int)a_NBT.GetByte(Facing);
|
||||||
if ((Direction < 2) || (Direction > 5))
|
if ((Facing >= 2) && (Facing <= 5))
|
||||||
{
|
{
|
||||||
a_Hanging.SetDirection(BLOCK_FACE_NORTH);
|
a_Hanging.SetFacing(static_cast<eBlockFace>(Facing));
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
a_Hanging.SetDirection(static_cast<eBlockFace>(Direction));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Direction = a_NBT.FindChildByName(a_TagIdx, "Dir");
|
Facing = a_NBT.FindChildByName(a_TagIdx, "Direction");
|
||||||
if (Direction > 0)
|
if (Facing > 0)
|
||||||
{
|
{
|
||||||
switch ((int)a_NBT.GetByte(Direction))
|
switch ((int)a_NBT.GetByte(Facing))
|
||||||
{
|
{
|
||||||
case 0: a_Hanging.SetDirection(BLOCK_FACE_NORTH); break;
|
case 0: a_Hanging.SetFacing(BLOCK_FACE_ZM); break;
|
||||||
case 1: a_Hanging.SetDirection(BLOCK_FACE_TOP); break;
|
case 1: a_Hanging.SetFacing(BLOCK_FACE_XM); break;
|
||||||
case 2: a_Hanging.SetDirection(BLOCK_FACE_BOTTOM); break;
|
case 2: a_Hanging.SetFacing(BLOCK_FACE_ZP); break;
|
||||||
case 3: a_Hanging.SetDirection(BLOCK_FACE_SOUTH); break;
|
case 3: a_Hanging.SetFacing(BLOCK_FACE_XP); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Facing = a_NBT.FindChildByName(a_TagIdx, "Dir"); // Has values 0 and 2 swapped
|
||||||
|
if (Facing > 0)
|
||||||
|
{
|
||||||
|
switch ((int)a_NBT.GetByte(Facing))
|
||||||
|
{
|
||||||
|
case 0: a_Hanging.SetFacing(BLOCK_FACE_ZP); break;
|
||||||
|
case 1: a_Hanging.SetFacing(BLOCK_FACE_XM); break;
|
||||||
|
case 2: a_Hanging.SetFacing(BLOCK_FACE_ZM); break;
|
||||||
|
case 3: a_Hanging.SetFacing(BLOCK_FACE_XP); break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user