From ca410cd29d5b84a4d67ac9a64c55c9c734b42f68 Mon Sep 17 00:00:00 2001 From: Qiuzhizhe <42761326+quizhizhe@users.noreply.github.com> Date: Fri, 14 Oct 2022 11:39:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DsendTextPack=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LiteLoader/Header/MC/NetworkHandler.hpp | 11 +++- LiteLoader/Header/MC/Player.hpp | 6 ++- LiteLoader/Header/MC/TextPacket.hpp | 11 ++-- LiteLoader/Kernel/MC/PlayerAPI.cpp | 70 ++++++++++++++----------- 4 files changed, 59 insertions(+), 39 deletions(-) diff --git a/LiteLoader/Header/MC/NetworkHandler.hpp b/LiteLoader/Header/MC/NetworkHandler.hpp index 2a694f3..9d22567 100644 --- a/LiteLoader/Header/MC/NetworkHandler.hpp +++ b/LiteLoader/Header/MC/NetworkHandler.hpp @@ -10,7 +10,16 @@ class NetworkHandler { #define AFTER_EXTRA - + // Add Member There +public: + enum NetworkStatisticsConfig; + class Connection + { + public: + Connection() = delete; + Connection(Connection const&) = delete; + Connection(Connection const&&) = delete; + }; #undef AFTER_EXTRA #ifndef DISABLE_CONSTRUCTOR_PREVENTION_NETWORKHANDLER public: diff --git a/LiteLoader/Header/MC/Player.hpp b/LiteLoader/Header/MC/Player.hpp index 89c9af9..e6afba0 100644 --- a/LiteLoader/Header/MC/Player.hpp +++ b/LiteLoader/Header/MC/Player.hpp @@ -42,7 +42,7 @@ public: LIAPI std::string getIP(); LIAPI string getLanguageCode(); LIAPI string getServerAddress(); - LIAPI NetworkIdentifier* getNetworkIdentifier(); + LIAPI NetworkIdentifier* getNetworkIdentifier() const; LIAPI Certificate* getCertificate()const; LIAPI std::pair getRespawnPosition(); LIAPI float getAvgPacketLoss(); @@ -168,6 +168,8 @@ public: LIAPI bool sendRawFormPacket(unsigned formId, const string& data) const; //LIAPI bool sendToastPacket(string title, string msg); + void sendNetworkPacket(class Packet &) const; + LIAPI static bool isValid(Player* player); // For compatibility @@ -360,7 +362,7 @@ public: /*418*/ virtual bool isItemInCooldown(enum CooldownType) const; /*419*/ virtual void sendInventoryTransaction(class InventoryTransaction const &) const = 0; /*420*/ virtual void sendComplexInventoryTransaction(std::unique_ptr) const = 0; - /*421*/ virtual void sendNetworkPacket(class Packet &) const; +// /*421*/ virtual void sendNetworkPacket(class Packet &) const; /*422*/ virtual class PlayerEventCoordinator & getPlayerEventCoordinator() = 0; /*423*/ virtual class MoveInputHandler * getMoveInputHandler() = 0; /*424*/ virtual enum InputMode getInputMode() const = 0; diff --git a/LiteLoader/Header/MC/TextPacket.hpp b/LiteLoader/Header/MC/TextPacket.hpp index d75b412..17c3826 100644 --- a/LiteLoader/Header/MC/TextPacket.hpp +++ b/LiteLoader/Header/MC/TextPacket.hpp @@ -13,22 +13,23 @@ class TextPacket : public Packet { #define AFTER_EXTRA // Add Member There // char filler[168]; +public: TextType mType; std::string mAuthor; std::string mMessage; - std::vector params; - bool mLocalize; + std::vector params;//参数用于替换mMessage里的% + bool mLocalize = 0;//是否本地化 std::string mXuid; std::string mPlatformId; -public: - TextPacket(){}; + + //TextPacket(){}; #undef AFTER_EXTRA #ifndef DISABLE_CONSTRUCTOR_PREVENTION_TEXTPACKET public: class TextPacket& operator=(class TextPacket const &) = delete; TextPacket(class TextPacket const &) = delete; - //TextPacket() = delete; + TextPacket() = delete; #endif public: diff --git a/LiteLoader/Kernel/MC/PlayerAPI.cpp b/LiteLoader/Kernel/MC/PlayerAPI.cpp index 526efd3..8c0dc82 100644 --- a/LiteLoader/Kernel/MC/PlayerAPI.cpp +++ b/LiteLoader/Kernel/MC/PlayerAPI.cpp @@ -44,7 +44,7 @@ extern Logger logger; -NetworkIdentifier* Player::getNetworkIdentifier() { +NetworkIdentifier* Player::getNetworkIdentifier() const{ //ServerPlayer::isHostingPlayer return dAccess(this, 2432); } @@ -116,6 +116,12 @@ int Player::getPlayerLevel(){ return attr.getCurrentValue(); } +void Player::sendNetworkPacket(class Packet &pkt) const{ + void (Player::*rv)(class Packet&) const; + *((void**)&rv) = dlsym("?sendNetworkPacket@ServerPlayer@@UEBAXAEAVPacket@@@Z"); + return (this->*rv)(pkt); +} + string Player::getDeviceTypeName() { switch ((int)getPlatform()) { case -1: @@ -157,7 +163,8 @@ string Player::getDeviceTypeName() { bool Player::kick(const std::string& msg) { NetworkIdentifier* pNetworkIdentifier = getNetworkIdentifier(); - Global->disconnectClient(*pNetworkIdentifier, 0, msg, 0); + unsigned char subID = dAccess(this,3520); + Global->disconnectClient(*pNetworkIdentifier, subID, msg, 0); return true; } @@ -497,35 +504,36 @@ static_assert(sizeof(TextPacket) == 208); static_assert(sizeof(TransferPacket) == 80); bool Player::sendTextPacket(string text, TextType Type) const { - BinaryStream wp; - wp.reserve(8 + text.size()); - wp.writeUnsignedChar((char)Type); - wp.writeBool(true); - switch (Type) { - case TextType::CHAT: - case TextType::WHISPER: - case TextType::ANNOUNCEMENT: - wp.writeString("Server"); - case TextType::RAW: - case TextType::TIP: - case TextType::SYSTEM: - case TextType::JSON_WHISPER: - case TextType::JSON: - wp.writeString(text); - break; - case TextType::TRANSLATION: - case TextType::POPUP: - case TextType::JUKEBOX_POPUP: - wp.writeString(text); - wp.writeUnsignedVarInt(0); - break; - } - wp.writeString(""); - wp.writeString(""); - - auto pkt = MinecraftPackets::createPacket(MinecraftPacketIds::Text); - pkt->read(wp); - sendNetworkPacket(*pkt); +// BinaryStream wp; +// wp.reserve(8 + text.size()); +// wp.writeUnsignedChar((char)Type); +// wp.writeBool(true); +// switch (Type) { +// case TextType::CHAT: +// case TextType::WHISPER: +// case TextType::ANNOUNCEMENT: +// wp.writeString("Server"); +// case TextType::RAW: +// case TextType::TIP: +// case TextType::SYSTEM: +// case TextType::JSON_WHISPER: +// case TextType::JSON: +// wp.writeString(text); +// break; +// case TextType::TRANSLATION: +// case TextType::POPUP: +// case TextType::JUKEBOX_POPUP: +// wp.writeString(text); +// wp.writeUnsignedVarInt(0); +// break; +// } +// wp.writeString(""); +// wp.writeString(""); +// +// auto pkt = MinecraftPackets::createPacket(MinecraftPacketIds::Text); +// pkt->read(wp); + auto pkt = TextPacket::createSystemMessage(text); + this->sendNetworkPacket(pkt); return true; }