diff options
author | Treeston <treeston.mmoc@gmail.com> | 2020-08-21 01:19:28 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-02-04 00:27:11 +0100 |
commit | c6582096ab0d80d67bbbe055468f1ca3e3ab9b2b (patch) | |
tree | 5a0abeeae6b9a9bbaa1d7fe7423dfca163bed7eb /src/server/game/Warden/WardenWin.cpp | |
parent | b5d0a94ead71290ac5701ea21b4a507d16f00182 (diff) |
Core/Warden: Add Lua checks to Warden (PR #25286)
(cherry picked from commit 0531463a3c02d98ed77e9c7689ad7237ecaddc09)
Diffstat (limited to 'src/server/game/Warden/WardenWin.cpp')
-rw-r--r-- | src/server/game/Warden/WardenWin.cpp | 46 |
1 files changed, 25 insertions, 21 deletions
diff --git a/src/server/game/Warden/WardenWin.cpp b/src/server/game/Warden/WardenWin.cpp index 92e77378198..dcee3ba2a3a 100644 --- a/src/server/game/Warden/WardenWin.cpp +++ b/src/server/game/Warden/WardenWin.cpp @@ -37,6 +37,14 @@ #include "WorldSession.h" #include <sstream> + // GUILD is the shortest string that has no client validation (RAID only sends if in a raid group) +static constexpr char _luaEvalPrefix[] = "local S,T,R=SendAddonMessage,function()"; +static constexpr char _luaEvalMidfix[] = " end R=S and T()if R then S('_TW',"; +static constexpr char _luaEvalPostfix[] = ",'GUILD')end"; + +static_assert((sizeof(_luaEvalPrefix)-1 + sizeof(_luaEvalMidfix)-1 + sizeof(_luaEvalPostfix)-1 + WARDEN_MAX_LUA_CHECK_LENGTH) == 255); + + WardenWin::WardenWin() : Warden(), _serverTicks(0) { for (WardenCheckCategory category : EnumUtils::Iterate<WardenCheckCategory>()) @@ -104,7 +112,7 @@ void WardenWin::InitializeModule() Request.Unk3 = 4; Request.Unk4 = 0; Request.String_library2 = 0; - Request.Function2 = 0x00419D40; // 0x00400000 + 0x00419D40 FrameScript::GetText + Request.Function2 = 0x00419210; // 0x00400000 + 0x00419210 FrameScript::Execute Request.Function2_set = 1; Request.CheckSumm2 = BuildChecksum(&Request.Unk3, 8); @@ -213,7 +221,16 @@ void WardenWin::RequestChecks() uint16 const id = *(checksIt++); WardenCheck const& check = sWardenCheckMgr->GetCheckData(id); - if (!check.Str.empty()) + if (check.Type == LUA_EVAL_CHECK) + { + buff << uint8(sizeof(_luaEvalPrefix)-1 + check.Str.size() + sizeof(_luaEvalMidfix)-1 + check.IdStr.size() + sizeof(_luaEvalPostfix)-1); + buff.append(_luaEvalPrefix, sizeof(_luaEvalPrefix)-1); + buff.append(check.Str.data(), check.Str.size()); + buff.append(_luaEvalMidfix, sizeof(_luaEvalMidfix)-1); + buff.append(check.IdStr.data(), check.IdStr.size()); + buff.append(_luaEvalPostfix, sizeof(_luaEvalPostfix)-1); + } + else if (!check.Str.empty()) { buff << uint8(check.Str.size()); buff.append(check.Str.data(), check.Str.size()); @@ -255,7 +272,7 @@ void WardenWin::RequestChecks() break; } case MPQ_CHECK: - case LUA_STR_CHECK: + case LUA_EVAL_CHECK: { buff << uint8(index++); break; @@ -410,26 +427,13 @@ void WardenWin::HandleCheckResult(ByteBuffer &buff) TC_LOG_DEBUG("warden", "RESULT %s passed CheckId %u account Id %u", EnumUtils::ToConstant(check.Type), id, _session->GetAccountId()); break; } - case LUA_STR_CHECK: + case LUA_EVAL_CHECK: { - uint8 Lua_Result; - buff >> Lua_Result; + uint8 const result = buff.read<uint8>(); + if (result == 0) + buff.read_skip(buff.read<uint8>()); // discard attached string - if (Lua_Result == 0) - { - uint8 luaStrLen = buff.read<uint8>(); - if (luaStrLen != 0) - { - std::string str; - str.resize(luaStrLen); - buff.read(reinterpret_cast<uint8*>(str.data()), luaStrLen); - TC_LOG_DEBUG("warden", "Lua string: %s", str.c_str()); - TC_LOG_DEBUG("warden", "RESULT LUA_STR_CHECK fail, CheckId %u account Id %u", id, _session->GetAccountId()); - checkFailed = id; - continue; - } - } - TC_LOG_DEBUG("warden", "RESULT LUA_STR_CHECK passed, CheckId %u account Id %u", id, _session->GetAccountId()); + TC_LOG_DEBUG("warden", "LUA_EVAL_CHECK CheckId %u account Id %u got in-warden dummy response (%u)", id, _session->GetAccountId(), result); break; } case MPQ_CHECK: |