修复sendTextPack问题

This commit is contained in:
Qiuzhizhe 2022-10-14 11:39:17 +08:00
parent 50695e60b9
commit ca410cd29d
No known key found for this signature in database
GPG Key ID: 4EF4BF5521540263
4 changed files with 59 additions and 39 deletions

View File

@ -10,7 +10,16 @@
class NetworkHandler { class NetworkHandler {
#define AFTER_EXTRA #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 #undef AFTER_EXTRA
#ifndef DISABLE_CONSTRUCTOR_PREVENTION_NETWORKHANDLER #ifndef DISABLE_CONSTRUCTOR_PREVENTION_NETWORKHANDLER
public: public:

View File

@ -42,7 +42,7 @@ public:
LIAPI std::string getIP(); LIAPI std::string getIP();
LIAPI string getLanguageCode(); LIAPI string getLanguageCode();
LIAPI string getServerAddress(); LIAPI string getServerAddress();
LIAPI NetworkIdentifier* getNetworkIdentifier(); LIAPI NetworkIdentifier* getNetworkIdentifier() const;
LIAPI Certificate* getCertificate()const; LIAPI Certificate* getCertificate()const;
LIAPI std::pair<BlockPos, int> getRespawnPosition(); LIAPI std::pair<BlockPos, int> getRespawnPosition();
LIAPI float getAvgPacketLoss(); LIAPI float getAvgPacketLoss();
@ -168,6 +168,8 @@ public:
LIAPI bool sendRawFormPacket(unsigned formId, const string& data) const; LIAPI bool sendRawFormPacket(unsigned formId, const string& data) const;
//LIAPI bool sendToastPacket(string title, string msg); //LIAPI bool sendToastPacket(string title, string msg);
void sendNetworkPacket(class Packet &) const;
LIAPI static bool isValid(Player* player); LIAPI static bool isValid(Player* player);
// For compatibility // For compatibility
@ -360,7 +362,7 @@ public:
/*418*/ virtual bool isItemInCooldown(enum CooldownType) const; /*418*/ virtual bool isItemInCooldown(enum CooldownType) const;
/*419*/ virtual void sendInventoryTransaction(class InventoryTransaction const &) const = 0; /*419*/ virtual void sendInventoryTransaction(class InventoryTransaction const &) const = 0;
/*420*/ virtual void sendComplexInventoryTransaction(std::unique_ptr<class ComplexInventoryTransaction>) const = 0; /*420*/ virtual void sendComplexInventoryTransaction(std::unique_ptr<class ComplexInventoryTransaction>) const = 0;
/*421*/ virtual void sendNetworkPacket(class Packet &) const; // /*421*/ virtual void sendNetworkPacket(class Packet &) const;
/*422*/ virtual class PlayerEventCoordinator & getPlayerEventCoordinator() = 0; /*422*/ virtual class PlayerEventCoordinator & getPlayerEventCoordinator() = 0;
/*423*/ virtual class MoveInputHandler * getMoveInputHandler() = 0; /*423*/ virtual class MoveInputHandler * getMoveInputHandler() = 0;
/*424*/ virtual enum InputMode getInputMode() const = 0; /*424*/ virtual enum InputMode getInputMode() const = 0;

View File

@ -13,22 +13,23 @@ class TextPacket : public Packet {
#define AFTER_EXTRA #define AFTER_EXTRA
// Add Member There // Add Member There
// char filler[168]; // char filler[168];
public:
TextType mType; TextType mType;
std::string mAuthor; std::string mAuthor;
std::string mMessage; std::string mMessage;
std::vector<std::string> params; std::vector<std::string> params;//参数用于替换mMessage里的%
bool mLocalize; bool mLocalize = 0;//是否本地化
std::string mXuid; std::string mXuid;
std::string mPlatformId; std::string mPlatformId;
public:
TextPacket(){}; //TextPacket(){};
#undef AFTER_EXTRA #undef AFTER_EXTRA
#ifndef DISABLE_CONSTRUCTOR_PREVENTION_TEXTPACKET #ifndef DISABLE_CONSTRUCTOR_PREVENTION_TEXTPACKET
public: public:
class TextPacket& operator=(class TextPacket const &) = delete; class TextPacket& operator=(class TextPacket const &) = delete;
TextPacket(class TextPacket const &) = delete; TextPacket(class TextPacket const &) = delete;
//TextPacket() = delete; TextPacket() = delete;
#endif #endif
public: public:

View File

@ -44,7 +44,7 @@
extern Logger logger; extern Logger logger;
NetworkIdentifier* Player::getNetworkIdentifier() { NetworkIdentifier* Player::getNetworkIdentifier() const{
//ServerPlayer::isHostingPlayer //ServerPlayer::isHostingPlayer
return dAccess<NetworkIdentifier*>(this, 2432); return dAccess<NetworkIdentifier*>(this, 2432);
} }
@ -116,6 +116,12 @@ int Player::getPlayerLevel(){
return attr.getCurrentValue(); 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() { string Player::getDeviceTypeName() {
switch ((int)getPlatform()) { switch ((int)getPlatform()) {
case -1: case -1:
@ -157,7 +163,8 @@ string Player::getDeviceTypeName() {
bool Player::kick(const std::string& msg) { bool Player::kick(const std::string& msg) {
NetworkIdentifier* pNetworkIdentifier = getNetworkIdentifier(); NetworkIdentifier* pNetworkIdentifier = getNetworkIdentifier();
Global<ServerNetworkHandler>->disconnectClient(*pNetworkIdentifier, 0, msg, 0); unsigned char subID = dAccess<unsigned char>(this,3520);
Global<ServerNetworkHandler>->disconnectClient(*pNetworkIdentifier, subID, msg, 0);
return true; return true;
} }
@ -497,35 +504,36 @@ static_assert(sizeof(TextPacket) == 208);
static_assert(sizeof(TransferPacket) == 80); static_assert(sizeof(TransferPacket) == 80);
bool Player::sendTextPacket(string text, TextType Type) const { bool Player::sendTextPacket(string text, TextType Type) const {
BinaryStream wp; // BinaryStream wp;
wp.reserve(8 + text.size()); // wp.reserve(8 + text.size());
wp.writeUnsignedChar((char)Type); // wp.writeUnsignedChar((char)Type);
wp.writeBool(true); // wp.writeBool(true);
switch (Type) { // switch (Type) {
case TextType::CHAT: // case TextType::CHAT:
case TextType::WHISPER: // case TextType::WHISPER:
case TextType::ANNOUNCEMENT: // case TextType::ANNOUNCEMENT:
wp.writeString("Server"); // wp.writeString("Server");
case TextType::RAW: // case TextType::RAW:
case TextType::TIP: // case TextType::TIP:
case TextType::SYSTEM: // case TextType::SYSTEM:
case TextType::JSON_WHISPER: // case TextType::JSON_WHISPER:
case TextType::JSON: // case TextType::JSON:
wp.writeString(text); // wp.writeString(text);
break; // break;
case TextType::TRANSLATION: // case TextType::TRANSLATION:
case TextType::POPUP: // case TextType::POPUP:
case TextType::JUKEBOX_POPUP: // case TextType::JUKEBOX_POPUP:
wp.writeString(text); // wp.writeString(text);
wp.writeUnsignedVarInt(0); // wp.writeUnsignedVarInt(0);
break; // break;
} // }
wp.writeString(""); // wp.writeString("");
wp.writeString(""); // wp.writeString("");
//
auto pkt = MinecraftPackets::createPacket(MinecraftPacketIds::Text); // auto pkt = MinecraftPackets::createPacket(MinecraftPacketIds::Text);
pkt->read(wp); // pkt->read(wp);
sendNetworkPacket(*pkt); auto pkt = TextPacket::createSystemMessage(text);
this->sendNetworkPacket(pkt);
return true; return true;
} }