14 #include "json/json.h" 17 #include "../Server.h" 18 #include "../ClientHandle.h" 20 #include "../WorldStorage/FastNBT.h" 22 #include "../Entities/Boat.h" 23 #include "../Entities/ExpOrb.h" 24 #include "../Entities/Minecart.h" 25 #include "../Entities/FallingBlock.h" 26 #include "../Entities/Painting.h" 27 #include "../Entities/Pickup.h" 28 #include "../Entities/Player.h" 29 #include "../Entities/ItemFrame.h" 30 #include "../Entities/ArrowEntity.h" 31 #include "../Entities/FireworkEntity.h" 32 #include "../Entities/SplashPotionEntity.h" 34 #include "../Mobs/IncludeAllMonsters.h" 36 #include "../BlockEntities/BeaconEntity.h" 37 #include "../BlockEntities/CommandBlockEntity.h" 38 #include "../BlockEntities/MobHeadEntity.h" 39 #include "../BlockEntities/MobSpawnerEntity.h" 40 #include "../BlockEntities/FlowerPotEntity.h" 42 #include "../Bindings/PluginManager.h" 55 #pragma clang diagnostic push 56 #pragma clang diagnostic ignored "-Wduplicate-enum" 106 _FIREBALL_NEXT = _ENTITY_NEXT,
115 _HANGING_NEXT = _ENTITY_NEXT,
152 _AMBIENT_NEXT = _INSENTIENT_NEXT,
158 _CREATURE_NEXT = _INSENTIENT_NEXT,
168 _ANIMAL_NEXT = _AGEABLE_NEXT,
203 _GOLEM_NEXT = _CREATURE_NEXT,
214 _MONSTER_NEXT = _CREATURE_NEXT,
258 _FLYING_NEXT = _INSENTIENT_NEXT,
288 #pragma clang diagnostic pop // Restore ignored clang errors 295 Super(a_Client, a_ServerAddress, a_ServerPort, a_State)
325 auto NumPlayers =
static_cast<signed>(Server->
GetNumPlayers());
326 auto MaxPlayers =
static_cast<signed>(Server->
GetMaxPlayers());
332 Version[
"name"] =
"Cuberite 1.10";
333 Version[
"protocol"] = 210;
337 Players[
"online"] = NumPlayers;
338 Players[
"max"] = MaxPlayers;
342 Json::Value Description;
343 Description[
"text"] = ServerDescription.c_str();
346 Json::Value ResponseValue;
347 ResponseValue[
"version"] = Version;
348 ResponseValue[
"players"] = Players;
349 ResponseValue[
"description"] = Description;
351 if (!Favicon.empty())
353 ResponseValue[
"favicon"] =
Printf(
"data:image/png;base64,%s", Favicon.c_str());
356 Json::FastWriter Writer;
357 AString Response = Writer.write(ResponseValue);
401 auto & Player =
static_cast<const cPlayer &
>(a_Entity);
412 a_Pkt.
WriteBEFloat(static_cast<float>(Player.GetHealth()));
416 a_Pkt.
WriteBEUInt8(static_cast<UInt8>(Player.GetSkinParts()));
420 a_Pkt.
WriteBEUInt8(static_cast<UInt8>(Player.GetMainHand()));
427 WriteItem(a_Pkt, static_cast<const cPickup &>(a_Entity).GetItem());
436 auto & Minecart =
static_cast<const cMinecart &
>(a_Entity);
439 a_Pkt.
WriteVarInt32(static_cast<UInt32>((maxHealth - curHealth) * Minecart.LastDamage() * 4));
447 a_Pkt.
WriteBEFloat(static_cast<float>(Minecart.LastDamage() + 10));
452 const cItem & MinecartContent = RideableMinecart.GetContent();
453 if (!MinecartContent.
IsEmpty())
463 a_Pkt.
WriteVarInt32(static_cast<UInt32>(RideableMinecart.GetBlockHeight()));
474 a_Pkt.
WriteBool(static_cast<const cMinecartWithFurnace &>(Minecart).IsFueled());
482 switch (Projectile.GetProjectileKind())
488 a_Pkt.
WriteBEInt8(static_cast<const cArrowEntity &>(Projectile).IsCritical() ? 1 : 0);
495 WriteItem(a_Pkt, static_cast<const cFireworkEntity &>(Projectile).GetItem());
502 WriteItem(a_Pkt, static_cast<const cSplashPotionEntity &>(Projectile).GetItem());
520 auto & Boat =
static_cast<const cBoat &
>(a_Entity);
524 a_Pkt.
WriteVarInt32(static_cast<UInt32>(Boat.GetLastDamage()));
528 a_Pkt.
WriteVarInt32(static_cast<UInt32>(Boat.GetForwardDirection()));
536 a_Pkt.
WriteVarInt32(static_cast<UInt32>(Boat.GetMaterial()));
540 a_Pkt.
WriteBool(Boat.IsRightPaddleUsed());
544 a_Pkt.
WriteBool(Boat.IsLeftPaddleUsed());
551 auto & Frame =
static_cast<const cItemFrame &
>(a_Entity);
580 auto & BeaconEntity =
static_cast<const cBeaconEntity &
>(a_BlockEntity);
581 Writer.
AddInt(
"x", BeaconEntity.GetPosX());
582 Writer.
AddInt(
"y", BeaconEntity.GetPosY());
583 Writer.
AddInt(
"z", BeaconEntity.GetPosZ());
584 Writer.
AddInt(
"Primary", BeaconEntity.GetPrimaryEffect());
585 Writer.
AddInt(
"Secondary", BeaconEntity.GetSecondaryEffect());
586 Writer.
AddInt(
"Levels", BeaconEntity.GetBeaconLevel());
594 Writer.
AddByte(
"TrackOutput", 1);
595 Writer.
AddInt(
"SuccessCount", CommandBlockEntity.GetResult());
596 Writer.
AddInt(
"x", CommandBlockEntity.GetPosX());
597 Writer.
AddInt(
"y", CommandBlockEntity.GetPosY());
598 Writer.
AddInt(
"z", CommandBlockEntity.GetPosZ());
599 Writer.
AddString(
"Command", CommandBlockEntity.GetCommand().c_str());
605 if (!CommandBlockEntity.GetLastOutput().empty())
607 Writer.
AddString(
"LastOutput",
Printf(
"{\"text\":\"%s\"}", CommandBlockEntity.GetLastOutput().c_str()));
614 auto & MobHeadEntity =
static_cast<const cMobHeadEntity &
>(a_BlockEntity);
615 Writer.
AddInt(
"x", MobHeadEntity.GetPosX());
616 Writer.
AddInt(
"y", MobHeadEntity.GetPosY());
617 Writer.
AddInt(
"z", MobHeadEntity.GetPosZ());
618 Writer.
AddByte(
"SkullType", MobHeadEntity.GetType() & 0xFF);
619 Writer.
AddByte(
"Rot", MobHeadEntity.GetRotation() & 0xFF);
624 Writer.
AddString(
"Id", MobHeadEntity.GetOwnerUUID().ToShortString());
625 Writer.
AddString(
"Name", MobHeadEntity.GetOwnerName());
629 Writer.
AddString(
"Signature", MobHeadEntity.GetOwnerTextureSignature());
630 Writer.
AddString(
"Value", MobHeadEntity.GetOwnerTexture());
640 auto & FlowerPotEntity =
static_cast<const cFlowerPotEntity &
>(a_BlockEntity);
641 Writer.
AddInt(
"x", FlowerPotEntity.GetPosX());
642 Writer.
AddInt(
"y", FlowerPotEntity.GetPosY());
643 Writer.
AddInt(
"z", FlowerPotEntity.GetPosZ());
644 Writer.
AddInt(
"Item", static_cast<Int32>(FlowerPotEntity.GetItem().m_ItemType));
645 Writer.
AddInt(
"Data", static_cast<Int32>(FlowerPotEntity.GetItem().m_ItemDamage));
653 Writer.
AddInt(
"x", MobSpawnerEntity.GetPosX());
654 Writer.
AddInt(
"y", MobSpawnerEntity.GetPosY());
655 Writer.
AddInt(
"z", MobSpawnerEntity.GetPosZ());
659 Writer.
AddShort(
"Delay", MobSpawnerEntity.GetSpawnDelay());
703 auto & Bat =
static_cast<const cBat &
>(a_Mob);
712 auto & Chicken =
static_cast<const cChicken &
>(a_Mob);
722 auto & Cow =
static_cast<const cCow &
>(a_Mob);
732 auto & Creeper =
static_cast<const cCreeper &
>(a_Mob);
743 a_Pkt.
WriteBool(Creeper.IsBurnedWithFlintAndSteel());
749 auto & Enderman =
static_cast<const cEnderman &
>(a_Mob);
753 Carried |=
static_cast<UInt32>(Enderman.GetCarriedBlock() << 4);
754 Carried |= Enderman.GetCarriedMeta();
765 auto & Ghast =
static_cast<const cGhast &
>(a_Mob);
774 auto & Horse =
static_cast<const cHorse &
>(a_Mob);
780 if (Horse.IsSaddled())
784 if (Horse.IsChested())
788 if (Horse.IsEating())
792 if (Horse.IsRearing())
796 if (Horse.IsMthOpen())
806 a_Pkt.
WriteVarInt32(static_cast<UInt32>(Horse.GetHorseType()));
811 Appearance = Horse.GetHorseColor();
812 Appearance |= Horse.GetHorseStyle() << 8;
817 a_Pkt.
WriteVarInt32(static_cast<UInt32>(Horse.GetHorseArmour()));
827 auto & MagmaCube =
static_cast<const cMagmaCube &
>(a_Mob);
830 a_Pkt.
WriteVarInt32(static_cast<UInt32>(MagmaCube.GetSize()));
836 auto & Ocelot =
static_cast<const cOcelot &
>(a_Mob);
846 auto & Pig =
static_cast<const cPig &
>(a_Mob);
861 auto & Rabbit =
static_cast<const cRabbit &
>(a_Mob);
868 a_Pkt.
WriteVarInt32(static_cast<UInt32>(Rabbit.GetRabbitType()));
874 auto & Sheep =
static_cast<const cSheep &
>(a_Mob);
882 Int8 SheepMetadata = 0;
883 SheepMetadata =
static_cast<Int8>(Sheep.GetFurColor());
884 if (Sheep.IsSheared())
886 SheepMetadata |= 0x10;
894 auto & Skeleton =
static_cast<const cSkeleton &
>(a_Mob);
903 auto & Slime =
static_cast<const cSlime &
>(a_Mob);
912 auto & Villager =
static_cast<const cVillager &
>(a_Mob);
919 a_Pkt.
WriteVarInt32(static_cast<UInt32>(Villager.GetVilType()));
925 auto & Witch =
static_cast<const cWitch &
>(a_Mob);
934 auto & Wither =
static_cast<const cWither &
>(a_Mob);
945 auto & Wolf =
static_cast<const cWolf &
>(a_Mob);
951 if (Wolf.IsSitting())
977 a_Pkt.
WriteVarInt32(static_cast<UInt32>(Wolf.GetCollarColor()));
983 auto & Zombie =
static_cast<const cZombie &
>(a_Mob);
1000 auto & ZombiePigman =
static_cast<const cZombiePigman &
>(a_Mob);
virtual void WriteEntityMetadata(cPacketizer &a_Pkt, const cEntity &a_Entity) override
Writes the metadata for the specified entity, not including the terminating 0xff. ...
UInt32 m_State
State of the protocol.
void WriteBEInt8(Int8 a_Value)
eEntityType GetEntityType(void) const
eMonsterType GetMobType(void) const
BLOCKTYPE GetBlockType() const
const AString & GetCustomName(void) const
Gets the custom name of the monster.
void WriteBuf(const char *a_Data, size_t a_Size)
virtual void WriteItem(cPacketizer &a_Pkt, const cItem &a_Item)
Writes the item data into a packet.
void AddShort(const AString &a_Name, Int16 a_Value)
virtual void HandlePacketStatusRequest(cByteBuffer &a_ByteBuffer) override
virtual bool IsOnFire(void) const
bool CallHookServerPing(cClientHandle &a_ClientHandle, AString &a_ServerDescription, int &a_OnlinePlayersCount, int &a_MaxPlayersCount, AString &a_Favicon)
bool HasCustomName(void) const
Returns true if the monster has a custom name.
void AddByte(const AString &a_Name, unsigned char a_Value)
void WriteBEUInt8(UInt8 a_Value)
virtual bool IsCrouched(void) const
const AString & GetDescription(void) const
void WriteString(const AString &a_Value)
The version 110 protocol, used by 1.9.3 and 1.9.4.
const AString & GetFaviconData(void) const
Returns base64 encoded favicon data (obtained from favicon.png)
void WriteBEInt32(Int32 a_Value)
virtual bool IsInvisible(void) const
bool IsCustomNameAlwaysVisible(void) const
Is the custom name of this monster always visible? If not, you only see the name when you sight the m...
virtual void WriteBlockEntity(cPacketizer &a_Pkt, const cBlockEntity &a_BlockEntity) override
Writes the block entity data for the specified block entity into the packet.
size_t GetMaxPlayers(void) const
AString & Printf(AString &str, const char *format, fmt::ArgList args)
Output the formatted text into the string.
virtual void SendSoundEffect(const AString &a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch) override
float GetHealth(void) const
Returns the health of this entity.
size_t GetNumPlayers(void) const
An object that can store incoming bytes and lets its clients read the bytes sequentially The bytes ar...
virtual void WriteMobMetadata(cPacketizer &a_Pkt, const cMonster &a_Mob) override
Writes the mob-specific metadata for the specified mob.
float GetMaxHealth(void) const
const AString & GetResult(void) const
virtual bool IsSprinting(void) const
cServer * GetServer(void)
Composes an individual packet in the protocol's m_OutPacketBuffer; sends it just before being destruc...
void ForgeAugmentServerListPing(Json::Value &a_Response)
Add the Forge mod list to the server ping response.
void AddString(const AString &a_Name, const AString &a_Value)
void WriteVarInt32(UInt32 a_Value)
void WriteBEFloat(float a_Value)
virtual bool IsRclking(void) const
void AddInt(const AString &a_Name, Int32 a_Value)
cProtocol_1_10_0(cClientHandle *a_Client, const AString &a_ServerAddress, UInt16 a_ServerPort, UInt32 a_State)
void WriteBool(bool a_Value)
std::enable_if< std::is_arithmetic< T >::value, C >::type FloorC(T a_Value)
Floors a value, then casts it to C (an int by default)
void BeginList(const AString &a_Name, eTagType a_ChildrenType)
static AString MobTypeToVanillaName(eMonsterType a_MobType)
Translates MobType enum to the vanilla name of the mob, empty string if unknown.
void BeginCompound(const AString &a_Name)
cPluginManager * GetPluginManager(void)