mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-15 23:20:36 +01:00
Core/Conditions: Catch exceptions caused by invalid WorldStateExpression data
This commit is contained in:
@@ -3285,14 +3285,14 @@ bool ConditionMgr::IsPlayerMeetingCondition(Player const* player, PlayerConditio
|
||||
return true;
|
||||
}
|
||||
|
||||
ByteBuffer HexToBytes(const std::string& hex)
|
||||
static ByteBuffer HexToBytes(std::string_view const& hex)
|
||||
{
|
||||
ByteBuffer buffer(hex.length() / 2, ByteBuffer::Resize{});
|
||||
Trinity::Impl::HexStrToByteArray(hex, buffer.data(), buffer.size());
|
||||
return buffer;
|
||||
}
|
||||
|
||||
static int32(* const WorldStateExpressionFunctions[WSE_FUNCTION_MAX])(Map const*, uint32, uint32) =
|
||||
static constexpr int32(* const WorldStateExpressionFunctions[WSE_FUNCTION_MAX])(Map const*, uint32, uint32) =
|
||||
{
|
||||
// WSE_FUNCTION_NONE
|
||||
[](Map const* /*map*/, uint32 /*arg1*/, uint32 /*arg2*/) -> int32
|
||||
@@ -3634,21 +3634,24 @@ bool EvalRelOp(ByteBuffer& buffer, Map const* map)
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ConditionMgr::IsMeetingWorldStateExpression(Map const* map, WorldStateExpressionEntry const* expression)
|
||||
bool ConditionMgr::IsMeetingWorldStateExpression(Map const* map, WorldStateExpressionEntry const* expression) try
|
||||
{
|
||||
ByteBuffer buffer = HexToBytes(expression->Expression);
|
||||
if (buffer.empty())
|
||||
return false;
|
||||
|
||||
bool enabled = buffer.read<bool>();
|
||||
uint8 enabled = buffer.read<uint8>();
|
||||
if (!enabled)
|
||||
return false;
|
||||
|
||||
bool finalResult = EvalRelOp(buffer, map);
|
||||
WorldStateExpressionLogic resultLogic = buffer.read<WorldStateExpressionLogic>();
|
||||
|
||||
while (resultLogic != WorldStateExpressionLogic::None)
|
||||
do
|
||||
{
|
||||
WorldStateExpressionLogic resultLogic = buffer.read<WorldStateExpressionLogic>();
|
||||
if (resultLogic == WorldStateExpressionLogic::None)
|
||||
break;
|
||||
|
||||
bool secondResult = EvalRelOp(buffer, map);
|
||||
|
||||
switch (resultLogic)
|
||||
@@ -3659,15 +3662,15 @@ bool ConditionMgr::IsMeetingWorldStateExpression(Map const* map, WorldStateExpre
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (buffer.rpos() >= buffer.size())
|
||||
break;
|
||||
|
||||
resultLogic = buffer.read<WorldStateExpressionLogic>();
|
||||
}
|
||||
} while (buffer.rpos() >= buffer.size());
|
||||
|
||||
return finalResult;
|
||||
}
|
||||
catch (std::exception const& e)
|
||||
{
|
||||
TC_LOG_ERROR("condition", "Failed to parse WorldStateExpression {}: {}", expression->ID, e.what());
|
||||
return false;
|
||||
}
|
||||
|
||||
int32 GetUnitConditionVariable(Unit const* unit, Unit const* otherUnit, UnitConditionVariable variable, int32 value)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user