diff options
Diffstat (limited to 'src/server/game/Conditions')
-rw-r--r-- | src/server/game/Conditions/ConditionMgr.cpp | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 30d752050ca..d83e04f0200 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -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) { |