Decompile fn_11800 (UIChatRoomWnd::SendMsg)
Batch #13337 by Yommy: 0 byte-identical, 1 confirmed by peer review. - fn_11800 UIChatRoomWnd::SendMsg: logic confirmed by peer review Peer-reviewed-by: gordaoprogramas, Tanke, Toshiro, cremane Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes).
This commit is contained in:
parent
683da3838d
commit
488cceacdb
1 changed files with 59 additions and 56 deletions
|
|
@ -631,6 +631,21 @@ UIChatRoomWnd::UIChatRoomWnd()
|
|||
: UIFrameWnd(0), title(), unknown_00CC(), unknown_010C(), unknown_0114(), saved(nullptr) {
|
||||
}
|
||||
|
||||
#pragma pack(push, 1)
|
||||
struct ChatRoomRecordHeader {
|
||||
// INLINED
|
||||
ChatRoomRecordHeader() : tag(0), size(0) {}
|
||||
// INLINED
|
||||
~ChatRoomRecordHeader() {
|
||||
this->size = 0;
|
||||
this->tag = 0;
|
||||
}
|
||||
|
||||
/* 0000 */ std::int16_t tag;
|
||||
/* 0002 */ std::uint32_t size;
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
// OFFSET: 0x008BB9E0
|
||||
// FUNCTION: fn_11800
|
||||
int UIChatRoomWnd::SendMsg(UIWindow* sender, int message, std::intptr_t a, std::intptr_t b, std::intptr_t c, std::intptr_t d) {
|
||||
|
|
@ -762,10 +777,11 @@ int UIChatRoomWnd::SendMsg(UIWindow* sender, int message, std::intptr_t a, std::
|
|||
|
||||
const std::size_t end = this->title.find('\r');
|
||||
if (end != std::string::npos) {
|
||||
this->title = std::string(this->title.c_str(), end);
|
||||
this->title = this->title.substr(0, end);
|
||||
}
|
||||
|
||||
const std::string prefix = LookupMessage((this->roomStatus.roomType != 0) + 89);
|
||||
std::string prefix;
|
||||
prefix = LookupMessage((this->roomStatus.roomType != 0) + 89);
|
||||
char text[256];
|
||||
std::sprintf(text, "%s%s (%d/%d)", prefix.c_str(), this->title.c_str(), this->roomStatus.memberCount, this->roomStatus.memberLimit);
|
||||
if (g_forbiddenWords.Contains(text)) {
|
||||
|
|
@ -792,9 +808,8 @@ int UIChatRoomWnd::SendMsg(UIWindow* sender, int message, std::intptr_t a, std::
|
|||
const int enter = static_cast<int>(message.find(")님이 입장 하였습니다.", 0));
|
||||
const int leave = static_cast<int>(message.find(")님이 퇴장 하였습니다.", 0));
|
||||
const int colon = static_cast<int>(message.find(" :", 0));
|
||||
const bool english = g_serviceType == 19 && g_tipOfTheDayEnglish;
|
||||
if (enter > 0 && enter < length) {
|
||||
if (english) {
|
||||
if (g_serviceType == 19 && g_tipOfTheDayEnglish) {
|
||||
std::memcpy(name, text + enter + 1, length - enter);
|
||||
name[length - enter] = '\0';
|
||||
} else {
|
||||
|
|
@ -802,7 +817,7 @@ int UIChatRoomWnd::SendMsg(UIWindow* sender, int message, std::intptr_t a, std::
|
|||
name[enter - 1] = '\0';
|
||||
}
|
||||
} else if (leave > 0 && leave < length) {
|
||||
if (english) {
|
||||
if (g_serviceType == 19 && g_tipOfTheDayEnglish) {
|
||||
std::memcpy(name, text + leave + 1, length - leave);
|
||||
name[length - leave] = '\0';
|
||||
} else {
|
||||
|
|
@ -810,7 +825,7 @@ int UIChatRoomWnd::SendMsg(UIWindow* sender, int message, std::intptr_t a, std::
|
|||
name[leave - 1] = '\0';
|
||||
}
|
||||
} else if (colon > 0 && colon < length && colon < 24) {
|
||||
if (english) {
|
||||
if (g_serviceType == 19 && g_tipOfTheDayEnglish) {
|
||||
std::memcpy(name, text + colon, length - colon);
|
||||
name[length - colon] = '\0';
|
||||
} else {
|
||||
|
|
@ -837,7 +852,7 @@ int UIChatRoomWnd::SendMsg(UIWindow* sender, int message, std::intptr_t a, std::
|
|||
}
|
||||
case 43:
|
||||
this->memberList->Clear();
|
||||
this->unknown_010C.clear();
|
||||
this->unknown_010C.erase(this->unknown_010C.begin(), this->unknown_010C.end());
|
||||
return 0;
|
||||
case 44: {
|
||||
this->unknown_010C[std::string(reinterpret_cast<const char*>(a))] = static_cast<int>(b);
|
||||
|
|
@ -920,11 +935,6 @@ int UIChatRoomWnd::SendMsg(UIWindow* sender, int message, std::intptr_t a, std::
|
|||
g_windowMgr.CloseWindow(18);
|
||||
}
|
||||
|
||||
const auto add = [this](int id, int value) {
|
||||
const std::string text = LookupMessage(id);
|
||||
this->unknown_0114.emplace_back(text, value);
|
||||
};
|
||||
|
||||
{
|
||||
const std::string self = g_session.DecodePlayerName();
|
||||
if (this->unknown_010C.find(self) == this->unknown_010C.end()) {
|
||||
|
|
@ -942,25 +952,25 @@ int UIChatRoomWnd::SendMsg(UIWindow* sender, int message, std::intptr_t a, std::
|
|||
}
|
||||
if (rank == 0) {
|
||||
if (!(target == self)) {
|
||||
add(127, 0);
|
||||
add(128, 1);
|
||||
this->unknown_0114.push_back(std::pair<std::string, int>(std::string(LookupMessage(127)), 0));
|
||||
this->unknown_0114.push_back(std::pair<std::string, int>(std::string(LookupMessage(128)), 1));
|
||||
}
|
||||
add(129, 3);
|
||||
this->unknown_0114.push_back(std::pair<std::string, int>(std::string(LookupMessage(129)), 3));
|
||||
if (g_serviceMode != 3 && !g_windowMgr.IsFriend(target.c_str()) && !(target == self)) {
|
||||
add(358, 21);
|
||||
this->unknown_0114.push_back(std::pair<std::string, int>(std::string(LookupMessage(358)), 21));
|
||||
}
|
||||
add(126, 2);
|
||||
this->unknown_0114.push_back(std::pair<std::string, int>(std::string(LookupMessage(126)), 2));
|
||||
} else if (rank == 1) {
|
||||
add(129, 3);
|
||||
this->unknown_0114.push_back(std::pair<std::string, int>(std::string(LookupMessage(129)), 3));
|
||||
if (!g_windowMgr.IsFriend(target.c_str()) && !(target == self) && g_serviceMode != 3) {
|
||||
add(358, 21);
|
||||
this->unknown_0114.push_back(std::pair<std::string, int>(std::string(LookupMessage(358)), 21));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (rank == 0) {
|
||||
add(126, 2);
|
||||
this->unknown_0114.push_back(std::pair<std::string, int>(std::string(LookupMessage(126)), 2));
|
||||
}
|
||||
add(312, 11);
|
||||
this->unknown_0114.push_back(std::pair<std::string, int>(std::string(LookupMessage(312)), 11));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1003,72 +1013,65 @@ int UIChatRoomWnd::SendMsg(UIWindow* sender, int message, std::intptr_t a, std::
|
|||
case 123: {
|
||||
const unsigned char* data = reinterpret_cast<const unsigned char*>(a);
|
||||
const unsigned size = static_cast<unsigned>(b);
|
||||
std::uint16_t tag = 0;
|
||||
std::uint32_t recordSize = 0;
|
||||
std::memcpy(&tag, data, sizeof(tag));
|
||||
std::memcpy(&recordSize, data + 2, sizeof(recordSize));
|
||||
if (tag == 0x5014) {
|
||||
ChatRoomRecordHeader header;
|
||||
std::memcpy(&header, data, sizeof(header));
|
||||
if (header.tag == 0x5014) {
|
||||
g_windowMgr.SendNotice(3, 0, 0, 0, 0, 0);
|
||||
g_windowMgr.SendNotice(1, reinterpret_cast<std::intptr_t>(LookupMessage(64)), 0xFFFF00, 0, 0, 0);
|
||||
ChatRoomTitleInfo* settings = reinterpret_cast<ChatRoomTitleInfo*>(&static_cast<CGameMode*>(g_modeMgr.GetGameMode())->unknown_03C8);
|
||||
unsigned offset = 6;
|
||||
bool done = false;
|
||||
while (!done && offset < size) {
|
||||
std::memcpy(&tag, data + offset, sizeof(tag));
|
||||
std::memcpy(&recordSize, data + offset + 2, sizeof(recordSize));
|
||||
while (offset < size) {
|
||||
std::memcpy(&header, data + offset, sizeof(header));
|
||||
offset += 6;
|
||||
switch (tag) {
|
||||
switch (header.tag) {
|
||||
case 0x5015:
|
||||
done = true;
|
||||
break;
|
||||
return 0;
|
||||
case 0x5016:
|
||||
std::memcpy(this->saved, data + offset, recordSize);
|
||||
offset += recordSize;
|
||||
std::memcpy(this->saved, data + offset, header.size);
|
||||
offset += header.size;
|
||||
break;
|
||||
case 0x5017: {
|
||||
char value[260];
|
||||
std::memset(value, 0, sizeof(value));
|
||||
std::memcpy(value, data + offset, recordSize);
|
||||
offset += recordSize;
|
||||
this->title = value;
|
||||
settings->title = this->title;
|
||||
std::memcpy(value, data + offset, header.size);
|
||||
offset += header.size;
|
||||
settings->title = this->title = value;
|
||||
break;
|
||||
}
|
||||
case 0x5018: {
|
||||
char value[260];
|
||||
std::memset(value, 0, sizeof(value));
|
||||
std::memcpy(value, data + offset, recordSize);
|
||||
offset += recordSize;
|
||||
this->unknown_00CC = value;
|
||||
settings->unknown_0018 = this->unknown_00CC;
|
||||
std::memcpy(value, data + offset, header.size);
|
||||
offset += header.size;
|
||||
settings->unknown_0018 = this->unknown_00CC = value;
|
||||
break;
|
||||
}
|
||||
case 0x5019:
|
||||
std::memcpy(&this->roomStatus.roomType, data + offset, recordSize);
|
||||
offset += recordSize;
|
||||
std::memcpy(&this->roomStatus.roomType, data + offset, header.size);
|
||||
offset += header.size;
|
||||
settings->type = this->roomStatus.roomType;
|
||||
break;
|
||||
case 0x501A:
|
||||
std::memcpy(&this->roomStatus.memberCount, data + offset, recordSize);
|
||||
offset += recordSize;
|
||||
std::memcpy(&this->roomStatus.memberCount, data + offset, header.size);
|
||||
offset += header.size;
|
||||
settings->memberCount = this->roomStatus.memberCount;
|
||||
break;
|
||||
case 0x501B:
|
||||
std::memcpy(&this->roomStatus.memberLimit, data + offset, recordSize);
|
||||
offset += recordSize;
|
||||
std::memcpy(&this->roomStatus.memberLimit, data + offset, header.size);
|
||||
offset += header.size;
|
||||
settings->memberLimit = this->roomStatus.memberLimit;
|
||||
break;
|
||||
case 0x501C:
|
||||
std::memcpy(&this->roomStatus.roomId, data + offset, recordSize);
|
||||
offset += recordSize;
|
||||
std::memcpy(&this->roomStatus.roomId, data + offset, header.size);
|
||||
offset += header.size;
|
||||
settings->id = this->roomStatus.roomId;
|
||||
this->SendMsg(nullptr, 34, reinterpret_cast<std::intptr_t>(settings), 0, 0, 0);
|
||||
break;
|
||||
case 0x501E: {
|
||||
char value[260];
|
||||
std::memset(value, 0, sizeof(value));
|
||||
std::memcpy(value, data + offset, recordSize);
|
||||
offset += recordSize;
|
||||
std::memcpy(value, data + offset, header.size);
|
||||
offset += header.size;
|
||||
this->SendMsg(nullptr, 43, 0, 0, 0, 0);
|
||||
this->SendMsg(nullptr, 44, reinterpret_cast<std::intptr_t>(value), 0, 0, 0);
|
||||
break;
|
||||
|
|
@ -1076,13 +1079,13 @@ int UIChatRoomWnd::SendMsg(UIWindow* sender, int message, std::intptr_t a, std::
|
|||
case 0x501F: {
|
||||
char value[260];
|
||||
std::memset(value, 0, sizeof(value));
|
||||
std::memcpy(value, data + offset, recordSize);
|
||||
offset += recordSize;
|
||||
std::memcpy(value, data + offset, header.size);
|
||||
offset += header.size;
|
||||
this->SendMsg(nullptr, 44, reinterpret_cast<std::intptr_t>(value), 1, 0, 0);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
offset += recordSize;
|
||||
offset += header.size;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue