mirror of
https://github.com/quizhizhe/LiteLoaderBDS-1.16.40.git
synced 2025-06-03 04:23:39 +00:00
修复在使用CommandOrigin::getPlayer()获取的玩家调用Player::kick时崩溃的问题,主要是NetworkIdentifier::getHash越界访问,也许这样获取的玩家实例是不完整的
This commit is contained in:
parent
ca410cd29d
commit
551594cb3e
@ -11,7 +11,9 @@
|
||||
class DisconnectPacket : public Packet {
|
||||
|
||||
#define AFTER_EXTRA
|
||||
|
||||
public:
|
||||
bool mSkipMessage;
|
||||
std::string mMessage;
|
||||
#undef AFTER_EXTRA
|
||||
#ifndef DISABLE_CONSTRUCTOR_PREVENTION_DISCONNECTPACKET
|
||||
public:
|
||||
|
@ -11,7 +11,11 @@
|
||||
class Minecraft {
|
||||
|
||||
#define AFTER_EXTRA
|
||||
|
||||
public:
|
||||
inline NetworkHandler & getNetworkHandler(){
|
||||
//lambda_b490644342a3912d59dc52eb79c3a67f_::operator() Line410
|
||||
return dAccess<NetworkHandler>(this,24);
|
||||
};
|
||||
#undef AFTER_EXTRA
|
||||
#ifndef DISABLE_CONSTRUCTOR_PREVENTION_MINECRAFT
|
||||
public:
|
||||
|
@ -4,14 +4,29 @@
|
||||
#include "../Global.h"
|
||||
|
||||
#define BEFORE_EXTRA
|
||||
#include "RakNet.hpp"
|
||||
|
||||
struct sockaddr_storage
|
||||
{
|
||||
__int16 ss_family;
|
||||
char __ss_padding[118];
|
||||
unsigned __int64 __ss_align;
|
||||
};
|
||||
#undef BEFORE_EXTRA
|
||||
|
||||
class NetworkIdentifier {
|
||||
|
||||
#define AFTER_EXTRA
|
||||
// Add Member There
|
||||
char filler[160];
|
||||
enum Type{
|
||||
RakNet = 0x0,
|
||||
Address = 0x1,
|
||||
Address6 = 0x2,
|
||||
Generic = 0x3,
|
||||
};
|
||||
RakNet::RakNetGUID mGuid;
|
||||
sockaddr_storage mSock;
|
||||
NetworkIdentifier::Type mType;
|
||||
public:
|
||||
LIAPI std::string getIP();
|
||||
|
||||
|
@ -10,7 +10,8 @@
|
||||
class PacketSender {
|
||||
|
||||
#define AFTER_EXTRA
|
||||
|
||||
__int64 _vptr;
|
||||
uint8_t mSenderSubId;
|
||||
#undef AFTER_EXTRA
|
||||
#ifndef DISABLE_CONSTRUCTOR_PREVENTION_PACKETSENDER
|
||||
public:
|
||||
|
@ -61,6 +61,7 @@
|
||||
// #include <MC/ResourcePackPaths.hpp>
|
||||
#include <MC/DirectoryPackSource.hpp>
|
||||
#include <MC/PackSource.hpp>
|
||||
#include <MC/TextPacket.hpp>
|
||||
|
||||
static_assert(offsetof(InventoryAction, source) == 0x0);
|
||||
static_assert(offsetof(InventoryAction, slot) == 0x0c);
|
||||
@ -369,18 +370,16 @@ TClasslessInstanceHook(void, "?handle@?$PacketHandlerDispatcherInstance@VPlayerA
|
||||
|
||||
/////////////////// PlayerChat ///////////////////
|
||||
TInstanceHook(void, "?handle@ServerNetworkHandler@@UEAAXAEBVNetworkIdentifier@@AEBVTextPacket@@@Z",
|
||||
ServerNetworkHandler, NetworkIdentifier* id, void* text) {
|
||||
ServerNetworkHandler, NetworkIdentifier* id, TextPacket* text) {
|
||||
IF_LISTENED(PlayerChatEvent) {
|
||||
Event::PlayerChatEvent ev{};
|
||||
ev.mPlayer = this->getServerPlayer(*id);
|
||||
if (!ev.mPlayer)
|
||||
return;
|
||||
|
||||
ev.mMessage = std::string(*(std::string*)((uintptr_t)text + 80));
|
||||
|
||||
ev.mMessage = text->mMessage;
|
||||
if (!ev.call())
|
||||
return;
|
||||
*(std::string*)((uintptr_t)text + 80) = ev.mMessage;
|
||||
text->mMessage = ev.mMessage;
|
||||
}
|
||||
IF_LISTENED_END(PlayerChatEvent);
|
||||
return original(this, id, text);
|
||||
|
@ -60,11 +60,11 @@ std::string Player::getRealName() {
|
||||
}
|
||||
|
||||
int Player::getAvgPing() {
|
||||
return Global<NetworkHandler>->getPeerForUser(*getNetworkIdentifier())->getNetworkStatus().mAveragePing;
|
||||
return Global<Minecraft>->getNetworkHandler().getPeerForUser(*getNetworkIdentifier())->getNetworkStatus().mAveragePing;
|
||||
}
|
||||
|
||||
int Player::getLastPing() {
|
||||
return Global<NetworkHandler>->getPeerForUser(*getNetworkIdentifier())->getNetworkStatus().mCurrentPing;
|
||||
return Global<Minecraft>->getNetworkHandler().getPeerForUser(*getNetworkIdentifier())->getNetworkStatus().mCurrentPing;
|
||||
}
|
||||
|
||||
string Player::getIP() {
|
||||
@ -162,9 +162,19 @@ string Player::getDeviceTypeName() {
|
||||
}
|
||||
|
||||
bool Player::kick(const std::string& msg) {
|
||||
NetworkIdentifier* pNetworkIdentifier = getNetworkIdentifier();
|
||||
unsigned char subID = dAccess<unsigned char>(this,3520);
|
||||
Global<ServerNetworkHandler>->disconnectClient(*pNetworkIdentifier, subID, msg, 0);
|
||||
// NetworkIdentifier* pNetworkIdentifier = getNetworkIdentifier();
|
||||
// Global<Minecraft>->getServerNetworkHandler()->disconnectClient(*pNetworkIdentifier, 0, msg, 0);
|
||||
BinaryStream wp;
|
||||
if(msg.empty()){
|
||||
wp.writeBool(1);
|
||||
}
|
||||
else{
|
||||
wp.writeBool(0);
|
||||
wp.writeString(msg);
|
||||
}
|
||||
auto pkt = MinecraftPackets::createPacket(MinecraftPacketIds::Disconnect);
|
||||
pkt->read(wp);
|
||||
this->sendNetworkPacket(*pkt);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -311,15 +321,16 @@ string Player::getXuid() const{
|
||||
}
|
||||
|
||||
unsigned char Player::getClientSubId() {
|
||||
return -1;
|
||||
//ServerPlayer::sendNetworkPacket 参4
|
||||
return dAccess<unsigned char>(this,3520);
|
||||
}
|
||||
|
||||
float Player::getAvgPacketLoss() {
|
||||
return Global<NetworkHandler>->getPeerForUser(*getNetworkIdentifier())->getNetworkStatus().mAveragePacketLoss;
|
||||
return Global<Minecraft>->getNetworkHandler().getPeerForUser(*getNetworkIdentifier())->getNetworkStatus().mAveragePacketLoss;
|
||||
}
|
||||
|
||||
float Player::getLastPacketLoss() {
|
||||
return Global<NetworkHandler>->getPeerForUser(*getNetworkIdentifier())->getNetworkStatus().mCurrentPacketLoss;
|
||||
return Global<Minecraft>->getNetworkHandler().getPeerForUser(*getNetworkIdentifier())->getNetworkStatus().mCurrentPacketLoss;
|
||||
}
|
||||
|
||||
// string Player::getClientId() {
|
||||
|
@ -16,11 +16,11 @@ TInstanceHook(void, "?initAsDedicatedServer@Minecraft@@QEAAXXZ", Minecraft) {
|
||||
original(this);
|
||||
}
|
||||
//NetworkHandler
|
||||
TInstanceHook(void, "??0WorldTemplateInfo@@QEAA@AEBVWorldTemplatePackManifest@@@Z", WorldTemplateInfo,
|
||||
NetworkHandler* a1) {
|
||||
Global<NetworkHandler> = a1;
|
||||
original(this,a1);
|
||||
}
|
||||
//TInstanceHook(void, "??0WorldTemplateInfo@@QEAA@AEBVWorldTemplatePackManifest@@@Z", WorldTemplateInfo,
|
||||
// NetworkHandler* a1) {
|
||||
// Global<NetworkHandler> = a1;
|
||||
// original(this,a1);
|
||||
//}
|
||||
// ServerNetworkHandler
|
||||
TInstanceHook(void, "?allowIncomingConnections@ServerNetworkHandler@@QEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@_N@Z",
|
||||
ServerNetworkHandler, std::string const& a1, bool a2) {
|
||||
|
Loading…
Reference in New Issue
Block a user