summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/BlockEntities/DispenserEntity.cpp2
-rw-r--r--src/ByteBuffer.cpp28
-rw-r--r--src/ByteBuffer.h1
-rw-r--r--src/Entities/HangingEntity.cpp15
-rw-r--r--src/Entities/HangingEntity.h2
-rw-r--r--src/Generating/BioGen.cpp35
-rw-r--r--src/Mobs/Villager.cpp6
-rw-r--r--src/Protocol/ChunkDataSerializer.cpp2
-rw-r--r--src/Protocol/Protocol18x.cpp74
-rw-r--r--src/Protocol/Protocol18x.h6
-rw-r--r--src/World.cpp17
-rw-r--r--src/WorldStorage/NBTChunkSerializer.cpp6
-rw-r--r--src/WorldStorage/WSSAnvil.cpp27
13 files changed, 168 insertions, 53 deletions
diff --git a/src/BlockEntities/DispenserEntity.cpp b/src/BlockEntities/DispenserEntity.cpp
index d3c06653f..068891d66 100644
--- a/src/BlockEntities/DispenserEntity.cpp
+++ b/src/BlockEntities/DispenserEntity.cpp
@@ -203,7 +203,7 @@ void cDispenserEntity::SpawnProjectileFromDispenser(int a_BlockX, int a_BlockY,
Vector3d cDispenserEntity::GetShootVector(NIBBLETYPE a_Meta)
{
- switch (a_Meta)
+ switch (a_Meta & 0x7)
{
case E_META_DROPSPENSER_FACING_YP: return Vector3d( 0, 1, 0);
case E_META_DROPSPENSER_FACING_YM: return Vector3d( 0, -1, 0);
diff --git a/src/ByteBuffer.cpp b/src/ByteBuffer.cpp
index 17e8091c7..70fdc008c 100644
--- a/src/ByteBuffer.cpp
+++ b/src/ByteBuffer.cpp
@@ -497,12 +497,15 @@ bool cByteBuffer::ReadPosition(int & a_BlockX, int & a_BlockY, int & a_BlockZ)
return false;
}
- UInt32 BlockXRaw = (Value >> 38) & 0x3ffffff;
- UInt32 BlockYRaw = (Value >> 26) & 0xfff;
- UInt32 BlockZRaw = (Value & 0x3ffffff);
- a_BlockX = ((BlockXRaw & 0x2000000) == 0) ? BlockXRaw : (~(BlockXRaw & 0x1ffffff)) + 1;
- a_BlockY = ((BlockYRaw & 0x800) == 0) ? BlockYRaw : (~(BlockXRaw & 0x7ff)) + 1;
- a_BlockZ = ((BlockZRaw & 0x2000000) == 0) ? BlockZRaw : (~(BlockZRaw & 0x1ffffff)) + 1;
+ // Convert the 64 received bits into 3 coords:
+ UInt32 BlockXRaw = (Value >> 38) & 0x03ffffff; // Top 26 bits
+ UInt32 BlockYRaw = (Value >> 26) & 0x0fff; // Middle 12 bits
+ UInt32 BlockZRaw = (Value & 0x03ffffff); // Bottom 26 bits
+
+ // If the highest bit in the number's range is set, convert the number into negative:
+ a_BlockX = ((BlockXRaw & 0x02000000) == 0) ? BlockXRaw : -(0x04000000 - (int)BlockXRaw);
+ a_BlockY = ((BlockYRaw & 0x0800) == 0) ? BlockYRaw : -(0x0800 - (int)BlockYRaw);
+ a_BlockZ = ((BlockZRaw & 0x02000000) == 0) ? BlockZRaw : -(0x04000000 - (int)BlockZRaw);
return true;
}
@@ -547,6 +550,19 @@ bool cByteBuffer::WriteBEShort(short a_Value)
+bool cByteBuffer::WriteBEUShort(unsigned short a_Value)
+{
+ CHECK_THREAD;
+ CheckValid();
+ PUTBYTES(2);
+ u_short Converted = htons((u_short)a_Value);
+ return WriteBuf(&Converted, 2);
+}
+
+
+
+
+
bool cByteBuffer::WriteBEInt(int a_Value)
{
CHECK_THREAD;
diff --git a/src/ByteBuffer.h b/src/ByteBuffer.h
index c1c71d8c4..74dc378d4 100644
--- a/src/ByteBuffer.h
+++ b/src/ByteBuffer.h
@@ -82,6 +82,7 @@ public:
bool WriteChar (char a_Value);
bool WriteByte (unsigned char a_Value);
bool WriteBEShort (short a_Value);
+ bool WriteBEUShort (unsigned short a_Value);
bool WriteBEInt (int a_Value);
bool WriteBEInt64 (Int64 a_Value);
bool WriteBEFloat (float a_Value);
diff --git a/src/Entities/HangingEntity.cpp b/src/Entities/HangingEntity.cpp
index 6e9a89550..3276bc4a0 100644
--- a/src/Entities/HangingEntity.cpp
+++ b/src/Entities/HangingEntity.cpp
@@ -21,6 +21,21 @@ cHangingEntity::cHangingEntity(eEntityType a_EntityType, eBlockFace a_BlockFace,
+void cHangingEntity::SetDirection(eBlockFace a_BlockFace)
+{
+ if ((a_BlockFace < 2) || (a_BlockFace > 5))
+ {
+ ASSERT(!"Tried to set a bad direction!");
+ return;
+ }
+
+ m_BlockFace = a_BlockFace;
+}
+
+
+
+
+
void cHangingEntity::SpawnOn(cClientHandle & a_ClientHandle)
{
int Dir = 0;
diff --git a/src/Entities/HangingEntity.h b/src/Entities/HangingEntity.h
index 3593f9ede..1cc0034e1 100644
--- a/src/Entities/HangingEntity.h
+++ b/src/Entities/HangingEntity.h
@@ -24,7 +24,7 @@ public:
eBlockFace GetDirection() const { return m_BlockFace; } // tolua_export
/** Set the orientation from the hanging entity */
- void SetDirection(eBlockFace a_BlockFace) { m_BlockFace = a_BlockFace; } // tolua_export
+ void SetDirection(eBlockFace a_BlockFace); // tolua_export
/** Returns the X coord. */
int GetTileX() const { return POSX_TOINT; } // tolua_export
diff --git a/src/Generating/BioGen.cpp b/src/Generating/BioGen.cpp
index 217ca8f80..3ee0bd4c5 100644
--- a/src/Generating/BioGen.cpp
+++ b/src/Generating/BioGen.cpp
@@ -913,15 +913,32 @@ EMCSBiome cBioGenTwoLevel::SelectBiome(int a_BiomeGroup, int a_BiomeIdx, int a_D
void cBioGenTwoLevel::InitializeBiomeGen(cIniFile & a_IniFile)
{
- // TODO: Read these from a file
- m_VoronoiLarge.SetCellSize(1024);
- m_VoronoiSmall.SetCellSize(128);
- m_DistortX.AddOctave(0.01f, 16);
- m_DistortX.AddOctave(0.005f, 8);
- m_DistortX.AddOctave(0.0025f, 4);
- m_DistortZ.AddOctave(0.01f, 16);
- m_DistortZ.AddOctave(0.005f, 8);
- m_DistortZ.AddOctave(0.0025f, 4);
+ m_VoronoiLarge.SetCellSize(a_IniFile.GetValueSetI("Generator", "TwoLevelLargeCellSize", 1024));
+ m_VoronoiSmall.SetCellSize(a_IniFile.GetValueSetI("Generator", "TwoLevelSmallCellSize", 128));
+ m_DistortX.AddOctave(
+ (float)a_IniFile.GetValueSetF("Generator", "TwoLevelDistortXOctave1Freq", 0.01),
+ (float)a_IniFile.GetValueSetF("Generator", "TwoLevelDistortXOctave1Amp", 16)
+ );
+ m_DistortX.AddOctave(
+ (float)a_IniFile.GetValueSetF("Generator", "TwoLevelDistortXOctave2Freq", 0.005),
+ (float)a_IniFile.GetValueSetF("Generator", "TwoLevelDistortXOctave2Amp", 8)
+ );
+ m_DistortX.AddOctave(
+ (float)a_IniFile.GetValueSetF("Generator", "TwoLevelDistortXOctave3Freq", 0.0025),
+ (float)a_IniFile.GetValueSetF("Generator", "TwoLevelDistortXOctave3Amp", 4)
+ );
+ m_DistortZ.AddOctave(
+ (float)a_IniFile.GetValueSetF("Generator", "TwoLevelDistortZOctave1Freq", 0.01),
+ (float)a_IniFile.GetValueSetF("Generator", "TwoLevelDistortZOctave1Amp", 16)
+ );
+ m_DistortZ.AddOctave(
+ (float)a_IniFile.GetValueSetF("Generator", "TwoLevelDistortZOctave2Freq", 0.005),
+ (float)a_IniFile.GetValueSetF("Generator", "TwoLevelDistortZOctave2Amp", 8)
+ );
+ m_DistortZ.AddOctave(
+ (float)a_IniFile.GetValueSetF("Generator", "TwoLevelDistortZOctave3Freq", 0.0025),
+ (float)a_IniFile.GetValueSetF("Generator", "TwoLevelDistortZOctave3Amp", 4)
+ );
}
diff --git a/src/Mobs/Villager.cpp b/src/Mobs/Villager.cpp
index 1cdac7c74..0efd5501e 100644
--- a/src/Mobs/Villager.cpp
+++ b/src/Mobs/Villager.cpp
@@ -109,11 +109,11 @@ void cVillager::HandleFarmerPrepareFarmCrops()
Surrounding.Read(
m_World,
(int) GetPosX() - 5,
- (int) GetPosX() + 5,
+ (int) GetPosX() + 6,
(int) GetPosY() - 3,
- (int) GetPosY() + 3,
+ (int) GetPosY() + 4,
(int) GetPosZ() - 5,
- (int) GetPosZ() + 5
+ (int) GetPosZ() + 6
);
for (int I = 0; I < 5; I++)
diff --git a/src/Protocol/ChunkDataSerializer.cpp b/src/Protocol/ChunkDataSerializer.cpp
index a133cc0e3..5d080656d 100644
--- a/src/Protocol/ChunkDataSerializer.cpp
+++ b/src/Protocol/ChunkDataSerializer.cpp
@@ -191,7 +191,7 @@ void cChunkDataSerializer::Serialize47(AString & a_Data, int a_ChunkX, int a_Chu
Packet.WriteBEInt(a_ChunkX);
Packet.WriteBEInt(a_ChunkZ);
Packet.WriteBool(true); // "Ground-up continuous", or rather, "biome data present" flag
- Packet.WriteBEShort((short) 0xffff); // We're aways sending the full chunk with no additional data, so the bitmap is 0xffff
+ Packet.WriteBEUShort(0xffff); // We're aways sending the full chunk with no additional data, so the bitmap is 0xffff
// Write the chunk size:
const int BiomeDataSize = cChunkDef::Width * cChunkDef::Width;
diff --git a/src/Protocol/Protocol18x.cpp b/src/Protocol/Protocol18x.cpp
index 0cafdeb76..9f7569ff2 100644
--- a/src/Protocol/Protocol18x.cpp
+++ b/src/Protocol/Protocol18x.cpp
@@ -1000,6 +1000,7 @@ void cProtocol180::SendPluginMessage(const AString & a_Channel, const AString &
cPacketizer Pkt(*this, 0x3f);
Pkt.WriteString(a_Channel);
+ Pkt.WriteVarInt((UInt32)a_Message.size());
Pkt.WriteBuf(a_Message.data(), a_Message.size());
}
@@ -1391,13 +1392,18 @@ void cProtocol180::SendUpdateBlockEntity(cBlockEntity & a_BlockEntity)
void cProtocol180::SendUpdateSign(int a_BlockX, int a_BlockY, int a_BlockZ, const AString & a_Line1, const AString & a_Line2, const AString & a_Line3, const AString & a_Line4)
{
ASSERT(m_State == 3); // In game mode?
-
+
cPacketizer Pkt(*this, 0x33);
Pkt.WritePosition(a_BlockX, a_BlockY, a_BlockZ);
- Pkt.WriteString(Printf("{\"text\": \"%s\"}", a_Line1.c_str()));
- Pkt.WriteString(Printf("{\"text\": \"%s\"}", a_Line2.c_str()));
- Pkt.WriteString(Printf("{\"text\": \"%s\"}", a_Line3.c_str()));
- Pkt.WriteString(Printf("{\"text\": \"%s\"}", a_Line4.c_str()));
+
+ Json::StyledWriter JsonWriter;
+ AString Lines[] = { a_Line1, a_Line2, a_Line3, a_Line4 };
+ for (size_t i = 0; i < ARRAYCOUNT(Lines); i++)
+ {
+ Json::Value RootValue;
+ RootValue["text"] = Lines[i];
+ Pkt.WriteString(JsonWriter.write(RootValue).c_str());
+ }
}
@@ -1711,20 +1717,43 @@ void cProtocol180::AddReceivedData(const char * a_Data, size_t a_Size)
m_ReceivedData.ResetRead();
break;
}
- cByteBuffer bb(PacketLen + 1);
- VERIFY(m_ReceivedData.ReadToByteBuffer(bb, (int)PacketLen));
- m_ReceivedData.CommitRead();
-
- // Compressed packets
+
+ // Check packet for compression:
+ UInt32 CompressedSize = 0;
+ AString UncompressedData;
if (m_State == 3)
{
- UInt32 CompressedSize;
- if (!bb.ReadVarInt(CompressedSize))
+ UInt32 NumBytesRead = m_ReceivedData.GetReadableSpace();
+ m_ReceivedData.ReadVarInt(CompressedSize);
+ if (CompressedSize > 0)
{
- // Not enough data
- break;
+ // Decompress the data:
+ AString CompressedData;
+ m_ReceivedData.ReadString(CompressedData, CompressedSize);
+ InflateString(CompressedData.data(), CompressedSize, UncompressedData);
+ PacketLen = UncompressedData.size();
}
+ else
+ {
+ NumBytesRead -= m_ReceivedData.GetReadableSpace(); // How many bytes has the CompressedSize taken up?
+ ASSERT(PacketLen > NumBytesRead);
+ PacketLen -= NumBytesRead;
+ }
+ }
+
+ // Move the packet payload to a separate cByteBuffer, bb:
+ cByteBuffer bb(PacketLen + 1);
+ if (CompressedSize == 0)
+ {
+ // No compression was used, move directly
+ VERIFY(m_ReceivedData.ReadToByteBuffer(bb, (int)PacketLen));
}
+ else
+ {
+ // Compression was used, move the uncompressed data:
+ VERIFY(bb.Write(UncompressedData.data(), UncompressedData.size()));
+ }
+ m_ReceivedData.CommitRead();
UInt32 PacketType;
if (!bb.ReadVarInt(PacketType))
@@ -1966,13 +1995,19 @@ void cProtocol180::HandlePacketStatusRequest(cByteBuffer & a_ByteBuffer)
void cProtocol180::HandlePacketLoginEncryptionResponse(cByteBuffer & a_ByteBuffer)
{
UInt32 EncKeyLength, EncNonceLength;
- a_ByteBuffer.ReadVarInt(EncKeyLength);
+ if (!a_ByteBuffer.ReadVarInt(EncKeyLength))
+ {
+ return;
+ }
AString EncKey;
if (!a_ByteBuffer.ReadString(EncKey, EncKeyLength))
{
return;
}
- a_ByteBuffer.ReadVarInt(EncNonceLength);
+ if (!a_ByteBuffer.ReadVarInt(EncNonceLength))
+ {
+ return;
+ }
AString EncNonce;
if (!a_ByteBuffer.ReadString(EncNonce, EncNonceLength))
{
@@ -2292,8 +2327,9 @@ void cProtocol180::HandlePacketPlayerPosLook(cByteBuffer & a_ByteBuffer)
void cProtocol180::HandlePacketPluginMessage(cByteBuffer & a_ByteBuffer)
{
HANDLE_READ(a_ByteBuffer, ReadVarUTF8String, AString, Channel);
+ HANDLE_READ(a_ByteBuffer, ReadVarInt, UInt32, DataLen);
AString Data;
- a_ByteBuffer.ReadAll(Data);
+ a_ByteBuffer.ReadString(Data, DataLen);
m_Client->HandlePluginMessage(Channel, Data);
}
@@ -2520,7 +2556,7 @@ void cProtocol180::SendData(const char * a_Data, size_t a_Size)
-bool cProtocol180::ReadItem(cByteBuffer & a_ByteBuffer, cItem & a_Item, size_t a_RemainingBytes)
+bool cProtocol180::ReadItem(cByteBuffer & a_ByteBuffer, cItem & a_Item, size_t a_KeepRemainingBytes)
{
HANDLE_PACKET_READ(a_ByteBuffer, ReadBEShort, short, ItemType);
if (ItemType == -1)
@@ -2541,7 +2577,7 @@ bool cProtocol180::ReadItem(cByteBuffer & a_ByteBuffer, cItem & a_Item, size_t a
}
AString Metadata;
- if (!a_ByteBuffer.ReadString(Metadata, a_ByteBuffer.GetReadableSpace() - a_RemainingBytes) || (Metadata.size() == 0) || (Metadata[0] == 0))
+ if (!a_ByteBuffer.ReadString(Metadata, a_ByteBuffer.GetReadableSpace() - a_KeepRemainingBytes - 1) || (Metadata.size() == 0) || (Metadata[0] == 0))
{
// No metadata
return true;
diff --git a/src/Protocol/Protocol18x.h b/src/Protocol/Protocol18x.h
index eb0253663..df188b70f 100644
--- a/src/Protocol/Protocol18x.h
+++ b/src/Protocol/Protocol18x.h
@@ -321,8 +321,10 @@ protected:
void SendCompass(const cWorld & a_World);
- /** Reads an item out of the received data, sets a_Item to the values read. Returns false if not enough received data */
- virtual bool ReadItem(cByteBuffer & a_ByteBuffer, cItem & a_Item, size_t a_RemainingBytes = 0);
+ /** Reads an item out of the received data, sets a_Item to the values read.
+ Returns false if not enough received data.
+ a_KeepRemainingBytes tells the function to keep that many bytes at the end of the buffer. */
+ virtual bool ReadItem(cByteBuffer & a_ByteBuffer, cItem & a_Item, size_t a_KeepRemainingBytes = 0);
/** Parses item metadata as read by ReadItem(), into the item enchantments. */
void ParseItemMetadata(cItem & a_Item, const AString & a_Metadata);
diff --git a/src/World.cpp b/src/World.cpp
index f272d0ebe..cd23ff191 100644
--- a/src/World.cpp
+++ b/src/World.cpp
@@ -681,8 +681,19 @@ void cWorld::GenerateRandomSpawn(void)
{
LOGD("Generating random spawnpoint...");
- while (IsBlockWaterOrIce(GetBlock((int)m_SpawnX, GetHeight((int)m_SpawnX, (int)m_SpawnZ), (int)m_SpawnZ)))
+ // Look for a spawn point at most 100 chunks away from map center:
+ for (int i = 0; i < 100; i++)
{
+ EMCSBiome biome = GetBiomeAt((int)m_SpawnX, (int)m_SpawnZ);
+ if (
+ (biome != biOcean) && (biome != biFrozenOcean) && // The biome is acceptable (don't want a small ocean island)
+ !IsBlockWaterOrIce(GetBlock((int)m_SpawnX, GetHeight((int)m_SpawnX, (int)m_SpawnZ), (int)m_SpawnZ)) // The terrain is acceptable (don't want to spawn inside a lake / river)
+ )
+ {
+ // A good spawnpoint was found
+ break;
+ }
+ // Try a neighboring chunk:
if ((GetTickRandomNumber(4) % 2) == 0) // Randomise whether to increment X or Z coords
{
m_SpawnX += cChunkDef::Width;
@@ -691,11 +702,11 @@ void cWorld::GenerateRandomSpawn(void)
{
m_SpawnZ += cChunkDef::Width;
}
- }
+ } // for i - 100*
m_SpawnY = (double)GetHeight((int)m_SpawnX, (int)m_SpawnZ) + 1.6f; // 1.6f to accomodate player height
- LOGD("Generated random spawnpoint %i %i %i", (int)m_SpawnX, (int)m_SpawnY, (int)m_SpawnZ);
+ LOGINFO("Generated random spawnpoint position {%i, %i, %i}", (int)m_SpawnX, (int)m_SpawnY, (int)m_SpawnZ);
}
diff --git a/src/WorldStorage/NBTChunkSerializer.cpp b/src/WorldStorage/NBTChunkSerializer.cpp
index 6cc901b0c..2420c905b 100644
--- a/src/WorldStorage/NBTChunkSerializer.cpp
+++ b/src/WorldStorage/NBTChunkSerializer.cpp
@@ -637,9 +637,9 @@ void cNBTChunkSerializer::AddProjectileEntity(cProjectileEntity * a_Projectile)
{
cArrowEntity * Arrow = (cArrowEntity *)a_Projectile;
- m_Writer.AddInt("xTile", (Int16)Arrow->GetBlockHit().x);
- m_Writer.AddInt("yTile", (Int16)Arrow->GetBlockHit().y);
- m_Writer.AddInt("zTile", (Int16)Arrow->GetBlockHit().z);
+ m_Writer.AddShort("xTile", (Int16)Arrow->GetBlockHit().x);
+ m_Writer.AddShort("yTile", (Int16)Arrow->GetBlockHit().y);
+ m_Writer.AddShort("zTile", (Int16)Arrow->GetBlockHit().z);
m_Writer.AddByte("pickup", Arrow->GetPickupState());
m_Writer.AddDouble("damage", Arrow->GetDamageCoeff());
break;
diff --git a/src/WorldStorage/WSSAnvil.cpp b/src/WorldStorage/WSSAnvil.cpp
index bd814e2c7..092b9514c 100644
--- a/src/WorldStorage/WSSAnvil.cpp
+++ b/src/WorldStorage/WSSAnvil.cpp
@@ -1664,7 +1664,7 @@ void cWSSAnvil::LoadHangingFromNBT(cHangingEntity & a_Hanging, const cParsedNBT
if (Direction > 0)
{
Direction = (int)a_NBT.GetByte(Direction);
- if ((Direction < 0) || (Direction > 5))
+ if ((Direction < 2) || (Direction > 5))
{
a_Hanging.SetDirection(BLOCK_FACE_NORTH);
}
@@ -1752,7 +1752,7 @@ void cWSSAnvil::LoadArrowFromNBT(cEntityList & a_Entities, const cParsedNBT & a_
// Load pickup state:
int PickupIdx = a_NBT.FindChildByName(a_TagIdx, "pickup");
- if (PickupIdx > 0)
+ if ((PickupIdx > 0) && (a_NBT.GetType(PickupIdx) == TAG_Byte))
{
Arrow->SetPickupState((cArrowEntity::ePickupState)a_NBT.GetByte(PickupIdx));
}
@@ -1760,7 +1760,7 @@ void cWSSAnvil::LoadArrowFromNBT(cEntityList & a_Entities, const cParsedNBT & a_
{
// Try the older "player" tag:
int PlayerIdx = a_NBT.FindChildByName(a_TagIdx, "player");
- if (PlayerIdx > 0)
+ if ((PlayerIdx > 0) && (a_NBT.GetType(PlayerIdx) == TAG_Byte))
{
Arrow->SetPickupState((a_NBT.GetByte(PlayerIdx) == 0) ? cArrowEntity::psNoPickup : cArrowEntity::psInSurvivalOrCreative);
}
@@ -1768,7 +1768,7 @@ void cWSSAnvil::LoadArrowFromNBT(cEntityList & a_Entities, const cParsedNBT & a_
// Load damage:
int DamageIdx = a_NBT.FindChildByName(a_TagIdx, "damage");
- if (DamageIdx > 0)
+ if ((DamageIdx > 0) && (a_NBT.GetType(DamageIdx) == TAG_Double))
{
Arrow->SetDamageCoeff(a_NBT.GetDouble(DamageIdx));
}
@@ -1779,7 +1779,24 @@ void cWSSAnvil::LoadArrowFromNBT(cEntityList & a_Entities, const cParsedNBT & a_
int InBlockZIdx = a_NBT.FindChildByName(a_TagIdx, "zTile");
if ((InBlockXIdx > 0) && (InBlockYIdx > 0) && (InBlockZIdx > 0))
{
- Arrow->SetBlockHit(Vector3i(a_NBT.GetInt(InBlockXIdx), a_NBT.GetInt(InBlockYIdx), a_NBT.GetInt(InBlockZIdx)));
+ if (a_NBT.GetType(InBlockXIdx) == a_NBT.GetType(InBlockYIdx) == a_NBT.GetType(InBlockZIdx))
+ {
+ switch (a_NBT.GetType(InBlockXIdx))
+ {
+ case TAG_Int:
+ {
+ // Old MCS code used this, keep reading it for compatibility reasons:
+ Arrow->SetBlockHit(Vector3i(a_NBT.GetInt(InBlockXIdx), a_NBT.GetInt(InBlockYIdx), a_NBT.GetInt(InBlockZIdx)));
+ break;
+ }
+ case TAG_Short:
+ {
+ // Vanilla uses this
+ Arrow->SetBlockHit(Vector3i((int)a_NBT.GetShort(InBlockXIdx), (int)a_NBT.GetShort(InBlockYIdx), (int)a_NBT.GetShort(InBlockZIdx)));
+ break;
+ }
+ }
+ }
}
// Store the new arrow in the entities list: